- analiticas
- Posts
- La correlazione con Python e pandas
La correlazione con Python e pandas
Scopri come utilizzare df.corr() per esplorare le relazioni tra le variabili nei tuoi dati
Capire se due o più variabili sono correlate ci può aiutare a identificare pattern e relazioni meno ovvie, quando facciamo analisi dei dati.
In questa micro-lezione vedremo come calcolare la correlazione tra le variabili in un dataframe con Python e pandas.
Il programma della micro-lezione
Cos'è la correlazione?
La correlazione è una misura statistica che esprime il grado in cui due variabili cambiano insieme.
Il valore della correlazioni è espresso da un numero, che prende il nome di coefficiente di correlazione, che è compreso tra -1 e 1.
Quando il coefficiente di correlazione tende a 1, si parla di correlazione positiva: quando una variabile aumenta, lo fa anche l’altra. Un classico esempio di correlazione positiva è quella tra l’aumento della temperatura e le vendite di gelati.
Quando il coefficiente di correlazione tende a -1, abbiamo una correlazione negativa: quando una variabile aumenta, l’altra diminuisce. Un esempio di correlazione negativa è quella tra il prezzo della benzina e suo consumo: infatti, quando il prezzo della benzina aumenta, le persone tendono a guidare meno.
Se il coefficiente di correlazione è esattamente 1, ci troviamo di fronte ad una correlazione positiva perfetta. Quando è -1 abbiamo una correlazione negativa perfetta.
Se invece il coefficiente di correlazione è 0 (o si avvicina ad esso) ciò indica l’assenza di correlazione: i cambiamenti in una variabile non corrispondono ai cambiamenti nell'altra.
Ricapitolando:
1: correlazione positiva perfetta
0: nessuna correlazione
-1: correlazione negativa perfetta
Le librerie e il dataframe
Vediamo adesso come calcolare la correlazione tra due variabili all’interno di un set di dati.
Per prima cosa, importiamo le librerie necessarie:
import pandas as pd
import numpy as np
Se vuoi approfondire perché importiamo le librerie con degli alias, ti consiglio di leggere la micro-lezione che spiega perché scriviamo "import pandas as pd".
Adesso costruiamo un dataframe, ma se ne hai già uno a portata di mano puoi saltare questo passaggio:
np.random.seed(42)
df = pd.DataFrame({
'età': np.random.randint(18, 65, 100),
'stipendio': np.random.randint(20000, 100000, 100),
'esperienza': np.random.randint(0, 40, 100),
'soddisfazione': np.random.randint(1, 11, 100)
})
In questo caso abbiamo creato un dataframe con 100 valori random per colonna (ai fini della spiegazione, i valori di alcune colonne sono stati modificati manualmente).
Nel nostro caso, le prime 10 righe del dataframe avranno questo aspetto:
età | stipendio | esperienza | soddisfazione |
---|---|---|---|
63 | 92401 | 52 | 7 |
32 | 71515 | 22 | 8 |
31 | 98454 | 16 | 3 |
59 | 49390 | 50 | 9 |
35 | 69984 | 19 | 2 |
61 | 88155 | 47 | 4 |
28 | 62082 | 13 | 3 |
28 | 63958 | 13 | 3 |
43 | 45296 | 26 | 1 |
56 | 72554 | 39 | 1 |
La correlazione tra due colonne
Normalmente, ci aspetteremmo una correlazione positiva tra i valori della colonna “età” e quelli della colonna “esperienza”, dato che l’esperienza lavorativa di solito aumenta di pari passo con l’età.
Ecco come ottenere il coefficiente di correlazione tra due variabili (in questo caso, i valori di due colonne):
df['età'].corr(df['esperienza'])
Ed ecco il risultato:
0.9802131683661705
Con un valore di 0.98, abbiamo una fortissima correlazione positiva.
E se volessimo stabilire la correlazione tra stipendio e soddisfazione all’interno del nostro dataframe?
Nulla di più semplice:
df['stipendio'].corr(df['soddisfazione'])
Ed ecco il nostro coefficiente di correlazione tra queste due variabili:
-0.10666109323111787
Con un valore di -0.11, la correlazione è debolmente negativa. Sembra quindi che, uno stipendio più grande non sia correlato ad una maggiore soddisfazione sul lavoro.
La matrice di correlazione
Ma se volessimo calcolare il coefficiente di correlazione tra tutte le colonne del nostro dataframe in una sola volta?
Per farlo, dobbiamo costruire una matrice (o matrix) di correlazione. Ecco come:
df.corr()
Ed ecco il risultato:
età | stipendio | soddisfazione | esperienza | |
---|---|---|---|---|
età | 1.00 | -0.07 | 0.20 | 0.98 |
stipendio | -0.07 | 1.00 | -0.11 | -0.09 |
soddisfazione | 0.20 | -0.10 | 1.00 | 0.39 |
esperienza | 0.98 | -0.09 | 0.39 | 1.00 |
Analizziamo alcune correlazioni interessanti:
Età ed esperienza (0.98): forte correlazione positiva, il che è logico poiché più si è anziani, più esperienza lavorativa si tende ad avere.
Soddisfazione ed esperienza (0.39): Correlazione positiva che suggerisce che la gente che ha più esperienza tende ad essere più soddisfatta del proprio lavoro.
Stipendio ed esperienza (-0.09): Correlazione negativa molto debole che indica che, nel nostro dataframe, all’aumentare dell’esperienza non corrisponde un aumento dello stipendio.
La scelta del metodo di correlazione
Negli esempi visti fin qui, abbiamo utilizzato df.corr()
senza modificare alcun parametro.
Questo vuol dire che, per calcolare il coefficiente di correlazione abbiamo sempre usato il metodo “pearson”.
df.corr()
ci permette infatti di scegliere tra 3 metodi di correlazione:
“pearson”: ideale quando i dati sono distribuiti normalmente e si vuole calcolare una correlazione lineare.
“kendall”: non presuppone una relazione lineare né una distribuzione normale dei dati. Ideale quando si ha campioni di dati piccoli.
“spearman”: è adatto quando si vuole misurare la forza e la direzione di una relazione monotona tra due variabili, specialmente quando i dati non sono distribuiti normalmente o contengono outlier.
Per scegliere un metodo diverso da quello di Pearson (che è quello di default) ci basta fare così:
# Coefficiente di Spearman
df.corr(method='kendall')
# Coefficiente di Kendall Tau
df.corr(method='spearman')
Ultime considerazioni
Per concludere, ricorda che il valore di default di df.corr()
è “pearson”, ma puoi cambiarlo a seconda del tipo dei dati che stai analizzando.
Inoltre, il coefficiente di correlazione calcolato con df.corr()
esclude sempre eventuali valori nulli presenti nel tuo dataframe.
Alla prossima micro-lezione 👋