Mestre kunsten å rense data i Python - KDnuggets

Mestre kunsten å rense data i Python – KDnuggets

Kilde node: 2939047

Mestring av kunsten å rense data i Python
Bilde av forfatter
 

Datarensing er en kritisk del av enhver dataanalyseprosess. Det er trinnet der du fjerner feil, håndterer manglende data og sørger for at dataene dine er i et format du kan jobbe med. Uten et godt rengjort datasett kan eventuelle påfølgende analyser være skjeve eller feil.

Denne artikkelen introduserer deg til flere nøkkelteknikker for datarensing i Python, ved å bruke kraftige biblioteker som pandaer, numpy, seaborn og matplotlib.

Før vi dykker inn i mekanikken til datarensing, la oss forstå viktigheten. Data fra den virkelige verden er ofte rotete. Den kan inneholde dupliserte oppføringer, feil eller inkonsekvente datatyper, manglende verdier, irrelevante funksjoner og uteliggere. Alle disse faktorene kan føre til misvisende konklusjoner når man analyserer data. Dette gjør datarensing til en uunnværlig del av datavitenskapens livssyklus.

Vi dekker følgende datarensingsoppgaver.
 

Mestring av kunsten å rense data i Python
Bilde av forfatter

Før du begynner, la oss importere de nødvendige bibliotekene. Vi kommer til å bruke pandaer for datamanipulering, og seaborn og matplotlib for visualiseringer.

Vi vil også importere datetime Python-modulen for å manipulere datoene.

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

Først må vi laste inn dataene våre. I dette eksemplet skal vi laste en CSV-fil ved hjelp av pandaer. Vi legger også til avgrensningsargumentet.

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

Deretter er det viktig å inspisere dataene for å forstå strukturen, hva slags variabler vi jobber med, og om det mangler verdier. Siden dataene vi importerte ikke er enorme, la oss ta en titt på hele datasettet.

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

Slik ser datasettet ut.

 

Mestring av kunsten å rense data i Python
 

Du kan umiddelbart se at det mangler noen verdier. Også datoformatene er inkonsekvente.

La oss nå ta en titt på DataFrame-sammendraget ved å bruke info()-metoden.

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

Her er kodeutgangen.

 

Mestring av kunsten å rense data i Python
 

Vi kan se at bare kolonnen square_feet ikke har noen NULL-verdier, så vi må på en eller annen måte håndtere dette. Dessuten er kolonnene annonse_dato og salgsdato objektdatatypen, selv om dette skal være en dato.

Kolonneplasseringen er helt tom. Trenger vi det?

Vi viser deg hvordan du håndterer disse problemene. Vi begynner med å lære hvordan du sletter unødvendige kolonner.

Det er to kolonner i datasettet som vi ikke trenger i dataanalysen vår, så vi fjerner dem.

Den første kolonnen er kjøper. Vi trenger det ikke, siden kjøperens navn ikke påvirker analysen.

Vi bruker drop()-metoden med det angitte kolonnenavnet. Vi setter aksen til 1 for å spesifisere at vi ønsker å slette en kolonne. Dessuten er inplace-argumentet satt til True slik at vi endrer den eksisterende DataFrame, og ikke oppretter en ny DataFrame uten den fjernede kolonnen.

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

Den andre kolonnen vi ønsker å fjerne er plassering. Selv om det kan være nyttig å ha denne informasjonen, er dette en helt tom kolonne, så la oss bare fjerne den.

Vi tar samme tilnærming som med den første kolonnen.

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

Selvfølgelig kan du fjerne disse to kolonnene samtidig.

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

Begge tilnærmingene returnerer følgende dataramme.

 

Mestring av kunsten å rense data i Python

Dupliserte data kan forekomme i datasettet ditt av ulike årsaker og kan forvride analysen din.

La oss oppdage duplikatene i datasettet vårt. Slik gjør du det.

Koden nedenfor bruker metoden duplisert() å vurdere duplikater i hele datasettet. Standardinnstillingen er å betrakte den første forekomsten av en verdi som unik og de påfølgende forekomstene som duplikater. Du kan endre denne virkemåten ved å bruke держать parameter. For eksempel vil df.duplicated(keep=False) merke alle duplikater som True, inkludert den første forekomsten.

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

Her er utgangen.

 

Mestring av kunsten å rense data i Python
 

Raden med indeks 3 er merket som duplikat fordi rad 2 med de samme verdiene er dens første forekomst.

Nå må vi fjerne duplikater, noe vi gjør med følgende kode.

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

De drop_duplicates() funksjon vurderer alle kolonner mens du identifiserer duplikater. Hvis du bare vil vurdere visse kolonner, kan du sende dem som en liste til denne funksjonen slik: df.drop_duplicates(subset=[‘column1’, ‘column2’]).

 

Mestring av kunsten å rense data i Python
 

Som du kan se, har duplikatraden blitt slettet. Imidlertid forble indekseringen den samme, med indeks 3 som mangler. Vi skal rydde opp i dette ved å nullstille indekser.

df = df.reset_index(drop=True)

Denne oppgaven utføres ved å bruke reset_index() funksjon. Argumentet drop=True brukes til å forkaste den opprinnelige indeksen. Hvis du ikke inkluderer dette argumentet, vil den gamle indeksen bli lagt til som en ny kolonne i DataFrame. Ved å sette drop=True, ber du pandaer om å glemme den gamle indeksen og tilbakestille den til standard heltallsindeks.

For praksis, prøv å fjern duplikater fra dette Microsoft-datasettet.

Noen ganger kan datatyper være feil angitt. For eksempel kan en datokolonne tolkes som strenger. Du må konvertere disse til passende typer.

I datasettet vårt gjør vi det for kolonnene annonse_dato og salgsdato, ettersom de vises som objektdatatypen. Dato-datoene er også formatert forskjellig på tvers av radene. Vi må gjøre det konsistent, sammen med å konvertere det til dato.

Den enkleste måten er å bruke to_datetime() metode. Igjen, du kan gjøre det kolonne for kolonne, som vist nedenfor.

Når vi gjør det, setter vi dayfirst-argumentet til True fordi noen 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 kolonnene samtidig ved å bruke søke om() 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 tilnærmingene gir deg det samme resultatet.

 

Mestring av kunsten å rense data i Python
 

Nå er datoene i et konsistent format. Vi ser at ikke alle data er konvertert. Det er én NaT-verdi i annonse_dato og to i salgsdato. Dette betyr at datoen mangler.

La oss sjekke om kolonnene er konvertert til datoer ved å bruke info () metoden.

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

 

Mestring av kunsten å rense data i Python
 

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

Prøv nå å konvertere dataene fra TEXT til NUMERIC i denne Airbnb datasett.

Datasett fra den virkelige verden har ofte manglende verdier. Håndtering av manglende data er viktig, siden visse algoritmer ikke kan håndtere slike verdier.

Eksemplet vårt har også noen manglende verdier, så la oss ta en titt på de to mest vanlige tilnærmingene til å håndtere manglende data.

Sletting av rader med manglende verdier

Hvis antallet rader med manglende data er ubetydelig sammenlignet med det totale antallet observasjoner, kan du vurdere å slette disse radene.

I vårt eksempel har den siste raden ingen verdier bortsett fra kvadratfot og annonsedato. Vi kan ikke bruke slike data, så la oss fjerne denne raden.

Her er koden der vi angir radens indeks.

df = df.drop(8)

DataFrame ser nå slik ut.

 

Mestring av kunsten å rense data i Python
 

Den siste raden er slettet, og vår DataFrame ser nå bedre ut. Imidlertid er det fortsatt noen manglende data som vi vil håndtere ved hjelp av en annen tilnærming.

Imputering av manglende verdier

Hvis du har betydelige manglende data, kan en bedre strategi enn å slette være imputering. Denne prosessen innebærer å fylle ut manglende verdier basert på andre data. For numeriske data involverer vanlige imputeringsmetoder bruk av et mål på sentral tendens (gjennomsnitt, median, modus).

I vår allerede endrede DataFrame har vi NaT-verdier (Not a Time) i kolonnene annonse_dato og salgsdato. Vi tilskriver disse manglende verdiene ved å bruke mener() metoden.

Koden bruker fillna() metode for å finne og fylle nullverdiene med middelverdien.

# 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å gjøre det samme i én kodelinje. Vi bruker søke om() for å bruke funksjonen som er definert ved hjelp av lambda. Samme som ovenfor, denne funksjonen bruker fillna() og mener() metoder for å fylle inn de manglende verdiene.

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

Utgangen i begge tilfeller ser slik ut.

 

Mestring av kunsten å rense data i Python
 

Sale_date-kolonnen vår har nå tider som vi ikke trenger. La oss fjerne dem.

Vi bruker strftime () metode, som konverterer datoene til deres strengrepresentasjon og et spesifikt format.

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

 

Mestring av kunsten å rense data i Python
 

Datoene ser nå helt ryddige ut.

Hvis du trenger å bruke strftime () på flere kolonner, kan du igjen bruke lambda på følgende måte.

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

La oss nå se hvordan vi kan tilskrive manglende kategoriske verdier.

Kategoriske data er en type data som brukes til å gruppere informasjon med lignende egenskaper. Hver av disse gruppene er en kategori. Kategoriske data kan ha numeriske verdier (som "1" som indikerer "mann" og "2" som indikerer "kvinne"), men disse tallene har ikke matematisk betydning. Du kan for eksempel ikke legge dem sammen.

Kategoriske data er vanligvis delt inn i to kategorier:

  1. Nominelle data: Dette er når kategoriene bare er merket og ikke kan ordnes i noen bestemt rekkefølge. Eksempler inkluderer kjønn (mann, kvinne), blodtype (A, B, AB, O) eller farge (rød, grønn, blå).
  1. Ordinære data: Dette er når kategoriene kan bestilles eller rangeres. Mens intervallene mellom kategoriene ikke er like fordelt, har rekkefølgen av kategoriene en betydning. Eksempler inkluderer vurderingsskalaer (1 til 5 vurdering av en film), et utdanningsnivå (videregående skole, lavere grad, graduate) eller stadier av kreft (trinn I, trinn II, trinn III).

For å tilskrive manglende kategoriske data, brukes vanligvis modusen. I vårt eksempel er kolonnen property_category kategoriske (nominelle) data, og det mangler data i to rader.

La oss erstatte de manglende verdiene med modus.

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

Denne koden bruker fillna() funksjon for å erstatte alle NaN-verdiene i kolonnen egenskapskategori. Den erstatter den med modus.

I tillegg brukes [0]-delen til å trekke ut den første verdien fra denne serien. Hvis det er flere moduser, vil dette velge den første. Hvis det bare er én modus, fungerer den fortsatt bra.

Her er utgangen.

 

Mestring av kunsten å rense data i Python
 

Dataene ser nå ganske bra ut. Det eneste som gjenstår er å se om det er uteliggere.

Du kan øve på å håndtere null på dette Meta intervju spørsmål, hvor du må erstatte NULL med nuller.

Outliers er datapunkter i et datasett som er tydelig forskjellige fra de andre observasjonene. De kan ligge eksepsjonelt langt fra de andre verdiene i datasettet, og ligge utenfor et overordnet mønster. De anses som uvanlige på grunn av at verdiene deres enten er betydelig høyere eller lavere sammenlignet med resten av dataene.

Outliers kan oppstå på grunn av ulike årsaker som:

  • Måle- eller inndatafeil
  • Datakorrupsjon
  • Ekte statistiske anomalier

Outliers kan påvirke resultatene av dataanalysen og statistisk modellering betydelig. De kan føre til en skjev fordeling, skjevhet eller ugyldiggjøre de underliggende statistiske antakelsene, forvrenge den estimerte modelltilpasningen, redusere den prediktive nøyaktigheten til prediktive modeller og føre til uriktige konklusjoner.

Noen ofte brukte metoder for å oppdage uteliggere er Z-score, IQR (Interquartile Range), boksplott, spredningsplott og datavisualiseringsteknikker. I noen avanserte tilfeller brukes også maskinlæringsmetoder.

Visualisering av data kan bidra til å identifisere uteliggere. Seaborns boksplott er nyttig for dette.

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

Vi bruker plt.figure() for å angi bredden og høyden på figuren i tommer.

Deretter lager vi boxplotten for kolonnene annonsert_pris og salgspris, som ser slik ut.

 

Mestring av kunsten å rense data i Python
 

Plottet kan forbedres for enklere bruk ved å legge dette til koden ovenfor.

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 bruker koden ovenfor for å sette etikettene for begge aksene. Vi legger også merke til at verdiene på y-aksen er i den vitenskapelige notasjonen, og vi kan ikke bruke det for prisverdiene. Så vi endrer dette til vanlig stil ved å bruke plt.ticklabel_format()-funksjonen.

Deretter lager vi formateringsverktøyet som vil vise verdiene på y-aksen med komma som tusen skilletegn og desimalpunkter. Den siste kodelinjen bruker dette på aksen.

Utgangen ser nå slik ut.

 

Mestring av kunsten å rense data i Python
 

Nå, hvordan identifiserer og fjerner vi uteliggeren?

En av måtene er å bruke IQR-metoden.

IQR, eller Interquartile Range, er en statistisk metode som brukes til å måle variabilitet ved å dele et datasett i kvartiler. Kvartiler deler et rangordnet datasett i fire like deler, og verdier innenfor området for den første kvartilen (25. persentil) og den tredje kvartilen (75. persentilen) utgjør interkvartilområdet.

Interkvartilområdet brukes til å identifisere uteliggere i dataene. Slik fungerer det:

  1. Beregn først den første kvartilen (Q1), den tredje kvartilen (Q3), og bestem deretter IQR. IQR beregnes som Q3 – Q1.
  2. Enhver verdi under Q1 – 1.5IQR eller over Q3 + 1.5IQR regnes som en uteligger.

På boksplottet vårt representerer boksen faktisk IQR. Linjen inne i boksen er medianen (eller andre kvartil). 'Mærhårene' på boksplottet representerer området innenfor 1.5*IQR fra Q1 og Q3.

Eventuelle datapunkter utenfor disse værhårene kan betraktes som uteliggere. I vårt tilfelle er det verdien av $12,000,000 XNUMX XNUMX. Hvis du ser på boksplotten, vil du se hvor tydelig dette er representert, noe som viser hvorfor datavisualisering er viktig for å oppdage uteliggere.

La oss nå fjerne avvikene ved å bruke IQR-metoden i Python-kode. Først fjerner vi de annonserte prisavvikene.

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 kvartilen (eller den 25. persentilen) ved å bruke kvantil() funksjon. Vi gjør det samme for tredje kvartil eller 75. persentil.

De viser verdiene som henholdsvis 25 % og 75 % av dataene faller under.

Så regner vi ut forskjellen mellom kvartilene. Alt så langt er bare å oversette IQR-trinnene til Python-kode.

Som et siste skritt fjerner vi ytterpunktene. Med andre ord, alle data mindre enn Q1 – 1.5 * IQR eller mer enn Q3 + 1.5 * IQR.

'~'-operatoren negerer betingelsen, så vi sitter igjen med bare dataene som ikke er uteliggere.

Da kan vi gjøre det samme med utsalgsprisen.

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 gjøre det på en mer kortfattet måte ved å bruke for sløyfe.

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 kolonnene. For hver kolonne beregner den IQR og fjerner deretter radene i DataFrame.

Vær oppmerksom på at denne operasjonen gjøres sekvensielt, først for annonsert_pris og deretter for salgspris. Som et resultat blir DataFrame modifisert på plass for hver kolonne, og rader kan fjernes på grunn av at de er en uteligger i hver kolonne. Derfor kan denne operasjonen resultere i færre rader enn hvis uteliggere for annonsert_pris og salgspris ble fjernet uavhengig og resultatene ble kombinert etterpå.

I vårt eksempel vil utgangen være den samme i begge tilfeller. For å se hvordan boksplottet endret seg, må vi plotte det igjen med 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 utgangen.

 

Mestring av kunsten å rense data i Python
 

Du kan øve på å beregne persentiler i Python ved å løse Generalforsamlingens intervjuspørsmål.

Datarensing er et avgjørende trinn i dataanalyseprosessen. Selv om det kan være tidkrevende, er det viktig å sikre nøyaktigheten av funnene dine.

Heldigvis gjør Pythons rike økosystem av biblioteker denne prosessen mer håndterbar. Vi lærte hvordan vi fjerner unødvendige rader og kolonner, formaterer data på nytt og håndterer manglende verdier og uteliggere. Dette er de vanlige trinnene som må utføres på de fleste data. Imidlertid må du også noen ganger kombinere to kolonner til én, verifisere eksisterende data, tilordne etiketter til deneller bli kvitt de hvite mellomrommene.

Alt dette er datarensing, siden det lar deg gjøre rotete, virkelige data til et godt strukturert datasett som du kan analysere med selvtillit. Bare sammenlign datasettet vi startet med med det vi endte opp med.

Hvis du ikke ser tilfredsheten i dette resultatet og de rene dataene ikke gjør deg merkelig begeistret, hva i all verden gjør du innen datavitenskap!?
 

Nate Rosidi er dataviter og innen produktstrategi. Han er også adjungert professor som underviser i analyse, og er grunnleggeren av StrataScratch, en plattform som hjelper dataforskere med å forberede seg til intervjuene sine med ekte intervjuspørsmål fra toppbedrifter. Ta kontakt med ham Twitter: StrataScratch or Linkedin.

Tidstempel:

Mer fra KDnuggets