Aller au contenu

Étudiez plusieurs variables à la fois

Une station météo rennaise enregistre chaque week-end le nombre de jours de pluie et la présence de vent fort. Prises séparément, ces deux variables sont faciles à décrire. Mais la question intéressante est ailleurs : quand il y a du vent, pleut-il davantage ? Pour y répondre, il faut étudier les deux variables ensemble.

Ce chapitre généralise tout ce que vous avez vu à plusieurs variables : loi conjointe, lois marginales, indépendance, covariance, et enfin les vecteurs gaussiens, omniprésents en statistique et en apprentissage automatique. Le fil rouge sera cette station météo, puis deux capteurs de température.

Un vecteur aléatoire X=(X1,…,Xn)\mathbf{X} = (X_1, \dots, X_n) est une fonction de Ω\Omega dans Rn\mathbb{R}^n : nn variables aléatoires définies sur la même expérience. Pour deux variables, on parle de couple (X,Y)(X, Y).

La loi conjointe d’un couple discret est le tableau des probabilités P(X=xi,Y=yj)P(X = x_i, Y = y_j) (la virgule se lit « et »). Pour notre station météo, XX est le nombre de jours de pluie sur le week-end (0, 1 ou 2) et YY vaut 1 s’il y a du vent fort, 0 sinon. Supposons que l’historique donne :

Y=0Y = 0 (pas de vent fort)Y=1Y = 1 (vent fort)Loi de XX
X=0X = 00,300,050,35
X=1X = 10,200,100,30
X=2X = 20,150,200,35
Loi de YY0,650,351

Les lois marginales s’obtiennent en sommant les lignes ou les colonnes, d’où leur nom (elles s’écrivent dans les marges) :

P(X=xi)=∑jP(X=xi,Y=yj)P(X = x_i) = \sum_j P(X = x_i, Y = y_j)

C’est simplement la formule des probabilités totales du chapitre 2, avec la partition des valeurs de YY.

Y = 0pas de vent fortY = 1vent fortX = 0X = 1X = 20,300,050,200,100,150,20Loi conjointe P(X = x, Y = y)0,350,300,35Loi de X(somme des lignes)0,650,35Loi de Y (somme des colonnes)
La loi conjointe au centre ; chaque loi marginale est la somme d'une ligne ou d'une colonne, écrite « dans la marge ».

La loi conditionnelle de XX sachant Y=yjY = y_j s’obtient en normalisant une colonne : P(X=xi∣Y=yj)=P(X=xi,Y=yj)/P(Y=yj)P(X = x_i \mid Y = y_j) = P(X = x_i, Y = y_j) / P(Y = y_j). Les week-ends venteux, P(X=2∣Y=1)=0,20/0,35≈0,57P(X = 2 \mid Y = 1) = 0{,}20 / 0{,}35 \approx 0{,}57, contre 0,350{,}35 tous week-ends confondus : le vent fort s’accompagne plus souvent de pluie.

0 jour de pluie1 jour2 jours0,00,10,20,30,40,50,60,7probabilité0,350,140,300,290,350,57P(X = x), tous les week-endsP(X = x | Y = 1), week-ends venteux
Conditionner, c'est ne garder qu'une colonne du tableau et la renormaliser : les week-ends venteux, deux jours de pluie deviennent le cas le plus probable (0,57 contre 0,35).

Pour un couple continu, la loi conjointe est une densité f(x,y)≥0f(x, y) \geq 0 d’intégrale 1 sur R2\mathbb{R}^2, et P((X,Y)∈D)=∬Df(x,y) dx dyP((X, Y) \in D) = \iint_D f(x, y) \, dx \, dy est un volume sous la surface. Les formules discrètes se transposent en remplaçant les sommes par des intégrales :

fX(x)=∫−∞+∞f(x,y) dy,fX∣Y=y(x)=f(x,y)fY(y)f_X(x) = \int_{-\infty}^{+\infty} f(x, y) \, dy, \qquad f_{X \mid Y = y}(x) = \frac{f(x, y)}{f_Y(y)}

La première donne la densité marginale de XX ; la seconde, la densité conditionnelle de XX sachant Y=yY = y (pour fY(y)>0f_Y(y) \gt 0).

−3−2−10123x−3−2−10123yx = 1,2 fixé :coupe = densitéconditionnellefxfxydyX()=(,)∫fyY()
Une densité conjointe vue de dessus (plus c'est foncé, plus c'est probable). Les marginales sont ses « ombres » sur chaque axe ; une coupe verticale, renormalisée, donne la densité conditionnelle de Y sachant X = x.

Deux variables XX et YY sont indépendantes si tout événement portant sur XX est indépendant de tout événement portant sur YY. En pratique, on vérifie que la loi conjointe est le produit des marginales :

  • cas discret : P(X=xi,Y=yj)=P(X=xi) P(Y=yj)P(X = x_i, Y = y_j) = P(X = x_i) \, P(Y = y_j) pour tous ii, jj ;
  • cas continu : f(x,y)=fX(x) fY(y)f(x, y) = f_X(x) \, f_Y(y) pour tous xx, yy (ou de façon équivalente, avec les fonctions de répartition).

Pour la station météo, P(X=0,Y=1)=0,05P(X = 0, Y = 1) = 0{,}05, alors que P(X=0) P(Y=1)=0,35×0,35≈0,12P(X = 0) \, P(Y = 1) = 0{,}35 \times 0{,}35 \approx 0{,}12 : pluie et vent ne sont pas indépendants. Une seule case qui ne factorise pas suffit.

Si XX et YY sont indépendantes, la loi de Z=X+YZ = X + Y se calcule par un produit de convolution. Dans le cas continu :

fZ(z)=∫−∞+∞fX(z−y) fY(y) dyf_Z(z) = \int_{-\infty}^{+\infty} f_X(z - y) \, f_Y(y) \, dy

Pour que la somme vaille zz, il faut que YY prenne une valeur yy et XX la valeur z−yz - y ; on intègre sur toutes les valeurs de yy. Dans le cas discret, l’intégrale devient une somme : c’est exactement ce que vous avez fait au chapitre 1 en comptant les couples de dés de somme 7. La convolution est aussi l’opération de base du filtrage en traitement du signal et des réseaux de neurones convolutifs.

01020304050minutes0,000,020,040,060,080,10densité95 % arriventavant 43,1 minattente du bus U ~ U[0, 10]trajet T ~ N(30, 4²)durée totale U + T (convolution)
La somme de deux variables indépendantes « étale » les deux lois : la durée totale U + T est plus large que le trajet seul et n'est plus exactement normale.

La loi conjointe est parfois lourde. Comme l’espérance et la variance résument une variable, la covariance résume la façon dont deux variables varient ensemble :

Cov(X,Y)=E[(X−E[X])(Y−E[Y])]=E[XY]−E[X] E[Y]\mathrm{Cov}(X, Y) = E\big[(X - E[X])(Y - E[Y])\big] = E[XY] - E[X] \, E[Y]

Elle est positive si XX et YY ont tendance à être grandes (ou petites) en même temps, négative si l’une a tendance à être grande quand l’autre est petite. On a Cov(X,X)=Var(X)\mathrm{Cov}(X, X) = \mathrm{Var}(X). Son défaut : elle dépend des unités. On la normalise donc en coefficient de corrélation :

ρ(X,Y)=Cov(X,Y)σX σY∈[−1 ; 1]\rho(X, Y) = \frac{\mathrm{Cov}(X, Y)}{\sigma_X \, \sigma_Y} \in [-1\,;\,1]

ρ=±1\rho = \pm 1 signifie que YY est une fonction affine de XX ; ρ\rho mesure donc l’intensité d’une relation linéaire.

xy++−−E[X]E[Y]produit (x − E[X])(y − E[Y]) > 0produit < 0
La covariance est la moyenne du produit des écarts aux moyennes. Quand la plupart des points tombent dans les quadrants « + », elle est positive.
ρ = 0,95ρ = 0,5ρ = 0,0ρ = −0,7Y = X² : ρ ≈ 0mais dépendantesdisque : ρ ≈ 0mais dépendantes
ρ mesure l'alignement autour d'une droite. Les deux derniers nuages ont une corrélation nulle alors que X et Y sont clairement liés : c'est le piège ci-dessous.

La covariance intervient dans la variance d’une somme :

Var(X+Y)=Var(X)+Var(Y)+2 Cov(X,Y)\mathrm{Var}(X + Y) = \mathrm{Var}(X) + \mathrm{Var}(Y) + 2\,\mathrm{Cov}(X, Y)

Si XX et YY sont indépendantes, alors E[XY]=E[X] E[Y]E[XY] = E[X] \, E[Y], donc Cov(X,Y)=0\mathrm{Cov}(X, Y) = 0 et les variances s’additionnent. Revenons au trajet du chapitre 5 : l’attente du bus U∼U[0,10]U \sim \mathcal{U}[0, 10] et le trajet T∼N(30,42)T \sim \mathcal{N}(30, 4^2) sont indépendants, donc la durée totale a pour espérance 5+30=355 + 30 = 35 minutes et pour variance 100/12+16≈24,3100/12 + 16 \approx 24{,}3, soit un écart-type de 4,9 minutes. Sa loi exacte (une convolution, qui n’est pas normale) donne un quantile à 95 % d’environ 43,1 minutes : partez 44 minutes avant votre cours.

Un autre contre-exemple classique : un point (X,Y)(X, Y) tiré uniformément dans le disque unité. Par symétrie, Cov(X,Y)=0\mathrm{Cov}(X, Y) = 0. Mais si X=0,9X = 0{,}9, alors YY est forcément entre −0,44-0{,}44 et 0,440{,}44 : connaître XX renseigne sur YY. Formellement, f(0,9 ; 0,9)=0f(0{,}9\,;\,0{,}9) = 0 (le point est hors du disque) alors que fX(0,9) fY(0,9)>0f_X(0{,}9) \, f_Y(0{,}9) \gt 0. Les variables sont non corrélées mais dépendantes.

Avec nn variables, on range les espérances dans le vecteur moyen μ=E[X]=(E[X1],…,E[Xn])\boldsymbol{\mu} = E[\mathbf{X}] = (E[X_1], \dots, E[X_n]), et toutes les covariances dans la matrice de covariance :

Σ=E[(X−μ)(X−μ)T],Σij=Cov(Xi,Xj)\Sigma = E\big[(\mathbf{X} - \boldsymbol{\mu})(\mathbf{X} - \boldsymbol{\mu})^T\big], \qquad \Sigma_{ij} = \mathrm{Cov}(X_i, X_j)

Sa diagonale contient les variances. Elle est symétrique et semi-définie positive (pour tout vecteur a\mathbf{a}, aTΣ a≥0\mathbf{a}^T \Sigma \, \mathbf{a} \geq 0, car c’est la variance de aTX\mathbf{a}^T \mathbf{X}). Si les composantes sont indépendantes, elle est diagonale. Son inverse, quand il existe, s’appelle la matrice de précision.

Tout son intérêt apparaît avec les transformations affines. Si Y=AX+b\mathbf{Y} = A\mathbf{X} + \mathbf{b}, avec AA une matrice m×nm \times n et b\mathbf{b} un vecteur de Rm\mathbb{R}^m :

E[Y]=A E[X]+b,ΣY=A ΣX ATE[\mathbf{Y}] = A \, E[\mathbf{X}] + \mathbf{b}, \qquad \Sigma_{\mathbf{Y}} = A \, \Sigma_{\mathbf{X}} \, A^T
0,00,20,40,60,81,0poids a du capteur 1 dans la mesure a·X₁ + (1 − a)·X₂23456789variance de l’erreur (°C²)moyenne simple : 4,25moyenne simple : 3,25optimum : a ≈ 0,22 capteur 2 seul : 4capteur 1 seul : 9 capteurs indépendants (Cov = 0)capteurs corrélés (Cov = 2)
Variance de a·X₁ + (1 − a)·X₂ selon le poids a. La covariance positive relève toute la courbe : la moyenne simple (a = 0,5) passe de 3,25 à 4,25, et le meilleur mélange donne plus de poids au capteur le plus précis.

Un vecteur X\mathbf{X} est gaussien si toute combinaison linéaire a1X1+⋯+anXna_1 X_1 + \dots + a_n X_n de ses composantes suit une loi normale. On note X∼N(μ,Σ)\mathbf{X} \sim \mathcal{N}(\boldsymbol{\mu}, \Sigma) : sa loi est entièrement déterminée par son vecteur moyen et sa matrice de covariance. Si Σ\Sigma est inversible, sa densité est :

f(x)=1(2π)n/2det⁡Σexp⁡(−12(x−μ)TΣ−1(x−μ))f(\mathbf{x}) = \frac{1}{(2\pi)^{n/2} \sqrt{\det \Sigma}} \exp\left(-\frac{1}{2} (\mathbf{x} - \boldsymbol{\mu})^T \Sigma^{-1} (\mathbf{x} - \boldsymbol{\mu})\right)

On reconnaît la densité normale du chapitre 5, où (x−μ)2/σ2(x - \mu)^2 / \sigma^2 est remplacé par la forme quadratique (x−μ)TΣ−1(x−μ)(\mathbf{x} - \boldsymbol{\mu})^T \Sigma^{-1} (\mathbf{x} - \boldsymbol{\mu}). Les courbes de niveau de cette densité sont des ellipses (en dimension 2), allongées dans la direction où la variance est la plus grande.

x₁x₂Σ diagonale(composantes indépendantes)Cov = +2(les deux capteurs)Cov = −4,5(corrélation négative)
Les ellipses de niveau de N(0, Σ). Leurs axes (flèches) sont les vecteurs propres de Σ, et leurs longueurs sont proportionnelles aux racines des valeurs propres : c'est exactement ce qu'exploite l'ACP.

Les vecteurs gaussiens ont des propriétés remarquables :

  • leurs marginales sont gaussiennes ;
  • l’image AX+bA\mathbf{X} + \mathbf{b} reste gaussienne, de loi N(Aμ+b,AΣAT)\mathcal{N}(A\boldsymbol{\mu} + \mathbf{b}, A\Sigma A^T) ;
  • pour un vecteur gaussien, et seulement dans ce cas, composantes non corrélées équivaut à composantes indépendantes : Σ\Sigma diagonale suffit.

On simule un vecteur gaussien en R avec la fonction mvrnorm du paquet MASS, et l’on vérifie les formules sur les tirages :

library(MASS)
set.seed(4)
Sigma <- matrix(c(9, 2,
2, 4), nrow = 2) # erreurs des deux capteurs
erreurs <- mvrnorm(100000, mu = c(0, 0), Sigma = Sigma)
cov(erreurs) # proche de Sigma
A <- matrix(c(0.5, 0.5), nrow = 1)
A %*% Sigma %*% t(A) # variance théorique de la moyenne : 4.25
var(erreurs %*% t(A)) # variance observée, proche de 4.25
cor(erreurs)[1, 2] # corrélation : 2 / (3 * 2) = 0.33

En Python, numpy.random.default_rng().multivariate_normal(mean, cov, size) joue le même rôle, et numpy.cov estime la matrice de covariance (attention, il attend les variables en lignes par défaut, d’où l’option rowvar=False).

  • La loi conjointe décrit un vecteur aléatoire ; les marginales s’obtiennent en sommant ou en intégrant sur les autres variables, les conditionnelles en normalisant.
  • XX et YY sont indépendantes si la loi conjointe est le produit des marginales ; la loi d’une somme de variables indépendantes est une convolution.
  • Cov(X,Y)=E[XY]−E[X]E[Y]\mathrm{Cov}(X, Y) = E[XY] - E[X]E[Y] ; ρ=Cov/(σXσY)∈[−1,1]\rho = \mathrm{Cov}/(\sigma_X \sigma_Y) \in [-1, 1] mesure un lien linéaire.
  • Var(X+Y)=Var(X)+Var(Y)+2 Cov(X,Y)\mathrm{Var}(X + Y) = \mathrm{Var}(X) + \mathrm{Var}(Y) + 2\,\mathrm{Cov}(X, Y) ; indépendance implique covariance nulle, pas l’inverse.
  • La matrice de covariance Σ\Sigma est symétrique semi-définie positive, et ΣAX+b=AΣAT\Sigma_{A\mathbf{X} + \mathbf{b}} = A \Sigma A^T.
  • Un vecteur gaussien N(μ,Σ)\mathcal{N}(\boldsymbol{\mu}, \Sigma) reste gaussien par transformation affine, et ses composantes sont indépendantes si et seulement si Σ\Sigma est diagonale.

Exercice · Lire un tableau conjoint

facile

À partir du tableau de la station météo, calculez :

  1. P(Y=1∣X=0)P(Y = 1 \mid X = 0) et P(Y=1∣X=2)P(Y = 1 \mid X = 2) ;
  2. la probabilité qu’il pleuve au moins un jour et qu’il n’y ait pas de vent fort.
Voir la solution
  1. P(Y=1∣X=0)=0,05/0,35≈0,14P(Y = 1 \mid X = 0) = 0{,}05 / 0{,}35 \approx 0{,}14 et P(Y=1∣X=2)=0,20/0,35≈0,57P(Y = 1 \mid X = 2) = 0{,}20 / 0{,}35 \approx 0{,}57. Le vent fort est quatre fois plus fréquent les week-ends entièrement pluvieux que les week-ends secs, ce qui confirme la dépendance.
  2. On additionne les cases (X=1,Y=0)(X = 1, Y = 0) et (X=2,Y=0)(X = 2, Y = 0) : 0,20+0,15=0,350{,}20 + 0{,}15 = 0{,}35.

En code

import pandas as pd
# Loi conjointe : lignes X (jours de pluie), colonnes Y (vent fort)
conjointe = pd.DataFrame([[0.30, 0.05],
[0.20, 0.10],
[0.15, 0.20]], index=[0, 1, 2], columns=[0, 1])
# Loi conditionnelle de Y sachant X : on normalise chaque ligne
cond_y_sachant_x = conjointe.div(conjointe.sum(axis=1), axis=0)
print(cond_y_sachant_x.loc[[0, 2], 1].round(3).tolist()) # [0.143, 0.571]
# Au moins un jour de pluie et pas de vent fort
print(round(conjointe.loc[[1, 2], 0].sum(), 2)) # 0.35

Exercice · Variance d'une combinaison

moyen

Un vecteur (X1,X2)(X_1, X_2) a pour matrice de covariance Σ=(2−1−13)\Sigma = \begin{pmatrix} 2 & -1 \\ -1 & 3 \end{pmatrix}.

  1. Calculez Var(3X1+4X2)\mathrm{Var}(3X_1 + 4X_2).
  2. Calculez Cov(X1+X2,X1−X2)\mathrm{Cov}(X_1 + X_2, X_1 - X_2).
  3. Calculez le coefficient de corrélation entre X1X_1 et X2X_2.
Voir la solution
  1. Avec A=(3  4)A = (3\ \ 4) : Var=9×2+16×3+2×3×4×(−1)=18+48−24=42\mathrm{Var} = 9 \times 2 + 16 \times 3 + 2 \times 3 \times 4 \times (-1) = 18 + 48 - 24 = 42.
  2. La covariance est bilinéaire : Cov(X1+X2,X1−X2)=Var(X1)−Cov(X1,X2)+Cov(X2,X1)−Var(X2)=2−3=−1\mathrm{Cov}(X_1 + X_2, X_1 - X_2) = \mathrm{Var}(X_1) - \mathrm{Cov}(X_1, X_2) + \mathrm{Cov}(X_2, X_1) - \mathrm{Var}(X_2) = 2 - 3 = -1.
  3. ρ=−1/2×3≈−0,41\rho = -1 / \sqrt{2 \times 3} \approx -0{,}41.

En code

import numpy as np
sigma = np.array([[2, -1],
[-1, 3]])
a = np.array([3, 4])
print(a @ sigma @ a) # 42 Var(3 X1 + 4 X2)
# Cov(u.X, v.X) = u' Sigma v, avec u = (1, 1) et v = (1, -1)
u, v = np.array([1, 1]), np.array([1, -1])
print(u @ sigma @ v) # -1
print(sigma[0, 1] / np.sqrt(sigma[0, 0] * sigma[1, 1])) # -0.408

Exercice · Somme de deux attentes exponentielles

difficile

À un arrêt, les bus arrivent selon des temps exponentiels de paramètre λ\lambda, indépendants. Vous attendez le deuxième bus (le premier est bondé). Votre attente est Z=T1+T2Z = T_1 + T_2, avec T1T_1 et T2T_2 indépendantes de loi E(λ)\mathcal{E}(\lambda).

  1. Calculez la densité de ZZ par convolution.
  2. Déduisez-en E[Z]E[Z] et Var(Z)\mathrm{Var}(Z) sans calculer d’intégrale supplémentaire.
Voir la solution
  1. Les densités sont nulles sur les négatifs, donc pour z≥0z \geq 0, l’intégrale se restreint à 0≤y≤z0 \leq y \leq z :
fZ(z)=∫0zλe−λ(z−y) λe−λy dy=λ2e−λz∫0zdy=λ2 z e−λzf_Z(z) = \int_0^z \lambda e^{-\lambda(z - y)} \, \lambda e^{-\lambda y} \, dy = \lambda^2 e^{-\lambda z} \int_0^z dy = \lambda^2 \, z \, e^{-\lambda z}

C’est la loi gamma de paramètres (2,λ)(2, \lambda). Contrairement à l’exponentielle, sa densité est nulle en 0 : attendre deux bus prend forcément un peu de temps.

  1. Par linéarité, E[Z]=2/λE[Z] = 2/\lambda. Par indépendance, les variances s’ajoutent : Var(Z)=2/λ2\mathrm{Var}(Z) = 2/\lambda^2.

Vérification en R, avec λ=0,1\lambda = 0{,}1 par minute : z <- rexp(1e5, 0.1) + rexp(1e5, 0.1), puis mean(z) (proche de 20) et var(z) (proche de 200) ; hist(z, freq = FALSE); curve(dgamma(x, shape = 2, rate = 0.1), add = TRUE) superpose la densité trouvée.

En code

import numpy as np
from scipy import stats
lam = 0.1 # un bus toutes les 10 minutes
rng = np.random.default_rng(0)
z = rng.exponential(1 / lam, 100_000) + rng.exponential(1 / lam, 100_000)
print(z.mean(), z.var()) # 19.97 200.5, proches de 20 et 200
# Comparaison avec la loi gamma(2, lambda) : même proportion sous 15 minutes ?
gamma_2 = stats.gamma(a=2, scale=1 / lam)
print(np.mean(z <= 15), gamma_2.cdf(15)) # 0.4443 0.4422