Andmete puhastamise kunsti valdamine Pythonis – KDnuggets

Andmete puhastamise kunsti valdamine Pythonis – KDnuggets

Allikasõlm: 2939047

Andmete puhastamise kunsti valdamine Pythonis
Pilt autorilt
 

Andmete puhastamine on iga andmeanalüüsi protsessi kriitiline osa. See on samm, mille käigus eemaldate vead, käsitlete puuduvaid andmeid ja veenduge, et teie andmed on vormingus, millega saate töötada. Ilma hästi puhastatud andmestikuta võivad kõik järgnevad analüüsid olla moonutatud või valed.

See artikkel tutvustab mitut Pythonis andmete puhastamise põhitehnikat, kasutades võimsaid teeke, nagu pandas, numpy, seaborn ja matplotlib.

Enne andmete puhastamise mehaanikasse sukeldumist mõistame selle tähtsust. Reaalse maailma andmed on sageli segased. See võib sisaldada topeltkirjeid, valesid või ebajärjekindlaid andmetüüpe, puuduvaid väärtusi, ebaolulisi funktsioone ja kõrvalekaldeid. Kõik need tegurid võivad andmete analüüsimisel viia eksitavate järeldusteni. See muudab andmete puhastamise andmeteaduse elutsükli asendamatuks osaks.

Käsitleme järgmisi andmete puhastamise ülesandeid.
 

Andmete puhastamise kunsti valdamine Pythonis
Pilt autorilt

Enne alustamist impordime vajalikud teegid. Me kasutame andmetega manipuleerimiseks pandasid ning visualiseerimiseks mereande ja matplotlibi.

Samuti impordime kuupäevade ja kuupäevadega manipuleerimiseks Pythoni mooduli datetime.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

Esiteks peame oma andmed laadima. Selles näites laadime pandade abil CSV-faili. Lisame ka eraldaja argumendi.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

Järgmiseks on oluline andmeid kontrollida, et mõista nende struktuuri, milliste muutujatega me töötame ja kas puuduvad väärtused. Kuna imporditud andmed ei ole suured, vaatame kogu andmestikku.

# Look at all the rows of the dataframe
display(df)

Andmekogum näeb välja järgmiselt.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Näete kohe, et mõned väärtused on puudu. Samuti on kuupäevavormingud ebajärjekindlad.

Vaatame nüüd DataFrame'i kokkuvõtet info() meetodi abil.

# Get a concise summary of the dataframe
print(df.info())

Siin on koodi väljund.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Näeme, et ainult veerus square_foet ei ole ühtegi NULL-väärtust, nii et me peame sellega kuidagi hakkama saama. Samuti on veerud kuulutuse_kuupäev ja müügikuupäev objekti andmetüübid, kuigi see peaks olema kuupäev.

Veeru asukoht on täiesti tühi. Kas meil on seda vaja?

Näitame teile, kuidas neid probleeme lahendada. Alustuseks õpime tarbetuid veerge kustutama.

Andmekogus on kaks veergu, mida me oma andmeanalüüsis ei vaja, seega eemaldame need.

Esimene veerg on ostja. Meil pole seda vaja, kuna ostja nimi ei mõjuta analüüsi.

Me kasutame määratud veeru nimega meetodit drop(). Seadsime teljeks 1, et täpsustada, et tahame veeru kustutada. Samuti on inplace argument seatud väärtusele Tõene, nii et me muudame olemasolevat DataFrame'i, mitte ei loo uut DataFrame'i ilma eemaldatud veeruta.

df.drop('buyer', axis = 1, inplace = True)

Teine veerg, mille tahame eemaldada, on asukoht. Kuigi see teave võib olla kasulik, on see täiesti tühi veerg, nii et eemaldame selle lihtsalt.

Me kasutame sama lähenemisviisi nagu esimese veeru puhul.

df.drop('location', axis = 1, inplace = True)

Loomulikult saate need kaks veergu korraga eemaldada.

df = df.drop(['buyer', 'location'], axis=1)

Mõlemad lähenemisviisid tagastavad järgmise andmeraami.

 

Andmete puhastamise kunsti valdamine Pythonis

Teie andmekogus võivad erinevatel põhjustel esineda dubleerivaid andmeid ja need võivad teie analüüsi moonutada.

Tuvastame oma andmekogus duplikaadid. Siin on, kuidas seda teha.

Allpool olev kood kasutab meetodit dubleeritud () kogu andmestiku duplikaate arvesse võtma. Selle vaikesäte on käsitleda väärtuse esimest esinemist unikaalsena ja järgnevaid esinemisi duplikaatidena. Saate seda käitumist muuta, kasutades hoidma parameeter. Näiteks df.duplicated(keep=False) märgib kõik duplikaadid tõeseks, sealhulgas esimese esinemise.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Siin on väljund.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Rida indeksiga 3 on märgitud duplikaadiks, kuna samade väärtustega rida 2 on selle esmakordne esinemine.

Nüüd peame eemaldama duplikaadid, mida teeme järgmise koodiga.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

. drop_duplicates() funktsioon võtab duplikaatide tuvastamisel arvesse kõiki veerge. Kui soovite arvesse võtta ainult teatud veerge, saate need sellele funktsioonile loendina edastada järgmiselt: df.drop_duplicates(subset=['veerg1', 'veerg2']).

 

Andmete puhastamise kunsti valdamine Pythonis
 

Nagu näete, on duplikaatrida välja jäetud. Kuid indekseerimine jäi samaks, indeks 3 puudus. Teeme selle korda, lähtestades indeksid.

df = df.reset_index(drop=True)

See ülesanne täidetakse kasutades reset_index() funktsiooni. Argumenti drop=True kasutatakse algse indeksi tühistamiseks. Kui te seda argumenti ei lisa, lisatakse vana register teie DataFrame'i uue veeruna. Seadistades drop=True, käsite pandadel vana indeks unustada ja lähtestada vaiketäisarvuindeksile.

Harjutamiseks proovige eemaldage sellest Microsofti andmekogumist duplikaadid.

Mõnikord võivad andmetüübid olla valesti määratud. Näiteks võib kuupäeva veergu tõlgendada stringidena. Peate need sobivateks tüüpideks teisendama.

Meie andmekogumis teeme seda veergude reklaami_kuupäev ja müügi_kuupäev jaoks, kuna need on näidatud objekti andmetüübina. Samuti on kuupäevade kuupäevad erinevatel ridadel erinevalt vormindatud. Peame muutma selle järjepidevaks ja muutma selle praeguseks.

Lihtsaim viis on kasutada to_datetime() meetod. Jällegi saate seda teha veeru haaval, nagu allpool näidatud.

Seda tehes määrame argumendi dayfirst väärtuseks Tõene, kuna mõned kuupäevad algavad päevaga esimesena.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

Samuti saate teisendada mõlemad veerud korraga, kasutades rakendama () meetodiga to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

Mõlemad lähenemisviisid annavad teile sama tulemuse.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Nüüd on kuupäevad ühtses vormingus. Näeme, et kõiki andmeid pole teisendatud. Üks NaT väärtus on reklaami_kuupäevas ja kaks müügikuupäevas. See tähendab, et kuupäev on puudu.

Kontrollime, kas veerud teisendatakse kuupäevadeks, kasutades info () meetod.

# Get a concise summary of the dataframe
print(df.info())

 

Andmete puhastamise kunsti valdamine Pythonis
 

Nagu näete, pole mõlemad veerud vormingus datetime64[ns].

Nüüd proovige selles olevad andmed teisendada TEKST NUMBRIKS Airbnb andmestik.

Reaalmaailma andmekogudel on sageli väärtused puuduvad. Puuduvate andmete käsitlemine on ülioluline, kuna teatud algoritmid ei suuda selliseid väärtusi käsitleda.

Meie näites on ka mõned puuduvad väärtused, seega vaatame kahte kõige tavalisemat puuduvate andmete käsitlemise meetodit.

Puuduvate väärtustega ridade kustutamine

Kui puuduvate andmetega ridade arv on vaatluste koguarvuga võrreldes ebaoluline, võiksite kaaluda nende ridade kustutamist.

Meie näites pole viimasel real väärtusi peale ruutjalgade ja reklaami kuupäeva. Me ei saa selliseid andmeid kasutada, seega eemaldame selle rea.

Siin on kood, kus näitame rea indeksit.

df = df.drop(8)

DataFrame näeb nüüd välja selline.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Viimane rida on kustutatud ja meie DataFrame näeb nüüd parem välja. Siiski on endiselt puuduvaid andmeid, mille käsitlemiseks kasutame teist lähenemisviisi.

Puuduvate väärtuste omistamine

Kui teil on märkimisväärseid andmeid puudu, võiks kustutamisest parem strateegia olla imputeerimine. See protsess hõlmab muude andmete alusel puuduvate väärtuste täitmist. Arvandmete puhul hõlmavad levinumad imputeerimismeetodid keskse tendentsi (keskmine, mediaan, moodus) mõõtmist.

Meie juba muudetud DataFrame'is on NaT (Not a Time) väärtused veergudes reklaami_kuupäev ja müügi_kuupäev. Arvutame need puuduvad väärtused kasutades tähendab () meetod.

Kood kasutab fillna() meetod nullväärtuste leidmiseks ja keskmise väärtusega täitmiseks.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

Sama asja saate teha ka ühes koodireas. Me kasutame rakendama () kasutades määratletud funktsiooni rakendamiseks lambda. See funktsioon kasutab samamoodi nagu ülalpool fillna() ja tähendab () meetodid puuduvate väärtuste täitmiseks.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

Mõlemal juhul näeb väljund välja selline.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Meie müügikuupäeva veerus on nüüd aegu, mida me ei vaja. Eemaldame need.

Me kasutame strftime() meetod, mis teisendab kuupäevad nende stringi esitusviisiks ja kindlasse vormingusse.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Andmete puhastamise kunsti valdamine Pythonis
 

Kuupäevad paistavad nüüd kõik korras olevat.

Kui teil on vaja kasutada strftime() mitmel veerul, saate uuesti kasutada lambda järgmisel viisil.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

Nüüd vaatame, kuidas saame puuduvaid kategoorilisi väärtusi omistada.

Kategoorilised andmed on teatud tüüpi andmed, mida kasutatakse sarnaste omadustega teabe rühmitamiseks. Igaüks neist rühmadest on kategooria. Kategoorilistel andmetel võib olla arvväärtusi (nt "1" tähistab "meest" ja "2" tähistab "naist"), kuid neil numbritel ei ole matemaatilist tähendust. Näiteks ei saa te neid kokku liita.

Kategoorilised andmed jagunevad tavaliselt kahte kategooriasse:

  1. Nominaalsed andmed: See on siis, kui kategooriad on ainult märgistatud ja neid ei saa kindlas järjekorras järjestada. Näited hõlmavad sugu (mees, naine), veregruppi (A, B, AB, O) või värvi (punane, roheline, sinine).
  1. Tavalised andmed: See on siis, kui kategooriaid saab järjestada või järjestada. Kuigi kategooriate vahelised intervallid ei ole võrdselt paigutatud, on kategooriate järjestusel tähendus. Näited hõlmavad hindamisskaalasid (filmi reiting 1 kuni 5), haridustase (keskkool, bakalaureuseõpe, magistriõpe) või vähi staadiumid (I etapp, II etapp, III etapp).

Puuduvate kategooriliste andmete imputeerimiseks kasutatakse tavaliselt režiimi. Meie näites on veerg property_category kategoorilised (nominaalsed) andmed ja kahes reas puuduvad andmed.

Asendame puuduvad väärtused režiimiga.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

See kood kasutab fillna() funktsiooni, et asendada kõik NaN väärtused veerus property_category. See asendab selle režiimiga.

Lisaks kasutatakse osa [0] sellest seeriast esimese väärtuse eraldamiseks. Kui režiime on mitu, valitakse esimene. Kui on ainult üks režiim, töötab see endiselt hästi.

Siin on väljund.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Andmed näivad praegu päris head. Ainus asi, mis jääb alles, on näha, kas on kõrvalekaldeid.

Selle peal saate harjutada nullidega tegelemist Meta intervjuu küsimus, kus peate NULL-id asendama nullidega.

Kõrvalekalded on andmestiku andmepunktid, mis erinevad selgelt teistest vaatlustest. Need võivad asuda erakordselt kaugel teistest andmekogumi väärtustest, asudes väljaspool üldist mustrit. Neid peetakse ebatavalisteks, kuna nende väärtused on ülejäänud andmetega võrreldes oluliselt kõrgemad või madalamad.

Kõrvalekalded võivad tekkida erinevatel põhjustel, näiteks:

  • Mõõtmis- või sisestusvead
  • Andmete korruptsioon
  • Tõelised statistilised anomaaliad

Kõrvalekalded võivad märkimisväärselt mõjutada teie andmeanalüüsi ja statistilise modelleerimise tulemusi. Need võivad põhjustada kallutatud jaotust, kallutamist või muuta aluseks olevad statistilised eeldused kehtetuks, moonutada hinnangulist mudeli sobivust, vähendada ennustavate mudelite ennustavat täpsust ja viia valede järeldusteni.

Mõned tavaliselt kasutatavad meetodid kõrvalekallete tuvastamiseks on Z-skoor, IQR (Interquartile Range), kastdiagrammid, hajuvusdiagrammid ja andmete visualiseerimise tehnikad. Mõnel arenenud juhul kasutatakse ka masinõppe meetodeid.

Andmete visualiseerimine võib aidata tuvastada kõrvalekaldeid. Seaborni boxplot on selleks mugav.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

Kasutame plt.figure() kujundi laiuse ja kõrguse määramiseks tollides.

Seejärel loome veergude reklaamitud_hind ja müügihind kastiploki, mis näeb välja selline.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Süžeed saab lihtsamaks kasutamiseks täiustada, lisades selle ülaltoodud koodile.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Mõlema telje siltide määramiseks kasutame ülaltoodud koodi. Samuti märkame, et y-telje väärtused on teaduslikus tähistuses ja me ei saa seda kasutada hinnaväärtuste jaoks. Seega muudame selle lihtsaks, kasutades funktsiooni plt.ticklabel_format().

Seejärel loome vormindaja, mis näitab väärtusi y-teljel komadega tuhandete eraldajate ja kümnendkohtadena. Viimane koodirida rakendab seda teljele.

Väljund näeb nüüd välja selline.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Kuidas nüüd kõrvalekaldeid tuvastada ja eemaldada?

Üks võimalus on kasutada IQR meetodit.

IQR ehk kvartiilidevaheline vahemik on statistiline meetod, mida kasutatakse varieeruvuse mõõtmiseks, jagades andmekogumi kvartiilideks. Kvartiilid jagavad järjestatud andmehulga neljaks võrdseks osaks ning esimese kvartiili (25. protsentiil) ja kolmanda kvartiili (75. protsentiil) vahemikus olevad väärtused moodustavad kvartiilidevahelise vahemiku.

Interkvartiilide vahemikku kasutatakse andmete kõrvalekallete tuvastamiseks. See toimib järgmiselt.

  1. Esmalt arvutage esimene kvartiil (Q1), kolmas kvartiil (Q3) ja seejärel määrake IQR. IQR arvutatakse Q3 – Q1.
  2. Kõik väärtused, mis on väiksemad Q1 – 1.5 IQR või üle Q3 + 1.5 IQR, loetakse kõrvalekalleteks.

Meie kastplokil esindab kast tegelikult IQR-i. Kasti sees olev joon on mediaan (või teine ​​kvartiil). Kastdiagrammi "vurrud" tähistavad vahemikku 1.5 * IQR vahemikus Q1 ja Q3.

Kõiki andmepunkte väljaspool neid vurrud võib pidada kõrvalekalleteks. Meie puhul on selle väärtus 12,000,000 XNUMX XNUMX dollarit. Kui vaatate kastploti, näete, kui selgelt see on esitatud, mis näitab, miks andmete visualiseerimine on kõrvalekallete tuvastamisel oluline.

Nüüd eemaldame kõrvalekalded, kasutades Pythoni koodis IQR-meetodit. Esiteks eemaldame reklaamitud hinnaerinevused.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

Esmalt arvutame esimese kvartiili (või 25. protsentiili), kasutades kvantiil() funktsiooni. Teeme sama ka kolmanda kvartiili või 75. protsentiili puhul.

Need näitavad väärtusi, millest allapoole jäävad vastavalt 25% ja 75% andmetest.

Seejärel arvutame kvartiilide vahe. Seni on kõik vaid IQR-i sammude tõlkimine Pythoni koodiks.

Viimase sammuna eemaldame kõrvalekalded. Teisisõnu, kõik andmed on alla Q1 – 1.5 * IQR või rohkem kui Q3 + 1.5 * IQR.

Operaator '~' tühistab tingimuse, nii et meile jäävad ainult need andmed, mis ei ole kõrvalekalded.

Siis saame sama teha ka müügihinnaga.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

Muidugi saate seda teha kokkuvõtlikumal viisil, kasutades silmuse jaoks.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

Silmus itereerub kahest veerust. Iga veeru jaoks arvutab see IQR ja seejärel eemaldab DataFrame'i read.

Pange tähele, et see toiming tehakse järjestikku, kõigepealt reklaamide_hinna ja seejärel müügihinna jaoks. Selle tulemusel muudetakse DataFrame'i iga veeru jaoks kohapeal ja ridu saab eemaldada, kuna need on kummaski veerus kõrvalekalded. Seetõttu võib selle toimingu tulemuseks olla vähem ridu kui siis, kui reklaamitud_hinna ja müügihinna kõrvalekalded eemaldataks eraldi ja tulemused seejärel kombineeritakse.

Meie näites on väljund mõlemal juhul sama. Et näha, kuidas kasti graafik muutus, peame selle uuesti joonistama, kasutades sama koodi nagu varem.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Siin on väljund.

 

Andmete puhastamise kunsti valdamine Pythonis
 

Saate harjutada protsentiilide arvutamist Pythonis, lahendades Peaassamblee intervjuu küsimus.

Andmete puhastamine on andmeanalüüsi protsessi oluline etapp. Kuigi see võib olla aeganõudev, on oluline tagada oma tulemuste täpsus.

Õnneks muudab Pythoni rikkalik raamatukogude ökosüsteem selle protsessi paremini juhitavaks. Õppisime, kuidas eemaldada tarbetuid ridu ja veerge, vormindada andmeid ümber ning käsitleda puuduvaid väärtusi ja kõrvalekaldeid. Need on tavalised toimingud, mida tuleb teha enamiku andmete puhul. Siiski peate mõnikord ka seda tegema ühendage kaks veergu üheks, kontrollige olemasolevaid andmeid, määrake sellele sildidvõi vabaneda valgetest tühikutest.

Kõik see on andmete puhastamine, kuna see võimaldab muuta segased reaalmaailma andmed hästi struktureeritud andmekogumiks, mida saate enesekindlalt analüüsida. Võrrelge lihtsalt andmestikku, millest alustasime, sellega, milleni me lõpuks jõudsime.

Kui sa selles tulemuses rahulolu ei näe ja puhtad andmed sind kummaliselt erutama ei pane, siis mida kuradit sa andmeteaduses teed!?
 

Nate Rosidi on andmeteadlane ja tootestrateegias. Ta on ka analüütikat õpetav dotsent ja asutaja StrataScratch, platvorm, mis aitab andmeteadlastel tippettevõtete tõeliste intervjuuküsimustega intervjuudeks valmistuda. Ühendage temaga Twitter: StrataScratch or LinkedIn.

Ajatempel:

Veel alates KDnuggets