Fiches › Carte › 0 · Socle probabiliste › leçon 9

Covariance et corrélation

Deux variables bougent-elles ensemble ? La covariance fait la moyenne du produit de leurs écarts au centre ; c'est exactement le terme qui manquait à Var(X + Y). La corrélation la rend sans unité. La leçon suit Brunton 41 et 42 avec ses images : un nuage de points et son point test, X uniforme sur {−1, 0, 1} avec Y = X², des fléchettes sur une cible gaussienne. Elle finit sur un calcul d'entretien : comparer deux modèles sur le même jeu de test (test set).

outilà savoir produire au tableau, donnera une cartecultureà comprendre, reste ici, pas de carte▸ blocs à déplier : exemples, preuve, code, où ça casse
Ce que cette leçon suppose acquis
  • Loi jointe. P(X = x, Y = y) décrit le couple, case par case ; une densité jointe f(x, y) en continu (l07, notion 1).
  • Indépendance. X et Y sont indépendantes quand la loi jointe est le produit des deux lois, pour toutes les cases (l07, notion 4).
  • Espérance. E est linéaire sans aucune hypothèse (l08, notion 3) ; E[XY] = E[X] E[Y] demande l'indépendance (notion 4).
  • Variance. Var(X) = E[(X − μ)²] = E[X²] − μ², la moyenne des carrés des écarts au centre (l08, notion 6) ; Var(aX + b) = a² Var(X) (notion 9). Pour un dé, Var = 35/12 = 2,917.

La leçon

La covariance : la moyenne du rectangle signé outil

Brunton 41 · Covariance and Correlation in Probability

Brunton dessine un nuage de points allongé et incliné, puis choisit un point test. Son écart horizontal au centre est X − μX, son écart vertical Y − μY. Sur un nuage qui monte, un grand écart à droite va presque toujours avec un grand écart vers le haut : les deux écarts ont le même signe.

La covariance est la moyenne du produit de ces deux écarts. Chaque produit est l'aire signée du rectangle tendu entre le centre et le point : positive en haut à droite et en bas à gauche, négative dans les deux autres coins. Avant de la définir, Brunton pose une exigence : Cov(X, X) doit redonner Var(X).

Quatre points équiprobables, (1, 1), (2, 3), (3, 2) et (4, 4). Le centre est (2,5 ; 2,5), les rectangles valent 2,25, −0,25, −0,25 et 2,25. Leur moyenne vaut 1 : les deux grands rectangles positifs l'emportent, Cov = 1.

Voir l'idée — un point test, ses deux écarts, et le rectangle signé

Les traits rouges pointillés passent par le centre (μX, μY). Chaque rectangle va du centre à un point : violet si les deux écarts ont le même signe, rouge sinon. Quatre points : les aires 2,25, −0,25, −0,25 et 2,25, de moyenne 1. Puis les trois nuages de Brunton, 250 points chacun, colorés selon le signe de leur produit. Incliné : 82 % de produits positifs, covariance mesurée 2,18. Plus large, moins pentu : 64 %, covariance 1,17. Rond : 45 % de produits positifs et une covariance de 0 à deux décimales : ce sont les aires qui comptent, pas les signes. Point suivant promène le point test.

La formule
Cov(X, Y) = E[(X − μX)(Y − μY)] = E[XY] − E[X] E[Y]
  • μX = E[X], μY = E[Y]. En discret, la moyenne se fait sur la loi jointe : Σx Σy (x − μX)(y − μY) P(X = x, Y = y). Les deux marginales ne suffisent pas (l07).
  • E[X²] et E[Y²] finies : la covariance existe alors, et elle est bornée par σX σY (notion 4).
  • Cov(X, X) = Var(X), Cov(X, Y) = Cov(Y, X). Son unité est celle de X fois celle de Y.
  • Règles de calcul (preuve plus bas) : Cov(aX + b, cY + d) = ac Cov(X, Y) et Cov(X + Z, Y) = Cov(X, Y) + Cov(Z, Y). Une constante ajoutée ne compte pas, un facteur sort.
Exemples simples constante, X avec lui-même, quatre points, trois couplages de dés, une composante partagée
  1. Une constante. Cov(X, 5) = 0 : la constante n'a aucun écart à sa moyenne, tous les rectangles sont plats.
  2. X avec lui-même. Cov(X, X) = E[(X − μ)²] = Var(X), et Cov(X, −X) = −Var(X). Pour un dé : 2,917 et −2,917.
  3. Les quatre points, par l'autre forme. E[XY] = (1 + 6 + 6 + 16)/4 = 7,25 et E[X] E[Y] = 2,5 × 2,5 = 6,25. Cov = 7,25 − 6,25 = 1, comme la moyenne des rectangles.
  4. Deux dés, mêmes marges, trois couplages. Les E[XY] de l08, notion 4 : indépendants, 12,25 − 12,25 = 0 ; Y = X, 15,17 − 12,25 = 2,917 ; Y = 7 − X, 9,33 − 12,25 = −2,917. Chaque fois X et Y sont des dés équilibrés : seule la jointe change, et la covariance avec elle.
  5. Une composante partagée (séance du 09/10). A, B, C indépendantes, de variance 1 chacune ; X = A + B et Y = A + C. Par la règle de la somme : Cov(X, Y) = Cov(A, A) + Cov(A, C) + Cov(B, A) + Cov(B, C) = 1 + 0 + 0 + 0 = 1. Ce que X et Y ont en commun est exactement leur covariance. En ML, deux variables explicatives (features) qui mesurent la même cause avec des bruits indépendants, deux capteurs de la même température par exemple, sont corrélées par cette cause.
Preuve la forme développée, puis les règles de calcul
Cov(X, Y) = E[(X − μX)(Y − μY)]
définition
= E[XY − μXY − μYX + μXμY]
développer le produit
= E[XY] − μX E[Y] − μY E[X] + μXμY
linéarité, sans hypothèse même si X et Y sont liées (l08) ; μX, μY sont des constantes
= E[XY] − μXμY − μXμY + μXμY = E[XY] − E[X] E[Y]
« deux moins et un plus » : il en reste un (Brunton)

Les règles de calcul se lisent sur les écarts.

Cov(aX + b, cY + d) = E[(aX + b − aμX − b)(cY + d − cμY − d)]
E[aX + b] = aμX + b
= E[a(X − μX) · c(Y − μY)] = ac Cov(X, Y)
b et d s'annulent, a et c sortent
Cov(X + Z, Y) = E[((X − μX) + (Z − μZ))(Y − μY)]
l'écart d'une somme est la somme des écarts
= Cov(X, Y) + Cov(Z, Y)
distribuer, puis linéarité

Avec Y = X, la première ligne redonne Var(X) = E[X²] − μ² (l08, notion 6) : la covariance généralise la variance, comme Brunton l'exigeait.

Simuler en Python la composante partagée, trois façons de calculer, et np.cov
import numpy as np

rng = np.random.default_rng(0)
n = 1_000_000
A, B, C = rng.standard_normal((3, n))      # independent, variance 1 each
X, Y = A + B, A + C                         # A is the shared part

mx, my = X.mean(), Y.mean()
print(f"mean of (X - mx)(Y - my): {np.mean((X - mx) * (Y - my)):.4f}")
print(f"E[XY] - E[X]E[Y]        : {np.mean(X * Y) - mx * my:.4f}")
print(f"np.cov(X, Y)[0, 1]      : {np.cov(X, Y)[0, 1]:.4f}   (theory: Var A = 1)")
print(f"Cov(B, C), nothing shared: {np.cov(B, C)[0, 1]:.4f}")

# the four points: np.cov divides by n - 1 by default
x = np.array([1, 2, 3, 4.]); y = np.array([1, 3, 2, 4.])
print("four points, np.cov          :", np.cov(x, y)[0, 1].round(4))
print("four points, np.cov bias=True:", np.cov(x, y, bias=True)[0, 1])
mean of (X - mx)(Y - my): 1.0003
E[XY] - E[X]E[Y]        : 1.0003
np.cov(X, Y)[0, 1]      : 1.0003   (theory: Var A = 1)
Cov(B, C), nothing shared: -0.0000
four points, np.cov          : 1.3333
four points, np.cov bias=True: 1.0
Où ça casse
  • Il faut la loi jointe. Les mêmes marges, deux dés équilibrés, donnent Cov = 0, +2,917 ou −2,917 selon le couplage (exemple 4). Deux histogrammes tracés séparément ne disent rien de la covariance.
  • Le nombre seul ne dit pas la force du lien. Passer X et Y de pieds en pouces multiplie la covariance par 12 × 12 = 144 sans rien changer au nuage. Et un nuage large mais peu serré peut dépasser un nuage serré : écarts-types 1 et corrélation 0,9 donnent Cov = 0,9 ; écarts-types 2 et corrélation 0,5 donnent Cov = 2. La force se lit sur la corrélation (notion 4).
  • La forme E[XY] − E[X]E[Y] trompe la machine. Quand les moyennes sont énormes devant les écarts, c'est la différence de deux nombres presque égaux. Sur un tirage de cent mille couples centrés autour de 10⁹, de vraie covariance 0,5 : le calcul naïf en flottants rend 384, la moyenne des produits d'écarts rend 0,50. Au clavier, on centre d'abord.
  • np.cov divise par n − 1, np.var par n. Sur les quatre points, np.cov rend 1,333 et np.cov(…, bias=True) rend 1 (code ci-dessus).
Brunton, rectifiéBrunton (41) dit qu'un nuage pentu et serré a « une grande covariance », et qu'un nuage plus large et moins pentu en a moins. Il mélange covariance et corrélation. La covariance grandit aussi avec l'étalement : un nuage plus large de même orientation peut en avoir davantage (deuxième point ci-dessus). Le serrage autour d'une droite, c'est la corrélation qui le mesure, et Brunton le dit lui-même quelques minutes plus tard avec les pieds et les pouces.

Cov(X, Y) = E[(X − μX)(Y − μY)] = E[XY] − E[X]E[Y] : la moyenne du rectangle signé tendu entre le centre et le point.

Var(X ± Y) : le terme croisé, et les deux rôles d'i.i.d. outil

Brunton 41 (et 30 pour Var(X + Y) et Var(2X))

Dès la vidéo 30, Brunton prévient : sous indépendance, Var(X + Y) = Var X + Var Y. Et Var(2X), c'est-à-dire Var(X + X), n'est « absolument pas égale à 2 Var X ; je suis presque sûr qu'elle vaut 4 Var X ». En 41, il donne la règle générale en exercice : Var(X + Y) = Var X + Var Y + 2 Cov(X, Y).

D'où vient le terme croisé ? L'écart de la somme au centre est la somme des deux écarts, et le carré d'une somme a un double produit : (u + v)² = u² + v² + 2uv. En moyenne, u² donne Var X, v² donne Var Y, et 2uv donne deux fois la moyenne du rectangle signé de la notion 1.

Deux dés indépendants : 2,917 + 2,917 + 0 = 5,83. Le même dé compté deux fois : 2,917 + 2,917 + 2 × 2,917 = 11,67. Même espérance 7, deux étalements.

Voir l'idée — deux dés contre un dé doublé

Deux mécanismes, même espérance 7 : la moyenne mesurée (trait rouge) tombe sur 7 en haut comme en bas. Les deux histogrammes partent de 300 tirages : écart-type mesuré 2,42 en haut, 3,38 en bas, pour 2,42 et 3,42 en théorie. Tires-en 500 de plus de chaque côté : la moyenne reste collée à 7, les écarts-types restent séparés. En bas, seules les valeurs paires sortent : 2X ne peut pas faire 7, alors que X + Y le fait une fois sur six. L'écart des variances, 35/3 − 35/6 = 35/6 = 5,83, est le terme croisé 2 Cov(X, X) = 2 Var X.

Les formules
Var(X ± Y) = Var X + Var Y ± 2 Cov(X, Y)      Var(aX + bY) = a² Var X + b² Var Y + 2ab Cov(X, Y)
Var(X1 + … + Xn) = Σi Var Xi + 2 Σi < j Cov(Xi, Xj)      i.i.d. ⇒ nσ²
  • Aucune hypothèse : X et Y quelconques, de variances finies ; a et b sont des constantes. Avec a = 1 et b = −1, c'est la différence : le terme croisé change de signe.
  • Le terme croisé est 2ab Cov(X, Y), pas 2ab E[XY] : comme la variance, il doit ignorer un décalage de X ou de Y.
  • Indépendance ⇒ Cov = 0 ⇒ Var(aX + bY) = a² Var X + b² Var Y (Cov = 0 suffit, notion 3). C'est de l'additivité. La variance n'est jamais linéaire : les coefficients sortent au carré.
  • Pour n variables, i.i.d. contient deux hypothèses qui servent à deux endroits : l'indépendance annule les n(n − 1) covariances, la même loi rend les n variances égales au même σ² (preuve plus bas, figure 1).
Figure 1 — la variance d'une somme est la somme de toutes les cases

La case (i, j) porte Cov(Xi, Xj) ; la diagonale porte les variances ; Var(X1 + … + Xn) est la somme de toutes les cases. i.i.d. : l'indépendance vide les cases hors diagonale, la même loi met 2,917 sur toute la diagonale, et six dés font 6 × 2,917 = 17,5. Lois différentes (une pièce 1–2, des dés à 4, 6, 8, 10, 12 faces) : toujours rien hors diagonale, mais plus de σ² commun, la somme vaut 29,83. Même loi, corrélés : la diagonale fait encore 17,5, et les 30 autres cases ajoutent 43,75. Le même dé n fois : toutes les cases valent 2,917, et 36 × 2,917 = 105 = Var(6X). Ramène n à 2 : le premier bouton donne X + Y (5,83), le dernier 2X (11,67).

Exemples simples le test des constantes, un décalage, une différence, des coefficients, dix dés
  1. Le test des constantes. X = Y = 1 : aX + bY vaut toujours a + b, sa variance est 0. La bonne formule donne a² · 0 + b² · 0 + 2ab · 0 = 0. Avec 2ab E[XY] à la place, on trouverait 2ab · 1 : pour a = 2 et b = 3, une variance de 12 pour une constante.
  2. Le test du décalage. Remplacer X par X + 10 décale aX + bY de 10a sans changer sa variance. Cov(X + 10, Y) = Cov(X, Y) passe le test ; E[(X + 10)Y] = E[XY] + 10 E[Y] ne le passe pas.
  3. Une différence. Deux dés indépendants : Var(X − Y) = 2,917 + 2,917 = 5,83, et non 2,917 − 2,917 = 0. Avec Y = X : X − X = 0, et la formule rend 2,917 + 2,917 − 2 × 2,917 = 0. Avec Y = 7 − X : X − Y = 2X − 7, de variance 11,67.
  4. Des coefficients. Deux dés indépendants : Var(2X − Y) = 4 × 2,917 + 1 × 2,917 = 14,58. Le −1 sort au carré.
  5. Dix dés. Indépendants : 10 × 2,917 = 29,17, écart-type 5,40. Un seul dé multiplié par 10 : Var(10X), avec 10X = X + … + X, dix copies du même dé, vaut 100 × 2,917 = 291,7. Même loi dans les deux cas ; dans le second, les 90 covariances valent 2,917 chacune.
Preuve le terme croisé fait apparaître Cov, puis les deux rôles d'i.i.d.
Var(aX + bY) = E[(aX + bY − aμX − bμY)²]
définition ; E[aX + bY] = aμX + bμY par linéarité
= E[(a(X − μX) + b(Y − μY))²]
l'écart de la combinaison est la combinaison des écarts
= a² E[(X − μX)²] + b² E[(Y − μY)²] + 2ab E[(X − μX)(Y − μY)]
(u + v)² = u² + v² + 2uv, puis linéarité
= a² Var X + b² Var Y + 2ab Cov(X, Y)
définitions de Var (l08, notion 6) et de Cov (notion 1)

D'où vient l'erreur 2ab E[XY]. Partir de la forme de calcul, E[(aX + bY)²] − (E[aX + bY])². Le premier terme apporte 2ab E[XY], le second −2ab μXμY, le double produit du carré de la moyenne. Ensemble : 2ab (E[XY] − μXμY) = 2ab Cov(X, Y). Écrire 2ab E[XY], c'est oublier ce second morceau.

n variables, i.i.d. Chaque ligne n'utilise qu'une hypothèse.

Var(X1 + … + Xn) = Σi Σj Cov(Xi, Xj)
carré de la somme des écarts : toutes les cases de la figure 1 ; aucune hypothèse
= Σi Var Xi + Σi ≠ j Cov(Xi, Xj)
séparer la diagonale : Cov(Xi, Xi) = Var Xi
= Σi Var Xi
indépendance : chaque Cov(Xi, Xj), i ≠ j, est nulle (notion 3)
= nσ²
même loi : chaque Var Xi vaut le même σ²

Sans la même loi, on s'arrête à Σ σi². Sans l'indépendance, les covariances restent : nσ² + n(n − 1)ρσ² si elles valent toutes ρσ² (l10, notion 6, et le pont b04).

Simuler en Python Var(2X − Y), Var(X + X), et une somme corrélée
import numpy as np

rng = np.random.default_rng(1)
n = 1_000_000
X = rng.integers(1, 7, n); Y = rng.integers(1, 7, n)     # two independent dice
v = 35 / 12
print("Var(2X - Y):", np.var(2 * X - Y).round(3), "| 4v + v =", round(5 * v, 3))
print("Var(X - Y) :", np.var(X - Y).round(3), "| v + v =", round(2 * v, 3), "(not v - v = 0)")
print("Var(X + X) :", np.var(X + X).round(3), "| 4v =", round(4 * v, 3))

# six variables of variance 1: independent, then pairwise correlated at 0.5
k, rho = 6, 0.5
iid = rng.standard_normal((k, n))
shared = rng.standard_normal(n)              # a common part creates the covariances
corr = np.sqrt(rho) * shared + np.sqrt(1 - rho) * rng.standard_normal((k, n))
print("Cov of two correlated ones:", np.cov(corr[0], corr[1])[0, 1].round(3))
print("Var(sum), iid       :", np.var(iid.sum(0)).round(3), "| k =", k)
print("Var(sum), correlated:", np.var(corr.sum(0)).round(3),
      "| k + k(k-1) rho =", k + k * (k - 1) * rho)
Var(2X - Y): 14.581 | 4v + v = 14.583
Var(X - Y) : 5.834 | v + v = 5.833 (not v - v = 0)
Var(X + X) : 11.667 | 4v = 11.667
Cov of two correlated ones: 0.502
Var(sum), iid       : 5.996 | k = 6
Var(sum), correlated: 21.063 | k + k(k-1) rho = 21.0
Où ça casse
  • Le terme croisé n'est pas 2ab E[XY]. E[XY] dépend de l'endroit où se trouve le nuage, Cov non (exemples 1 et 2, et la preuve).
  • L'indépendance ne rend pas la variance linéaire. Elle annule le terme croisé : c'est de l'additivité. Même sous indépendance, Var(X − Y) = Var X + Var Y, pas Var X − Var Y ; Var(2X) = 4 Var X, pas 2 Var X.
  • i.i.d. n'est pas une hypothèse, c'en sont deux. Lois différentes : on garde Σ σi², pas nσ². Variables corrélées : on garde les covariances, et σ²/n devient faux pour une moyenne (l10).
  • Une covariance négative fait baisser la variance. Y = 7 − X donne X + Y = 7 : variance nulle, 2,917 + 2,917 − 2 × 2,917 = 0. C'est l'idée des variables antithétiques en simulation Monte Carlo.
  • Moyenner des modèles corrélés. Un ensemble de B modèles de même variance σ², corrélés deux à deux par ρ, garde au moins ρσ² quel que soit B : les cases hors diagonale ne disparaissent pas (pont b04, bagging).
Brunton, rectifiéBrunton (30) dit que l'égalité Var(X + Y) = Var X + Var Y est « vraiment fausse » si X et Y sont dépendantes, et (41) que des variables dépendantes ont « ce terme de covariance en plus ». Pas forcément : il suffit que Cov = 0. X uniforme sur {−1, 0, 1} et Y = X² sont dépendantes, et Var(X + Y) = 8/9 = 2/3 + 2/9 (notion 3).

Var(aX + bY) = a² Var X + b² Var Y + 2ab Cov(X, Y), sans hypothèse. Dans Var(X1 + … + Xn) = nσ², l'indépendance annule les covariances, la même loi met σ² partout.

L'indépendance donne Cov = 0, pas l'inverse outil

Brunton 41

Si X et Y sont indépendantes, E[XY] = E[X] E[Y] (l08, notion 4), donc la covariance est nulle. Brunton insiste : la réciproque est fausse, et il en donne le contre-exemple le plus simple.

X vaut −1, 0 ou 1, avec probabilité ⅓ chacune, et Y = X². Connaître X donne Y exactement. Pourtant le centre est (0, ⅔), et les trois rectangles valent (−1) × ⅓ = −⅓, 0 × (−⅔) = 0 et 1 × ⅓ = ⅓ : ils s'annulent, Cov = 0.

La covariance ne voit qu'une tendance linéaire. Sur la parabole, la moitié gauche descend pendant que la moitié droite monte, et les deux se compensent. La dépendance est pourtant là : P(Y = 0 ∣ X = 0) = 1, alors que P(Y = 0) = ⅓.

Voir l'idée — des liens exacts, une covariance nulle

Chaque fois, le lien entre X et Y est exact. {−1, 0, 1} et X² : les trois points de Brunton, leurs rectangles −⅓, 0 et +⅓ autour du centre (0, ⅔). Parabole et cercle : 200 points, autant de violet que de rouge, covariance mesurée −0,003 et 0,003. Passe à la demi-parabole, X entre 0 et 1 : le même lien sans la symétrie, presque tout devient violet ; la covariance vaut 1/12 = 0,083 en théorie (0,084 mesuré) et la corrélation 0,97.

La formule
X ⫫ Y ⇒ Cov(X, Y) = 0       Cov(X, Y) = 0 ⇏ X ⫫ Y
  • X ⫫ Y : la loi jointe se factorise (l07) ; c'est elle qui donne E[XY] = E[X] E[Y].
  • Cov(X, Y) = 0 se dit « X et Y sont décorrélées ». Cela suffit pour additionner les variances (notion 2), pas pour raisonner comme si X ne disait rien de Y.
  • Le critère complet : X ⫫ Y si et seulement si Cov(g(X), h(Y)) = 0 pour toutes les fonctions bornées g et h. La seule paire (X, Y) ne suffit pas : ici Cov(X², Y) = Var(Y) = 2/9 ≠ 0 trahit le lien.
Exemples simples deux dés, la table de Brunton, un cercle, une demi-parabole, une feature
  1. Deux dés indépendants. Cov = 12,25 − 3,5 × 3,5 = 0, comme prévu.
  2. La table de Brunton, trois valeurs de X et deux de Y, six cases. P(X = 0, Y = 0) = ⅓, alors que P(X = 0) P(Y = 0) = ⅓ × ⅓ = 1/9 : la jointe ne se factorise pas. Une seule case suffit à ruiner l'indépendance.
  3. Un cercle. U uniforme sur [0, 2π], X = cos U, Y = sin U. E[X] = E[Y] = 0 et E[XY] = E[sin 2U]/2 = 0 : Cov = 0, et pourtant X² + Y² = 1 toujours.
  4. Une demi-parabole. X uniforme sur [0, 1], Y = X². Cov = E[X³] − E[X] E[X²] = ¼ − ½ × ⅓ = 1/12 > 0. Sans la symétrie, la dépendance se voit, et la corrélation vaut 0,97.
  5. En ML. Sélectionner des features par leur corrélation avec la cible rate une feature x qui la détermine par y = x², quand x est symétrique autour de 0 : corrélation nulle, information totale. Un arbre de décision ou l'information mutuelle la voient.
Preuve le sens direct en une ligne, le contre-exemple, le mécanisme
X ⫫ Y ⇒ E[XY] = E[X] E[Y]
la jointe se factorise, la double somme se coupe en deux (l08)
⇒ Cov(X, Y) = E[XY] − E[X] E[Y] = 0
forme développée (notion 1)

Le contre-exemple, en trois lignes :

E[X] = (−1 + 0 + 1)/3 = 0    E[Y] = (1 + 0 + 1)/3 = ⅔
X est symétrique autour de 0
E[XY] = E[X³] = (−1 + 0 + 1)/3 = 0
XY = X · X² = X³
Cov(X, Y) = 0 − 0 × ⅔ = 0
et pourtant P(X = 0, Y = 0) = ⅓ ≠ 1/9

Le mécanisme général : si X est symétrique autour de 0 et Y = g(X) avec g paire, alors XY = X g(X) est une fonction impaire de X, donc d'espérance nulle, et E[X] = 0. La covariance est nulle quel que soit le lien.

Simuler en Python corrélation nulle, dépendance totale
import numpy as np

rng = np.random.default_rng(2)
X = rng.choice([-1, 0, 1], size=600_000)        # uniform on {-1, 0, 1}
Y = X ** 2                                      # entirely determined by X

print("Cov(X, Y)      :", np.cov(X, Y)[0, 1].round(4))
print("P(Y = 0)       :", np.mean(Y == 0).round(3))
print("P(Y = 0 | X = 0):", np.mean(Y[X == 0] == 0))
print("Cov(X^2, Y)    :", np.cov(X ** 2, Y)[0, 1].round(4), "| Var Y = 2/9 = 0.2222")
print("Var(X + Y)     :", np.var(X + Y).round(4),
      "| Var X + Var Y =", (np.var(X) + np.var(Y)).round(4))

# continuous version: a feature that determines the target, with zero correlation
x = rng.uniform(-1, 1, 100_000); y = x ** 2
print("corr(x, x^2)   :", np.corrcoef(x, y)[0, 1].round(3))
print("corr(|x|, x^2) :", np.corrcoef(np.abs(x), y)[0, 1].round(3))
Cov(X, Y)      : 0.0001
P(Y = 0)       : 0.333
P(Y = 0 | X = 0): 1.0
Cov(X^2, Y)    : 0.2222 | Var Y = 2/9 = 0.2222
Var(X + Y)     : 0.8892 | Var X + Var Y = 0.889
corr(x, x^2)   : 0.001
corr(|x|, x^2) : 0.968
Où ça casse
  • « Décorrélées » n'est pas « indépendantes ». Sauf pour un couple gaussien, où les deux coïncident (notion 5).
  • La covariance mesure un lien linéaire, en moyenne. Elle est nulle pour une parabole symétrique, un cercle, une croix : des liens parfaits qui ne penchent ni d'un côté ni de l'autre.
  • L'additivité ne demande que Cov = 0. Dans le contre-exemple, Var(X + Y) = 8/9 = 2/3 + 2/9 : la formule de la notion 2 tient, sur des variables pourtant liées. Mais on ne peut plus multiplier des probabilités comme si X et Y étaient indépendantes.
Brunton, rectifiéBrunton (41) affirme que « clairement, Y dépend de X » sans le montrer : il suffit d'une case, P(Y = 0 ∣ X = 0) = 1 ≠ P(Y = 0) = ⅓. Il explique l'annulation par « une fonction paire sur un domaine impair » : il veut dire une fonction paire sur un domaine symétrique autour de 0. Et il parle de « la covariance de ces deux matrices » : ce sont deux variables aléatoires.

Indépendance ⇒ Cov = 0, mais la réciproque est fausse : X uniforme sur {−1, 0, 1} et Y = X² ont une covariance nulle alors que Y est entièrement déterminé par X. La covariance ne voit que le linéaire.

La corrélation : la covariance sans unité outil

Brunton 41

Brunton remarque qu'on peut grossir une covariance sans toucher au nuage : il suffit de changer d'unité. Passer X et Y de pieds en pouces multiplie chaque écart par 12, donc chaque rectangle par 144. Pour juger la force du lien, il divise par les deux écarts-types : c'est la corrélation, une covariance normalisée.

Sur les quatre points de la notion 1 : Cov = 1 et σX = σY = √1,25 = 1,118, donc ρ = 1/1,25 = 0,8. En pouces : Cov = 144, σX σY = 180, et ρ = 144/180 = 0,8 encore.

Diviser par les écarts-types revient à standardiser chaque variable avant de faire la moyenne des rectangles. Le résultat est toujours compris entre −1 et 1, et ±1 signifie que les points sont exactement sur une droite.

Voir l'idée — changer d'unité gonfle la covariance, pas la corrélation

Les quatre points de la notion 1, en pieds, et leurs rectangles. Chaque bouton change les unités : le dessin reste le même, seuls les nombres des axes et des aires changent. En pouces : Cov passe de 1 à 144, σX σY de 1,25 à 180, ρ reste 0,8. Y seul en pouces : 12 et 15, ρ = 0,8. Décalé de 10 : rien ne change. Y retourné : le nuage se renverse, les rectangles changent de signe, ρ = −0,8.

Les formules
ρ(X, Y) = Cov(X, Y) / (σX σY) = E[ZX ZY]     avec ZX = (X − μX)/σX     −1 ≤ ρ ≤ 1
Cov(aX + b, cY + d) = ac Cov(X, Y)      ρ(aX + b, cY + d) = signe(ac) · ρ(X, Y)
  • σX > 0 et σY > 0 : ρ n'est pas défini pour une constante. ZX et ZY sont les versions standardisées, de moyenne 0 et d'écart-type 1 (l06).
  • |ρ| = 1 si et seulement si Y = aX + b exactement, avec a ≠ 0 ; le signe de ρ est celui de a.
  • a ≠ 0 et c ≠ 0. Un changement d'unité (a, c > 0) ou un décalage (b, d) ne change pas ρ ; retourner une seule des deux variables change son signe.
  • ρ² est la part de la variance de Y expliquée par la meilleure droite : le R² d'une régression linéaire simple (preuve plus bas).
Figure 2 — des nuages à ρ variable

Trois cents points tirés une fois pour toutes ; X a un écart-type 1. Monte ρ : le nuage se resserre autour d'une droite et devient cette droite à ρ = 1 ; à ρ = 0 il est rond, à ρ < 0 il descend. Puis, à ρ fixé, élargis σY : la covariance ρ σX σY double quand σY double, ρ ne bouge pas. Le trait plein est la droite de régression de Y sur X, de pente ρ σY/σX : à ρ = 0,6 et σY = 2, la pente vaut 1,2. ρ n'est pas une pente.

Exemples simples des droites, les quatre points, une composante partagée, un R², des dés, des features
  1. Des droites. Y = 2X + 1 : ρ = 1. Y = −3X : ρ = −1. Y = 5, une constante : ρ n'est pas défini.
  2. Les quatre points. ρ = 0,8, en pieds comme en pouces ; −0,8 si l'on retourne Y.
  3. La composante partagée de la notion 1. Cov(A + B, A + C) = 1 et σX = σY = √2, donc ρ = 1/2. Plus généralement, quand B et C ont la même variance, ρ = Var A / (Var A + Var B) : la part commune de la variance.
  4. Un R². Les cinq points de la chaîne régression, x = 1 à 5 et y = 2, 4, 5, 4, 5, ont R² = 0,6 : ρ = √0,6 = 0,775.
  5. Deux dés. Indépendants : ρ = 0. Y = X : ρ = 1. Y = 7 − X : ρ = −1.
  6. En ML, des features corrélées. En régression linéaire avec deux features de corrélation ρ, la variance de chaque coefficient est multipliée par 1/(1 − ρ²) par rapport à des features décorrélées : c'est le facteur d'inflation de la variance (VIF). À ρ = 0,9, il vaut 5,3 ; une simulation de 4 000 régressions donne 5,35. Les coefficients deviennent instables.
Preuve pourquoi −1 ≤ ρ ≤ 1, le signe de ac, et pourquoi ρ² est une part de variance
Cov(ZX, ZY) = Cov(X, Y)/(σX σY) = ρ
règles de la notion 1 : les constantes −μ disparaissent, les facteurs 1/σ sortent
Var(ZX + ZY) = 1 + 1 + 2ρ ≥ 0, donc ρ ≥ −1
notion 2 ; une variance est positive (l08)
Var(ZX − ZY) = 1 + 1 − 2ρ ≥ 0, donc ρ ≤ 1
même argument, terme croisé changé de signe
ρ = 1 ⇔ Var(ZX − ZY) = 0 ⇔ ZY = ZX
variance nulle ⇔ variable constante (avec probabilité 1) ; cette constante est 0, les deux Z étant centrés

Donc ρ = 1 donne Y = μY + σY(X − μX)/σX, une droite de pente positive ; même raisonnement pour ρ = −1 avec la somme. Pour le signe : ρ(aX + b, cY + d) = ac Cov(X, Y)/(|a| σX · |c| σY) = signe(ac) ρ, puisque l'écart-type de aX + b est |a| σX.

ρ² comme part de variance. On cherche la droite qui laisse le moins de variance à Y :

Var(Y − βX) = σY² − 2β Cov(X, Y) + β² σX²
notion 2, avec a = 1 et b = −β
minimale en β = Cov(X, Y)/σX²
dériver en β et annuler : c'est la pente de la régression
Var(Y − βX) = σY² − Cov(X, Y)²/σX² = σY² (1 − ρ²)
remplacer β

La meilleure droite laisse la part 1 − ρ² de la variance de Y : elle en explique ρ². À ρ = 0,8, elle en explique 64 %, pas 80 %.

Simuler en Python unités, signe, et un seul point aberrant
import numpy as np

rng = np.random.default_rng(3)
u, w = rng.standard_normal((2, 100_000))
X = u; Y = 0.6 * u + 0.8 * w                    # Var Y = 0.36 + 0.64 = 1, rho = 0.6
r = lambda a, b: np.corrcoef(a, b)[0, 1].round(3)

print("rho(X, Y)               :", r(X, Y))
print("Cov in feet, in inches  :", np.cov(X, Y)[0, 1].round(3),
      np.cov(12 * X, 12 * Y)[0, 1].round(1))
print("rho(12X + 5, 12Y - 3)   :", r(12 * X + 5, 12 * Y - 3))
print("rho(2X + 1, -3Y + 5)    :", r(2 * X + 1, -3 * Y + 5), "<- ac < 0 flips it")
print("share explained, rho^2  :", (r(X, Y) ** 2).round(2))

# one far point is enough to manufacture a correlation
a, b = rng.standard_normal((2, 30))
print("30 unrelated points     :", r(a, b))
print("same + one point (8, 8) :", r(np.append(a, 8), np.append(b, 8)))
rho(X, Y)               : 0.6
Cov in feet, in inches  : 0.599 86.2
rho(12X + 5, 12Y - 3)   : 0.6
rho(2X + 1, -3Y + 5)    : -0.6 <- ac < 0 flips it
share explained, rho^2  : 0.36
30 unrelated points     : -0.139
same + one point (8, 8) : 0.536
Où ça casse
  • ρ ne voit que le linéaire. ρ = 0 pour Y = X² sur des X symétriques (notion 3).
  • ρ n'est pas une pente. La pente de la meilleure droite est ρ σY/σX (figure 2) : deux nuages de même ρ peuvent avoir des pentes très différentes, et un nuage presque plat peut avoir ρ = 0,99.
  • ρ = 0,8 ne veut pas dire « 80 % expliqué ». La droite explique ρ² = 64 % de la variance.
  • Un seul point lointain fabrique une corrélation. Trente points tirés sans aucun lien donnent une corrélation mesurée de −0,14 ; ajouter le seul point (8, 8) la porte à 0,54 (code ci-dessus).
  • Corrélation n'est pas causalité (Brunton). Deux variables sans effet l'une sur l'autre peuvent être corrélées par une cause commune : c'est la composante partagée A de la notion 1.
Brunton, rectifiéBrunton (41) dit que Corr(aX + b, cY + d) = Corr(X, Y). C'est vrai seulement si ac > 0. Si ac < 0, le signe s'inverse : dans le code ci-dessus, ρ(2X + 1, −3Y + 5) vaut −0,6 quand ρ(X, Y) vaut 0,6. L'énoncé juste est ρ(aX + b, cY + d) = signe(ac) · ρ(X, Y). Brunton ne montre pas non plus que −1 ≤ ρ ≤ 1 : la preuve ci-dessus n'utilise que la notion 2 et le fait qu'une variance est positive.

ρ = Cov(X, Y)/(σX σY) ∈ [−1, 1], ±1 pour une droite exacte ; ρ(aX + b, cY + d) = signe(ac) ρ(X, Y).

La gaussienne 2D : cercle, ellipse alignée, ellipse tournée outil

Brunton 42 · Covariance and Correlation — Example with Gaussian Distributions

Brunton reprend ses nuages comme des impacts de fléchettes sur une cible : une densité gaussienne en deux dimensions, dessinée par ses courbes de niveau. Quand les deux écarts-types sont égaux et que rien ne lie X à Y, ce sont des cercles : la densité ne dépend que de la distance au centre.

Étire un axe, σX = 2 et σY = 1 : les cercles deviennent des ellipses alignées sur les axes. La densité se factorise toujours, X et Y restent indépendantes, Cov = 0.

Tourne maintenant cette ellipse de 45°. Chaque variable reçoit un morceau des deux axes : Var X = Var Y = 2,5 et Cov = 1,5, donc ρ = 0,6. C'est la rotation, et elle seule, qui crée la covariance : dans la densité, elle fait apparaître un terme croisé en xy.

Voir l'idée — trois cibles, des fléchettes

Les ellipses sont deux courbes de niveau de la densité : celle de demi-axes σ1, σ2, puis celle de demi-axes 2σ1, 2σ2. Les 300 fléchettes sont les mêmes tirages, déformés d'une cible à l'autre. Cercle puis ellipse alignée : la covariance mesurée reste proche de 0 (0,00 puis 0,01). Ellipse tournée : 1,51 mesuré pour 1,5 en théorie. Lancer 300 fléchettes en ajoute, jusqu'à 3 000 : la mesure fluctue de moins en moins autour de la théorie.

La formule
f(x, y) = 1 / (2π σX σY √(1 − ρ²)) · exp(− (zx² − 2ρ zx zy + zy²) / (2(1 − ρ²)))    zx = (x − μX)/σX, zy = (y − μY)/σY
matrice de covariance Σ = σX²ρσXσYρσXσYσY²
ellipse de demi-axes σ1, σ2 tournée de θ :   Cov(X, Y) = (σ1² − σ2²) sin θ cos θ
  • Hypothèse : (X, Y) est un couple gaussien, c'est-à-dire de densité jointe de cette forme, avec |ρ| < 1. Que X et Y soient chacune gaussiennes ne suffit pas (où ça casse).
  • Les courbes de niveau sont les ellipses zx² − 2ρ zx zy + zy² = constante.
  • Le seul terme qui mélange x et y est −2ρ zx zy. ρ = 0 ⇒ f(x, y) = fX(x) fY(y) ⇒ indépendance. Pour un couple gaussien, Cov = 0 ⇔ indépendance.
  • σ1 et σ2 sont les écarts-types le long des axes de l'ellipse ; à θ = 0, σ1 = σX et σ2 = σY. Ces axes sont les vecteurs propres de Σ, σ1² et σ2² ses valeurs propres : les composantes principales de la PCA.
Figure 3 — une ellipse, trois curseurs

Trois courbes de niveau, de demi-axes σ1, σ2, puis 2σ1, 2σ2 et 3σ1, 3σ2. σ1 et σ2 règlent les deux demi-axes, θ l'angle. À θ = 0, l'ellipse est alignée : Cov = 0 quels que soient σ1 et σ2. Tourne : Cov = (σ1² − σ2²) sin θ cos θ, la plus forte à ±45°. Mets σ1 = σ2 : le cercle tourne sans rien changer, Cov = 0 à tout angle. Le trait ocre pointillé est le grand axe, le trait bleu la droite de régression de Y sur X : au départ (σ1 = 2, σ2 = 1, θ = 45°), pentes 1 et 0,6.

Exemples simples cercle, ellipse alignée, tournée de 45°, de 30°, de 90°, et la PCA
  1. Le cercle. σX = σY = 1, ρ = 0 : f(x, y) = (1/2π) e−(x² + y²)/2 = (1/2π) e−r²/2. Elle ne dépend que de la distance r au centre, et vaut 1/2π = 0,159 au centre : la cible de Brunton.
  2. L'ellipse alignée. σ1 = 2, σ2 = 1, θ = 0 : Σ a 4 et 1 sur la diagonale, 0 ailleurs. Ellipse étirée, variables indépendantes.
  3. Tournée de 45°. Var X = Var Y = 4 × ½ + 1 × ½ = 2,5 ; Cov = (4 − 1) × ½ = 1,5 ; ρ = 1,5/2,5 = 0,6. Tournée de −45° : ρ = −0,6.
  4. Tournée de 30°. Var X = 4 × ¾ + 1 × ¼ = 3,25 ; Var Y = 4 × ¼ + 1 × ¾ = 1,75 ; Cov = 3 × (√3/4) = 1,30 ; ρ = 0,54. Tournée de 90° : les axes échangent leurs rôles, Var X = 1, Var Y = 4, Cov = 0 de nouveau.
  5. Un cercle tourné reste un cercle. σ1 = σ2 : Cov = 0 à tout angle.
  6. En ML, la PCA cherche les axes de cette ellipse : elle tourne le repère pour rendre Σ diagonale, c'est-à-dire des composantes décorrélées (chaîne PCA).
Preuve la covariance d'une ellipse tournée, et pourquoi ρ = 0 factorise
X = U cos θ − V sin θ,   Y = U sin θ + V cos θ
tourner de θ un couple (U, V) indépendant, Var U = σ1², Var V = σ2²
Cov(X, Y) = cos θ sin θ Var U − sin θ cos θ Var V
règles de la notion 1, développées terme à terme ; Cov(U, V) = 0
= (σ1² − σ2²) sin θ cos θ
nulle si θ = 0, si θ = 90° ou si σ1 = σ2

Pour ρ = 0, l'exposant se coupe en deux :

f(x, y) = 1/(2π σX σY) · e−zx²/2 · e−zy²/2
ρ = 0 dans la formule ; ea + b = ea eb
= [e−zx²/2 / (σX√(2π))] · [e−zy²/2 / (σY√(2π))] = fX(x) fY(y)
deux densités normales : la jointe se factorise, donc X ⫫ Y (l07)

C'est le raisonnement de Brunton dans le bon sens : on part de la densité jointe, on constate qu'elle se factorise, on en déduit l'indépendance.

Simuler en Python tourner une ellipse, retrouver ses axes
import numpy as np

rng = np.random.default_rng(4)
s1, s2, theta = 2.0, 1.0, np.radians(45)
U = s1 * rng.standard_normal(500_000)             # independent axes
V = s2 * rng.standard_normal(500_000)
X = U * np.cos(theta) - V * np.sin(theta)         # rotate the cloud by 45 degrees
Y = U * np.sin(theta) + V * np.cos(theta)

S = np.cov(X, Y)
print("covariance matrix:\n", S.round(3))
print("rho:", (S[0, 1] / np.sqrt(S[0, 0] * S[1, 1])).round(3), "| theory 0.6")
vals, vecs = np.linalg.eigh(S)                    # axes of the ellipse
print("eigenvalues:", vals.round(3), "| theory sigma2^2 = 1, sigma1^2 = 4")
angle = np.degrees(np.arctan(vecs[1, 1] / vecs[0, 1]))
print("major axis angle:", angle.round(1), "degrees")
print("regression slope of Y on X:", (S[0, 1] / S[0, 0]).round(3), "| major axis: 1")
covariance matrix:
 [[2.499 1.497]
 [1.497 2.492]]
rho: 0.6 | theory 0.6
eigenvalues: [0.999 3.992] | theory sigma2^2 = 1, sigma1^2 = 4
major axis angle: 44.9 degrees
regression slope of Y on X: 0.599 | major axis: 1
Où ça casse
  • Des marges gaussiennes ne font pas un couple gaussien. X de loi N(0, 1), S = ±1 à pile ou face indépendamment de X, Y = S X. Y est N(0, 1) elle aussi, Cov(X, Y) = E[S] E[X²] = 0, et pourtant |Y| = |X| toujours. X + Y vaut 0 une fois sur deux, ce qu'aucun couple gaussien de densité ne fait. « Cov = 0 ⇒ indépendance » demande la gaussienne jointe.
  • La pente de l'ellipse n'est pas celle de la régression. À σ1 = 2, σ2 = 1, θ = 45°, le grand axe a une pente 1, la droite de régression de Y sur X une pente 0,6 (figure 3). La régression ne suit pas l'ellipse : elle prédit la moyenne de Y à x fixé.
  • ρ n'est pas un angle. La même rotation de 45° donne ρ = 0 si σ1 = σ2, 0,6 si σ1 = 2 et σ2 = 1, 0,98 si σ1 = 10 et σ2 = 1.
  • |ρ| = 1 : plus de densité. Le facteur √(1 − ρ²) s'annule, tout tombe sur une droite.
Brunton, rectifiéBrunton (42) veut montrer que la gaussienne ronde a des composantes indépendantes. Il suppose que la densité jointe est le produit fX fY (« c'est là qu'intervient l'indépendance »), calcule ce produit, puis conclut que X et Y sont indépendantes : le raisonnement tourne en rond. Il ajoute « si j'ai une gaussienne multivariée en 2D, ses composantes x et y sont indépendantes » : faux dès que ρ ≠ 0, ce que son ellipse tournée montre ensuite. Le bon sens va de la densité jointe, (1/2π) e−r²/2, vers sa factorisation, qui prouve l'indépendance (preuve ci-dessus). Il ne dit pas non plus qu'une ellipse alignée, à variances différentes, garde des variables indépendantes ; et il dit « gaussienne multinomiale » pour gaussienne multivariée.

Pour un couple gaussien, Cov = 0 ⇔ indépendance : cercle ou ellipse alignée sur les axes. La covariance vient de la rotation : Cov = (σ1² − σ2²) sin θ cos θ.

Comparer deux modèles sur le même jeu de test outil

Brunton 41 (Var(X + Y), ici avec un signe moins), appliquée à l'évaluation de modèles (séance du 09/10)

Deux modèles A et B répondent aux mêmes 1 000 questions de test. Leur taux de bonnes réponses (accuracy) vaut 87,2 % pour A et 90,1 % pour B : B fait 2,9 points de mieux. Est-ce du bruit ? Il faut l'écart-type de la différence D̂ = p̂B − p̂A, et la notion 2 le donne : Var(D̂) = Var p̂A + Var p̂B − 2 Cov(p̂A, p̂B).

Sur un jeu de test partagé, les deux modèles butent sur les mêmes questions difficiles. La difficulté joue le rôle de la composante partagée de la notion 1 : elle rend Cov(p̂A, p̂B) positive, et le terme −2 Cov retire une grande part de la variance.

Avec deux jeux de test séparés, les deux scores sont indépendants, Cov = 0, et les variances s'additionnent : écart-type 0,0142. Avec le même jeu de test, où A seul réussit 10 questions et B seul 39 : 0,0069, deux fois moins.

Voir l'idée — refaire l'évaluation, avec un jeu de test ou deux

On refait 400 fois l'évaluation de 1 000 questions, en tirant chaque question dans la loi de la chaîne p01-04, prise comme vraie loi : les deux justes 86,2 %, A seul 1,0 %, B seul 3,9 %, les deux faux 8,9 %. Chaque barre compte les D̂ obtenus. Même jeu de test (en haut) : D̂ reste serré autour de 0,029, écart-type mesuré 0,0068, et ne tombe jamais à 0. Deux jeux de test (en bas) : écart-type 0,0144, deux fois plus large, et D̂ ≤ 0 dans 9 évaluations sur 400 (2,2 % en théorie) : un jeu de test malchanceux suffit à effacer l'avantage de B. Refaire relance avec d'autres tirages.

Les formules
D̂ = p̂B − p̂A      Var(D̂) = Var p̂A + Var p̂B − 2 Cov(p̂A, p̂B)
même jeu de test : Var(D̂) = [pA(1 − pA) + pB(1 − pB) − 2(pAB − pApB)] / n = [P(désaccord) − (pB − pA)²] / n
  • pA, pB : les vraies accuracies, fixes et inconnues ; p̂A, p̂B : leurs estimateurs, les moyennes des Ai, Bi ∈ {0, 1} (1 si la question i est réussie) sur les n questions. pAB = P(A et B justes sur une même question).
  • Les questions sont i.i.d. L'indépendance entre questions annule Cov(Ai, Bj) pour i ≠ j : seules les n paires (Ai, Bi) comptent. Il reste n termes sur n², d'où le 1/n. La même loi rend ces n termes égaux à Cov(A1, B1) : la formule ne dépend que de pA, pB, pAB.
  • Deux jeux de test séparés : p̂A et p̂B sont indépendants, Cov = 0, et Var(D̂) = [pA(1 − pA) + pB(1 − pB)]/n.
  • P(désaccord) = P(Ai ≠ Bi) : seules les questions où les modèles diffèrent portent la différence ; c'est l'idée du test de McNemar (chaîne p01-04). En pratique, les p sont remplacés par leurs estimations : l'écart-type devient une erreur standard estimée.
Exemples simples deux jeux de test, un jeu de test, le même modèle deux fois, des erreurs indépendantes, la composante partagée
  1. Deux jeux de test de 1 000. Var(D̂) = (0,872 × 0,128 + 0,901 × 0,099)/1 000 = 0,000201 ; écart-type 0,0142. D̂ = 0,029 est à 2,05 écarts-types de 0.
  2. Le même jeu de test. Par question, P(les deux justes) = 0,862, d'où Cov(Ai, Bi) = 0,862 − 0,872 × 0,901 = 0,0763, une corrélation de 0,76. Var(D̂) = (0,1116 + 0,0892 − 2 × 0,0763)/1 000 = 0,0000482 ; écart-type 0,0069. D̂ est à 4,18 écarts-types de 0 : la variance a été divisée par 4,2.
  3. Le même modèle évalué deux fois. Sur le même jeu de test, D̂ = 0 à chaque fois : Cov = Var, la variance de la différence est nulle. Sur deux jeux de test, écart-type √(2 × 0,872 × 0,128/1 000) = 0,0149 : l'écart-type de la différence apparente entre deux copies du même modèle vaut 1,5 point, par pur hasard.
  4. Des erreurs indépendantes question par question, P(les deux justes) = pA pB : Cov = 0, et partager le jeu de test ne gagne rien. Tout le gain vient de la covariance.
  5. La composante partagée de la notion 1, réécrite X = S + U et Y = S + V : S est la difficulté commune de la question, U et V ce qui est propre à chaque modèle. Var(X − Y) = Var(U − V). La difficulté s'annule dans la différence.
Preuve de Var(D̂) aux désaccords, avec les deux rôles d'i.i.d.
Cov(p̂A, p̂B) = (1/n²) Σi Σj Cov(Ai, Bj)
règles de la notion 1 : p̂A = (1/n) Σ Ai, les facteurs 1/n sortent
= (1/n²) Σi Cov(Ai, Bi)
indépendance des questions : Cov(Ai, Bj) = 0 si i ≠ j
= Cov(A1, B1)/n = (pAB − pApB)/n
même loi : n termes égaux ; E[A1B1] = P(A1 = B1 = 1) = pAB
Var(D̂) = Var(B1 − A1)/n
D̂ est la moyenne des n différences Bi − Ai ; mêmes deux hypothèses (notion 2)
E[(B1 − A1)²] = P(A1 ≠ B1)
B1 − A1 ∈ {−1, 0, 1} : son carré vaut 1 exactement sur un désaccord
Var(D̂) = [P(A1 ≠ B1) − (pB − pA)²]/n
forme de calcul de la variance (l08)

Avec 49 désaccords sur 1 000 et une différence de 0,029 : (0,049 − 0,029²)/1 000 = 0,0000482, écart-type 0,0069.

Simuler en Python 10 000 évaluations, deux protocoles
import numpy as np

rng = np.random.default_rng(5)
n, reps = 1000, 10_000
# law of one question: both right, A only, B only, both wrong (table of chain p01-04)
probs = [0.862, 0.010, 0.039, 0.089]

counts = rng.multinomial(n, probs, size=reps)              # shared test set
pA_s = (counts[:, 0] + counts[:, 1]) / n
pB_s = (counts[:, 0] + counts[:, 2]) / n
d_shared = pB_s - pA_s                                     # = (B only - A only) / n

pA = rng.binomial(n, 0.872, reps) / n                      # two separate test sets
pB = rng.binomial(n, 0.901, reps) / n
d_sep = pB - pA

print("shared  : sd(D) =", d_shared.std().round(5), "| theory 0.00694")
print("separate: sd(D) =", d_sep.std().round(5), "| theory 0.01417")
print("Cov(pA_hat, pB_hat), shared  :", np.cov(pA_s, pB_s)[0, 1].round(7), "| theory 7.63e-05")
print("Cov(pA_hat, pB_hat), separate:", np.cov(pA, pB)[0, 1].round(7))
print("share of runs with D <= 0: shared", np.mean(d_shared <= 0),
      "| separate", np.mean(d_sep <= 0))
shared  : sd(D) = 0.00688 | theory 0.00694
separate: sd(D) = 0.0141 | theory 0.01417
Cov(pA_hat, pB_hat), shared  : 7.67e-05 | theory 7.63e-05
Cov(pA_hat, pB_hat), separate: 1.4e-06
share of runs with D <= 0: shared 0.0 | separate 0.0214
Où ça casse
  • Deux intervalles qui se chevauchent ne concluent rien. Chacun ignore la covariance des deux scores. Ici, les intervalles à 95 % de A, [0,851 ; 0,893], et de B, [0,882 ; 0,920], se chevauchent, alors que la différence sur le jeu de test partagé est à 4,18 écarts-types de 0 (chaîne p01-04).
  • Appliquer la formule « deux jeux de test » à un jeu de test partagé ne fait pas conclure à tort tant que Cov ≥ 0, le cas usuel, mais gaspille : elle surestime l'écart-type, ici d'un facteur 2, et le test perd de la puissance. Si les modèles se complètent (Cov < 0), elle devient trop optimiste.
  • Des questions dépendantes, plusieurs questions tirées du même document ou plusieurs lignes d'un même utilisateur, ajoutent des covariances entre questions : la vraie variance dépasse la formule, et le test devient trop optimiste (pont b04, l10).
  • Partager le jeu de test ne protège pas de la sélection. Garder le meilleur de 40 modèles évalués sur ce jeu de test gonfle son score : un maximum de variables bruitées est biaisé vers le haut (chaîne p01-04).

Sur un jeu de test partagé, Var(p̂B − p̂A) = [P(désaccord) − (pB − pA)²]/n : le terme −2 Cov, avec Cov > 0, retire la difficulté commune, d'où une variance plus faible qu'avec deux jeux de test.

Résumé

À retenir
  1. Cov(X, Y) = E[(X − μX)(Y − μY)] = E[XY] − E[X]E[Y] : la moyenne du rectangle signé ; Cov(X, X) = Var X.
  2. Var(aX + bY) = a² Var X + b² Var Y + 2ab Cov(X, Y), sans hypothèse ; le terme croisé est en Cov, jamais en E[XY].
  3. L'indépendance annule le terme croisé (Cov = 0 suffit, notion 3) : c'est de l'additivité, la variance n'est jamais linéaire.
  4. i.i.d. = deux hypothèses : l'indépendance annule les covariances, la même loi donne nσ².
  5. Indépendance ⇒ Cov = 0 ; la réciproque est fausse (Y = X²) : la covariance ne voit que le linéaire.
  6. ρ = Cov/(σX σY) ∈ [−1, 1], sans unité, de signe inversé si l'on retourne une variable ; ρ² est la part expliquée par la meilleure droite.
  7. Couple gaussien : Cov = 0 ⇔ indépendance ; la covariance vient de la rotation de l'ellipse.
  8. Deux modèles sur le même jeu de test : −2 Cov réduit la variance de la différence, seuls les désaccords comptent.
« La covariance est l'espérance du produit des écarts au centre, E[XY] − E[X]E[Y]. C'est le terme croisé de la variance d'une somme, Var(X + Y) = Var X + Var Y + 2 Cov ; l'indépendance l'annule, mais une covariance nulle ne prouve pas l'indépendance, sauf pour un couple gaussien. Normalisée par les écarts-types, elle devient la corrélation, entre −1 et 1. C'est pour ça qu'on compare deux modèles sur le même jeu de test : leurs scores sont corrélés positivement, et −2 Cov réduit la variance de leur différence. »

Chaîne verbalisée — une prise, à voix haute

7 maillons · clique pour révéler après avoir dit
  1. Définis la covariance, puis donne sa forme de calcul.
    La moyenne du produit des écarts au centre, E[(X − μX)(Y − μY)] ; E[XY] − E[X]E[Y].
  2. Développe Var(aX + bY). Pourquoi le terme croisé ne peut-il pas être 2ab E[XY] ?
    a² Var X + b² Var Y + 2ab Cov(X, Y). Avec X = Y = 1, la variance vaut 0, alors que 2ab E[XY] vaudrait 2ab.
  3. Que vaut Var(X − Y) pour deux dés indépendants ? Et Var(2X) ?
    2,917 + 2,917 = 5,83, pas 0 : l'indépendance donne l'additivité, pas la linéarité. Var(2X) = 4 Var X = 11,67.
  4. Dans Var(X1 + … + Xn) = nσ², où sert l'indépendance, où sert la même loi ?
    L'indépendance annule les n(n − 1) covariances ; la même loi rend les n variances égales à σ².
  5. Une covariance nulle prouve-t-elle l'indépendance ?
    Non : X uniforme sur {−1, 0, 1} et Y = X² ont Cov = 0. Oui seulement pour un couple gaussien.
  6. Que devient ρ(aX + b, cY + d) ?
    signe(ac) · ρ(X, Y) : ni les unités ni les décalages ne comptent, mais retourner une seule variable change le signe.
  7. Pourquoi compare-t-on deux modèles sur le même jeu de test ?
    Var(D̂) = Var p̂A + Var p̂B − 2 Cov, et Cov > 0 parce qu'ils ratent les mêmes questions : écart-type 0,0069 contre 0,0142 sur deux jeux de test.