- 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.
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.
- μ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
- Une constante. Cov(X, 5) = 0 : la constante n'a aucun écart à sa moyenne, tous les rectangles sont plats.
- 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.
- 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.
- 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.
- 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
Les règles de calcul se lisent sur les écarts.
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).
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.
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.
- 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).
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
- 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.
- 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.
- 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.
- Des coefficients. Deux dés indépendants : Var(2X − Y) = 4 × 2,917 + 1 × 2,917 = 14,58. Le −1 sort au carré.
- 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.
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.
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).
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) = ⅓.
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.
- 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
- Deux dés indépendants. Cov = 12,25 − 3,5 × 3,5 = 0, comme prévu.
- 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.
- 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.
- 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.
- 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
Le contre-exemple, en trois lignes :
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.
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.
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.
- σ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).
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
- Des droites. Y = 2X + 1 : ρ = 1. Y = −3X : ρ = −1. Y = 5, une constante : ρ n'est pas défini.
- Les quatre points. ρ = 0,8, en pieds comme en pouces ; −0,8 si l'on retourne Y.
- 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.
- 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.
- Deux dés. Indépendants : ρ = 0. Y = X : ρ = 1. Y = 7 − X : ρ = −1.
- 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
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 :
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.
ρ = 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.
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.
- 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.
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
- 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.
- L'ellipse alignée. σ1 = 2, σ2 = 1, θ = 0 : Σ a 4 et 1 sur la diagonale, 0 ailleurs. Ellipse étirée, variables indépendantes.
- 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.
- 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.
- Un cercle tourné reste un cercle. σ1 = σ2 : Cov = 0 à tout angle.
- 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
Pour ρ = 0, l'exposant se coupe en deux :
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.
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.
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.
- 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
- 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.
- 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.
- 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.
- 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.
- 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.
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é
- Cov(X, Y) = E[(X − μX)(Y − μY)] = E[XY] − E[X]E[Y] : la moyenne du rectangle signé ; Cov(X, X) = Var X.
- 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].
- L'indépendance annule le terme croisé (Cov = 0 suffit, notion 3) : c'est de l'additivité, la variance n'est jamais linéaire.
- i.i.d. = deux hypothèses : l'indépendance annule les covariances, la même loi donne nσ².
- Indépendance ⇒ Cov = 0 ; la réciproque est fausse (Y = X²) : la covariance ne voit que le linéaire.
- ρ = 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.
- Couple gaussien : Cov = 0 ⇔ indépendance ; la covariance vient de la rotation de l'ellipse.
- 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.
Chaîne verbalisée — une prise, à voix haute
- 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].
- 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.
- 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.
- 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 à σ².
- 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.
- 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.
- 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.
Où ça sert ensuite
stats::covariance (notions 1, 2, 3, 6) · stats::correlation (notions 4, 5).
Une carte se fait depuis le « ce qu'on garde » d'une notion OUTIL, après ta lecture, dans tes mots.