É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.
Loi conjointe et lois marginales
Section intitulée « Loi conjointe et lois marginales »Un vecteur aléatoire est une fonction de dans : variables aléatoires définies sur la même expérience. Pour deux variables, on parle de couple .
Le cas discret : un tableau
Section intitulée « Le cas discret : un tableau »La loi conjointe d’un couple discret est le tableau des probabilités (la virgule se lit « et »). Pour notre station météo, est le nombre de jours de pluie sur le week-end (0, 1 ou 2) et vaut 1 s’il y a du vent fort, 0 sinon. Supposons que l’historique donne :
| (pas de vent fort) | (vent fort) | Loi de | |
|---|---|---|---|
| 0,30 | 0,05 | 0,35 | |
| 0,20 | 0,10 | 0,30 | |
| 0,15 | 0,20 | 0,35 | |
| Loi de | 0,65 | 0,35 | 1 |
Les lois marginales s’obtiennent en sommant les lignes ou les colonnes, d’où leur nom (elles s’écrivent dans les marges) :
C’est simplement la formule des probabilités totales du chapitre 2, avec la partition des valeurs de .
La loi conditionnelle de sachant s’obtient en normalisant une colonne : . Les week-ends venteux, , contre tous week-ends confondus : le vent fort s’accompagne plus souvent de pluie.
Le cas continu : une densité conjointe
Section intitulée « Le cas continu : une densité conjointe »Pour un couple continu, la loi conjointe est une densité d’intégrale 1 sur , et est un volume sous la surface. Les formules discrètes se transposent en remplaçant les sommes par des intégrales :
La première donne la densité marginale de ; la seconde, la densité conditionnelle de sachant (pour ).
Indépendance de variables aléatoires
Section intitulée « Indépendance de variables aléatoires »Deux variables et sont indépendantes si tout événement portant sur est indépendant de tout événement portant sur . En pratique, on vérifie que la loi conjointe est le produit des marginales :
- cas discret : pour tous , ;
- cas continu : pour tous , (ou de façon équivalente, avec les fonctions de répartition).
Pour la station météo, , alors que : pluie et vent ne sont pas indépendants. Une seule case qui ne factorise pas suffit.
Somme de variables indépendantes
Section intitulée « Somme de variables indépendantes »Si et sont indépendantes, la loi de se calcule par un produit de convolution. Dans le cas continu :
Pour que la somme vaille , il faut que prenne une valeur et la valeur ; on intègre sur toutes les valeurs de . 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.
Covariance et corrélation
Section intitulée « Covariance et corrélation »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 :
Elle est positive si et 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 . Son défaut : elle dépend des unités. On la normalise donc en coefficient de corrélation :
signifie que est une fonction affine de ; mesure donc l’intensité d’une relation linéaire.
La covariance intervient dans la variance d’une somme :
Si et sont indépendantes, alors , donc et les variances s’additionnent. Revenons au trajet du chapitre 5 : l’attente du bus et le trajet sont indépendants, donc la durée totale a pour espérance minutes et pour variance , 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 tiré uniformément dans le disque unité. Par symétrie, . Mais si , alors est forcément entre et : connaître renseigne sur . Formellement, (le point est hors du disque) alors que . Les variables sont non corrélées mais dépendantes.
Vecteur moyen et matrice de covariance
Section intitulée « Vecteur moyen et matrice de covariance »Avec variables, on range les espérances dans le vecteur moyen , et toutes les covariances dans la matrice de covariance :
Sa diagonale contient les variances. Elle est symétrique et semi-définie positive (pour tout vecteur , , car c’est la variance de ). 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 , avec une matrice et un vecteur de :
Les vecteurs gaussiens
Section intitulée « Les vecteurs gaussiens »Un vecteur est gaussien si toute combinaison linéaire de ses composantes suit une loi normale. On note : sa loi est entièrement déterminée par son vecteur moyen et sa matrice de covariance. Si est inversible, sa densité est :
On reconnaît la densité normale du chapitre 5, où est remplacé par la forme quadratique . 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.
Les vecteurs gaussiens ont des propriétés remarquables :
- leurs marginales sont gaussiennes ;
- l’image reste gaussienne, de loi ;
- pour un vecteur gaussien, et seulement dans ce cas, composantes non corrélées équivaut à composantes indépendantes : 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 capteurserreurs <- mvrnorm(100000, mu = c(0, 0), Sigma = Sigma)
cov(erreurs) # proche de SigmaA <- matrix(c(0.5, 0.5), nrow = 1)A %*% Sigma %*% t(A) # variance théorique de la moyenne : 4.25var(erreurs %*% t(A)) # variance observée, proche de 4.25cor(erreurs)[1, 2] # corrélation : 2 / (3 * 2) = 0.33En 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).
En résumé
Section intitulée « En résumé »- 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.
- et sont indépendantes si la loi conjointe est le produit des marginales ; la loi d’une somme de variables indépendantes est une convolution.
- ; mesure un lien linéaire.
- ; indépendance implique covariance nulle, pas l’inverse.
- La matrice de covariance est symétrique semi-définie positive, et .
- Un vecteur gaussien reste gaussien par transformation affine, et ses composantes sont indépendantes si et seulement si est diagonale.
Exercices
Section intitulée « Exercices »Exercice · Lire un tableau conjoint
facileÀ partir du tableau de la station météo, calculez :
- et ;
- la probabilité qu’il pleuve au moins un jour et qu’il n’y ait pas de vent fort.
Voir la solution
- et . 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.
- On additionne les cases et : .
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 lignecond_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 fortprint(round(conjointe.loc[[1, 2], 0].sum(), 2)) # 0.35# Loi conjointe : lignes X (jours de pluie), colonnes Y (vent fort)conjointe <- matrix(c(0.30, 0.05, 0.20, 0.10, 0.15, 0.20), nrow = 3, byrow = TRUE, dimnames = list(X = 0:2, Y = 0:1))
# Loi conditionnelle de Y sachant X : on normalise chaque lignecond_y_sachant_x <- prop.table(conjointe, margin = 1)cond_y_sachant_x[c("0", "2"), "1"] # 0.143 0.571
# Au moins un jour de pluie et pas de vent fortsum(conjointe[c("1", "2"), "0"]) # 0.35Exercice · Variance d'une combinaison
moyenUn vecteur a pour matrice de covariance .
- Calculez .
- Calculez .
- Calculez le coefficient de corrélation entre et .
Voir la solution
- Avec : .
- La covariance est bilinéaire : .
- .
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.408sigma <- matrix(c(2, -1, -1, 3), nrow = 2)
a <- c(3, 4)t(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 <- c(1, 1); v <- c(1, -1)t(u) %*% sigma %*% v # -1
cov2cor(sigma)[1, 2] # -0.408Exercice · Somme de deux attentes exponentielles
difficileÀ un arrêt, les bus arrivent selon des temps exponentiels de paramètre , indépendants. Vous attendez le deuxième bus (le premier est bondé). Votre attente est , avec et indépendantes de loi .
- Calculez la densité de par convolution.
- Déduisez-en et sans calculer d’intégrale supplémentaire.
Voir la solution
- Les densités sont nulles sur les négatifs, donc pour , l’intégrale se restreint à :
C’est la loi gamma de paramètres . Contrairement à l’exponentielle, sa densité est nulle en 0 : attendre deux bus prend forcément un peu de temps.
- Par linéarité, . Par indépendance, les variances s’ajoutent : .
Vérification en R, avec 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 npfrom scipy import stats
lam = 0.1 # un bus toutes les 10 minutesrng = 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.4422lambda <- 0.1 # un bus toutes les 10 minutesset.seed(0)z <- rexp(1e5, lambda) + rexp(1e5, lambda)c(mean(z), var(z)) # 19.99 200.4, proches de 20 et 200
# Comparaison avec la loi gamma(2, lambda) : même proportion sous 15 minutes ?c(mean(z <= 15), pgamma(15, shape = 2, rate = lambda)) # 0.4433 0.4422
# Histogramme et densité trouvée par convolutionhist(z, breaks = 60, freq = FALSE)curve(dgamma(x, shape = 2, rate = lambda), add = TRUE, lwd = 2)