7 Controlli Essenziali sulla Qualità dei Dati con Pandas

7 Controlli Fondamentali sulla Qualità dei Dati con Pandas

 

Come professionista dei dati, probabilmente sei familiare con il costo della scarsa qualità dei dati. Per tutti i progetti di dati, grandi o piccoli, dovresti eseguire controlli essenziali sulla qualità dei dati.

Esistono librerie e framework dedicati per la valutazione della qualità dei dati. Ma se sei un principiante, puoi eseguire controlli semplici ma importanti sulla qualità dei dati con pandas. E questo tutorial ti insegnerà come farlo.

Utilizzeremo il Dataset sulle abitazioni in California di scikit-learn per questo tutorial.

 

Una panoramica del Dataset sulle abitazioni in California

 

Utilizzeremo il dataset sulle abitazioni in California dal modulo dataset di Scikit-learn. Il dataset contiene oltre 20.000 record di otto caratteristiche numeriche e un valore medio della casa target.

Leggiamo il dataset in un dataframe di pandas df:

from sklearn.datasets import fetch_california_housing
import pandas as pd
# Recupera il dataset sulle abitazioni in California
data = fetch_california_housing()
# Converti il dataset in un dataframe di Pandas
df = pd.DataFrame(data.data, columns=data.feature_names)
# Aggiungi la colonna target
df['MedHouseVal'] = data.target

 

Per una descrizione dettagliata del dataset, esegui data.DESCR come mostrato:

print(data.DESCR)

 

 

Ottieni alcune informazioni di base sul dataset:

df.info()

 

Ecco l’output:

Output >>>RangeIndex: 20640 entries, 0 to 20639Data columns (total 9 columns): #   Column     Non-Null Count  Dtype  ---  ------      --------------  -----   0   MedInc      20640 non-null  float64 1   HouseAge    20640 non-null  float64 2   AveRooms    20640 non-null  float64 3   AveBedrms   20640 non-null  float64 4   Population   20640 non-null  float64 5   AveOccup   20640 non-null  float64 6   Latitude    20640 non-null  float64 7   Longitude   20640 non-null  float64 8   MedHouseVal  20640 non-null  float64dtypes: float64(9)memory usage: 1.4 MB

 

Dato che abbiamo caratteristiche numeriche, otteniamo anche le statistiche riassuntive utilizzando il metodo describe():

df.describe()

 

 

1. Verifica dei valori mancanti

 

I dataset del mondo reale spesso contengono valori mancanti. Per analizzare i dati e costruire modelli, è necessario gestire questi valori mancanti.

Per garantire la qualità dei dati, è necessario verificare se la frazione di valori mancanti rientra in un limite di tolleranza specifico. È quindi possibile imputare i valori mancanti utilizzando opportune strategie di imputazione.

Il primo passo, quindi, è controllare la presenza di valori mancanti in tutte le caratteristiche del dataset.

Questo codice controlla la presenza di valori mancanti in ogni colonna del dataframe df:

# Verifica dei valori mancanti nel dataframe
missing_values = df.isnull().sum()
print("Valori mancanti:")
print(missing_values)

 

Il risultato è una serie di pandas che mostra il conteggio dei valori mancanti per ogni colonna:

Output >>>Valori mancanti: MedInc  0HouseAge  0AveRooms  0AveBedrms  0Population  0AveOccup  0Latitude  0Longitude  0MedHouseVal  0dtype: int64

 

Come si può vedere, non ci sono valori mancanti in questo dataset.

 

2. Identificare Record Duplicati

 

I record duplicati nel dataset possono influenzare l’analisi. Dovresti quindi controllare e eliminare i record duplicati, se necessario.

Ecco il codice per identificare e restituire le righe duplicate nel df. Se ci sono righe duplicate, saranno incluse nel risultato:

# Controlla le righe duplicate nel DataFrame
duplicate_rows = df[df.duplicated()]
print("Righe Duplicate:")
print(duplicate_rows)

 

Il risultato è un DataFrame vuoto. Ciò significa che non ci sono record duplicati nel dataset:

Output >>>Righe Duplicate:Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

 

3. Controlla i Tipi di Dati

 

Nell’analisi di un dataset, spesso è necessario trasformare o scalare una o più caratteristiche. Per evitare errori inaspettati durante tali operazioni, è importante controllare se le colonne sono tutte del tipo di dati previsto.

Questo codice controlla i tipi di dati di ogni colonna nel dataframe df:

# Controlla i tipi di dati di ogni colonna nel DataFrame
tipi_dati = df.dtypes
print("Tipi di Dati:")
print(tipi_dati)

 

Qui, tutte le caratteristiche numeriche sono del tipo di dati float come previsto:

Output >>>Tipi di Dati:
MedInc       float64
HouseAge     float64
AveRooms     float64
AveBedrms    float64
Population   float64
AveOccup     float64
Latitude     float64
Longitude    float64
MedHouseVal  float64
dtype: object

 

4. Controllare gli Outlier

 

Gli outlier sono punti dati significativamente diversi dagli altri punti nel dataset. Se ricordi, abbiamo eseguito il metodo describe() sul dataframe.

In base ai valori del quartile e al valore massimo, potresti aver identificato che un sottoinsieme di caratteristiche contiene outlier. In particolare, queste caratteristiche:

  • MedInc
  • AveRooms
  • AveBedrms
  • Population

Un approccio per gestire gli outlier consiste nell’utilizzare l’intervallo interquartile, la differenza tra il 75° e il 25° quartile. Se Q1 è il 25° quartile e Q3 è il 75° quartile, allora l’intervallo interquartile è dato da: Q3 – Q1.

Successivamente, utilizziamo i quartili e l’IQR per definire l’intervallo [Q1 - 1,5 * IQR, Q3 + 1,5 * IQR]. E tutti i punti al di fuori di questo intervallo sono outliers.

colonne_da_controllare = ['MedInc', 'AveRooms', 'AveBedrms', 'Population']# Funzione per trovare record con outlierdef trova_outlier_pandas(data, colonna):   Q1 = data[colonna].quantile(0.25)    Q3 = data[colonna].quantile(0.75)    IQR = Q3 - Q1   limite_inferiore = Q1 - 1.5 * IQR    limite_superiore = Q3 + 1.5 * IQR    outliers = data[(data[colonna] < limite_inferiore) | (data[colonna] > limite_superiore)]  return outliers# Trova record con outlier per ogni colonna specificataoutliers_dict = {}for colonna in colonne_da_controllare:  outliers_dict[colonna] = trova_outlier_pandas(df, colonna)# Stampa i record con outlier per ogni colonnafor colonna, outliers in outliers_dict.items(): print(f"Outlier in '{colonna}':")   print(outliers) print("\n")

 

 

5. Convalida intervalli numerici

 

Un controllo importante per le caratteristiche numeriche è convalidare l’intervallo. Ciò garantisce che tutte le osservazioni di una caratteristica assumano valori in un intervallo atteso.

Questo codice convalida che il valore ‘MedInc’ rientri in un intervallo atteso e identifica i punti dati che non soddisfano questo criterio:

# Controllo dell'intervallo di valori numerici per la colonna 'MedInc'valid_range = (0, 16)  value_range_check = df[~df['MedInc'].between(*valid_range)]print("Controllo dell'intervallo di valori (MedInc):")print(value_range_check)

 

Puoi provare per altre caratteristiche numeriche a tua scelta. Ma vediamo che tutti i valori nella colonna ‘MedInc’ rientrano nell’intervallo atteso:

Output >>>Controllo dell'intervallo di valori (MedInc):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

 

6. Controllo dipendenza tra colonne

 

La maggior parte dei set di dati contiene caratteristiche correlate. Pertanto, è importante includere controlli basati su relazioni logicamente rilevanti tra le colonne (o caratteristiche).

Anche se le caratteristiche, individualmente, possono assumere valori nell’intervallo atteso, la relazione tra loro potrebbe essere inconsistente.

Ecco un esempio per il nostro set di dati. In un record valido, ‘AveRooms’ dovrebbe essere tipicamente maggiore o uguale a ‘AveBedRms’.

# AveRooms non dovrebbe essere inferiore a AveBedroomsinvalid_data = df[df['AveRooms'] < df['AveBedrms']]print("Record non validi (AveRooms < AveBedrms):")print(invalid_data)

 

Nel set di dati di abitazioni della California con cui stiamo lavorando, vediamo che non ci sono tali record non validi:

Output >>>Record non validi (AveRooms < AveBedrms):Empty DataFrameColumns: [MedInc, HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude, MedHouseVal]Index: []

 

7. Controllo per inserimento dati non coerente

 

L’inserimento di dati non coerenti è un problema comune di qualità dei dati nella maggior parte dei set di dati. Esempi includono:

  • Formattazione non coerente nelle colonne di data e ora 
  • Registrazione non coerente dei valori di variabile categorica 
  • Registrazione di letture in unità diverse 

Nel nostro set di dati, abbiamo verificato i tipi di dati delle colonne e identificato gli outlier. Ma puoi anche eseguire controlli per l’inserimento di dati non coerenti.

Creiamo un semplice esempio per verificare se tutte le voci di data hanno una formattazione coerente.

Qui utilizziamo le espressioni regolari in combinazione con la funzione apply() di pandas per verificare se tutte le voci di data sono nel formato YYYY-MM-DD:

import pandas as pdimport redata = {'Date': ['2023-10-29', '2023-11-15', '23-10-2023', '2023/10/29', '2023-10-30']}df = pd.DataFrame(data)# Definisci il formato atteso per la datadata_format_pattern = r'^\d{4}-\d{2}-\d{2}$'  # Formato YYYY-MM-DD# Funzione per verificare se un valore di data corrisponde al formato atteso def check_date_format(date_str, date_format_pattern):   return re.match(date_format_pattern, date_str) is not None# Applica il controllo di formato alla colonna 'Date'date_format_check = df['Date'].apply(lambda x: check_date_format(x, date_format_pattern))# Identifica e recupera le voci che non seguono il formato attesnon_adherent_dates = df[~date_format_check]if not non_adherent_dates.empty:   print("Voci che non seguono il formato atteso:")    print(non_adherent_dates)else:  print("Tutte le date sono nel formato atteso.")

 

Questo restituisce le voci che non seguono il formato atteso:

Output >>>Voci che non seguono il formato previsto:        Date2  23-10-20233  2023/10/29

 

Conclusione

 

In questo tutorial, abbiamo esaminato controlli comuni sulla qualità dei dati con pandas. 

Quando si lavora su progetti di analisi dei dati di dimensioni ridotte, questi controlli sulla qualità dei dati con pandas rappresentano un buon punto di partenza. A seconda del problema e dell’insieme di dati, è possibile includere controlli aggiuntivi. 

Se sei interessato a imparare l’analisi dei dati, dai un’occhiata alla guida 7 Passaggi per Padroneggiare il Data Wrangling con Pandas e Python.  

[Bala Priya C](https://twitter.com/balawc27) è una sviluppatrice e scrittrice tecnica dell’India. Le piace lavorare all’intersezione tra matematica, programmazione, data science e creazione di contenuti. Le sue aree di interesse e competenza includono DevOps, data science e elaborazione del linguaggio naturale. Ama leggere, scrivere, programmare e il caffè! Attualmente sta lavorando per imparare e condividere la sua conoscenza con la community di sviluppatori scrivendo tutorial, guide pratiche, articoli di opinione ed altro ancora.