Come eseguire un’analisi esplorativa dei dati (Explorative Data Analysis)

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:

  1. il numero di righe e colonne
  2. il tipo associato a ogni colonna (data, intero, decimale, eccetera)
  3. 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.

output metodo info di pandas per analisi esplorativa

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:

output del metodo head per visualizzare alcune righe di un dataframe

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.

output del metodo describe di pandas applicato ad un dataframe

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:

diagramma a barre realizzato con metodo catplot di seaborn

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à.

rappresentazione di due variabili qualitative con seaborn e catplot

Per due o più variabili quantitative possiamo utilizzare invece il metodo pairplot di seaborn. Con una sola riga di codice otterremo una matrice contenente:

g = sns.pairplot(data = titanic[["age","fare"]])
Rappresentazione grafica delle relazioni tra variabili quantitative tramite pairplot di seaborn

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")
utilizzo di seaborn e catplot per rappresentare la relazioni tra variabili qualitative e quantitative

Continua a imparare

Torna in alto
Torna su