Con il termine Analisi esplorativa si intende l’insieme di attività volte a studiare la distribuzione, le proprietà e le relazioni tra i dati che si hanno a disposizione. Ogni progetto di analisi dei dati dovrebbe iniziare con una fase di Analisi esplorativa: uno degli errori più frequenti che si fanno all’inizio è gettarsi a capofitto sull’applicazione di algoritmi di Machine Learning o sulla scrittura di query SQL, senza analizzare prima il contesto e la distribuzione generale dei dati. In questo articolo vedremo le principali tecniche di EDA (Exploratory Data Analysis) utilizzando il linguaggio di programmazione Python.
Analisi dei tipi e presenza di null con il metodo info
Il primo obiettivo dell’analisi esplorativa consiste nel collezionare una serie di informazioni sui dati a disposizione, come ad esempio:
- il numero di righe e colonne
- il tipo associato a ogni colonna (data, intero, decimale, eccetera)
- la distribuzione dei null (o valori mancanti) per ogni colonna
Con il linguaggio Python, tramite il metodo info() della libreria pandas, possiamo ottenere queste informazioni con una sola riga di codice:
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset("titanic")
titanic.info()
Analizziamo il codice precedente: dopo aver importato le librerie pandas e seaborn, abbiamo acquisito i dati del noto dataset titanic all’interno di un DataFrame con il medesimo nome. A questo punto abbiamo applicato il metodo .info() per ottenere tutte le informazioni della lista precedente.

In generale è bene non fidarsi mai al 100% dei tipi proposti da pandas, senza fare nessun tipo test. Dobbiamo sempre visualizzare almeno alcune righe del DataFrame, anche al fine di verificare che abbiate importato i dati correttamente. Per visualizzare 10 righe del DataFrame possiamo utilizzare il metodo head():
titanic.head(10)
Ecco il risultato:

Analisi statistiche dei dati con describe e corr
Il secondo passo che generalmente eseguo è calcolare i principali indici statistici associati alle varie colonne, in modo da avere un’idea della distribuzione dei dati e della presenza di outlier. Anche per queste attività, la libreria pandas di Python ci mostra tutta la sua potenza e semplicità con il metodo describe. Ci basterà infatti eseguire
titanic.describe()
per ottenere in solo colpo il numero di valori non null, la media aritmetica, la deviazione standard, massimo, minimo e quartili di tutte le colonne numeriche. Inoltre, specificando il parametro di input include=’all’, otterremo utili informazioni anche per le variabili categoriche, come moda e numero di valori univoci.

Un ulteriore obiettivo dell’analisi esplorativa è indagare sulla presenza di relazioni e associazione tra le colonne. Tramite il metodo corr() possiamo calcolare i principali coefficienti di correlazione tra tutte le variabile numeriche. Ad esempio l’istruzione
titanic.corr()
crea la matrice di correlazione tra le colonne numeriche del DataFrame utilizzando il coefficiente di correlazione di Pearson. Tramite il parametro di input method possiamo calcolare anche:
- i coefficienti di Spearman;
- i coefficienti di Kendall Tau.
Rappresentazione grafica delle variabili con pandas e seaborn
Rappresentare graficamente le variabili ci permette di avere una visione più veloce e d’impatto delle caratteristiche dei nostri dati. Dal punto di vista tecnico, con le librerie pandas e seaborn possiamo disegnare facilmente dei grafici accurati e professionali. In generale dobbiamo fare comunque molta attenzione a scegliere correttamente la tipologia di grafico da utilizzare per ogni colonna. Tale scelta sarà dettata principalmente dalla scala di misura della variabile statistica rappresentata. Ad esempio, per una variabile qualitativa nominale potremmo utilizzare il metodo catplot di seaborn in questo modo:
g = sns.catplot(data = titanic, x = "embark_town", kind = "count")
Otterremo il diagramma a barre mostrato in questa figura:

Per le variabili numeriche potremmo creare un boxplot e un istogramma con le istruzioni
g = titanic.boxplot(column = "age", figsize = (8,6))
g = sns.histplot(data = titanic, x = "age", kde = True)
Su queste tipologie di grafici ho scritto due articoli specifici:
Catplot e pairplot per individuare l’associazione tra due variabili
Anche per l’analisi bivariata la scelta dei grafici è strettamente legata alla scala delle variabili. Nel caso di due colonne qualitative possiamo usare nuovamente il metodo catplot di seaborn, utilizzando efficacemente il parametro hue:
g = sns.catplot(data = titanic, x = "embark_town", hue = "survived", kind = "count")
Con il codice precedente creiamo un grafico che mostra come la probabilità di sopravvivenza nell’incidente del Titanic per chi si è imbarcato da Chenburg sia risultata più alta rispetto a quelle della altre città.

Per due o più variabili quantitative possiamo utilizzare invece il metodo pairplot di seaborn. Con una sola riga di codice otterremo una matrice contenente:
- gli istogrammi delle singole colonne sulla diagonale
- i diagrammi di dispersione nelle altre celle
g = sns.pairplot(data = titanic[["age","fare"]])

Infine, per confrontare una variabile qualitativa con una quantitativa esistono vari metodi. Vi propongo qui un altro modo di utilizzare catplot:
g = sns.catplot(data = titanic, x = "embark_town", y = "age")

Continua a imparare
- Segui la lezione successiva sul preprocessing
- Torna all’indice delle lezioni
- Visita la pagina del mio corso online su Pandas, Python e Machine Learning