Mestring af kunsten at rense data i Python - KDnuggets

Mestring af kunsten at rense data i Python – KDnuggets

Kildeknude: 2939047

Mestring af kunsten at rense data i Python
Billede af forfatter
 

Datarensning er en kritisk del af enhver dataanalyseproces. Det er det trin, hvor du fjerner fejl, håndterer manglende data og sørger for, at dine data er i et format, som du kan arbejde med. Uden et velrenset datasæt kan eventuelle efterfølgende analyser være skæve eller forkerte.

Denne artikel introducerer dig til flere nøgleteknikker til datarensning i Python ved hjælp af kraftfulde biblioteker som pandaer, numpy, seaborn og matplotlib.

Før vi dykker ned i mekanikken i datarensning, lad os forstå dens betydning. Data fra den virkelige verden er ofte rodet. Det kan indeholde duplikerede indtastninger, forkerte eller inkonsistente datatyper, manglende værdier, irrelevante funktioner og outliers. Alle disse faktorer kan føre til misvisende konklusioner, når man analyserer data. Dette gør datarensning til en uundværlig del af datavidenskabens livscyklus.

Vi dækker følgende datarensningsopgaver.
 

Mestring af kunsten at rense data i Python
Billede af forfatter

Inden vi går i gang, lad os importere de nødvendige biblioteker. Vi vil bruge pandaer til datamanipulation og seaborn og matplotlib til visualiseringer.

Vi importerer også datetime Python-modulet til at manipulere datoerne.

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

Først skal vi indlæse vores data. I dette eksempel skal vi indlæse en CSV-fil ved hjælp af pandaer. Vi tilføjer også afgrænsningsargumentet.

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

Dernæst er det vigtigt at inspicere dataene for at forstå deres struktur, hvilken slags variabler vi arbejder med, og om der mangler værdier. Da de data, vi importerede, ikke er enorme, lad os tage et kig på hele datasættet.

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

Sådan ser datasættet ud.

 

Mestring af kunsten at rense data i Python
 

Du kan straks se, at der mangler nogle værdier. Også datoformaterne er inkonsekvente.

Lad os nu tage et kig på DataFrame-oversigten ved hjælp af info()-metoden.

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

Her er kodeoutputtet.

 

Mestring af kunsten at rense data i Python
 

Vi kan se, at kun kolonnen square_feet ikke har nogen NULL-værdier, så vi bliver på en eller anden måde nødt til at håndtere dette. Desuden er kolonnerne annonce_dato og salgsdato objektdatatypen, selvom dette burde være en dato.

Kolonneplaceringen er helt tom. Har vi brug for det?

Vi viser dig, hvordan du håndterer disse problemer. Vi starter med at lære, hvordan du sletter unødvendige kolonner.

Der er to kolonner i datasættet, som vi ikke har brug for i vores dataanalyse, så vi fjerner dem.

Den første kolonne er køber. Vi har ikke brug for det, da køberens navn ikke påvirker analysen.

Vi bruger drop()-metoden med det angivne kolonnenavn. Vi sætter aksen til 1 for at angive, at vi vil slette en kolonne. Desuden er inplace-argumentet sat til True, så vi ændrer den eksisterende DataFrame og ikke opretter en ny DataFrame uden den fjernede kolonne.

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

Den anden kolonne, vi vil fjerne, er placering. Selvom det kan være nyttigt at have disse oplysninger, er dette en helt tom kolonne, så lad os bare fjerne den.

Vi tager samme tilgang som med den første kolonne.

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

Selvfølgelig kan du fjerne disse to kolonner samtidigt.

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

Begge tilgange returnerer følgende dataramme.

 

Mestring af kunsten at rense data i Python

Dublerede data kan forekomme i dit datasæt af forskellige årsager og kan skævvride din analyse.

Lad os opdage dubletterne i vores datasæt. Sådan gør du det.

Nedenstående kode bruger metoden duplikeret() at overveje dubletter i hele datasættet. Dens standardindstilling er at betragte den første forekomst af en værdi som unik og de efterfølgende forekomster som dubletter. Du kan ændre denne adfærd ved hjælp af holde parameter. For eksempel vil df.duplicated(keep=False) markere alle dubletter som True, inklusive den første forekomst.

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

Her er outputtet.

 

Mestring af kunsten at rense data i Python
 

Rækken med indeks 3 er blevet markeret som dublet, fordi række 2 med de samme værdier er dens første forekomst.

Nu skal vi fjerne dubletter, hvilket vi gør med følgende kode.

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

drop_duplicates() funktion overvejer alle kolonner, mens dubletter identificeres. Hvis du kun ønsker at overveje bestemte kolonner, kan du overføre dem som en liste til denne funktion på denne måde: df.drop_duplicates(subset=['column1', 'column2']).

 

Mestring af kunsten at rense data i Python
 

Som du kan se, er duplikatrækken blevet slettet. Indekseringen forblev dog den samme, hvor indeks 3 manglede. Vi vil rydde op i dette ved at nulstille indeks.

df = df.reset_index(drop=True)

Denne opgave udføres ved at bruge nulstil_indeks() fungere. Argumentet drop=True bruges til at kassere det originale indeks. Hvis du ikke inkluderer dette argument, vil det gamle indeks blive tilføjet som en ny kolonne i din DataFrame. Ved at indstille drop=True beder du pandaer om at glemme det gamle indeks og nulstille det til standardheltalsindekset.

For praksis, prøv at fjern dubletter fra dette Microsoft-datasæt.

Nogle gange kan datatyper være forkert indstillet. For eksempel kan en datokolonne fortolkes som strenge. Du skal konvertere disse til deres passende typer.

I vores datasæt gør vi det for kolonnerne annoncedato og salgsdato, da de vises som objektdatatypen. Dato-datoerne er også formateret forskelligt på tværs af rækkerne. Vi er nødt til at gøre det konsekvent, sammen med at konvertere det til dato.

Den nemmeste måde er at bruge to_datetime() metode. Igen kan du gøre det kolonne for kolonne, som vist nedenfor.

Når vi gør det, sætter vi dagførst-argumentet til Sandt, fordi nogle datoer starter med dagen først.

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

Du kan også konvertere begge kolonner på samme tid ved at bruge ansøge() metode med 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)

Begge tilgange giver dig det samme resultat.

 

Mestring af kunsten at rense data i Python
 

Nu er datoerne i et ensartet format. Vi ser, at ikke alle data er blevet konverteret. Der er én NaT-værdi i annoncedato og to i udsalgsdato. Det betyder, at datoen mangler.

Lad os kontrollere, om kolonnerne er konverteret til datoer ved at bruge info () fremgangsmåde.

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

 

Mestring af kunsten at rense data i Python
 

Som du kan se, er begge kolonner ikke i formatet datetime64[ns].

Prøv nu at konvertere dataene fra TEXT til NUMERIC i denne Airbnb datasæt.

Datasæt fra den virkelige verden mangler ofte værdier. Håndtering af manglende data er afgørende, da visse algoritmer ikke kan håndtere sådanne værdier.

Vores eksempel har også nogle manglende værdier, så lad os tage et kig på de to mest sædvanlige tilgange til håndtering af manglende data.

Sletning af rækker med manglende værdier

Hvis antallet af rækker med manglende data er ubetydeligt i forhold til det samlede antal observationer, kan du overveje at slette disse rækker.

I vores eksempel har den sidste række ingen værdier undtagen kvadratfod og annoncedato. Vi kan ikke bruge sådanne data, så lad os fjerne denne række.

Her er koden, hvor vi angiver rækkens indeks.

df = df.drop(8)

DataFrame ser nu sådan ud.

 

Mestring af kunsten at rense data i Python
 

Den sidste række er blevet slettet, og vores DataFrame ser nu bedre ud. Der mangler dog stadig nogle data, som vi vil håndtere ved hjælp af en anden tilgang.

Imputering af manglende værdier

Hvis du har betydelige manglende data, kan en bedre strategi end sletning være imputation. Denne proces involverer udfyldning af manglende værdier baseret på andre data. For numeriske data involverer almindelige imputationsmetoder brug af et mål for central tendens (middelværdi, median, tilstand).

I vores allerede ændrede DataFrame har vi NaT-værdier (Not a Time) i kolonnerne annoncedato og salgsdato. Vi imputerer disse manglende værdier ved hjælp af betyde() fremgangsmåde.

Koden bruger fillna() metode til at finde og udfylde nulværdierne med middelværdien.

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

Du kan også gøre det samme i én linje kode. Vi bruger ansøge() at anvende den funktion, der er defineret vha lambda. Samme som ovenfor, denne funktion bruger fillna() , betyde() metoder til at udfylde de manglende værdier.

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

Outputtet ser i begge tilfælde således ud.

 

Mestring af kunsten at rense data i Python
 

Vores udsalgsdato-kolonne har nu tidspunkter, som vi ikke har brug for. Lad os fjerne dem.

Vi bruger strftime() metode, som konverterer datoerne til deres strengrepræsentation og et specifikt format.

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

 

Mestring af kunsten at rense data i Python
 

Datoerne ser nu pæne ud.

Hvis du har brug for strftime() på flere kolonner, kan du igen bruge lambda følgende måde.

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

Lad os nu se, hvordan vi kan tilskrive manglende kategoriske værdier.

Kategoriske data er en type data, der bruges til at gruppere information med lignende karakteristika. Hver af disse grupper er en kategori. Kategoriske data kan antage numeriske værdier (såsom "1" angiver "mandlig" og "2" angiver "kvinde"), men disse tal har ikke matematisk betydning. Du kan f.eks. ikke lægge dem sammen.

Kategoriske data er typisk opdelt i to kategorier:

  1. Nominelle data: Dette er, når kategorierne kun er mærket og ikke kan arrangeres i nogen bestemt rækkefølge. Eksempler omfatter køn (mand, kvinde), blodtype (A, B, AB, O) eller farve (rød, grøn, blå).
  1. Ordinære data: Det er her, kategorierne kan bestilles eller rangeres. Mens intervallerne mellem kategorierne ikke er lige fordelt, har rækkefølgen af ​​kategorierne en betydning. Eksempler inkluderer vurderingsskalaer (1 til 5 vurdering af en film), et uddannelsesniveau (gymnasium, bachelor, kandidat) eller stadier af kræft (stadier I, fase II, fase III).

Til imputering af manglende kategoriske data bruges tilstanden typisk. I vores eksempel er kolonnen property_category kategoriske (nominelle) data, og der mangler data i to rækker.

Lad os erstatte de manglende værdier med mode.

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

Denne kode bruger fillna() funktion til at erstatte alle NaN-værdier i kolonnen property_category. Det erstatter det med mode.

Derudover bruges [0]-delen til at udtrække den første værdi fra denne serie. Hvis der er flere tilstande, vil dette vælge den første. Hvis der kun er én tilstand, fungerer den stadig fint.

Her er outputtet.

 

Mestring af kunsten at rense data i Python
 

Dataene ser nu ret gode ud. Det eneste, der er tilbage, er at se, om der er afvigelser.

Du kan øve dig i at håndtere nuller på dette Meta interview spørgsmål, hvor du bliver nødt til at erstatte NULL med nuller.

Outliers er datapunkter i et datasæt, der er tydeligt forskellige fra de andre observationer. De kan ligge usædvanligt langt fra de andre værdier i datasættet og ligge uden for et overordnet mønster. De anses for at være usædvanlige, fordi deres værdier enten er væsentligt højere eller lavere sammenlignet med resten af ​​dataene.

Outliers kan opstå på grund af forskellige årsager, såsom:

  • Måle- eller indtastningsfejl
  • Data korruption
  • Ægte statistiske anomalier

Outliers kan påvirke resultaterne af din dataanalyse og statistiske modellering markant. De kan føre til en skæv fordeling, skævhed eller ugyldiggøre de underliggende statistiske antagelser, forvrænge den estimerede modeltilpasning, reducere den prædiktive nøjagtighed af prædiktive modeller og føre til ukorrekte konklusioner.

Nogle almindeligt anvendte metoder til at detektere outliers er Z-score, IQR (Interquartile Range), boxplot, scatterplot og datavisualiseringsteknikker. I nogle avancerede tilfælde bruges maskinlæringsmetoder også.

Visualisering af data kan hjælpe med at identificere outliers. Seaborns boxplot er praktisk til dette.

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

Vi bruger plt.figure() til at indstille bredden og højden af ​​figuren i tommer.

Så laver vi boxplotten for kolonnerne annonceret_pris og udsalgspris, som ser sådan ud.

 

Mestring af kunsten at rense data i Python
 

Plottet kan forbedres for lettere brug ved at tilføje dette til ovenstående kode.

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)

Vi bruger ovenstående kode til at indstille etiketterne for begge akser. Vi bemærker også, at værdierne på y-aksen er i den videnskabelige notation, og det kan vi ikke bruge til prisværdierne. Så vi ændrer dette til almindelig stil ved hjælp af plt.ticklabel_format()-funktionen.

Derefter opretter vi formateren, der viser værdierne på y-aksen med kommaer som tusinde adskillere og decimalpunkter. Den sidste kodelinje anvender dette på aksen.

Outputtet ser nu sådan ud.

 

Mestring af kunsten at rense data i Python
 

Hvordan identificerer og fjerner vi nu afvigelsen?

En af måderne er at bruge IQR-metoden.

IQR, eller Interquartile Range, er en statistisk metode, der bruges til at måle variabilitet ved at opdele et datasæt i kvartiler. Kvartiler opdeler et rangordnet datasæt i fire lige store dele, og værdier inden for området af den første kvartil (25. percentil) og den tredje kvartil (75. percentil) udgør interkvartilområdet.

Interkvartilområdet bruges til at identificere outliers i dataene. Sådan fungerer det:

  1. Beregn først den første kvartil (Q1), den tredje kvartil (Q3), og bestem derefter IQR. IQR beregnes som Q3 – Q1.
  2. Enhver værdi under Q1 – 1.5IQR eller over Q3 + 1.5IQR betragtes som en outlier.

På vores boxplot repræsenterer boksen faktisk IQR. Linjen inde i boksen er medianen (eller anden kvartil). 'Whiskers' på boxplot repræsenterer området inden for 1.5*IQR fra Q1 og Q3.

Alle datapunkter uden for disse whiskers kan betragtes som afvigende. I vores tilfælde er det værdien af ​​$12,000,000. Hvis du ser på boxplotten, vil du se, hvor tydeligt dette er repræsenteret, hvilket viser, hvorfor datavisualisering er vigtig for at detektere outliers.

Lad os nu fjerne outliers ved at bruge IQR-metoden i Python-kode. Først fjerner vi de annoncerede prisudlignere.

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

Vi beregner først den første kvartil (eller den 25. percentil) ved hjælp af kvantil() fungere. Vi gør det samme for tredje kvartil eller 75. percentil.

De viser de værdier, hvorunder henholdsvis 25 % og 75 % af dataene falder.

Derefter beregner vi forskellen mellem kvartilerne. Alt indtil videre er bare at oversætte IQR-trinene til Python-kode.

Som et sidste trin fjerner vi afvigelserne. Med andre ord, alle data mindre end Q1 – 1.5 * IQR eller mere end Q3 + 1.5 * IQR.

Operatoren '~' negerer betingelsen, så vi står kun tilbage med de data, der ikke er afvigende.

Så kan vi gøre det samme med udsalgsprisen.

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

Selvfølgelig kan du gøre det på en mere kortfattet måde ved hjælp af til løkke.

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

Løkken itererer de to kolonner. For hver kolonne beregner den IQR og fjerner derefter rækkerne i DataFrame.

Bemærk venligst, at denne handling udføres sekventielt, først for annonceret_pris og derefter for udsalgspris. Som et resultat ændres DataFrame på plads for hver kolonne, og rækker kan fjernes, fordi de er en outlier i hver kolonne. Derfor kan denne handling resultere i færre rækker, end hvis outliers for annonceret_pris og udsalgspris blev fjernet uafhængigt, og resultaterne blev kombineret efterfølgende.

I vores eksempel vil output være det samme i begge tilfælde. For at se, hvordan boksplottet ændrede sig, skal vi plotte det igen med den samme kode som tidligere.

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)

Her er outputtet.

 

Mestring af kunsten at rense data i Python
 

Du kan øve dig i at beregne percentiler i Python ved at løse Generalforsamlingens interviewspørgsmål.

Datarensning er et afgørende trin i dataanalyseprocessen. Selvom det kan være tidskrævende, er det vigtigt at sikre nøjagtigheden af ​​dine resultater.

Heldigvis gør Pythons rige økosystem af biblioteker denne proces mere overskuelig. Vi lærte, hvordan man fjerner unødvendige rækker og kolonner, omformaterer data og håndterer manglende værdier og outliers. Dette er de sædvanlige trin, der skal udføres på de fleste data. Men nogle gange bliver du også nødt til det kombinere to kolonner til én, verificere de eksisterende data, tildele etiketter til det eller slippe af med de hvide mellemrum.

Alt dette er datarensning, da det giver dig mulighed for at omdanne rodede data fra den virkelige verden til et velstruktureret datasæt, som du kan analysere med tillid. Bare sammenlign det datasæt, vi startede med, med det, vi endte med.

Hvis du ikke kan se tilfredsheden i dette resultat, og de rene data ikke gør dig underligt begejstret, hvad i alverden laver du så inden for datavidenskab!?
 

Nate Rosidi er data scientist og i produktstrategi. Han er også adjungeret professor, der underviser i analytics og er grundlæggeren af StrataScratch, en platform, der hjælper dataforskere med at forberede sig til deres interviews med rigtige interviewspørgsmål fra topvirksomheder. Forbind med ham Twitter: StrataScratch or LinkedIn.

Tidsstempel:

Mere fra KDnuggets