Obvladovanje umetnosti čiščenja podatkov v Pythonu – KDnuggets

Obvladovanje umetnosti čiščenja podatkov v Pythonu – KDnuggets

Izvorno vozlišče: 2939047

Obvladovanje umetnosti čiščenja podatkov v Pythonu
Slika avtorja
 

Čiščenje podatkov je ključni del vsakega procesa analize podatkov. To je korak, v katerem odstranite napake, obdelate manjkajoče podatke in zagotovite, da so vaši podatki v obliki zapisa, s katero lahko delate. Brez dobro očiščenega nabora podatkov so lahko vse nadaljnje analize popačene ali nepravilne.

Ta članek vas seznani z več ključnimi tehnikami za čiščenje podatkov v Pythonu z uporabo zmogljivih knjižnic, kot so pandas, numpy, seaborn in matplotlib.

Preden se poglobimo v mehaniko čiščenja podatkov, poglejmo, kako pomembna je ta metoda. Podatki iz resničnega sveta so pogosto neurejeni. Vsebuje lahko podvojene vnose, nepravilne ali nedosledne tipe podatkov, manjkajoče vrednosti, nepomembne funkcije in izstopajoče vrednosti. Vsi ti dejavniki lahko vodijo do zavajajočih zaključkov pri analizi podatkov. Zaradi tega je čiščenje podatkov nepogrešljiv del življenjskega cikla podatkovne znanosti.

Pokrili bomo naslednje naloge čiščenja podatkov.
 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
Slika avtorja

Preden začnemo, uvozimo potrebne knjižnice. Za obdelavo podatkov bomo uporabljali pande, za vizualizacije pa seaborn in matplotlib.

Uvozili bomo tudi modul datetime Python za manipulacijo datumov.

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

Najprej bomo morali naložiti naše podatke. V tem primeru bomo naložili datoteko CSV z uporabo pand. Dodamo tudi argument ločilo.

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

Nato je pomembno pregledati podatke, da razumemo njihovo strukturo, s kakšnimi spremenljivkami delamo in ali obstajajo kakšne manjkajoče vrednosti. Ker podatkov, ki smo jih uvozili, ni veliko, si oglejmo celoten nabor podatkov.

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

Tako je videti nabor podatkov.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Takoj lahko vidite, da nekaj manjkajočih vrednosti. Poleg tega so formati datumov nedosledni.

Zdaj pa si poglejmo povzetek DataFrame z uporabo metode info().

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

Tukaj je izhod kode.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Vidimo lahko, da samo stolpec square_feet nima nobene vrednosti NULL, zato bomo morali to nekako urediti. Poleg tega sta stolpca advertisement_date in sale_date podatkovni tip objekta, čeprav bi to moral biti datum.

Lokacija stolpca je popolnoma prazna. Ali ga potrebujemo?

Pokazali vam bomo, kako rešiti te težave. Začeli bomo z učenjem brisanja nepotrebnih stolpcev.

V naboru podatkov sta dva stolpca, ki ju pri analizi podatkov ne potrebujemo, zato ju bomo odstranili.

Prvi stolpec je kupec. Ne potrebujemo ga, saj ime kupca ne vpliva na analizo.

Uporabljamo metodo drop() z navedenim imenom stolpca. Os nastavimo na 1, da določimo, da želimo izbrisati stolpec. Poleg tega je argument inplace nastavljen na True, tako da spremenimo obstoječi DataFrame in ne ustvarimo novega DataFrame brez odstranjenega stolpca.

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

Drugi stolpec, ki ga želimo odstraniti, je lokacija. Čeprav bi bilo morda koristno imeti te informacije, je to popolnoma prazen stolpec, zato ga preprosto odstranimo.

Uporabljamo enak pristop kot pri prvem stolpcu.

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

Seveda lahko ta dva stolpca odstranite hkrati.

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

Oba pristopa vrneta naslednji podatkovni okvir.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu

Podvojeni podatki se lahko pojavijo v vašem naboru podatkov iz različnih razlogov in lahko izkrivijo vašo analizo.

Odkrijmo dvojnike v našem naboru podatkov. Tukaj je opisano, kako to storiti.

Spodnja koda uporablja metodo podvojeno() upoštevati dvojnike v celotnem naboru podatkov. Njegova privzeta nastavitev je, da prvo pojavitev vrednosti obravnava kot edinstveno, naslednje pojavitve pa kot dvojnike. To vedenje lahko spremenite z uporabo naprej parameter. Na primer, df.duplicated(keep=False) bi vse dvojnike označil kot True, vključno s prvo pojavitvijo.

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

Tukaj je rezultat.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Vrstica z indeksom 3 je bila označena kot podvojena, ker se vrstica 2 z enakimi vrednostmi prvič pojavi.

Zdaj moramo odstraniti dvojnike, kar naredimo z naslednjo kodo.

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

O drop_duplicates() funkcija upošteva vse stolpce, medtem ko identificira dvojnike. Če želite upoštevati samo določene stolpce, jih lahko kot seznam posredujete tej funkciji takole: df.drop_duplicates(subset=['column1', 'column2']).

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Kot lahko vidite, je bila podvojena vrstica izpuščena. Vendar je indeksiranje ostalo enako, z manjkajočim indeksom 3. To bomo uredili s ponastavitvijo indeksov.

df = df.reset_index(drop=True)

Ta naloga se izvaja z uporabo reset_index() funkcijo. Argument drop=True se uporablja za zavrženje izvirnega indeksa. Če tega argumenta ne vključite, bo stari indeks dodan kot nov stolpec v vašem DataFrame. Če nastavite drop=True, pandam sporočate, naj pozabijo stari indeks in ga ponastavijo na privzeti celoštevilski indeks.

Za prakso poskusite odstranite dvojnike iz tega Microsoftovega nabora podatkov.

Včasih so tipi podatkov morda nepravilno nastavljeni. Na primer, datumski stolpec se lahko interpretira kot nizi. Te morate pretvoriti v ustrezne vrste.

V našem naboru podatkov bomo to storili za stolpca advertisement_date in sale_date, saj sta prikazana kot podatkovni tip objekta. Poleg tega so datumi v vrsticah različno oblikovani. Narediti ga moramo skladnega, skupaj s pretvorbo v datum.

Najlažji način je uporaba do_datetime() metoda. Ponovno lahko naredite ta stolpec za stolpcem, kot je prikazano spodaj.

Pri tem nastavimo argument dayfirst na True, ker se nekateri datumi začnejo z dnevom prvi.

# 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)

Prav tako lahko pretvorite oba stolpca hkrati z uporabo uporabi () metoda z do_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)

Oba pristopa dajeta enak rezultat.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Zdaj so datumi v dosledni obliki. Vidimo, da vsi podatki niso bili pretvorjeni. Obstaja ena vrednost NaT v advertisement_date in dve v sale_date. To pomeni, da datum manjka.

Preverimo, ali so stolpci pretvorjeni v datume z uporabo info () metoda.

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

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Kot lahko vidite, oba stolpca nista v formatu datetime64[ns].

Zdaj poskusite pretvoriti podatke iz TEXT v NUMERIC v tem Nabor podatkov Airbnb.

Nabori podatkov iz resničnega sveta pogosto vsebujejo manjkajoče vrednosti. Ravnanje z manjkajočimi podatki je bistvenega pomena, saj nekateri algoritmi ne morejo obravnavati takšnih vrednosti.

Naš primer ima tudi nekaj manjkajočih vrednosti, zato si poglejmo dva najpogostejša pristopa za ravnanje z manjkajočimi podatki.

Brisanje vrstic z manjkajočimi vrednostmi

Če je število vrstic z manjkajočimi podatki nepomembno v primerjavi s skupnim številom opazovanj, lahko razmislite o brisanju teh vrstic.

V našem primeru zadnja vrstica nima nobene vrednosti razen kvadratnih metrov in datuma oglasa. Takih podatkov ne moremo uporabiti, zato odstranimo to vrstico.

Tukaj je koda, kjer navedemo indeks vrstice.

df = df.drop(8)

DataFrame zdaj izgleda takole.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Zadnja vrstica je bila izbrisana in naš DataFrame je zdaj videti bolje. Vendar še vedno obstaja nekaj manjkajočih podatkov, ki jih bomo obdelali z drugim pristopom.

Pripisovanje manjkajočih vrednosti

Če imate veliko manjkajočih podatkov, bi lahko bila boljša strategija od brisanja imputacija. Ta postopek vključuje izpolnjevanje manjkajočih vrednosti na podlagi drugih podatkov. Za numerične podatke običajne metode imputiranja vključujejo uporabo merila osrednje težnje (povprečje, mediana, način).

V našem že spremenjenem DataFrame imamo vrednosti NaT (Not a Time) v stolpcih advertisement_date in sale_date. Te manjkajoče vrednosti bomo pripisali z uporabo pomeni() metoda.

Koda uporablja fillna() metoda za iskanje in zapolnitev ničelnih vrednosti s srednjo vrednostjo.

# 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())

Enako lahko storite tudi v eni vrstici kode. Uporabljamo uporabi () za uporabo funkcije, definirane z uporabo lambda. Enako kot zgoraj, ta funkcija uporablja fillna() in pomeni() metode za zapolnitev manjkajočih vrednosti.

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

Izhod v obeh primerih izgleda takole.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Naš stolpec sale_date ima zdaj čase, ki jih ne potrebujemo. Odstranimo jih.

Uporabili bomo strftime() metoda, ki pretvori datume v njihovo predstavitev niza in določeno obliko.

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

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Datumi so zdaj videti urejeni.

Če morate uporabiti strftime() na več stolpcih, lahko znova uporabite lambda naslednji način.

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

Zdaj pa poglejmo, kako lahko imputiramo manjkajoče kategorične vrednosti.

Kategorični podatki so vrsta podatkov, ki se uporabljajo za združevanje informacij s podobnimi lastnostmi. Vsaka od teh skupin je kategorija. Kategorični podatki lahko prevzamejo številčne vrednosti (kot je »1«, ki označuje »moškega« in »2«, ki označuje »žensko«), vendar te številke nimajo matematičnega pomena. Na primer, ne morete jih sešteti skupaj.

Kategorični podatki so običajno razdeljeni v dve kategoriji:

  1. Nominalni podatki: To je takrat, ko so kategorije samo označene in jih ni mogoče razvrstiti v nobenem posebnem vrstnem redu. Primeri vključujejo spol (moški, ženski), krvno skupino (A, B, AB, O) ali barvo (rdeča, zelena, modra).
  1. Redni podatki: Takrat je mogoče kategorije razvrstiti ali razvrstiti. Medtem ko intervali med kategorijami niso enakomerno razporejeni, ima vrstni red kategorij pomen. Primeri vključujejo ocenjevalne lestvice (ocena filma od 1 do 5), stopnjo izobrazbe (srednja šola, dodiplomski študij, podiplomski) ali stopnje raka (stopnja I, stopnja II, stopnja III).

Za imputiranje manjkajočih kategoričnih podatkov se običajno uporablja način. V našem primeru je stolpec property_category kategorični (nominalni) podatek, v dveh vrsticah pa manjkajo podatki.

Nadomestimo manjkajoče vrednosti z načinom.

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

Ta koda uporablja fillna() funkcijo za zamenjavo vseh vrednosti NaN v stolpcu property_category. Nadomesti ga z načinom.

Poleg tega se del [0] uporablja za ekstrahiranje prve vrednosti iz te serije. Če obstaja več načinov, bo to izbralo prvega. Če obstaja samo en način, še vedno deluje dobro.

Tukaj je rezultat.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Podatki so zdaj videti precej dobri. Edina stvar, ki preostane, je videti, ali obstajajo odstopanja.

Na tem lahko vadite ravnanje z ničlami Meta intervju vprašanje, kjer boste morali NULL zamenjati z ničlami.

Izstopajoči podatki so podatkovne točke v naboru podatkov, ki se izrazito razlikujejo od drugih opazovanj. Ležijo lahko izjemno daleč od drugih vrednosti v naboru podatkov in se nahajajo zunaj splošnega vzorca. Veljajo za nenavadne, ker so njihove vrednosti bistveno višje ali nižje v primerjavi z ostalimi podatki.

Izstopanja lahko nastanejo zaradi različnih razlogov, kot so:

  • Napake pri meritvah ali vnosu
  • Podatki korupcije
  • Resnične statistične anomalije

Izstopanja lahko pomembno vplivajo na rezultate vaše analize podatkov in statističnega modeliranja. Lahko povzročijo izkrivljeno porazdelitev, pristranskost ali razveljavijo temeljne statistične predpostavke, popačijo ocenjeno prileganje modela, zmanjšajo napovedno natančnost napovednih modelov in vodijo do napačnih zaključkov.

Nekatere pogosto uporabljene metode za odkrivanje izstopajočih vrednosti so Z-score, IQR (interkvartilni razpon), škatlasti grafikoni, razpršeni grafikoni in tehnike vizualizacije podatkov. V nekaterih naprednejših primerih se uporabljajo tudi metode strojnega učenja.

Vizualizacija podatkov lahko pomaga prepoznati odstopanja. Seabornov boxplot je priročen za to.

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

Uporabljamo plt.figure() za nastavitev širine in višine figure v palcih.

Nato ustvarimo polje za stolpca advertised_price in sale_price, ki je videti takole.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Zaplet lahko izboljšate za lažjo uporabo tako, da to dodate zgornji kodi.

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)

Zgornjo kodo uporabimo za nastavitev oznak za obe osi. Opazimo tudi, da so vrednosti na osi y v znanstveni notaciji in tega ne moremo uporabiti za vrednosti cen. Zato to spremenimo v navaden slog s funkcijo plt.ticklabel_format().

Nato ustvarimo oblikovalnik, ki bo prikazal vrednosti na osi y z vejicami kot ločili tisoč in decimalnimi pikami. Zadnja vrstica kode to uporabi za os.

Izhod je zdaj videti takole.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Zdaj pa, kako prepoznamo in odstranimo izstopajočo vrednost?

Eden od načinov je uporaba metode IQR.

IQR ali interkvartilni razpon je statistična metoda, ki se uporablja za merjenje variabilnosti z delitvijo nabora podatkov na kvartile. Kvartili razdelijo niz podatkov, urejen po rangu, na štiri enake dele, vrednosti znotraj obsega prvega kvartila (25. percentil) in tretjega kvartila (75. percentil) pa sestavljajo interkvartilni razpon.

Interkvartilni razpon se uporablja za identifikacijo izstopajočih vrednosti v podatkih. Takole deluje:

  1. Najprej izračunajte prvi kvartil (Q1), tretji kvartil (Q3) in nato določite IQR. IQR se izračuna kot Q3 – Q1.
  2. Vsaka vrednost pod Q1 – 1.5IQR ali nad Q3 + 1.5IQR se šteje za izstopajočo.

Na naši škatli polje dejansko predstavlja IQR. Črta znotraj polja je mediana (ali drugi kvartil). 'Brki' škatlaste ploskve predstavljajo razpon znotraj 1.5*IQR od Q1 in Q3.

Vse podatkovne točke zunaj teh brkov se lahko štejejo za izstopajoče. V našem primeru je to vrednost 12,000,000 $. Če pogledate okvirni prikaz, boste videli, kako jasno je to predstavljeno, kar kaže, zakaj je vizualizacija podatkov pomembna pri odkrivanju odstopanj.

Zdaj pa odstranimo izstopajoče vrednosti z uporabo metode IQR v kodi Python. Najprej bomo odstranili oglaševane cenovne izstope.

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)))]

Najprej izračunamo prvi kvartil (ali 25. percentil) z uporabo kvantil() funkcijo. Enako storimo za tretji kvartil ali 75. percentil.

Prikazujejo vrednosti, pod katere pade 25 % oziroma 75 % podatkov.

Nato izračunamo razliko med kvartili. Vse do zdaj je le prevajanje korakov IQR v kodo Python.

Kot zadnji korak odstranimo izstopajoče vrednosti. Z drugimi besedami, vsi podatki, manjši od Q1 – 1.5 * IQR ali večji od Q3 + 1.5 * IQR.

Operator '~' zanika pogoj, tako da nam ostanejo samo podatki, ki niso izstopajoči.

Nato lahko storimo enako s prodajno ceno.

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)))]

Seveda lahko to storite na bolj jedrnat način z uporabo za zanko.

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)))]

Zanka ponovi dva stolpca. Za vsak stolpec izračuna IQR in nato odstrani vrstice v DataFrame.

Upoštevajte, da se ta operacija izvede zaporedno, najprej za advertised_price in nato za sale_price. Posledično se DataFrame spremeni na mestu za vsak stolpec, vrstice pa je mogoče odstraniti, ker so v katerem koli stolpcu izstopajoči. Zato bi lahko ta operacija povzročila manj vrstic, kot če bi bili izstopajoči vrednosti za advertised_price in sale_price odstranjeni neodvisno in bi bili rezultati pozneje združeni.

V našem primeru bo rezultat v obeh primerih enak. Če želite videti, kako se je škatlasti izris spremenil, ga moramo znova narisati z uporabo iste kode kot prej.

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)

Tukaj je rezultat.

 

Obvladovanje umetnosti čiščenja podatkov v Pythonu
 

Izračunavanje percentilov v Pythonu lahko vadite z reševanjem Vprašanje za razgovor na generalni skupščini.

Čiščenje podatkov je ključni korak v procesu analize podatkov. Čeprav je lahko dolgotrajno, je bistveno, da zagotovite točnost svojih ugotovitev.

Na srečo je Pythonov bogat ekosistem knjižnic ta proces bolj obvladljiv. Naučili smo se, kako odstraniti nepotrebne vrstice in stolpce, preoblikovati podatke ter ravnati z manjkajočimi vrednostmi in izstopajočimi vrednostmi. To so običajni koraki, ki jih je treba izvesti za večino podatkov. Vendar pa boste včasih tudi morali združi dva stolpca v enega, preveri obstoječe podatke, mu dodelite oznakeali znebite se belih prostorov.

Vse to je čiščenje podatkov, saj vam omogoča, da neurejene podatke iz resničnega sveta spremenite v dobro strukturiran nabor podatkov, ki ga lahko z zaupanjem analizirate. Samo primerjajte nabor podatkov, s katerim smo začeli, s tistim, ki smo ga dobili na koncu.

Če v tem rezultatu ne vidite zadovoljstva in vas čisti podatki ne vznemirjajo čudno, kaj za vraga počnete v podatkovni znanosti!?
 

Nate Rosidi je podatkovni znanstvenik in v strategiji izdelkov. Je tudi izredni profesor, ki poučuje analitiko in je ustanovitelj StrataScratch, platforma, ki pomaga podatkovnim znanstvenikom pri pripravi na intervjuje z resničnimi vprašanji za intervjuje vrhunskih podjetij. Povežite se z njim Twitter: StrataScratch or LinkedIn.

Časovni žig:

Več od KDnuggets