Beheers de kunst van het opschonen van gegevens in Python - KDnuggets

Beheersing van de kunst van het opschonen van gegevens in Python – KDnuggets

Bronknooppunt: 2939047

Beheersing van de kunst van het opschonen van gegevens in Python
Afbeelding door auteur
 

Het opschonen van gegevens is een cruciaal onderdeel van elk gegevensanalyseproces. Het is de stap waarin u fouten verwijdert, ontbrekende gegevens verwerkt en ervoor zorgt dat uw gegevens een indeling hebben waarmee u kunt werken. Zonder een goed opgeschoonde dataset kunnen eventuele daaropvolgende analyses scheef of onjuist zijn.

In dit artikel maak je kennis met verschillende belangrijke technieken voor het opschonen van gegevens in Python, waarbij gebruik wordt gemaakt van krachtige bibliotheken zoals pandas, numpy, seaborn en matplotlib.

Voordat we ingaan op de werking van het opschonen van gegevens, moeten we eerst het belang ervan begrijpen. Gegevens uit de echte wereld zijn vaak rommelig. Het kan dubbele vermeldingen, onjuiste of inconsistente gegevenstypen, ontbrekende waarden, irrelevante kenmerken en uitschieters bevatten. Al deze factoren kunnen leiden tot misleidende conclusies bij het analyseren van gegevens. Dit maakt het opschonen van data een onmisbaar onderdeel van de data science-levenscyclus.

We behandelen de volgende taken voor het opschonen van gegevens.
 

Beheersing van de kunst van het opschonen van gegevens in Python
Afbeelding door auteur

Laten we, voordat we beginnen, de benodigde bibliotheken importeren. We zullen panda's gebruiken voor gegevensmanipulatie, en seaborn en matplotlib voor visualisaties.

We zullen ook de datetime Python-module importeren voor het manipuleren van de datums.

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

Eerst moeten we onze gegevens laden. In dit voorbeeld gaan we een CSV-bestand laden met panda's. We voegen ook het scheidingstekenargument toe.

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

Vervolgens is het belangrijk om de gegevens te inspecteren om de structuur ervan te begrijpen, met wat voor soort variabelen we werken en of er ontbrekende waarden zijn. Omdat de gegevens die we hebben geïmporteerd niet enorm zijn, laten we de hele dataset eens bekijken.

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

Zo ziet de dataset eruit.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Je kunt meteen zien dat er enkele ontbrekende waarden zijn. Ook zijn de datumnotaties inconsistent.

Laten we nu eens kijken naar de DataFrame-samenvatting met behulp van de info() -methode.

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

Hier is de code-uitvoer.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

We kunnen zien dat alleen de kolom square_feet geen NULL-waarden heeft, dus we zullen dit op de een of andere manier moeten afhandelen. Bovendien zijn de kolommen advertentie_datum en verkoopdatum het objectgegevenstype, ook al zou dit een datum moeten zijn.

De kolomlocatie is volledig leeg. Hebben we het nodig?

Wij laten u zien hoe u met deze problemen om kunt gaan. We beginnen met te leren hoe u onnodige kolommen kunt verwijderen.

Er zijn twee kolommen in de dataset die we niet nodig hebben in onze data-analyse, dus we zullen ze verwijderen.

De eerste kolom is koper. We hebben het niet nodig, omdat de naam van de koper geen invloed heeft op de analyse.

We gebruiken de methode drop() met de opgegeven kolomnaam. We stellen de as in op 1 om aan te geven dat we een kolom willen verwijderen. Bovendien wordt het argument inplace ingesteld op True, zodat we het bestaande DataFrame wijzigen en geen nieuw DataFrame maken zonder de verwijderde kolom.

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

De tweede kolom die we willen verwijderen is locatie. Hoewel het nuttig kan zijn om deze informatie te hebben, is dit een volledig lege kolom, dus laten we deze gewoon verwijderen.

We hanteren dezelfde aanpak als bij de eerste kolom.

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

Uiteraard kunt u deze twee kolommen tegelijkertijd verwijderen.

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

Beide benaderingen retourneren het volgende dataframe.

 

Beheersing van de kunst van het opschonen van gegevens in Python

Er kunnen om verschillende redenen dubbele gegevens in uw dataset voorkomen, waardoor uw analyse vertekend kan worden.

Laten we de duplicaten in onze dataset detecteren. Hier leest u hoe u het moet doen.

De onderstaande code gebruikt de methode gedupliceerd() om duplicaten in de hele dataset te overwegen. De standaardinstelling is om de eerste keer dat een waarde voorkomt als uniek te beschouwen en de daaropvolgende exemplaren als duplicaten. U kunt dit gedrag wijzigen met behulp van de houden parameter. Df.duplicated(keep=False) markeert bijvoorbeeld alle duplicaten als True, inclusief de eerste keer dat deze voorkomt.

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

Hier is de uitvoer.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

De rij met index 3 is als duplicaat gemarkeerd omdat rij 2 met dezelfde waarden de eerste keer voorkomt.

Nu moeten we duplicaten verwijderen, wat we doen met de volgende code.

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

De drop_duplicates() functie houdt rekening met alle kolommen en identificeert duplicaten. Als u alleen met bepaalde kolommen rekening wilt houden, kunt u deze als lijst als volgt aan deze functie doorgeven: df.drop_duplicates(subset=['column1', 'column2']).

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Zoals u kunt zien, is de dubbele rij verwijderd. De indexering bleef echter hetzelfde, waarbij index 3 ontbrak. We ruimen dit op door de indexen opnieuw in te stellen.

df = df.reset_index(drop=True)

Deze taak wordt uitgevoerd met behulp van de reset_index() functie. Het argument drop=True wordt gebruikt om de oorspronkelijke index te verwijderen. Als u dit argument niet opneemt, wordt de oude index als nieuwe kolom aan uw DataFrame toegevoegd. Door drop=True in te stellen, vertel je panda's dat ze de oude index moeten vergeten en deze opnieuw moeten instellen op de standaard geheeltallige index.

Probeer het voor de praktijk verwijder duplicaten uit deze Microsoft-gegevensset.

Soms zijn gegevenstypen onjuist ingesteld. Een datumkolom kan bijvoorbeeld worden geïnterpreteerd als tekenreeksen. U moet deze naar de juiste typen converteren.

In onze dataset doen we dat voor de kolommen advertentiedatum en verkoopdatum, omdat deze worden weergegeven als het objectgegevenstype. Bovendien worden de datumdatums in de rijen verschillend opgemaakt. We moeten het consistent maken en het naar de huidige tijd converteren.

De gemakkelijkste manier is om de to_datetime() methode. Nogmaals, u kunt dat kolom voor kolom doen, zoals hieronder weergegeven.

Wanneer we dat doen, stellen we het dayfirst-argument in op True, omdat sommige datums beginnen met de eerste dag.

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

U kunt beide kolommen ook tegelijkertijd converteren met behulp van de van toepassing zijn() methode met 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)

Beide benaderingen geven hetzelfde resultaat.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Nu hebben de datums een consistent formaat. We zien dat niet alle gegevens zijn geconverteerd. Er staat één NaT-waarde in advertentiedatum en twee in verkoopdatum. Dit betekent dat de datum ontbreekt.

Laten we controleren of de kolommen naar datums worden geconverteerd met behulp van de info () methode.

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

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Zoals u kunt zien, hebben beide kolommen niet het datetime64[ns]-formaat.

Probeer nu de gegevens hierin van TEKST naar NUMERIEK te converteren Airbnb-dataset.

Real-world datasets bevatten vaak ontbrekende waarden. Het omgaan met ontbrekende gegevens is van cruciaal belang, omdat bepaalde algoritmen dergelijke waarden niet aankunnen.

Ons voorbeeld bevat ook enkele ontbrekende waarden, dus laten we eens kijken naar de twee meest gebruikelijke benaderingen voor het omgaan met ontbrekende gegevens.

Rijen met ontbrekende waarden verwijderen

Als het aantal rijen met ontbrekende gegevens onbeduidend is in vergelijking met het totale aantal waarnemingen, kunt u overwegen deze rijen te verwijderen.

In ons voorbeeld heeft de laatste rij geen waarden behalve het aantal vierkante meters en de advertentiedatum. We kunnen dergelijke gegevens niet gebruiken, dus laten we deze rij verwijderen.

Hier is de code waarin we de index van de rij aangeven.

df = df.drop(8)

Het DataFrame ziet er nu zo uit.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

De laatste rij is verwijderd en ons DataFrame ziet er nu beter uit. Er zijn echter nog enkele ontbrekende gegevens die we op een andere manier zullen aanpakken.

Ontbrekende waarden toeschrijven

Als er aanzienlijke ontbrekende gegevens zijn, kan imputatie een betere strategie zijn dan verwijderen. Dit proces omvat het invullen van ontbrekende waarden op basis van andere gegevens. Voor numerieke gegevens omvatten gebruikelijke imputatiemethoden het gebruik van een maatstaf voor de centrale tendens (gemiddelde, mediaan, modus).

In ons reeds gewijzigde DataFrame hebben we NaT-waarden (Not a Time) in de kolommen advertentie_datum en verkoopdatum. We imputeren deze ontbrekende waarden met behulp van de gemeen() methode.

De code maakt gebruik van de vulna() methode om de nulwaarden te vinden en te vullen met de gemiddelde waarde.

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

Je kunt hetzelfde ook doen in één regel code. Wij gebruiken de van toepassing zijn() om de functie toe te passen die is gedefinieerd met lambda. Hetzelfde als hierboven, deze functie gebruikt de vulna() en gemeen() methoden om de ontbrekende waarden in te vullen.

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

De uitvoer ziet er in beide gevallen als volgt uit.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Onze kolom sale_date bevat nu tijden die we niet nodig hebben. Laten we ze verwijderen.

We gebruiken de strftime () methode, die de datums converteert naar hun tekenreeksrepresentatie en een specifiek formaat.

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

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

De data zien er nu allemaal netjes uit.

Als u strftime () op meerdere kolommen kunt u opnieuw gebruiken lambda de volgende manier.

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

Laten we nu eens kijken hoe we ontbrekende categorische waarden kunnen toeschrijven.

Categorische gegevens zijn een soort gegevens die worden gebruikt om informatie met vergelijkbare kenmerken te groeperen. Elk van deze groepen is een categorie. Categorische gegevens kunnen numerieke waarden aannemen (zoals ‘1’ die ‘mannelijk’ aangeeft en ‘2’ die ‘vrouwelijk’ aangeeft), maar die getallen hebben geen wiskundige betekenis. Je kunt ze bijvoorbeeld niet bij elkaar optellen.

Categorische gegevens worden doorgaans in twee categorieën verdeeld:

  1. Nominale gegevens: Dit is wanneer de categorieën alleen gelabeld zijn en niet in een bepaalde volgorde kunnen worden gerangschikt. Voorbeelden hiervan zijn geslacht (man, vrouw), bloedgroep (A, B, AB, O) of kleur (rood, groen, blauw).
  1. Ordinale gegevens: Dit is het moment waarop de categorieën kunnen worden geordend of gerangschikt. Hoewel de intervallen tussen de categorieën niet gelijkmatig verdeeld zijn, heeft de volgorde van de categorieën een betekenis. Voorbeelden hiervan zijn beoordelingsschalen (beoordeling van 1 tot 5 voor een film), een opleidingsniveau (middelbare school, bachelor, afgestudeerd) of stadia van kanker (fase I, fase II, fase III).

Voor het toeschrijven van ontbrekende categorische gegevens wordt doorgaans de modus gebruikt. In ons voorbeeld bestaat de kolom property_category uit categorische (nominale) gegevens en ontbreken er gegevens in twee rijen.

Laten we de ontbrekende waarden vervangen door mode.

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

Deze code gebruikt de vulna() functie om alle NaN-waarden in de kolom property_category te vervangen. Het vervangt het door modus.

Bovendien wordt het deel [0] gebruikt om de eerste waarde uit deze serie te extraheren. Als er meerdere modi zijn, wordt de eerste geselecteerd. Als er maar één modus is, werkt deze nog steeds prima.

Hier is de uitvoer.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

De gegevens zien er nu redelijk goed uit. Het enige dat overblijft is kijken of er uitschieters zijn.

Hierop kunt u oefenen met het omgaan met nulwaarden Meta-interviewvraag, waar u NULL's moet vervangen door nullen.

Uitbijters zijn datapunten in een dataset die duidelijk verschillen van de andere waarnemingen. Ze kunnen uitzonderlijk ver verwijderd liggen van de andere waarden in de dataset en buiten een algemeen patroon liggen. Ze worden als ongebruikelijk beschouwd omdat hun waarden aanzienlijk hoger of lager zijn in vergelijking met de rest van de gegevens.

Uitschieters kunnen verschillende oorzaken hebben, zoals:

  • Meet- of invoerfouten
  • Data corruptie
  • Echte statistische afwijkingen

Uitschieters kunnen een aanzienlijke impact hebben op de resultaten van uw data-analyse en statistische modellering. Ze kunnen leiden tot een scheve verdeling, vertekening of ontkrachting van de onderliggende statistische aannames, de geschatte fit van het model vertekenen, de voorspellende nauwkeurigheid van voorspellende modellen verminderen en tot onjuiste conclusies leiden.

Enkele veelgebruikte methoden om uitbijters te detecteren zijn Z-score, IQR (Interkwartielbereik), boxplots, spreidingsdiagrammen en datavisualisatietechnieken. In sommige geavanceerde gevallen worden ook machine learning-methoden gebruikt.

Het visualiseren van gegevens kan helpen bij het identificeren van uitschieters. De boxplot van Seaborn is hiervoor handig.

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

We gebruiken plt.figure() om de breedte en hoogte van het figuur in inches in te stellen.

Vervolgens maken we de boxplot voor de kolommen geadverteerde_prijs en uitverkoopprijs, die er als volgt uitziet.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

De plot kan worden verbeterd voor eenvoudiger gebruik door dit aan de bovenstaande code toe te voegen.

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)

We gebruiken de bovenstaande code om de labels voor beide assen in te stellen. We merken ook dat de waarden op de y-as in de wetenschappelijke notatie staan, en dat kunnen we niet gebruiken voor de prijswaarden. Dus veranderen we dit in gewone stijl met behulp van de plt.ticklabel_format() functie.

Vervolgens maken we de formatter die de waarden op de y-as toont met komma's als scheidingstekens voor duizendtallen en decimale punten. De laatste coderegel past dit toe op de as.

De uitvoer ziet er nu zo uit.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Hoe identificeren en verwijderen we de uitbijter?

Eén van de manieren is het gebruik van de IQR-methode.

IQR, of Interquartile Range, is een statistische methode die wordt gebruikt om de variabiliteit te meten door een dataset in kwartielen te verdelen. Kwartielen verdelen een gerangschikte dataset in vier gelijke delen, en waarden binnen het bereik van het eerste kwartiel (25e percentiel) en het derde kwartiel (75e percentiel) vormen het interkwartielbereik.

Het interkwartielbereik wordt gebruikt om uitbijters in de gegevens te identificeren. Dit is hoe het werkt:

  1. Bereken eerst het eerste kwartiel (Q1), het derde kwartiel (Q3) en bepaal vervolgens de IQR. De IQR wordt berekend als Q3 – Q1.
  2. Elke waarde onder Q1 – 1.5IQR of boven Q3 + 1.5IQR wordt als een uitbijter beschouwd.

Op onze boxplot vertegenwoordigt de box feitelijk de IQR. De lijn binnen de box is de mediaan (of het tweede kwartiel). De 'snorharen' van de boxplot vertegenwoordigen het bereik binnen 1.5*IQR van Q1 en Q3.

Alle gegevenspunten buiten deze snorharen kunnen als uitbijters worden beschouwd. In ons geval is het de waarde van $12,000,000. Als je naar de boxplot kijkt, zie je hoe duidelijk dit wordt weergegeven, wat laat zien waarom datavisualisatie belangrijk is bij het detecteren van uitschieters.

Laten we nu de uitschieters verwijderen door de IQR-methode in Python-code te gebruiken. Eerst verwijderen we de geadverteerde prijsuitschieters.

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

We berekenen eerst het eerste kwartiel (of het 25e percentiel) met behulp van de kwantiel() functie. Hetzelfde doen we voor het derde kwartiel of het 75e percentiel.

Ze tonen de waarden waaronder respectievelijk 25% en 75% van de gegevens vallen.

Vervolgens berekenen we het verschil tussen de kwartielen. Alles tot nu toe is alleen maar het vertalen van de IQR-stappen naar Python-code.

Als laatste stap verwijderen we de uitschieters. Met andere woorden: alle gegevens kleiner dan Q1 – 1.5 * IQR of meer dan Q3 + 1.5 * IQR.

De operator '~' negeert de voorwaarde, zodat we alleen de gegevens overhouden die geen uitschieters zijn.

Dan kunnen we hetzelfde doen met de verkoopprijs.

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

Je kunt het natuurlijk op een beknoptere manier doen met behulp van de for loop.

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

De lus herhaalt de twee kolommen. Voor elke kolom berekent het de IQR en verwijdert vervolgens de rijen in het DataFrame.

Houd er rekening mee dat deze bewerking opeenvolgend wordt uitgevoerd, eerst voor geadverteerde_prijs en vervolgens voor verkoopprijs. Als gevolg hiervan wordt het DataFrame voor elke kolom ter plaatse aangepast en kunnen rijen worden verwijderd omdat ze in een van beide kolommen een uitschieter zijn. Daarom kan deze bewerking resulteren in minder rijen dan wanneer de uitschieters voor de geadverteerde_prijs en de uitverkoopprijs onafhankelijk van elkaar zouden worden verwijderd en de resultaten daarna zouden worden gecombineerd.

In ons voorbeeld zal de uitvoer in beide gevallen hetzelfde zijn. Om te zien hoe de boxplot is veranderd, moeten we deze opnieuw plotten met dezelfde code als eerder.

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)

Hier is de uitvoer.

 

Beheersing van de kunst van het opschonen van gegevens in Python
 

Je kunt oefenen met het berekenen van percentielen in Python door het oplossen van de Interviewvraag Algemene Vergadering.

Het opschonen van gegevens is een cruciale stap in het gegevensanalyseproces. Hoewel het tijdrovend kan zijn, is het essentieel om de nauwkeurigheid van uw bevindingen te garanderen.

Gelukkig maakt Pythons rijke ecosysteem van bibliotheken dit proces beter beheersbaar. We hebben geleerd hoe we onnodige rijen en kolommen kunnen verwijderen, gegevens opnieuw kunnen formatteren en hoe we met ontbrekende waarden en uitschieters kunnen omgaan. Dit zijn de gebruikelijke stappen die op vrijwel alle gegevens moeten worden uitgevoerd. Soms is het echter ook nodig combineer twee kolommen tot één, verifieer de bestaande gegevens, wijs er labels aan toeof verwijder de witte ruimtes.

Dit alles is het opschonen van gegevens, omdat u rommelige gegevens uit de echte wereld kunt omzetten in een goed gestructureerde dataset die u met vertrouwen kunt analyseren. Vergelijk gewoon de dataset waarmee we zijn begonnen met degene waarmee we zijn geëindigd.

Als je de voldoening niet ziet in dit resultaat en de schone data je niet vreemd enthousiast maken, wat doe je dan in hemelsnaam in data science!?
 

Nate Rosidi is een datawetenschapper en in productstrategie. Hij is ook een adjunct-professor onderwijsanalyse en is de oprichter van StrataScratch, een platform dat datawetenschappers helpt bij het voorbereiden van hun interviews met echte interviewvragen van topbedrijven. Maak contact met hem op Twitter: StrataScratch or LinkedIn.

Tijdstempel:

Meer van KDnuggets