Come calcolare la correlazione tra variabili in Python

Come calcolare la correlazione tra variabili in Python

16 Gennaio 2023 ai 0
Come calcolare la correlazione tra variabili in Python

Un data engineer e in generale chi lavora con i big data conosce la sensazione che si ha prima di iniziare a lavorare su un grosso dataset: non si sa quali risposte arriveranno dai dati e non si sa quale correlazione tra variabili in Python emergeranno.

È importantissimo scoprire e quantificare il grado di dipendenza tra le variabili del dataset. 

In questa guida vedremo:

  • Perché la correlazione è considerata la sintesi statistica della relazione tra variabili;
  • Come si calcola la correlazione tra variabili in Python.

Cos’è la correlazione tra variabili in Python?

Le variabili di un insieme di dati possono essere correlate per molte ragioni.

Ad esempio una variabile può causare o dipendere dai valori di un’altra, oppure potrebbero presentare una leggera associazione, oppure essere entrambe dipendenti da una terza variabile ancora ignota.

Correlazione diretta e inversa

Una correlazione tra variabili in Python può essere diretta (o positiva) quando entrambe le variabili si muovono nella stessa direzione, o inversa (o negativa), ovvero quando al salire del primo valore, scende il secondo. Oppure può esserci una correlazione neutra (anche detta “nulla”).

Le prestazioni di alcuni modelli possono peggiorare se due o più variabili sono strettamente correlate, il che si chiama multicollinearità.

La struttura della relazione può essere nota, ad esempio può essere lineare, oppure non abbiamo idea se esista una relazione tra due variabili o quale struttura possa avere. A seconda di ciò che si conosce della relazione e della distribuzione delle variabili, si possono calcolare diversi punteggi di correlazione.

Vediamo di trovare un punteggio di correlazione tra variabili che hanno una distribuzione gaussiana e una relazione lineare e un altro che non presuppone una distribuzione e che riporta qualsiasi relazione monotona (crescente o decrescente).

Set di dati di prova nella correlazione tra variabili in Python

Prima di esaminare i metodi di correlazione, definiamo un set di dati da utilizzare per testare i metodi.

Genereremo 1.000 campioni di due variabili con una forte correlazione positiva. La prima variabile sarà costituita da numeri casuali estratti da una distribuzione gaussiana con una media di 100 e una deviazione standard di 20. La seconda variabile sarà costituita da valori della distribuzione gaussiana, ovvero i valori della prima variabile con l’aggiunta di un rumore gaussiano con una media di 50 e una deviazione standard di 10. 

Useremo la funzione randn() per generare valori gaussiani casuali con una media di 0 e una deviazione standard di 1, quindi moltiplicheremo i risultati per la nostra deviazione standard e aggiungeremo la media per spostare i valori nell’intervallo preferito.

Useremo il generatore di numeri pseudorandom per ottenere lo stesso campione numerico a ogni esecuzione del codice.

# generare le variabili correlate

from numpy import media

from numpy import std

from numpy.random import randn

from numpy.random import seed

from matplotlib import pyplot

# Generatore di numeri casuali

seed(1)

# preparare i dati

dati1 = 20 * randn(1000) + 100

dati2 = dati1 + (10 * randn(1000) + 50)

# riassumere

print('dati1: media=%.3f stdv=%.3f' % (media(dati1), std(dati1))

print('dati2: media=%.3f stdv=%.3f' % (media(dati2), std(dati2)))

# tracciare un grafico

pyplot.scatter(dati1, dati2)

pyplot.show()

Così facendo si ottengono la media e la deviazione standard di ciascuna variabile.

dati1: media=100,776 stdv=19,620

dati2: media=151,050 stdv=22,358

In tal modo viene creato un grafico a dispersione delle due variabili. Noi sappiamo fin dall’inizio che esiste una relazione tra le due variabili. 

Grafico di dispersione del dataset 

Prima di calcolare alcuni punteggi di correlazione è necessario esaminare la covarianza, ricordando che se la covarianza è pari a zero indica che le due variabili sono completamente indipendenti. La calcoliamo così:

cov(X, Y) = (somma (x - media(X)) * (y - media(Y)) * 1/(n-1)

Si presuppone che i dati abbiano una distribuzione gaussiana (e per questo si usa la media).

Il segno della covarianza può essere interpretato come se le due variabili cambiassero nella stessa direzione (positivo) o in direzioni diverse (negativo). 

Per calcolare la matrice di covarianza tra due o più variabili possiamo invece servirci della funzione NumPy cov().

covarianza = cov(dati1, dati2)

Ora procediamo al calcolo della covarianca nel nostro esempio:

# calcola la covarianza tra due variabili

from numpy.random import randn

from numpy.random import seed

da numpy import cov

# semina il generatore di numeri casuali

seed(1)

# preparare i dati

dati1 = 20 * randn(1000) + 100

dati2 = dati1 + (10 * randn(1000) + 50)

# calcolare la matrice di covarianza

covarianza = cov(dati1, dati2)

print(covarianza)

La covarianza tra le due variabili è pari a 389,75 e si tratta di una covarianza positiva. 

Correlazione di Pearson

Coefficiente di correlazione di Pearson = covarianza(X, Y) / (stdv(X) * stdv(Y))

Dato che la covarianza è spesso un valore difficield a interpretare, dobbiamo far scendere in campo il coefficiente di correlazione di Pearson. Questo coefficiente esprime la forza della relazione lineare tra due campioni di dati.

È in sostanza la covarianza delle due variabili divisa per il prodotto della deviazione standard di ciascun campione di dati. Con la normalizzazione della covarianza tra le due variabili si ottiene infine un punteggio interpretabile.

Il coefficiente restituisce un valore compreso tra -1 (correlazione negativa) e 1 (correlazione politiva). Un valore pari a 0 significa che non c’è correlazione. 

La funzione pearsonr() di SciPy può essere utilizzata per calcolare il coefficiente di correlazione di Pearson tra due campioni di dati della stessa lunghezza.

Ora possiamo procedere al nostro calcolo.

Come calcolare la correlazione di Pearson tra variabili – Python

# calcola la correlazione di Pearson tra due variabili

from numpy.random import randn

from numpy.random import seed

from scipy.stats import pearsonr

# generatore di numeri casuali

seed(1)

# preparare i dati

dati1 = 20 * randn(1000) + 100

dati2 = dati1 + (10 * randn(1000) + 50)

# calcolare la correlazione di Pearson

corr, _ = pearsonr (dati1, dati2)

print ('Correlazione di Pearson: %.3f' % corr)

Correlazione di Pearsons: 0.888

Si può notare che le due variabili sono correlate positivamente e che la correlazione è a un alto livello. 

Il coefficiente di correlazione di Pearson può essere usato anche per valutare la relazione tra più di due variabili.

Ciò può essere fatto calcolando una matrice delle relazioni tra ogni coppia di variabili nel set di dati. Il risultato è una matrice simmetrica chiamata matrice di correlazione con un valore di 1,0 lungo la diagonale, poiché ogni colonna è sempre perfettamente correlata con se stessa.

Correlazione di Spearman

Coefficiente di correlazione di Spearman = covarianza(rank(X), rank(Y)) / (stdv(rank(X)) * stdv(rank(Y))

Due variabili possono essere correlate da una relazione non lineare, tale per cui la relazione è più forte o più debole nella distribuzione delle variabili.

Inoltre, le due variabili considerate possono avere una distribuzione non gaussiana.

In questo caso ci serve il coefficiente di correlazione di Spearman.

Come per il coefficiente di correlazione di Pearson, i punteggi sono compresi tra -1 e 1 per le variabili perfettamente correlate negativamente e perfettamente correlate positivamente.

Non si presuppone una relazione lineare tra le variabili, ma una relazione monotona. 

Se non si è sicuri della distribuzione e delle possibili relazioni tra due variabili, il coefficiente di correlazione di Spearman è lo strumento che ti serve.

Proviamo ora a calcolare la correlazione tra le due variabili nel nostro problema.

# calcola la correlazione di Spearman tra due variabili

from numpy.random import randn

from numpy.random import seed

from scipy.stats import spearmanr

# generatore di numeri casuali

seed(1)

# preparare i dati

dati1 = 20 * randn(1000) + 100

dati2 = dati1 + (10 * randn(1000) + 50)

# calcolare la correlazione di Spearman

corr, _ = spearmanr(dati1, dati2)

print('Correlazione di Spearmans: %.3f' % corr)

L’esecuzione dell’esempio calcola e stampa il coefficiente di correlazione di Spearman.

Sappiamo che i dati sono gaussiani e che la relazione tra le variabili è lineare. Tuttavia, l’approccio non parametrico basato sui ranghi mostra una forte correlazione tra le variabili, in questo caso.

Abbiamo visto come calcolare agevolmente la correlazione tra variabili. Ora divertiti a calcolarle sul tuo dataset!

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *