Aller au contenu

Mesurez un lien monotone avec Spearman et Kendall

Plus on révise, meilleure est la note. Mais pas forcément de façon linéaire : les premières heures rapportent beaucoup, les suivantes de moins en moins. Le coefficient de corrélation de Pearson mesure l’alignement des points sur une droite ; il sous-estime donc un lien fort mais courbé, et il se laisse facilement abuser par un seul point extrême.

Les corrélations de rang mesurent autre chose : à quel point les deux variables montent ensemble, quelle que soit la forme exacte de la relation. Ce chapitre présente les deux plus utilisées, celle de Spearman et celle de Kendall.

Huit étudiants ont noté leurs heures de révision avant un examen, puis leur note sur 20 :

Étudiant12345678
Heures xx24578101215
Note yy69101211141516

La relation est clairement croissante, avec un gain qui s’essouffle et une petite inversion (l’étudiant 5 a révisé plus que l’étudiant 4 et obtenu une note un peu plus basse).

Rappelons que la corrélation de Pearson vaut

r=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2∑i(yi−yˉ)2r = \frac{\sum_i (x_i - \bar x)(y_i - \bar y)}{\sqrt{\sum_i (x_i - \bar x)^2 \sum_i (y_i - \bar y)^2}}

où xˉ\bar x et yˉ\bar y sont les moyennes. Elle vaut ici r≈0,967r \approx 0{,}967. Elle mesure un lien linéaire et suppose, pour ses tests, une loi normale des deux variables (voir le cours de Statistiques).

La corrélation de Spearman : Pearson sur les rangs

Section intitulée « La corrélation de Spearman : Pearson sur les rangs »

L’idée de Spearman est directe : on remplace chaque variable par ses rangs, puis on calcule la corrélation de Pearson sur ces rangs. On la note ρs\rho_s.

S’il n’y a pas d’ex aequo, une formule plus simple donne le même résultat :

ρs=1−6∑idi2n(n2−1)\rho_s = 1 - \frac{6 \sum_i d_i^2}{n(n^2 - 1)}

où did_i est la différence entre le rang de xix_i et le rang de yiy_i, et nn le nombre d’observations.

51015heures de révision4681012141618note sur 20étudiant 4étudiant 5valeurs : Pearson r ≈ 0,96712345678rang des heures12345678rang des notesd = −1d = +1rangs : ρₛ = 1 − 6 × 2 / 504 ≈ 0,976
Spearman, c'est Pearson appliqué au nuage de droite. Seuls les étudiants 4 et 5 s'écartent de la diagonale, d'un rang chacun : Σd² = 2.

ρs\rho_s vaut +1+1 quand yy est une fonction strictement croissante de xx (quelle qu’elle soit), −1-1 quand elle est strictement décroissante, et environ 0 quand il n’y a pas de tendance monotone.

Kendall adopte un point de vue différent. Prenez deux étudiants ii et jj. La paire est :

  • concordante si celui qui a le plus révisé a aussi la meilleure note, c’est-à-dire si (xi−xj)(yi−yj)>0(x_i - x_j)(y_i - y_j) > 0 ;
  • discordante si c’est l’inverse, c’est-à-dire si (xi−xj)(yi−yj)<0(x_i - x_j)(y_i - y_j) < 0.

Le tau de Kendall compare les nombres CC de paires concordantes et DD de paires discordantes :

τ=C−Dn(n−1)/2\tau = \frac{C - D}{n(n-1)/2}

où n(n−1)/2n(n-1)/2 est le nombre total de paires. Son interprétation est très concrète : pour une paire tirée au hasard, τ=P(concordante)−P(discordante)\tau = P(\text{concordante}) - P(\text{discordante}).

2468101214heures de révision6810121416note sur 20la seule paire discordante :(4, 5), plus d’heures, note plus basse27 paires concordantes (en vert)τ = (27 − 1)/28 ≈ 0,929
Kendall compte les segments qui montent (paires concordantes) et ceux qui descendent (discordantes). Un seul descend : τ = (27 − 1)/28.

Remarquez que τ\tau (0,929) est plus petit que ρs\rho_s (0,976) sur les mêmes données. C’est la règle générale : les deux coefficients n’ont pas la même échelle, et ∣τ∣|\tau| est en général plus petit que ∣ρs∣|\rho_s|. Pour une loi normale bivariée de corrélation ρ\rho, on a par exemple τ=2πarcsin⁡ρ\tau = \frac{2}{\pi}\arcsin \rho et ρs=6πarcsin⁡(ρ/2)\rho_s = \frac{6}{\pi}\arcsin(\rho/2) : pour ρ=0,5\rho = 0{,}5, τ≈0,33\tau \approx 0{,}33 et ρs≈0,48\rho_s \approx 0{,}48. Ne comparez donc jamais un τ\tau à un ρs\rho_s.

0,00,20,40,60,81,0corrélation ρ de la loi normale bivariée0,00,20,40,60,81,0valeur du coefficientρₛ ≈ 0,48τ ≈ 0,33ρ (Pearson)ρₛ = (6/π) arcsin(ρ/2)τ = (2/π) arcsin ρ
Les deux coefficients n'ont pas la même échelle : pour un même lien, τ est plus petit que ρₛ. Comparer un τ à un ρₛ n'a pas de sens.

Avec des ex aequo, une paire peut n’être ni concordante ni discordante. La version tau-b, utilisée par défaut par scipy et par R, corrige le dénominateur :

τb=C−D(n0−nx)(n0−ny)\tau_b = \frac{C - D}{\sqrt{(n_0 - n_x)(n_0 - n_y)}}

où n0=n(n−1)/2n_0 = n(n-1)/2, nxn_x est le nombre de paires ex aequo sur xx et nyn_y le nombre de paires ex aequo sur yy. Sans ex aequo, τb=τ\tau_b = \tau. Pour Spearman, on donne le rang moyen aux ex aequo et on calcule Pearson sur les rangs (la formule avec ∑di2\sum d_i^2 n’est alors plus exacte).

Deux situations montrent l’intérêt des corrélations de rang.

Une relation monotone mais courbe. Prenez x=1,2,…,8x = 1, 2, \dots, 8 et y=2xy = 2^x (une croissance exponentielle, 2, 4, 8, … , 256). Le lien est parfait : yy est entièrement déterminé par xx et croît avec lui. Pourtant, Pearson ne vaut que 0,85, car les points ne sont pas alignés. Spearman et Kendall valent exactement 1.

Un seul point aberrant. Prenez dix points sans aucune tendance, dont yy oscille autour de 5 (5,1 ; 4,8 ; 5,3 ; 4,9 ; 5,2 ; 5,0 ; 4,7 ; 5,4 ; 4,6 pour x=1x = 1 à 9), et ajoutez un dixième point, x=10x = 10 et y=30y = 30 (une erreur de saisie, par exemple).

Sans le point aberrantAvec le point aberrant
Pearson−0,220,52
Spearman−0,220,12
Kendall−0,170,07

Un seul point fait passer Pearson d’une légère corrélation négative à une corrélation positive « nette ». Pour les coefficients de rang, ce point n’est que « le plus grand yy » : son poids est borné, et la conclusion (pas de lien) ne change pas.

2468x050100150200250yPearson ≈ 0,85Spearman = Kendall = 1monotone mais courbe : y = 2ˣ246810x051015202530yun seul pointaberrant (10 ; 30)sans → avec le pointPearson : −0,22 → 0,52Spearman : −0,22 → 0,12Kendall : −0,17 → 0,07un point aberrant
À gauche, le lien est parfait mais courbe : Pearson ne vaut que 0,85. À droite, un seul point fait passer Pearson de −0,22 à 0,52, alors que les coefficients de rang restent proches de 0.
températureperformanceρₛ = 0,00y dépend pourtantentièrement de x
Un lien parfait mais en U : ρₛ = 0, parce que la relation n'est ni croissante ni décroissante.

Sous H0H_0 (les deux variables sont indépendantes), toutes les permutations des rangs de yy sont équiprobables : c’est ce qui rend ces tests libres de distribution.

  • Loi exacte : pour de petits nn, on énumère les n!n! permutations. Pour notre fil rouge, seules 8 permutations sur 8!=40 3208! = 40\,320 donnent ∑di2≤2\sum d_i^2 \le 2 (l’identité et les 7 échanges de deux rangs voisins), d’où une p-valeur bilatérale exacte de 2×8/40 320≈0,00042 \times 8/40\,320 \approx 0{,}0004. C’est aussi la p-valeur exacte de Kendall, puisque les permutations avec D≤1D \le 1 sont les mêmes.
  • Approximations : pour Spearman, t=ρs(n−2)/(1−ρs2)t = \rho_s \sqrt{(n-2)/(1-\rho_s^2)} suit approximativement une loi de Student à n−2n - 2 degrés de liberté ; pour Kendall, sous H0H_0, Var(τ)=2(2n+5)9n(n−1)\mathrm{Var}(\tau) = \frac{2(2n+5)}{9n(n-1)} et τ\tau est approximativement normal.
from scipy import stats
heures = [2, 4, 5, 7, 8, 10, 12, 15]
notes = [6, 9, 10, 12, 11, 14, 15, 16]
print(stats.pearsonr(heures, notes)) # r ≈ 0.967
print(stats.spearmanr(heures, notes)) # rho ≈ 0.976, p ≈ 3e-05 (approximation de Student)
print(stats.kendalltau(heures, notes)) # tau ≈ 0.929, p ≈ 0.0004 (loi exacte)

En R, une seule fonction, cor.test, avec l’argument method :

heures <- c(2, 4, 5, 7, 8, 10, 12, 15)
notes <- c(6, 9, 10, 12, 11, 14, 15, 16)
cor.test(heures, notes, method = "pearson")
cor.test(heures, notes, method = "spearman") # S = 2 (somme des d²), rho = 0.976, p ≈ 0.0004
cor.test(heures, notes, method = "kendall") # T = 27 (paires concordantes), tau = 0.929, p ≈ 0.0004
CritèreSpearmanKendall
InterprétationPearson sur les rangsP(concordance)−P(discordance)P(\text{concordance}) - P(\text{discordance})
Robustesse aux points extrêmesbonnemeilleure (chaque paire compte pour 1)
Petits échantillons, nombreux ex aequocorrectemeilleures propriétés, tau-b gère bien les ex aequo
CalculO(nlog⁡n)O(n \log n)O(n2)O(n^2) naïf, O(nlog⁡n)O(n \log n) avec un tri astucieux
Usage courantexploration, sélection de variablescomparaison de classements, petits nn

En data science, Spearman sert souvent à repérer des variables liées de façon monotone à la cible, et Kendall à comparer deux classements : le classement prédit par un moteur de recommandation et le classement réel, ou deux classements de modèles.

  • Pearson mesure un lien linéaire ; il est trompé par une relation courbe ou par un seul point extrême.
  • Spearman ρs\rho_s est la corrélation de Pearson des rangs ; sans ex aequo, ρs=1−6∑di2/(n(n2−1))\rho_s = 1 - 6\sum d_i^2 / (n(n^2-1)).
  • Kendall τ=(C−D)/(n(n−1)/2)\tau = (C - D)/(n(n-1)/2) compare paires concordantes et discordantes ; tau-b corrige les ex aequo.
  • Les deux valent ±1\pm 1 pour une relation strictement monotone et sont invariants par transformation croissante ; ∣τ∣|\tau| est en général plus petit que ∣ρs∣|\rho_s|.
  • Une corrélation de rang nulle signifie « pas de lien monotone », pas « pas de lien ».
  • scipy.stats.spearmanr, scipy.stats.kendalltau ; en R, cor.test(..., method = "spearman") ou "kendall".

Exercice · Deux jurys

facile

Deux jurys classent six projets. Jury A : 1, 2, 3, 4, 5, 6. Jury B (pour les mêmes projets) : 2, 1, 4, 3, 6, 5. Calculez ρs\rho_s et τ\tau.

Voir la solution

Les différences de rang valent toutes ±1\pm 1 : ∑di2=6\sum d_i^2 = 6, d’où

ρs=1−6×66×35=1−36210≈0,829\rho_s = 1 - \frac{6 \times 6}{6 \times 35} = 1 - \frac{36}{210} \approx 0{,}829

Paires : il y a 6×5/2=156 \times 5/2 = 15 paires. Les discordantes sont les trois paires inversées, (1, 2), (3, 4) et (5, 6) ; toutes les autres sont concordantes. C=12C = 12, D=3D = 3, τ=(12−3)/15=0,6\tau = (12 - 3)/15 = 0{,}6. Les deux jurys sont largement d’accord ; on retrouve τ\tau plus petit que ρs\rho_s.

En code

from scipy import stats
jury_A = [1, 2, 3, 4, 5, 6]
jury_B = [2, 1, 4, 3, 6, 5]
print(stats.spearmanr(jury_A, jury_B).statistic) # 0.829
print(stats.kendalltau(jury_A, jury_B).statistic) # 0.6

Exercice · Évaluer un classement prédit

moyen

Un moteur de recommandation classe six articles dans l’ordre 3, 1, 2, 6, 4, 5, alors que leur ordre de pertinence réel est 1, 2, 3, 4, 5, 6 (autrement dit, l’article réellement le plus pertinent est placé en 3e position, etc.).

  1. Calculez τ\tau entre classement prédit et classement réel.
  2. Interprétez-le comme une probabilité.
  3. Calculez ρs\rho_s.
Voir la solution
  1. Positions prédites : (3, 1, 2, 6, 4, 5). Une paire (i,j)(i, j) avec i<ji \lt j est discordante si la position de ii est plus grande que celle de jj. Paires discordantes : (1, 2) car 3>13 \gt 1, (1, 3) car 3>23 \gt 2, (4, 5) car 6>46 \gt 4, (4, 6) car 6>56 \gt 5. D=4D = 4, C=15−4=11C = 15 - 4 = 11, τ=7/15≈0,47\tau = 7/15 \approx 0{,}47.
  2. Deux articles tirés au hasard sont dans le bon ordre avec une probabilité 11/15≈0,7311/15 \approx 0{,}73, et dans le mauvais ordre avec une probabilité 4/15≈0,274/15 \approx 0{,}27 ; τ\tau est la différence des deux.
  3. Différences de rang : 3−1=23-1 = 2, 1−2=−11-2 = -1, 2−3=−12-3 = -1, 6−4=26-4 = 2, 4−5=−14-5 = -1, 5−6=−15-6 = -1. ∑di2=4+1+1+4+1+1=12\sum d_i^2 = 4 + 1 + 1 + 4 + 1 + 1 = 12, ρs=1−72/210≈0,657\rho_s = 1 - 72/210 \approx 0{,}657.

En code

import itertools
from scipy import stats
reel = [1, 2, 3, 4, 5, 6]
predit = [3, 1, 2, 6, 4, 5] # position prédite de chaque article
# Paires discordantes, comptées une à une
D = sum((predit[i] - predit[j]) * (reel[i] - reel[j]) < 0
for i, j in itertools.combinations(range(6), 2))
print(D, 15 - D) # D = 4, C = 11
print(stats.kendalltau(reel, predit).statistic) # 0.467 (= 7/15)
print(stats.spearmanr(reel, predit).statistic) # 0.657

Exercice · Choisir un coefficient

difficile

Pour chaque situation, dites quel coefficient vous calculeriez et pourquoi.

  1. Le lien entre la surface d’un appartement et son prix, sur 5 000 annonces, avec quelques annonces aberrantes (prix saisi en centimes).
  2. Le lien entre le niveau de satisfaction (très insatisfait à très satisfait, 5 niveaux) et le nombre de commandes, sur 40 clients.
  3. Le lien entre la dose d’un engrais et le rendement, sachant qu’au-delà d’une certaine dose l’engrais devient toxique.
Voir la solution
  1. Spearman (ou Kendall) : sur un grand échantillon, Spearman est rapide et robuste aux quelques prix aberrants, alors que Pearson serait fortement déformé. Mieux encore, nettoyer les erreurs de saisie avant tout calcul.
  2. Kendall tau-b : la satisfaction est ordinale avec seulement 5 niveaux, donc beaucoup d’ex aequo, et l’échantillon est petit. Tau-b gère bien les ex aequo.
  3. Aucun des trois ne convient seul : la relation monte puis descend (non monotone), donc Pearson, Spearman et Kendall peuvent être proches de 0 malgré un lien fort. Il faut tracer le nuage de points, puis modéliser la relation (régression avec un terme quadratique, par exemple) ou utiliser une mesure de dépendance générale comme l’information mutuelle.

En code

import numpy as np
from scipy import stats
# Question 3 : un rendement qui monte puis descend avec la dose d'engrais
dose = np.arange(0, 11) # doses 0 à 10
rendement = 50 - (dose - 5) ** 2 # maximum à la dose 5, lien parfait
print(stats.pearsonr(dose, rendement).statistic) # 5e-18, soit 0 aux erreurs d'arrondi près
print(stats.spearmanr(dose, rendement).statistic) # 0.0
print(stats.kendalltau(dose, rendement).statistic) # 0.0