Padroneggiare l'arte della pulizia dei dati in Python - KDnuggets

Padroneggiare l'arte della pulizia dei dati in Python – KDnuggets

Nodo di origine: 2939047

Padroneggiare l'arte della pulizia dei dati in Python
Immagine dell'autore
 

La pulizia dei dati è una parte fondamentale di qualsiasi processo di analisi dei dati. È il passaggio in cui rimuovi gli errori, gestisci i dati mancanti e ti assicuri che i tuoi dati siano in un formato con cui puoi lavorare. Senza un set di dati ben pulito, qualsiasi analisi successiva può essere distorta o errata.

Questo articolo presenta diverse tecniche chiave per la pulizia dei dati in Python, utilizzando potenti librerie come pandas, numpy, seaborn e matplotlib.

Prima di addentrarci nei meccanismi della pulizia dei dati, comprendiamone l’importanza. I dati del mondo reale sono spesso confusi. Può contenere voci duplicate, tipi di dati errati o incoerenti, valori mancanti, caratteristiche irrilevanti e valori anomali. Tutti questi fattori possono portare a conclusioni fuorvianti durante l’analisi dei dati. Ciò rende la pulizia dei dati una parte indispensabile del ciclo di vita della scienza dei dati.

Tratteremo le seguenti attività di pulizia dei dati.
 

Padroneggiare l'arte della pulizia dei dati in Python
Immagine dell'autore

Prima di iniziare, importiamo le librerie necessarie. Utilizzeremo panda per la manipolazione dei dati e seaborn e matplotlib per le visualizzazioni.

Importeremo anche il modulo Python datetime per manipolare le date.

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

Innanzitutto, dovremo caricare i nostri dati. In questo esempio, caricheremo un file CSV utilizzando panda. Aggiungiamo anche l'argomento delimitatore.

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

Successivamente, è importante ispezionare i dati per comprenderne la struttura, con che tipo di variabili stiamo lavorando e se sono presenti valori mancanti. Poiché i dati che abbiamo importato non sono enormi, diamo un'occhiata all'intero set di dati.

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

Ecco come appare il set di dati.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Puoi immediatamente vedere che ci sono alcuni valori mancanti. Inoltre, i formati della data non sono coerenti.

Ora diamo un'occhiata al riepilogo di DataFrame utilizzando il metodo info().

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

Ecco l'output del codice.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Possiamo vedere che solo la colonna sq_feet non ha valori NULL, quindi dovremo in qualche modo gestire la cosa. Inoltre, le colonne advertising_date e sale_date sono il tipo di dati dell'oggetto, anche se dovrebbe essere una data.

La posizione della colonna è completamente vuota. Ne abbiamo bisogno?

Ti mostreremo come gestire questi problemi. Inizieremo imparando come eliminare le colonne non necessarie.

Ci sono due colonne nel set di dati di cui non abbiamo bisogno nella nostra analisi dei dati, quindi le rimuoveremo.

La prima colonna è l'acquirente. Non ne abbiamo bisogno, poiché il nome dell’acquirente non influisce sull’analisi.

Stiamo utilizzando il metodo drop() con il nome della colonna specificata. Impostiamo l'asse su 1 per specificare che vogliamo eliminare una colonna. Inoltre, l'argomento inplace è impostato su True in modo da modificare il DataFrame esistente e non creare un nuovo DataFrame senza la colonna rimossa.

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

La seconda colonna che vogliamo rimuovere è la posizione. Anche se potrebbe essere utile avere queste informazioni, questa è una colonna completamente vuota, quindi rimuoviamola.

Adottiamo lo stesso approccio della prima colonna.

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

Naturalmente è possibile rimuovere queste due colonne contemporaneamente.

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

Entrambi gli approcci restituiscono il seguente dataframe.

 

Padroneggiare l'arte della pulizia dei dati in Python

Nel set di dati possono essere presenti dati duplicati per vari motivi e possono distorcere l'analisi.

Rileviamo i duplicati nel nostro set di dati. Ecco come farlo.

Il codice seguente utilizza il metodo duplicato() per considerare i duplicati nell'intero set di dati. L'impostazione predefinita prevede di considerare la prima occorrenza di un valore come univoca e le occorrenze successive come duplicate. È possibile modificare questo comportamento utilizzando il file mantenere parametro. Ad esempio, df.duplicated(keep=False) contrassegnerebbe tutti i duplicati come True, inclusa la prima occorrenza.

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

Ecco il risultato.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

La riga con indice 3 è stata contrassegnata come duplicata perché la riga 2 con gli stessi valori è la sua prima occorrenza.

Ora dobbiamo rimuovere i duplicati, cosa che facciamo con il seguente codice.

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

Il drop_duplicates() la funzione considera tutte le colonne identificando i duplicati. Se vuoi considerare solo determinate colonne, puoi passarle come elenco a questa funzione in questo modo: df.drop_duplicates(subset=['column1','column2']).

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Come puoi vedere, la riga duplicata è stata eliminata. Tuttavia, l'indicizzazione è rimasta la stessa, mancando l'indice 3. Faremo ordine reimpostando gli indici.

df = df.reset_index(drop=True)

Questa attività viene eseguita utilizzando il file reset_index() funzione. L'argomento drop=True viene utilizzato per scartare l'indice originale. Se non includi questo argomento, il vecchio indice verrà aggiunto come una nuova colonna nel tuo DataFrame. Impostando drop=True, stai dicendo ai panda di dimenticare il vecchio indice e reimpostarlo sull'indice intero predefinito.

Per esercitarti, prova a farlo rimuovere i duplicati da questo set di dati Microsoft.

A volte, i tipi di dati potrebbero essere impostati in modo errato. Ad esempio, una colonna di data potrebbe essere interpretata come stringhe. È necessario convertirli nei tipi appropriati.

Nel nostro set di dati, lo faremo per le colonne advertising_date e sale_date, poiché vengono visualizzate come tipo di dati dell'oggetto. Inoltre, le date vengono formattate in modo diverso nelle righe. Dobbiamo renderlo coerente, oltre a convertirlo alla data attuale.

Il modo più semplice è usare il a_dataora() metodo. Ancora una volta, puoi farlo colonna per colonna, come mostrato di seguito.

Quando lo facciamo, impostiamo l'argomento dayfirst su True perché alcune date iniziano prima con il giorno.

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

Puoi anche convertire entrambe le colonne contemporaneamente utilizzando il file applicare() metodo con a_dataora().

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

Entrambi gli approcci ti danno lo stesso risultato.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Ora le date hanno un formato coerente. Vediamo che non tutti i dati sono stati convertiti. C'è un valore NaT in advertising_date e due in sale_date. Ciò significa che manca la data.

Controlliamo se le colonne vengono convertite in date utilizzando il file Informazioni() metodo.

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

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Come puoi vedere, entrambe le colonne non sono nel formato datetime64[ns].

Ora prova a convertire i dati da TESTO a NUMERICO in questo Insieme di dati di Airbnb.

I set di dati del mondo reale spesso presentano valori mancanti. La gestione dei dati mancanti è fondamentale, poiché alcuni algoritmi non sono in grado di gestire tali valori.

Anche il nostro esempio presenta alcuni valori mancanti, quindi diamo un'occhiata ai due approcci più comuni per gestire i dati mancanti.

Eliminazione di righe con valori mancanti

Se il numero di righe con dati mancanti è insignificante rispetto al numero totale di osservazioni, potresti prendere in considerazione l'eliminazione di queste righe.

Nel nostro esempio, l'ultima riga non ha valori tranne i piedi quadrati e la data dell'annuncio. Non possiamo utilizzare tali dati, quindi rimuoviamo questa riga.

Ecco il codice dove indichiamo l'indice della riga.

df = df.drop(8)

Il DataFrame ora appare così.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

L'ultima riga è stata eliminata e il nostro DataFrame ora ha un aspetto migliore. Tuttavia, ci sono ancora alcuni dati mancanti che gestiremo utilizzando un altro approccio.

Imputazione dei valori mancanti

Se disponi di dati mancanti significativi, una strategia migliore dell'eliminazione potrebbe essere l'imputazione. Questo processo prevede il riempimento dei valori mancanti in base ad altri dati. Per i dati numerici, i metodi di imputazione comuni implicano l'utilizzo di una misura di tendenza centrale (media, mediana, moda).

Nel nostro DataFrame già modificato, abbiamo valori NaT (Not a Time) nelle colonne advertising_date e sale_date. Imputeremo questi valori mancanti utilizzando il significare() metodo.

Il codice utilizza il riempia() metodo per trovare e riempire i valori nulli con il valore medio.

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

Puoi anche fare la stessa cosa in una riga di codice. Noi usiamo il applicare() per applicare la funzione definita utilizzando lambda. Come sopra, questa funzione utilizza il file riempia() ed significare() metodi per inserire i valori mancanti.

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

L'output in entrambi i casi è simile al seguente.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

La nostra colonna sale_date ora contiene orari di cui non abbiamo bisogno. Rimuoviamoli.

Useremo il strftime() metodo, che converte le date nella loro rappresentazione di stringa e in un formato specifico.

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

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Le date ora sembrano tutte in ordine.

Se è necessario utilizzare strftime() su più colonne, puoi nuovamente utilizzare lambda nel modo seguente.

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

Ora vediamo come possiamo imputare i valori categoriali mancanti.

I dati categoriali sono un tipo di dati utilizzati per raggruppare informazioni con caratteristiche simili. Ciascuno di questi gruppi è una categoria. I dati categorici possono assumere valori numerici (come “1” che indica “maschio” e “2” che indica “femmina”), ma tali numeri non hanno significato matematico. Non puoi sommarli insieme, per esempio.

I dati categorici sono generalmente divisi in due categorie:

  1. Dati nominali: Questo è quando le categorie sono solo etichettate e non possono essere disposte in un ordine particolare. Gli esempi includono sesso (maschio, femmina), gruppo sanguigno (A, B, AB, O) o colore (rosso, verde, blu).
  1. Dati ordinali: Questo è il momento in cui le categorie possono essere ordinate o classificate. Sebbene gli intervalli tra le categorie non siano equispaziati, l'ordine delle categorie ha un significato. Gli esempi includono scale di valutazione (voto da 1 a 5 di un film), un livello di istruzione (scuola superiore, laurea, laurea) o stadi del cancro (Stadio I, Stadio II, Stadio III).

Per imputare i dati categorici mancanti, viene generalmente utilizzata la modalità. Nel nostro esempio, la colonna property_category contiene dati categorici (nominali) e mancano dati in due righe.

Sostituiamo i valori mancanti con mode.

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

Questo codice usa il riempia() funzione per sostituire tutti i valori NaN nella colonna property_category. Lo sostituisce con mode.

Inoltre, la parte [0] viene utilizzata per estrarre il primo valore da questa serie. Se sono presenti più modalità, verrà selezionata la prima. Se c'è solo una modalità, funziona comunque bene.

Ecco il risultato.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

I dati ora sembrano piuttosto buoni. L’unica cosa che resta da fare è vedere se ci sono valori anomali.

Puoi esercitarti a gestire i valori nulli su questo Domanda di meta intervista, dove dovrai sostituire i NULL con zeri.

I valori anomali sono punti dati in un set di dati che sono nettamente diversi dalle altre osservazioni. Possono trovarsi eccezionalmente distanti dagli altri valori nel set di dati, risiedendo al di fuori di uno schema generale. Sono considerati insoliti perché i loro valori sono significativamente più alti o più bassi rispetto al resto dei dati.

I valori anomali possono verificarsi per vari motivi, tra cui:

  • Errori di misurazione o di input
  • Corruzione dei dati
  • Vere anomalie statistiche

I valori anomali possono avere un impatto significativo sui risultati dell'analisi dei dati e della modellazione statistica. Possono portare a una distribuzione distorta, a distorsioni o a invalidare le ipotesi statistiche sottostanti, distorcere l’adattamento stimato del modello, ridurre l’accuratezza predittiva dei modelli predittivi e portare a conclusioni errate.

Alcuni metodi comunemente utilizzati per rilevare valori anomali sono il punteggio Z, l'IQR (intervallo interquartile), i box plot, i grafici a dispersione e le tecniche di visualizzazione dei dati. In alcuni casi avanzati vengono utilizzati anche metodi di apprendimento automatico.

La visualizzazione dei dati può aiutare a identificare i valori anomali. Il boxplot di Seaborn è utile per questo.

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

Usiamo plt.figure() per impostare la larghezza e l'altezza della figura in pollici.

Quindi creiamo il boxplot per le colonne Advertised_price e Sale_price, che assomiglia a questo.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

La trama può essere migliorata per un utilizzo più semplice aggiungendola al codice sopra.

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)

Usiamo il codice sopra per impostare le etichette per entrambi gli assi. Notiamo anche che i valori sull'asse y sono nella notazione scientifica e non possiamo usarla per i valori dei prezzi. Quindi lo modifichiamo in stile semplice utilizzando la funzione plt.ticklabel_format().

Quindi creiamo il formattatore che mostrerà i valori sull'asse y con virgole come separatori delle migliaia e punti decimali. L'ultima riga di codice lo applica all'asse.

L'output ora assomiglia a questo.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Ora, come identifichiamo e rimuoviamo il valore anomalo?

Uno dei modi è utilizzare il metodo IQR.

L'IQR, o intervallo interquartile, è un metodo statistico utilizzato per misurare la variabilità dividendo un set di dati in quartili. I quartili dividono un set di dati ordinato per rango in quattro parti uguali e i valori compresi nell'intervallo del primo quartile (25° percentile) e del terzo quartile (75° percentile) costituiscono l'intervallo interquartile.

L'intervallo interquartile viene utilizzato per identificare i valori anomali nei dati. Ecco come funziona:

  1. Innanzitutto, calcola il primo quartile (Q1), il terzo quartile (Q3), quindi determina l'IQR. L'IQR è calcolato come Q3 – Q1.
  2. Qualsiasi valore inferiore a Q1 – 1.5IQR o superiore a Q3 + 1.5IQR è considerato un valore anomalo.

Nel nostro boxplot, il riquadro rappresenta in realtà l'IQR. La linea all'interno del riquadro è la mediana (o secondo quartile). I “baffi” del boxplot rappresentano l’intervallo compreso tra 1.5*IQR tra Q1 e Q3.

Eventuali punti dati al di fuori di questi baffi possono essere considerati valori anomali. Nel nostro caso, è il valore di $ 12,000,000. Se guardi il boxplot, vedrai quanto chiaramente questo è rappresentato, il che mostra perché la visualizzazione dei dati è importante per rilevare i valori anomali.

Ora rimuoviamo i valori anomali utilizzando il metodo IQR nel codice Python. Innanzitutto, rimuoveremo i valori anomali dei prezzi pubblicizzati.

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

Per prima cosa calcoliamo il primo quartile (o il 25° percentile) utilizzando il quantile() funzione. Facciamo lo stesso per il terzo quartile o il 75° percentile.

Essi mostrano i valori al di sotto dei quali ricadono rispettivamente il 25% e il 75% dei dati.

Quindi calcoliamo la differenza tra i quartili. Finora tutto sta semplicemente traducendo i passaggi IQR in codice Python.

Come passaggio finale, rimuoviamo i valori anomali. In altre parole, tutti i dati inferiori a Q1 – 1.5 * IQR o superiori a Q3 + 1.5 * IQR.

L'operatore "~" nega la condizione, quindi ci rimangono solo i dati che non sono valori anomali.

Quindi possiamo fare lo stesso con il prezzo di vendita.

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

Naturalmente, puoi farlo in modo più conciso utilizzando il file per 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)))]

Il ciclo ripete le due colonne. Per ogni colonna, calcola l'IQR e quindi rimuove le righe nel DataFrame.

Tieni presente che questa operazione viene eseguita in sequenza, prima per Advertised_price e poi per Sale_price. Di conseguenza, DataFrame viene modificato sul posto per ogni colonna e le righe possono essere rimosse perché costituiscono un valore anomalo in entrambe le colonne. Pertanto, questa operazione potrebbe generare un numero inferiore di righe rispetto a quando i valori anomali per Advertised_price e Sale_price venissero rimossi in modo indipendente e i risultati venissero combinati successivamente.

Nel nostro esempio, l'output sarà lo stesso in entrambi i casi. Per vedere come è cambiato il box plot, dobbiamo tracciarlo nuovamente utilizzando lo stesso codice di prima.

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)

Ecco il risultato.

 

Padroneggiare l'arte della pulizia dei dati in Python
 

Puoi esercitarti a calcolare i percentili in Python risolvendo il Domanda per l'intervista all'Assemblea Generale.

La pulizia dei dati è un passaggio cruciale nel processo di analisi dei dati. Anche se può richiedere molto tempo, è essenziale garantire l’accuratezza dei risultati.

Fortunatamente, il ricco ecosistema di librerie di Python rende questo processo più gestibile. Abbiamo imparato come rimuovere righe e colonne non necessarie, riformattare i dati e gestire valori mancanti e valori anomali. Questi sono i soliti passaggi che devono essere eseguiti sulla maggior parte dei dati. Tuttavia, a volte ne avrai bisogno combina due colonne in una, verificare i dati esistenti, assegnargli delle etichette, o eliminare gli spazi bianchi.

Tutto questo è pulizia dei dati, poiché ti consente di trasformare dati disordinati del mondo reale in un set di dati ben strutturato che puoi analizzare con sicurezza. Basta confrontare il set di dati con cui abbiamo iniziato con quello con cui siamo finiti.

Se non vedi soddisfazione in questo risultato e i dati puliti non ti rendono stranamente eccitato, cosa diavolo stai facendo nella scienza dei dati!?
 

Nato Rosidi è un data scientist e nella strategia di prodotto. È anche un professore a contratto che insegna analisi ed è il fondatore di Strata Scratch, una piattaforma che aiuta i data scientist a prepararsi per le loro interviste con domande di interviste reali delle migliori aziende. Connettiti con lui su Twitter: Strata Scratch or LinkedIn.

Timestamp:

Di più da KDnuggets