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

Fonctions d'une variable aléatoire

On définit une variable aléatoire pour pouvoir en prendre des fonctions : changer d'unité, élever au carré, standardiser. La loi de Y = g(X) se déduit de celle de X, mais pas en recopiant la densité : on passe par la fonction de répartition. La leçon suit Brunton 23 à 25, avec ses exemples : les degrés Celsius et Fahrenheit, la table de Φ, le carré d'une normale. L'attente entre deux spams sert de loi asymétrique.

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
  • Densité et fonction de répartition. Une variable continue X a une densité fX ≥ 0 : P(c < X < d) = ∫cd fX. Sa fonction de répartition (CDF) est FX(x) = P(X ≤ x), et FX′ = fX (l04, notion 2).
  • La normale. N(μ, σ²), de moyenne μ et de variance σ². La normale centrée réduite N(0, 1) a la densité φ(x) = e−x²/2/√(2π) et la fonction de répartition Φ ; Φ(1) = 0,841 et Φ(−z) = 1 − Φ(z) (l04, notion 6).
  • L'exponentielle. L'attente T d'un flux de taux λ a la densité λe−λt pour t ≥ 0, la répartition 1 − e−λt et la moyenne 1/λ (l05, notion 3).
  • La règle de la chaîne. La dérivée de F(h(y)) est F′(h(y)) · h′(y). Elle sert dans chaque preuve de la leçon, et c'est elle qui fait apparaître le facteur qu'on oublie.

La leçon

De CDF à CDF, puis dériver : la densité ne se recopie pas outil

Brunton 23 · Functions of a Random Variable

Brunton pose Y = g(X) : des °F convertis en °C, le carré X² d'une normale, l'énergie cinétique ½mV² d'une molécule. Avant toute formule, il prévient : « brancher » la densité de X dans g ne donne pas une densité.

Le plus petit exemple : X uniforme sur [0, 1], de densité 1, et Y = 2X, uniforme sur [0, 2]. Recopier la densité, une hauteur 1 sur [0, 2], donne une aire de 2. La bonne hauteur est ½. Une densité est un taux de probabilité par unité de longueur : quand g étire, la même probabilité s'étale sur une largeur double, donc le taux est divisé par deux.

La fonction de répartition, elle, est la probabilité d'un événement, et « Y ≤ y » se réécrit « X ≤ y/2 ». D'où la règle de Brunton : de CDF à CDF, puis dériver. On intègre pour passer de la densité à la CDF, on dérive pour revenir.

Voir l'idée — étirer une densité : l'aire se garde, la hauteur baisse

En haut, X uniforme sur [0, 1] ; la bande foncée [0,2 ; 0,3] porte une probabilité de 0,1. En bas, Y = aX. Le rectangle violet est la vraie densité, de hauteur 1/a ; le pointillé rouge est la densité recopiée, de hauteur 1, dont l'aire vaut a. Bouge a : la bande devient [0,2a ; 0,3a], plus large et plus basse, et porte toujours 0,1. À a = 2, l'exemple de l'idée : aire recopiée 2, hauteur vraie 0,5.

La méthode, puis la formule qu'elle donne
FY(y) = P(g(X) ≤ y) = P(X dans l'ensemble correspondant)    puis    fY(y) = FY′(y)
g strictement monotone :   fY(y) = fX(g⁻¹(y)) · |(g⁻¹)′(y)|
  • X a une densité, donc P(X = x) = 0 : écrire ≤ ou < ne change rien.
  • g strictement monotone sur l'ensemble des valeurs de X (x² l'est sur [0, 1], pas sur ℝ) : l'événement « g(X) ≤ y » est une demi-droite pour X, « X ≤ g⁻¹(y) » si g croît, « X ≥ g⁻¹(y) » si g décroît. Sinon il a plusieurs morceaux (notion 4).
  • g dérivable, avec g′(x) ≠ 0 : la règle de la chaîne fait sortir (g⁻¹)′(y) = 1/g′(x), l'inverse de l'étirement local. La valeur absolue couvre le cas g décroissante.
  • En discret, rien de tout cela : les masses se transportent telles quelles, P(Y = y) = Σ P(X = x) sur les x tels que g(x) = y (l08, notion 5). C'est la densité, un taux, qui ne se transporte pas.
Figure 1 — dix tranches de probabilité 0,1 : g les étire ou les tasse

X est uniforme sur [0, 1], coupée en dix tranches de largeur 0,1 : chacune porte une probabilité de 0,1. Dans le premier panneau, la courbe y = g(x) envoie chaque tranche sur un intervalle de y, de la même couleur. Dans le second, la densité de Y, couchée le long du même axe y : chaque tranche y devient un rectangle d'aire 0,1, d'autant plus bas qu'il est large. Le trait noir est la densité exacte de la formule. Choisis x² : là où g est plate, près de 0, la première tranche est tassée dans [0 ; 0,01] et monte à 10. Choisis −ln x : on obtient l'exponentielle e−y.

Exemples simples uniforme étirée, spams en minutes, une exponentielle, le carré sur [0, 1]
  1. Uniforme étirée. Y = 2X, X uniforme sur [0, 1]. FY(y) = P(2X ≤ y) = P(X ≤ y/2) = y/2 pour y dans [0, 2]. Sa dérivée vaut ½ : la densité de Y. La densité recopiée, 1 sur [0, 2], aurait une aire de 2.
  2. Les spams, en heures puis en minutes. L'attente T suit une exponentielle de taux 4 par heure : fT(0) = 4 par heure. En minutes, M = 60T. FM(m) = P(T ≤ m/60) = 1 − e−4m/60, dont la dérivée en 0 vaut 4/60 = 0,0667 par minute. Même attente, densité 60 fois plus basse. Mais un même événement garde sa probabilité : P(M ≤ 6 min) = P(T ≤ 0,1 h) = 1 − e−0,4 = 0,330.
  3. Fabriquer une exponentielle avec un uniforme. U uniforme sur [0, 1] et Y = −ln U, une fonction décroissante. P(Y ≤ y) = P(ln U ≥ −y) = P(U ≥ e−y) = 1 − e−y : Y suit une exponentielle de taux 1, et P(Y ≤ 1) = 0,632. Avec la formule : g⁻¹(y) = e−y, (g⁻¹)′(y) = −e−y, donc fY(y) = fU(e−y) · e−y = e−y. C'est la méthode d'inversion : la fonction de répartition de l'exponentielle de taux 1 est F(y) = 1 − e−y, d'inverse F⁻¹(u) = −ln(1 − u), et 1 − U est encore uniforme. À partir d'un générateur uniforme, on simule ainsi toute loi dont on sait inverser la fonction de répartition.
  4. Le carré sur [0, 1], celui de la figure 1. X uniforme sur [0, 1] et Y = X² : g est croissante sur [0, 1], g⁻¹(y) = √y et (g⁻¹)′(y) = 1/(2√y). Donc fY(y) = 1 · 1/(2√y) = 1/(2√y) sur ]0, 1], la densité exacte de la figure 1. Sur [0 ; 0,01], elle donne P = √0,01 = 0,1 : la première tranche.
Preuve la formule de g monotone, en deux cas

g croissante.

FY(y) = P(g(X) ≤ y)
définition de la fonction de répartition de Y
= P(X ≤ g⁻¹(y)) = FX(g⁻¹(y))
g croissante : g(x) ≤ y équivaut à x ≤ g⁻¹(y)
fY(y) = fX(g⁻¹(y)) · (g⁻¹)′(y)
dériver : règle de la chaîne, FX′ = fX ; ici (g⁻¹)′ > 0

g décroissante.

FY(y) = P(X ≥ g⁻¹(y)) = 1 − FX(g⁻¹(y))
g décroissante retourne l'inégalité ; P(X = g⁻¹(y)) = 0
fY(y) = −fX(g⁻¹(y)) · (g⁻¹)′(y)
règle de la chaîne ; le moins vient du « 1 − »
= fX(g⁻¹(y)) · |(g⁻¹)′(y)|
(g⁻¹)′ < 0, donc −(g⁻¹)′ = |(g⁻¹)′|

Lecture physique : la tranche [x, x + dx] porte la probabilité fX(x) dx. Son image a la largeur |dy| = |g′(x)| dx et porte la même probabilité, donc fY(y) |dy| = fX(x) dx. Le facteur |(g⁻¹)′| est un jacobien en dimension 1 ; en dimension 2, c'est un déterminant (l07, notion 6).

Simuler en Python uniforme étirée, −ln U, heures et minutes
import numpy as np

rng = np.random.default_rng(0)
u = rng.uniform(0, 1, 1_000_000)

# Y = 2U: the histogram of Y sits at height 0.5, not 1
h, _ = np.histogram(2 * u, bins=4, range=(0, 2), density=True)
print("Y = 2U, histogram heights:", h.round(3))

# copying the density, f_U(y / 2) = 1 on [0, 2], gives area 2
y = np.linspace(0, 2, 200_001)
print("area of the copied density:", round(np.trapezoid(np.ones_like(y), y), 3))

# Y = -ln U: CDF to CDF gives P(Y <= t) = 1 - e^(-t), an Exp(1)
e = -np.log(u)
for t in [0.5, 1.0, 2.0]:
    print(f"P(-ln U <= {t}): simulated {np.mean(e <= t):.4f}, method {1 - np.exp(-t):.4f}")

# hours -> minutes: same event, same probability; the density drops by 60
T = rng.exponential(1 / 4, 1_000_000)  # hours, rate 4 per hour
M = 60 * T                             # minutes
print("P(T <= 0.1 h) =", np.mean(T <= 0.1).round(4))
print("P(M <= 6 min) =", np.mean(M <= 6).round(4))
print("first minute:", np.mean(M <= 1).round(4), " exact", round(1 - np.exp(-4 / 60), 4),
      " rate x width = 4/60 =", round(4 / 60, 4))
Y = 2U, histogram heights: [0.5   0.5   0.499 0.501]
area of the copied density: 2.0
P(-ln U <= 0.5): simulated 0.3937, method 0.3935
P(-ln U <= 1.0): simulated 0.6325, method 0.6321
P(-ln U <= 2.0): simulated 0.8644, method 0.8647
P(T <= 0.1 h) = 0.3294
P(M <= 6 min) = 0.3294
first minute: 0.0643  exact 0.0645  rate x width = 4/60 = 0.0667
Où ça casse
  • Brancher la densité dans g. C'est l'exercice que propose Brunton : élever au carré la densité de la normale. φ(x)² a une aire de 1/(2√π) = 0,282 : ce n'est pas une densité, et ce n'est pas la loi de X² (notion 4).
  • Oublier le facteur. fX(g⁻¹(y)) seul : pour Y = aX, son aire vaut a (vignette). Le facteur |(g⁻¹)′(y)| est exactement ce que fait sortir la règle de la chaîne : sauter cette ligne, c'est le perdre.
  • g non monotone. Pour g(x) = x² et une X qui prend des valeurs des deux signes, deux valeurs de x donnent le même y : l'événement « g(X) ≤ y » a deux bouts, et la densité deux termes (notion 4).
  • La valeur d'une densité dépend de l'unité, une probabilité non. 4 par heure ou 0,0667 par minute : c'est la même attente. On évalue une densité en un point pour une vraisemblance, on l'intègre pour une probabilité (l04, notion 2) ; seule l'intégrale est indépendante de l'unité.
  • En ML : comparer des vraisemblances sur deux échelles. Un modèle de log y donne à y la densité f(log y)/y : sa log-vraisemblance en y perd Σ log yi. Comparer sans ce terme les log-vraisemblances d'un modèle de y et d'un modèle de log y n'a pas de sens. Les normalizing flows reposent sur cette formule : log pX(x) = log pZ(z) + log |det ∂z/∂x|.
Brunton, rectifiéBrunton (13, 16, 23) dit souvent « cumulative density function ». C'est la fonction de répartition, en anglais cumulative distribution function : une probabilité, sans unité, et non une densité. C'est justement pour ça qu'elle se transporte d'une variable à l'autre, alors que la densité ne le fait pas.

X à densité, g strictement monotone sur les valeurs de X, Y = g(X) : fY(y) = fX(g⁻¹(y)) · |(g⁻¹)′(y)|. On l'obtient en dérivant FY(y) = P(g(X) ≤ y), jamais en recopiant la densité.

Y = aX + b : nouvelle moyenne, nouvel écart-type, et le cas a < 0 outil

Brunton 23 (et 24 pour l'écart-type)

Brunton convertit des températures : de °C en °F, on multiplie par 9/5 et on ajoute 32. Prenons des journées de printemps, X ~ N(15, 5²) en °C. La méthode de la notion 1 donne FY(y) = P(1,8X + 32 ≤ y) = FX((y − 32)/1,8) : Y suit N(59, 9²) en °F. Un même événement garde sa probabilité, P(Y ≤ 68) = P(X ≤ 20) = 0,841, et la cloche s'étale d'un facteur 1,8, donc son pic baisse de 0,0798 à 0,0443.

Brunton suppose a > 0. Prenons Y = 20 − X, les degrés qui manquent pour atteindre 20 °C : a = −1. « Y ≤ 0 » veut dire « X ≥ 20 » : l'inégalité se retourne, et la probabilité vaut 0,159. Sans la retourner, on trouverait 0,841, la probabilité de l'événement contraire.

Voir l'idée — de °C en °F, puis le miroir 20 − X

La courbe grise est X, la température en °C, N(15, 5²) ; la violette est Y = aX + b, sur le même axe des nombres. Sous chaque courbe, la zone ombrée est l'événement « X ≤ 20 » et son image. °F : la cloche s'étale de 1,8 et son pic baisse d'autant, de 0,0798 à 0,0443 ; « X ≤ 20 » devient « Y ≤ 68 », 84,1 % des deux côtés. 20 − X : la transition passe par a = 0, où tout s'écrase sur un point, puis la loi ressort en miroir ; « X ≤ 20 » devient « Y ≥ 0 » et l'ombre change de côté.

Les formules
fY(y) = fX((y − b)/a) / |a|     E[Y] = aμ + b     σY = |a| σ
X ~ N(μ, σ²)  ⇒  aX + b ~ N(aμ + b, a²σ²)
  • a ≠ 0. Si a = 0, Y = b est constante : toute la probabilité est en un point, il n'y a plus de densité.
  • a > 0 : FY(y) = FX((y − b)/a). a < 0 : diviser par a retourne l'inégalité, FY(y) = 1 − FX((y − b)/a). Dans les deux cas, la dérivée fait sortir 1/|a|.
  • μ = E[X] et σ est l'écart-type de X. La variance a²σ² vaut pour toute loi, preuve en l08, notion 9. Ce qui est propre à la normale, c'est que Y reste normale.
  • N(μ, σ²) : le second paramètre est la variance.
Figure 2 — une loi asymétrique sous aX + b : le signe de a la retourne

X est l'attente entre deux spams, exponentielle de moyenne 15 min (4 par heure). Le trait violet est la densité de aX + b, avec sa moyenne (trait rouge) et ±σ (segment vert). Au départ a = −1 et b = 30 : la loi est retournée, sa queue part à gauche. Le pointillé rouge est ce que donnerait 1/a au lieu de 1/|a| : une « densité » négative, d'aire −1. Bouge a vers les positifs : la queue repasse à droite et le pointillé disparaît ; à a = 0, il n'y a plus de densité. Bouge b : tout glisse, la forme ne change pas.

Exemples simples °C en °F, le miroir, les degrés manquants, a = 0
  1. De °C en °F. X ~ N(15, 5²). Moyenne 1,8 × 15 + 32 = 59 °F, écart-type 1,8 × 5 = 9 °F, variance 81. P(Y ≤ 68) = P(X ≤ 20) = Φ(1) = 0,841. Pic : 0,0798 par °C, 0,0798/1,8 = 0,0443 par °F.
  2. Le miroir Y = −X : fY(y) = fX(−y). Une loi symétrique autour de 0 n'en est pas changée ; une exponentielle part vers les négatifs, sa queue à gauche.
  3. Les degrés manquants, Y = 20 − X : moyenne 20 − 15 = 5, écart-type |−1| × 5 = 5, donc Y ~ N(5, 5²). P(Y ≤ 0) = P(X ≥ 20) = 1 − 0,841 = 0,159.
  4. Heures en minutes, a = 60 et b = 0 : l'attente des spams garde sa forme exponentielle, sa moyenne passe de 0,25 h à 15 min et sa densité en 0 de 4 à 4/60 (notion 1).
  5. a = 0. Y = b avec probabilité 1 : une variable qui n'a plus de densité, son écart-type est 0.
Preuve de CDF à CDF dans les deux sens, puis le cas normal

a > 0.

FY(y) = P(aX + b ≤ y)
définition
= P(X ≤ (y − b)/a) = FX((y − b)/a)
retrancher b, diviser par a > 0 : le sens reste
fY(y) = (1/a) fX((y − b)/a)
règle de la chaîne : la dérivée de (y − b)/a est 1/a

a < 0.

FY(y) = P(X ≥ (y − b)/a) = 1 − FX((y − b)/a)
diviser par a < 0 retourne l'inégalité ; P(X = point) = 0
fY(y) = −(1/a) fX((y − b)/a) = (1/|a|) fX((y − b)/a)
règle de la chaîne ; −1/a = 1/|a| quand a < 0

Le cas normal. On remplace fX par la densité de N(μ, σ²).

fY(y) = 1/(|a|σ√(2π)) · exp(−((y − b)/a − μ)² / (2σ²))
densité de N(μ, σ²) évaluée en (y − b)/a
(y − b)/a − μ = (y − (aμ + b))/a
même dénominateur
fY(y) = 1/(|a|σ√(2π)) · exp(−(y − (aμ + b))² / (2a²σ²))
c'est la densité de N(aμ + b, a²σ²), d'écart-type |a|σ
Simuler en Python °C en °F, et l'inégalité retournée
import numpy as np
from math import erf, sqrt

Phi = lambda z: 0.5 * (1 + erf(z / sqrt(2)))
rng = np.random.default_rng(1)
X = rng.normal(15, 5, 1_000_000)  # degrees C; numpy takes the sd (5), not the variance

Y = 1.8 * X + 32                    # degrees F
print("Y in F: mean", Y.mean().round(2), "  sd", Y.std().round(2), "  (theory 59 and 9)")
print("P(Y <= 68) =", np.mean(Y <= 68).round(4), "  P(X <= 20) =", np.mean(X <= 20).round(4),
      "  Phi(1) =", round(Phi(1), 4))

# peak height: share of a 1-degree window around the mean
pc, pf = np.mean(abs(X - 15) < 0.5), np.mean(abs(Y - 59) < 0.5)
print("peak per degree C:", pc.round(4), "  per degree F:", pf.round(4),
      "  ratio", round(pc / pf, 2))

# a < 0: H = 20 - X, the degrees missing to reach 20 C
H = 20 - X
print("P(H <= 0) =", np.mean(H <= 0).round(4), "  1 - F_X(20) =", round(1 - Phi(1), 4),
      "  F_X(20), no flip =", round(Phi(1), 4))
print("sd of H:", H.std().round(2), " = |a| sigma; a sigma would be -5")
Y in F: mean 59.0   sd 8.99   (theory 59 and 9)
P(Y <= 68) = 0.842   P(X <= 20) = 0.842   Phi(1) = 0.8413
peak per degree C: 0.0803   per degree F: 0.0444   ratio 1.81
P(H <= 0) = 0.158   1 - F_X(20) = 0.1587   F_X(20), no flip = 0.8413
sd of H: 4.99  = |a| sigma; a sigma would be -5
Où ça casse
  • Écart-type aσ. Avec a < 0, il serait négatif. C'est |a|σ ; la variance a²σ² n'a pas ce problème.
  • 1/a au lieu de 1/|a|. Pour a < 0, la « densité » devient négative et son aire vaut −1 (pointillé de la figure 2).
  • L'inégalité non retournée. Pour Y = 20 − X, écrire FY(0) = FX((0 − 20)/(−1)) = FX(20) donne 0,841 au lieu de 1 − 0,841 = 0,159.
  • a = 0. Y = b n'a plus de densité ; la formule divise par 0.
  • Seule une transformation affine garde la famille. aX + b d'une normale est normale. Mais eX d'une normale est log-normale, asymétrique (l08, notion 2), et X² est un χ² (notion 4). Même affine, on peut sortir de la famille : aX + b d'une exponentielle n'est exponentielle que si a > 0 et b = 0 ; sinon le support ne commence plus en 0 ou part vers les négatifs.
Brunton, rectifiéBrunton (23) dit que l'écart-type de aX + b est « a²σ² » et que le signe de a « ne compte pas tant que ça ». a²σ² est la variance ; l'écart-type est |a|σ. Et le signe compte : avec a < 0, l'inégalité se retourne, FY(y) = 1 − FX((y − b)/a), et la densité se divise par |a|, pas par a. En 24, il rectifie en « a fois σ », sans la valeur absolue. Enfin, il laisse le cas normal en exercice et en esquisse l'exposant (« e to the minus whatever… et cetera ») sans μ ni le facteur 2 : le calcul complet est dans la preuve.

Y = aX + b, a ≠ 0 : fY(y) = fX((y − b)/a)/|a| ; si a < 0, l'inégalité se retourne, FY(y) = 1 − FX((y − b)/a).

Standardiser : Z = (X − μ)/σ, et les intervalles par Φ outil

Brunton 24 · Rescaling the Normal Distribution to Mean Zero and Variance One

Quand les ordinateurs étaient lents, raconte Brunton, on ne trouvait Φ que pour la normale centrée réduite, dans une table « au fond du livre ». On y ramenait toute autre normale : Z = (X − μ)/σ. C'est la notion 2 avec a = 1/σ et b = −μ/σ : moyenne μ/σ − μ/σ = 0, écart-type σ/σ = 1. On centre, puis on réduit.

Les événements se correspondent, donc les probabilités aussi : « X entre μ − σ et μ + σ » est « Z entre −1 et 1 », 68,3 %. Avec nos journées X ~ N(15, 5²) : P(10 < X < 25) = P(−1 < Z < 2) = Φ(2) − Φ(−1) = 0,9772 − 0,1587 ≈ 0,819. Brunton cite P(X < 7) sans paramètres ; ici z = (7 − 15)/5 = −1,6 et Φ(−1,6) = 0,0548.

Ce z, le z-score, compte en écarts-types la distance à la moyenne : il est sans unité.

Voir l'idée — deux cloches reliées : standardiser change les graduations, pas la forme

En haut X ~ N(15, 5²) en °C, en bas Z ~ N(0, 1). Les deux axes sont alignés : 15 °C au-dessus de 0, chaque pas de 5 °C au-dessus d'un pas de 1. La cloche est la même ; seules changent les graduations, et les hauteurs, 0,0798 en haut et 0,399 en bas : cinq fois plus, puisqu'une unité de z couvre 5 °C. Choisis un intervalle, la même aire s'ombre en haut et en bas. 10 à 20 °C : ±1σ, 68,3 %. X < 7 °C, l'exemple de Brunton : Z < −1,6, 5,48 %. 10 à 25 °C : de −1 à 2, 81,9 %.

La formule
Z = (X − μ)/σ     E[Z] = 0     σZ = 1
X ~ N(μ, σ²) :   P(c < X < d) = Φ((d − μ)/σ) − Φ((c − μ)/σ)
  • C'est la preuve promise en l04 (notion 6) : la notion 2 avec a = 1/σ, b = −μ/σ, et une normale reste normale.
  • Moyenne 0 et écart-type 1 pour toute loi de variance finie : c'est la notion 2 avec a = 1/σ > 0, donc sans retournement.
  • Z ~ N(0, 1) seulement si X est normale. Standardiser ne change pas la forme (figure 3).
  • c et d sont les bornes de l'intervalle.
  • En pratique μ et σ sont inconnus : on standardise avec μ et σ, estimés sur l'apprentissage, et ce n'est plus la standardisation exacte. Pour la moyenne de n variables i.i.d. N(μ, σ²) standardisée par l'écart-type estimé, la loi devient une Student à n − 1 degrés de liberté, pas N(0, 1) (inférence en régression).
Figure 3 — standardiser ne rend pas normal

La densité de Z = (X − μ)/σ en violet, contre la normale centrée réduite φ en pointillé. Les trois lois, une fois standardisées, ont une moyenne 0 et un écart-type 1, mais seule la normale coïncide avec φ. Choisis exponentielle : Z = T − 1 (taux 1 : μ = σ = 1 ; toute exponentielle donne la même Z) commence à −1 et garde sa queue droite ; la zone ombrée, P(Z > 2) = e−3 = 0,0498, fait plus du double des 0,0228 que donnerait Φ. Choisis uniforme : Z reste entre −1,73 et 1,73, et P(Z > 2) = 0.

Exemples simples la règle 68-95-99,7, deux intervalles, les 400 pièces, des variables explicatives
  1. ±1, 2, 3 écarts-types. Pour toute normale : 68,3 %, 95,4 % et 99,7 % (vus en l04, notion 6). Pour X ~ N(15, 5²), ce sont les intervalles 10 à 20, 5 à 25 et 0 à 30 °C.
  2. Un intervalle quelconque. P(10 < X < 25) : z = (10 − 15)/5 = −1 et (25 − 15)/5 = 2, donc Φ(2) − Φ(−1) = 0,9772 − 0,1587 ≈ 0,819.
  3. Une queue. P(X < 7) : z = −1,6, Φ(−1,6) = 0,0548.
  4. Les 400 pièces de Brunton (l04, notion 7). Le nombre de piles est approximativement N(200, 10²) ; entre 190 et 230, la normale sans correction donne Φ((230 − 200)/10) − Φ((190 − 200)/10) = Φ(3) − Φ(−1) = 0,840 (la valeur exacte, 0,852, demande la correction de continuité, l04 notion 7). C'était déjà une standardisation.
  5. En ML : standardiser des variables explicatives (features). Trois clients, A (170 cm, 30 k€), B (180 cm, 30 k€), C (170 cm, 40 k€). En cm et en k€, A est à 10 de B et à 10 de C. Passe le revenu en € : A est toujours à 10 de B, mais à 10 000 de C, et un k-means ne voit plus que le revenu. Divise chaque variable par son écart-type, disons 10 cm et 20 k€ : A est à 1 de B et à 0,5 de C, quelle que soit l'unité de départ.
Simuler en Python Φ contre simulation, une exponentielle standardisée, des z-scores
import numpy as np
from scipy.stats import norm
rng = np.random.default_rng(2)

# X ~ N(15, 5^2): P(10 < X < 25) by standardising, then by simulation
X = rng.normal(15, 5, 1_000_000)
sim = np.mean((10 < X) & (X < 25))
print("Phi(2) - Phi(-1) =", round(norm.cdf(2) - norm.cdf(-1), 4), "  simulated:", sim.round(4))

# a standardised Exp(1) (mu = sigma = 1) has mean 0 and sd 1, but it is not normal
Z = rng.exponential(1.0, 1_000_000) - 1.0
print(f"mean {Z.mean():.3f}   sd {Z.std():.3f}")
print("P(Z > 2):", np.mean(Z > 2).round(4), "  Phi says", round(norm.sf(2), 4))
print("P(Z < -1):", np.mean(Z < -1).round(4), "  Phi says", round(norm.cdf(-1), 4))
# z-scores make distances unit-free: A, B, C = (height in cm, income in euros)
F, sd = np.array([[170, 30_000], [180, 30_000], [170, 40_000]]), np.array([10, 20_000])
print("raw:      AB", np.linalg.norm(F[0] - F[1]), "  AC", np.linalg.norm(F[0] - F[2]))
D = (F - F[0]) / sd  # differences to A, counted in standard deviations
print("z-scores: AB", np.linalg.norm(D[1]), "  AC", np.linalg.norm(D[2]))
Phi(2) - Phi(-1) = 0.8186   simulated: 0.819
mean 0.000   sd 1.000
P(Z > 2): 0.0498   Phi says 0.0228
P(Z < -1): 0.0   Phi says 0.1587
raw:      AB 10.0   AC 10000.0
z-scores: AB 1.0   AC 0.5
Où ça casse
  • Standardiser ne rend pas normal. Une exponentielle standardisée a une moyenne 0 et un écart-type 1, mais P(Z > 2) = 0,0498 au lieu de 0,0228, et P(Z < −1) = 0 au lieu de 0,159 (figure 3). La règle 68-95-99,7 ne vaut que pour une normale ; le TCL dira quand une moyenne standardisée le devient approximativement (l11).
  • σ, pas σ². scipy.stats.norm(loc, scale) et np.random.normal(loc, scale) prennent l'écart-type. Passer la variance 25 au lieu de 5 donne une cloche cinq fois trop large : P(10 < X < 25) tombe de 0,819 à 0,235.
  • Les statistiques du jeu de test (test set). μ et σ se calculent sur le jeu d'apprentissage seul, puis s'appliquent telles quelles au jeu de test. Les recalculer sur tout le jeu fait fuir de l'information (validation croisée et fuite).
  • μ et σ ne sont pas μ et σ. Une moyenne standardisée par l'écart-type estimé suit une Student si les données sont normales, aux queues plus lourdes que N(0, 1) ; l'écart ne compte qu'à petit n.
  • Les arbres n'en ont pas besoin. Standardiser est une transformation croissante : elle ne change l'ordre d'aucune valeur, donc les mêmes partitions, seule la valeur du seuil change (arbres). k-means, k-NN, PCA et régression pénalisée, eux, en dépendent.
Brunton, rectifiéBrunton (24) appelle Φ « la fonction d'erreur standard ». Φ et la fonction d'erreur erf sont parentes mais différentes : Φ(z) = ½[1 + erf(z/√2)], de sorte que erf(0) = 0 alors que Φ(0) = ½. Et il dit tantôt « normale de moyenne μ et d'écart-type σ », tantôt « de variance σ² » : on écrit N(μ, σ²), le second paramètre est la variance. Enfin, il appelle a et b à la fois les coefficients de la notion 2 et les bornes de l'intervalle : ici, les bornes sont c et d.

X ~ N(μ, σ²) : P(c < X < d) = Φ((d − μ)/σ) − Φ((c − μ)/σ), parce que Z = (X − μ)/σ suit N(0, 1), ce qui n'est vrai que si X est normale.

Le χ² à un degré de liberté : Y = X² culture

Brunton 25 · The Chi-Squared Distribution: The Square of the Normal Distribution

Brunton prend X ~ N(0, 1) et Y = X², « l'une des lois les plus utiles pour les tests ». Même méthode : « Y ≤ y » veut dire « X² ≤ y », donc « −√y ≤ X ≤ √y ». Les deux queues de X, à gauche et à droite, se replient sur un seul côté de Y. P(Y ≤ 1) = P(−1 ≤ X ≤ 1) = 0,683 ; P(Y ≤ 3,84) = P(|X| ≤ 1,96) = 0,95.

Près de 0, le carré écrase. La bande |X| ≤ 0,1 porte 8 % de la masse de X, et elle tombe tout entière dans [0 ; 0,01] : une densité moyenne de 7,97 sur cet intervalle. Plus on s'approche de 0, plus c'est tassé : la densité de Y n'est pas bornée en 0, et son aire vaut pourtant 1. C'est la loi du χ² à un degré de liberté.

Voir l'idée — la bande ±√y de X fait la probabilité de Y ≤ y

En haut, la densité φ de X, et la bande ombrée de −√y à √y. En bas, la densité du χ², et [0, y] ombré : les deux aires sont égales. Bouge y ou choisis un repère. y = 1 : la bande ±1, 68,3 %. y = 3,84 : la bande ±1,96, 95 %. y = 0,01 : la bande ±0,1 porte déjà 8 % de la masse, entassée dans [0 ; 0,01] : densité moyenne 7,97 (valeur affichée).

La formule
FY(y) = P(−√y ≤ X ≤ √y) = Φ(√y) − Φ(−√y) = 2Φ(√y) − 1    (y > 0)
fY(y) = φ(√y)/√y = e−y/2/√(2πy)     E[Y] = 1     Var(Y) = 2
  • X ~ N(0, 1) exactement. Pour X ~ N(μ, σ²), c'est ((X − μ)/σ)² qui suit cette loi : on standardise d'abord (notion 3).
  • Y ≥ 0 : FY(y) = 0 pour y ≤ 0.
  • g(x) = x² n'est pas monotone : chaque y > 0 a deux antécédents, ±√y, d'où les deux termes en Φ.
  • La somme de k carrés de N(0, 1) indépendantes suit un χ² à k degrés de liberté, de moyenne k et de variance 2k : c'est elle qui sert aux tests. Le χ² à un degré est aussi une loi Gamma de forme ½ et de taux ½ (l05, notion 7).
Figure 4 — les pentes de Φ en ±√y sont égales, et les deux bouts s'ajoutent

La courbe est Φ. FY(y) est l'écart vertical entre Φ(√y) et Φ(−√y), le segment rouge. Les deux tangentes ont la même pente, φ(√y), parce que φ est paire : elles sont parallèles. Quand y augmente, le bout droit avance de 1/(2√y) par unité de y et monte ; le bout gauche recule d'autant et descend. La longueur des flèches rouges est proportionnelle à cette vitesse : elles raccourcissent quand y grandit. Les deux mouvements élargissent l'écart : chacun apporte pente × vitesse, φ(√y)/(2√y), et leur somme est fY(y). Clique ▶ élargir la bande, ou bouge y. À y = 1 : pente 0,242, chaque bout 0,121, fY(1) = 0,242.

Exemples simples trois valeurs de y, la densité, la moyenne, une perte
  1. y = 1. 2Φ(1) − 1 = 0,683, et fY(1) = φ(1) = 0,242.
  2. y = 3,84. √3,84 ≈ 1,96, et 2Φ(1,96) − 1 = 0,95. Le seuil 3,84 d'un test du χ² à un degré de liberté est le carré de 1,96, le quantile 97,5 % de la normale.
  3. y = 0,01. P(|X| ≤ 0,1) = 0,0797, sur un intervalle de longueur 0,01.
  4. La densité en deux points : fY(0,5) = 0,439 et fY(2) = 0,104, les valeurs de scipy.stats.chi2(1).pdf.
  5. Moyenne et variance. E[Y] = E[X²] = Var(X) + E[X]² = 1. Pour la normale centrée réduite E[X⁴] = 3, donc Var(Y) = 3 − 1 = 2.
  6. En ML : une perte (loss) est une somme de carrés normalisés. En régression avec un bruit N(0, σ²), la log-vraisemblance négative vaut ½ Σ (ri/σ)² plus une constante (du bruit à la loss). Si les bruits εi sont indépendants, Σ (εi/σ)² suit un χ² à n degrés de liberté, de moyenne n ; avec les résidus d'une régression linéaire à p coefficients, il en reste n − p.
Preuve de CDF à CDF avec deux bouts, la dérivée sur laquelle Brunton trébuche
FY(y) = P(X² ≤ y)
définition, pour y > 0
= P(−√y ≤ X ≤ √y)
x² ≤ y équivaut à |x| ≤ √y : deux bouts
= Φ(√y) − Φ(−√y)
Φ est la CDF de X ; P(X = −√y) = 0
fY(y) = φ(√y) · 1/(2√y) − φ(−√y) · (−1/(2√y))
règle de la chaîne sur chaque terme : Φ′ = φ, (√y)′ = 1/(2√y), (−√y)′ = −1/(2√y)
= φ(√y)/(2√y) + φ(√y)/(2√y)
φ paire : φ(−√y) = φ(√y) ; les deux moins se compensent
= φ(√y)/√y = e−y/2/√(2πy)
φ(√y) = e−y/2/√(2π)

Le point délicat est la quatrième ligne : le moins devant Φ(−√y) et celui de la dérivée intérieure de −√y se compensent. Les pentes de Φ, elles, sont égales.

Moyenne et variance : E[Y] = E[X²] = Var(X) + E[X]² = 1 (l08, notion 6). Var(Y) = E[X⁴] − E[X²]² = 3 − 1 = 2, où E[X⁴] = 3 est admis ici : on le retrouve en dérivant quatre fois en 0 la fonction génératrice et²/2 de N(0, 1), dont le terme en t⁴ est t⁴/8 = 3 · t⁴/4! (l12, notion 3).

Simuler en Python X² contre 2Φ(√y) − 1, la densité, une somme de cinq carrés
import numpy as np
from scipy import stats
rng = np.random.default_rng(3)
Y = rng.normal(0, 1, 1_000_000) ** 2
# CDF to CDF: P(Y <= y) = P(|X| <= sqrt y) = 2 Phi(sqrt y) - 1
for y in [0.01, 1, 3.84]:
    exact = 2 * stats.norm.cdf(y ** 0.5) - 1
    print(f"P(Y <= {y}): simulated {np.mean(Y <= y):.4f}, exact {exact:.4f}")
print(f"mean {Y.mean():.3f}   variance {Y.var():.3f}   (theory 1 and 2)")

# density in a window of width 0.02 vs e^(-y/2) / sqrt(2 pi y), +- two standard errors
for y in [0.5, 2.0]:
    p = np.mean(abs(Y - y) < 0.01)
    noise = 2 * np.sqrt(p * (1 - p) / Y.size) / 0.02
    fy = np.exp(-y / 2) / np.sqrt(2 * np.pi * y)
    print(f"density at {y}: simulated {p / 0.02:.3f} +- {noise:.3f}, formula {fy:.4f}")

# sum of k = 5 independent squares: chi-square with 5 degrees of freedom
S = (rng.normal(0, 1, (1_000_000, 5)) ** 2).sum(axis=1)
print(f"k = 5: mean {S.mean():.3f}   variance {S.var():.2f}   (theory 5 and 10)")
P(Y <= 0.01): simulated 0.0800, exact 0.0797
P(Y <= 1): simulated 0.6822, exact 0.6827
P(Y <= 3.84): simulated 0.9500, exact 0.9500
mean 1.000   variance 1.999   (theory 1 and 2)
density at 0.5: simulated 0.437 +- 0.009, formula 0.4394
density at 2.0: simulated 0.101 +- 0.004, formula 0.1038
k = 5: mean 4.996   variance 10.00   (theory 5 and 10)
Où ça casse
  • Le carré de la densité. φ(x)² n'est pas la densité de X² : son aire vaut 0,282, et elle vit sur toute la droite alors que X² ≥ 0.
  • Une seule branche. Oublier −√y donne φ(√y)/(2√y), d'aire ½ : il manque la masse des X négatifs.
  • Une densité infinie n'est pas une probabilité infinie. fY(y) tend vers l'infini quand y tend vers 0, mais P(Y ≤ 0,01) = 0,0797 seulement. Une densité est un taux : elle peut exploser sur un intervalle de plus en plus court.
  • X non centrée réduite. Si X ~ N(15, 5²), X² n'est pas un χ² : E[X²] = 25 + 15² = 250. C'est ((X − 15)/5)² qui en est un.
  • Ce qui est normal, c'est l'erreur standardisée. Une erreur divisée par son écart-type est ≈ N(0, 1), avant tout carré ; c'est la somme des carrés de ces erreurs standardisées qui est ≈ χ². Il faut aussi qu'elles soient indépendantes, et chaque paramètre estimé retire un degré de liberté (parties 1, tests).
Brunton, rectifiéBrunton (25) écrit d'abord juste : « I'm going to get minus and minus. So plus… ». Puis il doute, « I think this should be a minus here », et justifie ce doute par « les pentes en +√y et −√y sont égales et opposées ». Elles sont égales : φ est paire, φ(−√y) = φ(√y). Le signe vient de la dérivée intérieure de −√y, qui vaut −1/(2√y) et annule le moins placé devant Φ(−√y) : les deux termes s'ajoutent, comme dans sa première ligne (figure 4). Son résultat final, tiré de ses notes, fY(y) = y−1/2 φ(√y), est juste. Au passage, il écrit la densité de N(0, 1) avec e−x²/σ² : c'est e−x²/2/√(2π). Enfin, pour les tests, il enchaîne « on soustrait le modèle aux données, on élève l'erreur au carré » et « ces erreurs suivent à peu près une normale », sans dire lesquelles : ce sont les erreurs standardisées, avant le carré.

Si X ~ N(0, 1), X² suit un χ² à 1 degré de liberté : P(X² ≤ y) = P(|X| ≤ √y) = 2Φ(√y) − 1, moyenne 1, variance 2, et 3,84 ≈ 1,96². Une somme de k carrés indépendants donne un χ² à k degrés de liberté. Pas de carte ici : elle viendra avec les tests.

Résumé

À retenir
  1. Une densité est un taux par unité : elle ne se recopie pas. Une fonction de répartition, probabilité d'un événement, se transporte.
  2. Méthode : FY(y) = P(g(X) ≤ y), réécrire en événement sur X, puis dériver par la règle de la chaîne.
  3. g monotone : fY(y) = fX(g⁻¹(y)) · |(g⁻¹)′(y)| ; la densité se divise par l'étirement.
  4. Y = aX + b : fY(y) = fX((y − b)/a)/|a|, moyenne aμ + b, écart-type |a|σ ; a < 0 retourne l'inégalité.
  5. Une normale reste normale : aX + b ~ N(aμ + b, a²σ²).
  6. Z = (X − μ)/σ : moyenne 0 et écart-type 1 toujours, N(0, 1) seulement si X est normale ; P(c < X < d) = Φ((d − μ)/σ) − Φ((c − μ)/σ).
  7. X ~ N(0, 1) ⇒ X² suit un χ² à 1 degré de liberté : P(X² ≤ y) = 2Φ(√y) − 1, moyenne 1, variance 2, densité infinie en 0.
« Pour la loi d'une fonction d'une variable aléatoire, je ne transforme pas la densité : je passe par la fonction de répartition, P(g(X) ≤ y), que je réécris comme un événement sur X, puis je dérive. Pour une transformation affine, la densité se divise par |a| ; standardiser en est le cas a = 1/σ, et ça ne rend normale qu'une variable déjà normale. »

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

6 maillons · clique pour révéler après avoir dit
  1. Pourquoi ne peut-on pas simplement remplacer x par g⁻¹(y) dans la densité de X ?
    Une densité est un taux par unité de longueur : si g étire, la même probabilité s'étale, il faut diviser par l'étirement |g′|. Uniforme sur [0, 1] étirée par 2 et recopiée : aire 2.
  2. Quelle est la méthode pour trouver la loi de Y = g(X) ?
    Écrire FY(y) = P(g(X) ≤ y), le traduire en événement sur X, l'exprimer avec FX, puis dériver par la règle de la chaîne.
  3. Densité de aX + b, et ce qui change si a < 0 ?
    fX((y − b)/a)/|a|. Si a < 0, l'inégalité se retourne : FY(y) = 1 − FX((y − b)/a). L'écart-type est |a|σ.
  4. X ~ N(15, 5²). Que vaut P(10 < X < 25) ?
    On standardise : z = −1 et 2, donc Φ(2) − Φ(−1) = 0,9772 − 0,1587 ≈ 0,819.
  5. Standardiser une variable explicative exponentielle la rend-elle normale ?
    Non : moyenne 0 et écart-type 1, mais la même forme. P(Z > 2) = 0,050, et non les 0,023 de Φ.
  6. Quelle est la loi de X² pour X ~ N(0, 1) ?
    P(X² ≤ y) = P(|X| ≤ √y) = 2Φ(√y) − 1 : deux antécédents ±√y. Densité e−y/2/√(2πy), moyenne 1 : le χ² à 1 degré de liberté ; 3,84 ≈ 1,96².