introduzione

Questa guida è un’introduzione a Spearman’s rank correlation coefficientil suo calcolo matematico e il suo calcolo tramite Python pandas. Costruiremo vari esempi per acquisire una comprensione di base di questo coefficiente e dimostreremo come visualizzare il correlation matrix attraverso heatmaps.

Qual è il coefficiente di correlazione del rango di Spearman?

Spearman rank correlation è strettamente correlato al Pearson correlationed entrambi sono un valore limitato, from -1 a 1 indicando un correlation tra due variabili.

Se desideri saperne di più sul coefficiente di correlazione alternativo, leggi la nostra Guida al coefficiente di correlazione di Pearson in Python.

Il coefficiente di correlazione di Pearson viene calcolato utilizzando valori di dati grezzi, mentre la correlazione di Spearman viene calcolata da ranghi dei valori individuali. Mentre il coefficiente di correlazione di Pearson è una misura della relazione lineare tra due variabili, il coefficiente di correlazione del rango di Spearman misura la relazione monotona tra un coppia di variabili. Per comprendere la correlazione di Spearman, abbiamo bisogno di una comprensione di base di monotonic functions.

Funzioni monotone

Esistono funzioni monotonicamente crescenti, monotonicamente decrescenti e non montoniche.

Per una funzione monotonicamente crescente, all’aumentare di X, aumenta anche Y (e non deve essere necessariamente lineare). Per una funzione decrescente monotonicamente, all’aumentare di una variabile, l’altra diminuisce (inoltre non deve essere lineare). Una funzione non monotona è dove l’aumento del valore di una variabile può talvolta portare ad un aumento e talvolta portare a una diminuzione del valore dell’altra variabile.

Misure del coefficiente di correlazione del rango di Spearman the monotonic relation between two variables. I suoi valori vanno da -1 a +1 e possono essere interpretati come:

  • +1: Rapporto perfettamente monotonicamente crescente
  • +0.8: Forte relazione monotonicamente crescente
  • +0.2: Debole relazione in aumento monotono
  • 0: Relazione non monotona
  • -0.2: Debole relazione monotonicamente decrescente
  • -0.8: Forte relazione monotonicamente decrescente
  • -1: Relazione perfettamente monotonicamente decrescente

Espressione matematica

Supponiamo di avere (n) osservazioni di due variabili casuali, (X) e (Y). Per prima cosa classifichiamo tutti i valori di entrambe le variabili rispettivamente come (X_r) e (Y_r). Il coefficiente di correlazione del rango di Spearman è indicato da (r_s) ed è calcolato da:

$$
r_s = rho_{X_r,Y_r} = frac{testo{COV}(X_r,Y_r)}{testo{STD}(X_r)testo{STD}(Y_r)} = frac{nsumlimits_{x_rin X_r, y_r in Y_r} x_r y_r – sumlimits_{x_rin X_r}x_rsumlimits_{y_rin Y_r}y_r}{sqrt{Grande(nsumlimits_{x_r in X_r} x_r^2 -(sumlimits_{x_rin X_r}x_r)^2Grande)}sqrt{Grande(nsumlimits_{y_r in Y_r } y_r^2 – (sumlimits_{y_rin Y_r}y_r)^2 Grande)}}
$$

Qui, COV() è la covarianza, e STD() è la deviazione standard. Prima di vedere le funzioni di Python per calcolare questo coefficiente, facciamo un esempio di calcolo a mano per capire l’espressione e apprezzarla.

Esempio di calcolo

Supponiamo di avere alcune osservazioni delle variabili casuali (X) e (Y). Il primo passo è convertire (X) e (Y) in (X_r) e (Y_r), che rappresentano i loro ranghi corrispondenti. Sarebbero necessari anche alcuni valori intermedi, che sono riportati di seguito:




X


=


[



2



1


0


1


2



]
T





Y


=


[


4


1


3


2


0



]
T






X
r



=


[


1


2


3


4


5



]
T






Y
r



=


[


5


2


4


3


1



]
T






X
r
2



=


[


1


4


9


16


25



]
T






Y
r
2



=


[


25


4


16


9


1



]
T






X
r


Y
r



=


[


5


4


12


12


5



]
T




Usiamo la formula di prima per calcolare la correlazione di Spearman:


r
S

=


5

38

(
15
)
(
15
)



(
5

55


15
2

)


(
5

55


15
2

)



=

181
532

=

0.7

Grande! Tuttavia, calcolarlo manualmente richiede molto tempo e il miglior uso dei computer è, beh, calcolare le cose per noi. Calcolare la correlazione di Spearman è davvero facile e diretto con le funzioni integrate in Pandas.

Calcolo del coefficiente di correlazione del rango di Spearman utilizzando Panda

I vari coefficienti di correlazione, incluso Spearman, possono essere calcolati tramite il corr() metodo della libreria Pandas.

Come argomento di input, il corr() accetta il metodo da utilizzare per calcolare la correlazione (spearman nel nostro caso). Il metodo è chiamato su a DataFramediciamo di taglia mxndove ogni colonna rappresenta i valori di una variabile casuale e m rappresenta i campioni totali di ciascuna variabile.

Per n variabili casuali, restituisce un nxn matrice quadrata R. R(i,j) indica il coefficiente di correlazione del rango di Spearman tra la variabile casuale i e j. Poiché il coefficiente di correlazione tra una variabile e se stessa è 1, tutte le voci diagonali (i,i) sono uguali all’unità. In breve:

R
(
io
,
j
)
=

{




r

io
,
j




Se
io

j




1


altrimenti





Si noti che la matrice di correlazione è simmetrica in quanto la correlazione è simmetrica, cioè M(i,j)=M(j,i). Prendiamo il nostro semplice esempio della sezione precedente e vediamo come usare Pandas’ corr() funzione:

import numpy as np
import pandas as pd
import seaborn as sns # For pairplots and heatmaps
import matplotlib.pyplot as plt

Useremo Pandas per il calcolo stesso, Matplotlib con Seaborn per la visualizzazione e Numpy per operazioni aggiuntive sui dati.

Il codice seguente calcola la matrice di correlazione di Spearman sul dataframe x_simple. Notare la ones sulle diagonali, indicando che il coefficiente di correlazione di una variabile con se stessa è naturalmente, one:

x_simple = pd.DataFrame([(-2,4),(-1,1),(0,3),(1,2),(2,0)],
                        columns=["X","Y"])
my_r = x_simple.corr(method="spearman")
print(my_r)
     X    Y
X  1.0 -0.7
Y -0.7  1.0

Visualizzazione del coefficiente di correlazione

Data la struttura tabellare delle intensità limitate, [-1, 1] – un modo naturale e conveniente di visualizzare il coefficiente di correlazione è a heatmap.

Se desideri saperne di più sulle mappe di calore in Seaborn, leggi la nostra Guida definitiva alle mappe di calore in Seaborn con Python!

Una mappa di calore è una griglia di celle, in cui a ciascuna cella viene assegnato un colore in base al suo valore, e questo modo visivo di interpretare le matrici di correlazione è molto più semplice per noi rispetto all’analisi dei numeri. Per i tavoli piccoli come quello precedentemente prodotto, va perfettamente bene. Ma con Un sacco di variabili, è molto più difficile interpretare effettivamente cosa sta succedendo.

Definiamo un display_correlation() che calcola il coefficiente di correlazione e lo visualizza come una mappa di calore:

def display_correlation(df):
    r = df.corr(method="spearman")
    plt.figure(figsize=(10,6))
    heatmap = sns.heatmap(df.corr(), vmin=-1, 
                      vmax=1, annot=True)
    plt.title("Spearman Correlation")
    return(r)

Chiamiamo display_correlation() sulla nostra r_simple DataFrame per visualizzare la correlazione di Spearman:

r_simple=display_correlation(x_simple)

Comprendere il coefficiente di correlazione di Spearman su esempi sintetici

Per comprendere il coefficiente di correlazione di Spearman, generiamo alcuni esempi sintetici che accentuano il modo in cui funziona il coefficiente, prima di immergerci in esempi più naturali. Questi esempi ci aiuteranno a capire, per quale tipo di relazioni questo coefficiente è +1, -1 o vicino a zero.

Prima di generare gli esempi, creeremo una nuova funzione di supporto, plot_data_corr()che chiama display_correlation() e traccia i dati rispetto a X:

def plot_data_corr(df,title,color="green"):    
    r = display_correlation(df)
    fig, ax = plt.subplots(nrows=1, ncols=len(df.columns)-1,figsize=(14,3))
    for i in range(1,len(df.columns)):
        ax[i-1].scatter(df["X"],df.values[:,i],color=color)
        ax[i-1].title.set_text(title[i] +'n r=" + 
                             "{:.2f}".format(r.values[0,i]))
        ax[i-1].set(xlabel=df.columns[0],ylabel=df.columns[i])
    fig.subplots_adjust(wspace=.7)    
    plt.show()

Funzioni monotonicamente crescenti

Generiamo alcune funzioni che aumentano in modo monotono, usando Numpy, e diamo un’occhiata a DataFrame una volta riempiti con i dati sintetici:

seed = 11
rand = np.random.RandomState(seed)
# Create a data frame using various monotonically increasing functions
x_incr = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_incr["Line+"] = x_incr.X*2+1
x_incr["Sq+"] = x_incr.X**2
x_incr["Exp+"] = np.exp(x_incr.X)
x_incr["Cube+"] = (x_incr.X-5)**3

print(x_incr.head())
X Riga+ mq+ Esp+ Cubo+
0 1.802697 4.605394 3.249716 6.065985 -32.685221
1 0.194752 1.389505 0.037929 1.215010 -110.955110
2 4.632185 10.264371 21.457140 102.738329 -0.049761
3 7.249339 15.498679 52.552920 1407.174809 11.380593
4 4.202036 9.404072 17.657107 66.822246 -0,508101

Ora diamo un’occhiata alla mappa termica della correlazione di Spearman e alla trama di varie funzioni contro X:

plot_data_corr(x_incr,["X","2X+1","$X^2$","$e^X$","$(X-5)^3$"])

funzioni monotonicamente crescenti

Possiamo vedere che per tutti questi esempi c’è una relazione perfettamente monotonicamente crescente tra le variabili. La correlazione di Spearman è un +1, indipendentemente dal fatto che le variabili abbiano una relazione lineare o non lineare.

Pearson avrebbe prodotto risultati molto diversi qui, dal momento che è calcolato in base a linear relazione tra le variabili.

Finché Y aumenta all’aumentare di X, senza falliresarà il coefficiente di correlazione del rango di Spearman 1.

Funzioni decrescenti monotonicamente

Ripetiamo gli stessi esempi su funzioni decrescenti monotonicamente. Genereremo nuovamente dati sintetici e calcoleremo la correlazione del rango di Spearman. Per prima cosa, diamo un’occhiata alle prime 4 righe del DataFrame:

# Create a data matrix
x_decr = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_decr["Line-"] = -x_decr.X*2+1
x_decr["Sq-"] = -x_decr.X**2
x_decr["Exp-"] = np.exp(-x_decr.X)
x_decr["Cube-"] = -(x_decr.X-5)**3
x_decr.head()
X Linea- mq- Exp- Cubo-
0 3.181872 -5.363744 -10.124309 0,041508 6.009985
1 2.180034 -3.360068 -4.752547 0.113038 22.424963
2 8.449385 -15.898771 -71.392112 0.000214 -41.041680
3 3.021647 -5.043294 -9.130350 0.048721 7.743039
4 4.382207 -7.764413 -19.203736 0.012498 0,235792

La mappa di calore della matrice di correlazione e il grafico delle variabili sono riportati di seguito:

plot_data_corr(x_decr,["X","-2X+1","$-X^2$","$-e^X$","$-(X-5)^3$"],"blue")

mappa termica di correlazione

funzioni monotonicamente decrescenti

Funzioni non monotone

Gli esempi seguenti sono per varie funzioni non monotoniche. L’ultima colonna aggiunta al DataFrame è quello di una variabile indipendente Randche non ha alcuna associazione con X.

Questi esempi dovrebbero anche chiarire che la correlazione di Spearman è una misura di monotonicity di una relazione tra due variabili. Un coefficiente zero non indica necessariamente nessuna relazione, ma indica che non esiste monotonicity tra loro.

Prima di generare dati sintetici, definiremo ancora un’altra funzione di supporto, display_corr_pairs()che chiama display_correlation() per visualizzare la mappa termica della matrice di correlazione e quindi tracciare tutte le coppie di variabili nel file DataFramest l’un l’altro usando la libreria Seaborn.

Sulle diagonali, visualizzeremo l’istogramma di ciascuna variabile in colore giallo utilizzando map_diag(). Sotto le diagonali, creeremo un grafico a dispersione di tutte le coppie di variabili. Poiché la matrice di correlazione è simmetrica, non abbiamo bisogno dei grafici sopra le diagonali.

Mostriamo anche il coefficiente di correlazione di Pearson per il confronto:

def display_corr_pairs(df,color="cyan"):
    s = set_title = np.vectorize(lambda ax,r,rho: ax.title.set_text("r = " + 
                                        "{:.2f}".format(r) + 
                                        'n $rho$ = ' + 
                                        "{:.2f}".format(rho)) if ax!=None else None
                            )      

    r = display_correlation(df)
    rho = df.corr(method="pearson")
    g = sns.PairGrid(df,corner=True)
    g.map_diag(plt.hist,color="yellow")
    g.map_lower(sns.scatterplot,color="magenta")
    set_title(g.axes,r,rho)
    plt.subplots_adjust(hspace = 0.6)
    plt.show()    

Creeremo un DataFrame non monotono, x_noncon queste funzioni di X:

  • Parabola: ( (X-5)^2 )

  • Peccato: ( peccato (frac{X}{10}2pi) )

  • Frac: ( frac{X-5}{(X-5)^2+1} )

  • Rand: numeri casuali nell’intervallo [-1,1]

Di seguito le prime 4 righe di x_non:

x_non = pd.DataFrame({"X":rand.uniform(0,10,100)})
x_non["Parabola"] = (x_non.X-5)**2
x_non["Sin"] = np.sin(x_non.X/10*2*np.pi)
x_non["Frac"] = (x_non.X-5)/((x_non.X-5)**2+1)
x_non["Rand"] = rand.uniform(-1,1,100)

print(x_non.head())
X Parabola Peccato frac Rand
0 0,654466 18.883667 0.399722 -0,218548 0,072827
1 5.746559 0,557351 -0,452063 0,479378 -0,818150
2 6.879362 3.532003 -0.924925 0,414687 -0,868501
3 5.683058 0,466569 -0,416124 0,465753 0.337066
4 6.037265 1.075920 -0,606565 0.499666 0,583229

Il coefficiente di correlazione di Spearman tra diverse coppie di dati è illustrato di seguito:

display_corr_pairs(x_non)

mappa termica di correlazione

funzioni non monotone

Questi esempi mostrano per quale tipo di dati la correlazione di Spearman è vicina allo zero e dove ha valori intermedi. Un’altra cosa da notare è che la correlazione di Spearman e il coefficiente di correlazione di Pearson non sono sempre in accordo tra loro, quindi la mancanza dell’uno non significa la mancanza dell’altro.

Sono usati per testare la correlazione per diversi aspetti dei dati e non possono essere usati in modo intercambiabile. Mentre saranno d’accordo in alcuni casi, non lo saranno sempre.

Coefficiente di correlazione di Spearman attivato Linnerud Set di dati

Applichiamo il coefficiente di correlazione di Spearman su un set di dati effettivo. Abbiamo scelto il semplice set di dati sull’esercizio fisico chiamata linnerud dal sklearn.datasets per la dimostrazione:

import sklearn.datasets.load_linnerud

Il codice seguente carica il set di dati e unisce le variabili e gli attributi di destinazione in uno DataFrame. Diamo un’occhiata alle prime 4 righe del linnerud dati:

d=load_linnerud()

dat = pd.DataFrame(d.data,columns=d.feature_names)
alldat=dat.join(pd.DataFrame(d.target,columns=d.target_names) )
alldat.head()
Menti Situ Salti Il peso Vita Polso
0 5.0 162.0 60.0 191.0 36.0 50.0
1 2.0 110.0 60.0 189.0 37.0 52.0
2 12.0 101.0 101.0 193.0 38.0 58.0
3 12.0 105.0 37.0 162.0 35.0 62.0
4 13.0 155.0 58.0 189.0 35.0 46.0

Ora, mostriamo le coppie di correlazione usando il nostro display_corr_pairs():

display_corr_pairs(alldat)

mappa termica di correlazione

analisi di correlazione del set di dati dell'esercizio fisico

Osservando i valori di correlazione di Spearman, possiamo trarre conclusioni interessanti come:

  • Valori di vita più alti implicano valori di peso crescenti (da r = 0.81)
  • Più situp hanno valori di vita più bassi (da r = -0.72)
  • Menti, addominali e salti non sembrano avere una relazione monotona con il polso, poiché i valori r corrispondenti sono vicini allo zero.

Conclusioni

In questa guida, abbiamo discusso del coefficiente di correlazione del rango di Spearman, della sua espressione matematica e del suo calcolo tramite Python pandas.

Abbiamo dimostrato questo coefficiente su vari esempi sintetici e anche sul Linnerrud set di dati. Il coefficiente di correlazione di Spearman è una misura ideale per calcolare la monotonia della relazione tra due variabili. Tuttavia, un valore vicino a zero non indica necessariamente che le variabili non hanno alcuna associazione tra di loro.