Stăpânirea artei curățării datelor în Python - KDnuggets

Stăpânirea artei curățării datelor în Python – KDnuggets

Nodul sursă: 2939047

Stăpânirea artei curățării datelor în Python
Imagine de autor
 

Curățarea datelor este o parte critică a oricărui proces de analiză a datelor. Este pasul în care eliminați erorile, gestionați datele lipsă și vă asigurați că datele dvs. sunt într-un format cu care puteți lucra. Fără un set de date bine curățat, orice analiză ulterioară poate fi denaturată sau incorectă.

Acest articol vă prezintă câteva tehnici cheie pentru curățarea datelor în Python, folosind biblioteci puternice precum panda, numpy, seaborn și matplotlib.

Înainte de a ne scufunda în mecanica curățării datelor, să înțelegem importanța acesteia. Datele din lumea reală sunt adesea dezordonate. Poate conține intrări duplicat, tipuri de date incorecte sau inconsecvente, valori lipsă, caracteristici irelevante și valori aberante. Toți acești factori pot duce la concluzii înșelătoare atunci când se analizează datele. Acest lucru face ca curățarea datelor să fie o parte indispensabilă a ciclului de viață al științei datelor.

Vom acoperi următoarele sarcini de curățare a datelor.
 

Stăpânirea artei curățării datelor în Python
Imagine de autor

Înainte de a începe, să importăm bibliotecile necesare. Vom folosi panda pentru manipularea datelor și seaborn și matplotlib pentru vizualizări.

Vom importa, de asemenea, modulul datetime Python pentru manipularea datelor.

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

În primul rând, va trebui să ne încărcăm datele. În acest exemplu, vom încărca un fișier CSV folosind panda. Adăugăm și argumentul delimitator.

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

În continuare, este important să inspectăm datele pentru a înțelege structura lor, cu ce fel de variabile lucrăm și dacă lipsesc valori. Deoarece datele pe care le-am importat nu sunt uriașe, să aruncăm o privire asupra întregului set de date.

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

Iată cum arată setul de date.

 

Stăpânirea artei curățării datelor în Python
 

Puteți vedea imediat că lipsesc niște valori. De asemenea, formatele de date sunt inconsecvente.

Acum, să aruncăm o privire la rezumatul DataFrame folosind metoda info().

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

Iată rezultatul codului.

 

Stăpânirea artei curățării datelor în Python
 

Putem vedea că numai coloana square_feet nu are nicio valoare NULL, așa că va trebui cumva să ne ocupăm de asta. De asemenea, coloanele advert_date și sales_date sunt tipul de date obiect, chiar dacă aceasta ar trebui să fie o dată.

Locația coloanei este complet goală. Avem nevoie de ea?

Vă vom arăta cum să gestionați aceste probleme. Vom începe prin a învăța cum să ștergem coloanele inutile.

Există două coloane în setul de date de care nu avem nevoie în analiza noastră de date, așa că le vom elimina.

Prima coloană este cumpărătorul. Nu avem nevoie de el, deoarece numele cumpărătorului nu afectează analiza.

Folosim metoda drop() cu numele de coloană specificat. Setăm axa la 1 pentru a specifica că dorim să ștergem o coloană. De asemenea, argumentul inplace este setat la True, astfel încât să modificăm DataFrame existent și să nu creăm un nou DataFrame fără coloana eliminată.

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

A doua coloană pe care vrem să o eliminăm este locația. Deși ar putea fi util să aveți aceste informații, aceasta este o coloană complet goală, așa că să o eliminăm.

Luăm aceeași abordare ca și în prima coloană.

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

Desigur, puteți elimina aceste două coloane simultan.

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

Ambele abordări returnează următorul cadru de date.

 

Stăpânirea artei curățării datelor în Python

Datele duplicate pot apărea în setul dvs. de date din diverse motive și vă pot denatura analiza.

Să detectăm duplicatele din setul nostru de date. Iată cum să o faci.

Codul de mai jos folosește metoda duplicat() pentru a lua în considerare duplicatele în întregul set de date. Setarea sa implicită este de a considera prima apariție a unei valori ca fiind unică și aparițiile ulterioare ca duplicate. Puteți modifica acest comportament utilizând păstra parametru. De exemplu, df.duplicated(keep=False) ar marca toate duplicatele ca True, inclusiv prima apariție.

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

Iată rezultatul.

 

Stăpânirea artei curățării datelor în Python
 

Rândul cu indicele 3 a fost marcat ca duplicat deoarece rândul 2 cu aceleași valori este prima sa apariție.

Acum trebuie să eliminăm duplicatele, ceea ce facem cu următorul cod.

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

drop_duplicates() funcția ia în considerare toate coloanele în timp ce identifică duplicatele. Dacă doriți să luați în considerare doar anumite coloane, le puteți transmite ca listă acestei funcții astfel: df.drop_duplicates(subset=['coloana1', 'coloana2']).

 

Stăpânirea artei curățării datelor în Python
 

După cum puteți vedea, rândul duplicat a fost eliminat. Cu toate acestea, indexarea a rămas aceeași, indicele 3 lipsește. Vom rezolva acest lucru prin resetarea indicilor.

df = df.reset_index(drop=True)

Această sarcină este efectuată utilizând reset_index() funcţie. Argumentul drop=True este folosit pentru a elimina indexul original. Dacă nu includeți acest argument, vechiul index va fi adăugat ca o coloană nouă în DataFrame. Prin setarea drop=True, le spuneți pandalor să uite vechiul index și să-l resetați la indexul întreg implicit.

Pentru practică, încercați eliminați duplicatele din acest set de date Microsoft.

Uneori, tipurile de date pot fi setate incorect. De exemplu, o coloană de dată poate fi interpretată ca șiruri de caractere. Trebuie să le convertiți în tipurile corespunzătoare.

În setul nostru de date, vom face asta pentru coloanele advert_date și sale_date, deoarece acestea sunt afișate ca tip de date obiect. De asemenea, datele date sunt formatate diferit pe rând. Trebuie să o facem consecventă, împreună cu convertirea la zi.

Cea mai ușoară modalitate este de a folosi to_datetime() metodă. Din nou, puteți face acest lucru coloană cu coloană, așa cum se arată mai jos.

Când facem asta, setăm argumentul dayfirst la True, deoarece unele date încep cu ziua prima.

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

Puteți, de asemenea, să convertiți ambele coloane în același timp utilizând aplica() metoda cu 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)

Ambele abordări vă oferă același rezultat.

 

Stăpânirea artei curățării datelor în Python
 

Acum datele sunt într-un format consistent. Vedem că nu toate datele au fost convertite. Există o valoare NaT în advert_date și două în sale_date. Aceasta înseamnă că lipsește data.

Să verificăm dacă coloanele sunt convertite în date utilizând info () metodă.

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

 

Stăpânirea artei curățării datelor în Python
 

După cum puteți vedea, ambele coloane nu sunt în format datetime64[ns].

Acum, încercați să convertiți datele din TEXT în NUMERIC Setul de date Airbnb.

Seturile de date din lumea reală au adesea valori lipsă. Gestionarea datelor lipsă este vitală, deoarece anumiți algoritmi nu pot gestiona astfel de valori.

Exemplul nostru are și câteva valori lipsă, așa că haideți să aruncăm o privire la cele două abordări cele mai obișnuite pentru gestionarea datelor lipsă.

Ștergerea rândurilor cu valori lipsă

Dacă numărul de rânduri cu date lipsă este nesemnificativ în comparație cu numărul total de observații, ați putea lua în considerare ștergerea acestor rânduri.

În exemplul nostru, ultimul rând nu are valori, cu excepția picioarelor pătrate și a datei reclamei. Nu putem folosi astfel de date, așa că haideți să eliminăm acest rând.

Iată codul în care indicăm indexul rândului.

df = df.drop(8)

DataFrame acum arată astfel.

 

Stăpânirea artei curățării datelor în Python
 

Ultimul rând a fost șters, iar DataFrame-ul nostru arată acum mai bine. Cu toate acestea, există încă unele date lipsă pe care le vom trata folosind o altă abordare.

Imputarea valorilor lipsă

Dacă aveți date lipsă semnificative, o strategie mai bună decât ștergerea ar putea fi imputarea. Acest proces implică completarea valorilor lipsă pe baza altor date. Pentru datele numerice, metodele obișnuite de imputare implică utilizarea unei măsuri a tendinței centrale (medie, mediană, mod).

În DataFrame-ul nostru deja modificat, avem valori NaT (Not a Time) în coloanele advert_date și sale_date. Vom imputa aceste valori lipsă folosind Rău() metodă.

Codul folosește fillna() metoda de a găsi și completa valorile nule cu valoarea medie.

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

De asemenea, puteți face același lucru într-o singură linie de cod. Noi folosim aplica() pentru a aplica funcția definită folosind lambda. La fel ca mai sus, această funcție folosește fillna() și Rău() metode de completare a valorilor lipsă.

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

Ieșirea în ambele cazuri arată astfel.

 

Stăpânirea artei curățării datelor în Python
 

Coloana noastră sale_date are acum ore de care nu avem nevoie. Să le eliminăm.

Vom folosi strftime() metoda, care convertește datele în reprezentarea lor în șir și într-un format specific.

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

 

Stăpânirea artei curățării datelor în Python
 

Datele par acum toate ordonate.

Dacă trebuie să utilizați strftime() pe mai multe coloane, puteți utiliza din nou lambda următorul mod.

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

Acum, să vedem cum putem imputa valorile categorice lipsă.

Datele categorice sunt un tip de date care sunt utilizate pentru a grupa informații cu caracteristici similare. Fiecare dintre aceste grupuri este o categorie. Datele categorice pot lua valori numerice (cum ar fi „1” indicând „mascul” și „2” indicând „femeie”), dar acele numere nu au semnificație matematică. Nu le puteți adăuga împreună, de exemplu.

Datele categorice sunt de obicei împărțite în două categorii:

  1. Date nominale: Acesta este momentul în care categoriile sunt doar etichetate și nu pot fi aranjate într-o anumită ordine. Exemplele includ sexul (masculin, femeie), grupa de sânge (A, B, AB, O) sau culoarea (roșu, verde, albastru).
  1. Date ordinale: Acesta este momentul în care categoriile pot fi ordonate sau clasate. În timp ce intervalele dintre categorii nu sunt egal distanțate, ordinea categoriilor are o semnificație. Exemplele includ scale de evaluare (evaluarea de la 1 la 5 a unui film), un nivel de educație (liceu, licență, absolvent) sau stadiile cancerului (Etapa I, Etapa II, Etapa III).

Pentru imputarea datelor categorice lipsă, se utilizează de obicei modul. În exemplul nostru, coloana property_category este date categorice (nominale) și lipsesc date pe două rânduri.

Să înlocuim valorile lipsă cu mode.

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

Acest cod folosește fillna() funcția de înlocuire a tuturor valorilor NaN din coloana property_category. Îl înlocuiește cu mode.

În plus, partea [0] este folosită pentru a extrage prima valoare din această serie. Dacă există mai multe moduri, acesta va selecta primul. Dacă există un singur mod, tot funcționează bine.

Iată rezultatul.

 

Stăpânirea artei curățării datelor în Python
 

Datele arată acum destul de bine. Singurul lucru care mai rămâne este să vedem dacă există valori aberante.

Puteți exersa tratarea cu nulurile în acest sens Întrebare meta interviu, unde va trebui să înlocuiți NULL-urile cu zerouri.

Valorile aberante sunt puncte de date dintr-un set de date care sunt distinct diferite de celelalte observații. Ele se pot afla excepțional de departe de celelalte valori din setul de date, locuind în afara unui model general. Sunt considerate neobișnuite, deoarece valorile lor sunt fie semnificativ mai mari, fie mai mici în comparație cu restul datelor.

Valorile aberante pot apărea din diverse motive, cum ar fi:

  • Erori de măsurare sau de introducere
  • Coruperea datelor
  • Adevărate anomalii statistice

Valorile aberante pot avea un impact semnificativ asupra rezultatelor analizei datelor și modelării statistice. Ele pot duce la o distribuție anormală, părtinire sau invalidează ipotezele statistice subiacente, pot distorsiona potrivirea modelului estimat, pot reduce acuratețea predictivă a modelelor predictive și pot duce la concluzii incorecte.

Unele metode utilizate în mod obișnuit pentru a detecta valorile aberante sunt scorul Z, IQR (Interquartile Range), diagramele cu casete, diagramele de dispersie și tehnicile de vizualizare a datelor. În unele cazuri avansate, sunt utilizate și metode de învățare automată.

Vizualizarea datelor poate ajuta la identificarea valorii aberante. Boxplot-ul lui Seaborn este la îndemână pentru asta.

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

Folosim plt.figure() pentru a seta lățimea și înălțimea figurii în inci.

Apoi creăm boxplot pentru coloanele advertised_price și sales_price, care arată astfel.

 

Stăpânirea artei curățării datelor în Python
 

Intriga poate fi îmbunătățită pentru o utilizare mai ușoară adăugând aceasta la codul de mai sus.

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)

Folosim codul de mai sus pentru a seta etichetele pentru ambele axe. De asemenea, observăm că valorile de pe axa y sunt în notația științifică și nu le putem folosi pentru valorile prețului. Deci schimbăm acest stil în stil simplu folosind funcția plt.ticklabel_format().

Apoi creăm formatatorul care va afișa valorile pe axa y cu virgule ca separatori de mii și puncte zecimale. Ultima linie de cod aplică acest lucru pe axă.

Ieșirea arată acum așa.

 

Stăpânirea artei curățării datelor în Python
 

Acum, cum identificăm și eliminăm valorile aberante?

Una dintre modalități este utilizarea metodei IQR.

IQR, sau Interquartile Range, este o metodă statistică folosită pentru a măsura variabilitatea prin împărțirea unui set de date în quartile. Quartilele împart un set de date ordonate în patru părți egale, iar valorile din intervalul primului cuartil (percentila 25) și al treilea cuartil (percentila 75) alcătuiesc intervalul intercuartil.

Intervalul intercuartil este utilizat pentru a identifica valorile aberante din date. Iată cum funcționează:

  1. Mai întâi, calculați prima cuartilă (Q1), a treia cuartilă (Q3) și apoi determinați IQR. IQR este calculat ca Q3 – Q1.
  2. Orice valoare sub Q1 – 1.5IQR sau peste Q3 + 1.5IQR este considerată aberantă.

Pe graficul nostru, caseta reprezintă de fapt IQR. Linia din interiorul cutiei este mediana (sau a doua cuartilă). „Mustații” boxplot reprezintă intervalul de 1.5*IQR de la Q1 și Q3.

Orice puncte de date din afara acestor mustăți pot fi considerate valori aberante. În cazul nostru, este valoarea de 12,000,000 USD. Dacă te uiți la boxplot, vei vedea cât de clar este reprezentat acest lucru, ceea ce arată de ce vizualizarea datelor este importantă în detectarea valorii aberante.

Acum, să eliminăm valorile aberante utilizând metoda IQR în codul Python. În primul rând, vom elimina valorile aberante de preț anunțate.

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

Mai întâi calculăm prima quartila (sau a 25-a percentila) folosind cuantilă() funcţie. Facem același lucru pentru a treia quartila sau a 75-a percentila.

Acestea arată valorile sub care se încadrează 25%, respectiv 75% din date.

Apoi calculăm diferența dintre quartile. Totul până acum este doar traducerea pașilor IQR în cod Python.

Ca pas final, eliminăm valorile aberante. Cu alte cuvinte, toate datele mai mici de Q1 – 1.5 * IQR sau mai mult de Q3 + 1.5 * IQR.

Operatorul „~” neagă condiția, așa că rămânem doar cu datele care nu sunt valori aberante.

Apoi putem face același lucru cu prețul de vânzare.

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

Desigur, o puteți face într-un mod mai succint folosind pentru bucla.

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

Bucla iterează cele două coloane. Pentru fiecare coloană, calculează IQR-ul și apoi elimină rândurile din DataFrame.

Vă rugăm să rețineți că această operațiune se face secvențial, mai întâi pentru advertised_price și apoi pentru sale_price. Ca rezultat, DataFrame este modificat în loc pentru fiecare coloană, iar rândurile pot fi eliminate, deoarece sunt aberante în oricare coloană. Prin urmare, această operațiune ar putea duce la mai puține rânduri decât dacă valorile aberante pentru advertised_price și sale_price ar fi eliminate independent și rezultatele ar fi combinate ulterior.

În exemplul nostru, rezultatul va fi același în ambele cazuri. Pentru a vedea cum s-a schimbat diagrama cu casete, trebuie să-l trasăm din nou folosind același cod ca mai devreme.

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)

Iată rezultatul.

 

Stăpânirea artei curățării datelor în Python
 

Puteți exersa calcularea percentilelor în Python rezolvând problema Întrebarea interviului Adunării Generale.

Curățarea datelor este un pas crucial în procesul de analiză a datelor. Deși poate consuma mult timp, este esențial să vă asigurați acuratețea constatărilor.

Din fericire, ecosistemul bogat de biblioteci al lui Python face acest proces mai ușor de gestionat. Am învățat cum să eliminam rândurile și coloanele inutile, cum să reformatăm datele și să ne ocupăm de valorile lipsă și valorile aberante. Aceștia sunt pașii obișnuiți care trebuie efectuati pe majoritatea datelor. Cu toate acestea, va trebui și uneori combina două coloane într-una singură, verifica datele existente, atribuiți-i etichete, Sau scapă de spațiile albe.

Toate acestea sunt curățarea datelor, deoarece vă permite să transformați datele dezordonate, din lumea reală, într-un set de date bine structurat pe care îl puteți analiza cu încredere. Comparați setul de date cu care am început cu cel cu care am ajuns.

Dacă nu vezi satisfacția în acest rezultat și datele curate nu te fac ciudat de entuziasmat, ce naiba faci în știința datelor!?
 

Nate Rosidi este un om de știință de date și în strategie de produs. El este, de asemenea, profesor adjunct care predă analiză și este fondatorul StrataScratch, o platformă care îi ajută pe oamenii de știință ai datelor să se pregătească pentru interviurile lor cu întrebări de interviu reale de la companii de top. Conectați-vă cu el Twitter: StrataScratch or LinkedIn.

Timestamp-ul:

Mai mult de la KDnuggets