Maîtrisez le théorème central limite
Un logiciel de caisse arrondit chaque montant à l’euro le plus proche. Sur une journée de 300 ventes, l’erreur totale sur le chiffre d’affaires peut-elle dépasser 15 € ? Chaque erreur d’arrondi est comprise entre −0,50 € et +0,50 €, donc l’erreur totale est en théorie comprise entre −150 € et +150 €. Mais en pratique ? La loi des grands nombres du chapitre 7 dit que l’erreur moyenne tend vers 0 ; elle ne dit pas comment l’erreur totale se répartit autour de 0.
C’est le rôle du théorème central limite (TCL) : il donne la loi approximative d’une somme ou d’une moyenne, quelle que soit la loi de départ. C’est sans doute le résultat le plus utilisé de toute la statistique. Le fil rouge sera ce logiciel de caisse, puis un site de vente en ligne.
Ce que dit le théorème
Section intitulée « Ce que dit le théorème »Reprenons le cadre du chapitre 7 : sont i.i.d., d’espérance et de variance finie. Nous savons que a pour espérance et pour écart-type . On la standardise comme au chapitre 5 :
a pour espérance 0 et pour variance 1, pour tout . Le théorème central limite affirme que sa loi se rapproche de la normale centrée réduite :
On dit que converge en loi vers . En pratique, on l’utilise sous la forme d’une approximation, pour « assez grand » :
Le point extraordinaire, c’est que la loi des n’intervient que par et . Qu’il s’agisse de dés, d’arrondis, de temps d’attente ou de pannes, la somme finit toujours par prendre une forme de cloche. Le schéma montre la loi exacte de la somme de 1, 2 et 4 dés : la loi uniforme d’un dé devient un triangle, puis déjà presque une cloche.
Le fil rouge : les erreurs d’arrondi
Section intitulée « Le fil rouge : les erreurs d’arrondi »Chaque erreur d’arrondi suit la loi uniforme sur (en euros) : on suppose les centimes « au hasard » et les ventes indépendantes. D’après le chapitre 5, et . L’erreur totale a donc pour espérance 0 et pour variance , soit un écart-type de 5 €. Par le TCL, , et :
L’erreur totale dépasse 15 € environ une journée sur 370, alors que la borne théorique est de 150 €. Les erreurs positives et négatives se compensent massivement. On vérifie par simulation :
set.seed(12)# 100 000 journées de 300 ventes : une ligne par journéeerreurs <- matrix(runif(300 * 100000, -0.5, 0.5), ncol = 300)S <- rowSums(erreurs)
sd(S) # proche de 5mean(abs(S) > 15) # 0.0024, proche de 0.0027hist(S, breaks = 60, freq = FALSE)curve(dnorm(x, 0, 5), add = TRUE, lwd = 2)Approcher la loi binomiale
Section intitulée « Approcher la loi binomiale »Une variable binomiale est une somme de variables de Bernoulli indépendantes (chapitre 4). Le TCL s’applique donc directement : pour grand,
Une règle d’usage courante demande , et , pour que la cloche ne soit pas « écrasée » contre 0 ou . (Quand est très petit, on préfère l’approximation de Poisson du chapitre 4.)
Ce calcul a une conséquence très concrète : si un jour le site observe 60 achats, ce n’est pas forcément le signe d’une amélioration. Un tel écart arrive par hasard environ une fois sur onze. Toute la question des tests statistiques (chapitre 10) est de distinguer un vrai effet d’une fluctuation de ce genre.
Jusqu’où peut-on faire confiance au TCL ?
Section intitulée « Jusqu’où peut-on faire confiance au TCL ? »Le théorème est asymptotique : il ne dit pas à partir de quel l’approximation est bonne. La règle souvent enseignée, « suffit », est un ordre de grandeur, pas une garantie. Tout dépend de la loi de départ.
- Pour une loi symétrique et sans valeurs extrêmes (uniforme, dés), la convergence est très rapide : dès , une somme d’uniformes est presque indiscernable d’une normale.
- Pour une loi asymétrique (exponentielle, temps de réponse, revenus), elle est plus lente, surtout dans les queues.
Deux conditions ne sont en revanche pas négociables : l’indépendance (ou une dépendance faible) et une variance finie. Pour la loi de Cauchy du chapitre 7, le TCL échoue comme la loi des grands nombres. Le TCL se généralise aussi aux vecteurs : pour des vecteurs aléatoires i.i.d. de moyenne et de matrice de covariance , converge en loi vers le vecteur gaussien du chapitre 6.
Pour voir le TCL à l’œuvre sur une loi asymétrique, rien ne vaut une simulation. La fonction replicate répète une expérience et renvoie le vecteur de ses résultats :
set.seed(3)moyennes <- replicate(10000, mean(rexp(50, rate = 1/200))) # 10 000 moyennes de 50 temps
hist(moyennes, breaks = 60, freq = FALSE, main = "Temps moyen sur 50 requêtes")curve(dnorm(x, mean = 200, sd = 200 / sqrt(50)), add = TRUE, lwd = 2)mean(moyennes > 250) # proche de 0.046 (valeur exacte), pas de 0.039L’histogramme a bien une forme de cloche, mais légèrement penchée à droite par rapport à la courbe normale.
Standardiser, normaliser : ne pas confondre
Section intitulée « Standardiser, normaliser : ne pas confondre »Le TCL travaille avec des variables standardisées, , de moyenne 0 et d’écart-type 1. En analyse de données, on rencontre aussi la normalisation min-max, , qui ramène les valeurs dans . Les deux servent à comparer des grandeurs d’échelles différentes (des âges et des revenus, par exemple), mais seule la standardisation a le sens probabiliste utilisé ici. Et aucune des deux ne rend une variable « normale » au sens de la loi de Gauss : elles changent l’échelle, pas la forme.
En résumé
Section intitulée « En résumé »- Pour i.i.d. de variance finie, converge en loi vers : c’est le théorème central limite.
- En pratique : et , quelle que soit la loi des .
- La LGN donne la limite de ; le TCL donne la forme et l’ampleur de ses fluctuations.
- La binomiale s’approche par si et sont assez grands, avec la correction de continuité.
- La règle « » est indicative : la convergence est rapide pour les lois symétriques, plus lente pour les lois asymétriques, et le TCL échoue sans variance finie.
- Standardiser () et normaliser () changent l’échelle, pas la forme de la loi.
Exercices
Section intitulée « Exercices »Exercice · Combien de tirages, cette fois ?
facileAu chapitre 7, l’inégalité de Tchebychev imposait 50 000 tirages pour estimer une probabilité à près avec une probabilité d’erreur d’au plus 5 %. Refaites le calcul avec le TCL, en utilisant .
Voir la solution
La fréquence est une moyenne de variables de Bernoulli, donc par le TCL . On veut , ce qui revient à :
Avec : . Environ 9 600 tirages suffisent, cinq fois moins qu’avec Tchebychev. Le TCL exploite la forme de la loi, là où Tchebychev se prépare au pire. (C’est aussi la taille classique d’un sondage à point.)
En code
import numpy as npfrom scipy import stats
z = stats.norm.ppf(0.975) # 1.96n_tcl = z**2 * 0.25 / 0.01**2 # p(1 - p) <= 1/4n_tcheb = round(0.25 / (0.01**2 * 0.05))print(round(z, 3), np.ceil(n_tcl), n_tcheb) # 1.96 9604.0 50000
# Vérification : avec n = 9604 et p = 0.5, part des estimations à plus de 0.01rng = np.random.default_rng(0)p_chapeau = rng.binomial(9604, 0.5, size=100_000) / 9604print(np.mean(np.abs(p_chapeau - 0.5) > 0.01)) # 0.0494, proche de 5 %z <- qnorm(0.975) # 1.96n_tcl <- z^2 * 0.25 / 0.01^2 # p(1 - p) <= 1/4n_tcheb <- 0.25 / (0.01^2 * 0.05)c(z, ceiling(n_tcl), n_tcheb) # 1.96 9604 50000
# Vérification : avec n = 9604 et p = 0.5, part des estimations à plus de 0.01set.seed(0)p_chapeau <- rbinom(100000, size = 9604, prob = 0.5) / 9604mean(abs(p_chapeau - 0.5) > 0.01) # 0.0484, proche de 5 %Exercice · La somme de 100 dés
moyenOn lance 100 dés équilibrés. Estimez avec le TCL la probabilité que la somme soit au moins égale à 380. Écrivez une simulation R pour vérifier.
Voir la solution
Pour un dé, et . La somme a pour espérance et pour écart-type . Avec la correction de continuité (la somme est entière) :
La valeur exacte (obtenue par convolution répétée) vaut aussi 0,042 : pour une loi symétrique comme celle d’un dé, l’approximation est excellente dès .
En code
import numpy as npfrom scipy import stats
# Approximation normale avec correction de continuitému, sigma = 100 * 3.5, np.sqrt(100 * 35 / 12)print(stats.norm.sf(379.5, loc=mu, scale=sigma)) # 0.0421
# Loi exacte de la somme : 99 convolutions de la loi d'un déun_de = np.ones(6) / 6 # P(face = 1..6)loi = un_defor _ in range(99): loi = np.convolve(loi, un_de) # loi[k] = P(S = k + 100)print(loi[380 - 100:].sum()) # 0.0420
# Simulationrng = np.random.default_rng(0)S = rng.integers(1, 7, size=(100_000, 100)).sum(axis=1)print(np.mean(S >= 380)) # 0.0417# Approximation normale avec correction de continuitému <- 100 * 3.5; sigma <- sqrt(100 * 35 / 12)1 - pnorm(379.5, mean = mu, sd = sigma) # 0.0421
# Loi exacte de la somme : 99 convolutions de la loi d'un déun_de <- rep(1/6, 6)loi <- un_defor (i in 1:99) loi <- convolve(loi, rev(un_de), type = "open") # loi[k] = P(S = k + 99)sum(loi[(380 - 99):length(loi)]) # 0.0420
# Simulationset.seed(21)S <- replicate(100000, sum(sample(1:6, 100, replace = TRUE)))mean(S >= 380) # 0.0416Exercice · Remplir un ascenseur
difficileUn ascenseur supporte au plus 1 000 kg. On suppose que le poids d’un usager a pour moyenne 75 kg et pour écart-type 12 kg, indépendamment des autres.
- Avec 12 usagers, quelle est la probabilité (approchée) de dépasser la charge maximale ?
- Combien d’usagers au plus peut-on autoriser pour que ce risque reste inférieur à 0,1 % ?
- Pourquoi l’hypothèse d’indépendance est-elle discutable ici ?
Voir la solution
- La somme de 12 poids a pour espérance kg et pour écart-type kg. Par le TCL, .
- On veut , soit (quantile d’ordre 0,999 de ). Pour , le rapport vaut : trop faible. Pour : . On autorise donc 11 usagers au plus.
- Les usagers d’un même ascenseur ne sont pas tirés au hasard : une équipe de rugby, un groupe d’enfants ou des déménageurs chargés forment des groupes aux poids corrélés. La variance de la somme inclut alors des covariances positives (chapitre 6) et le risque réel est plus élevé. Avec seulement, l’approximation normale des queues est de plus fragile : c’est pourquoi les normes de sécurité prennent des marges bien plus larges.
En code
import numpy as npfrom scipy import stats
def risque(n, moyenne=75, ecart_type=12, charge=1000): """P(somme des poids > charge) approchée par le TCL.""" return stats.norm.sf(charge, loc=n * moyenne, scale=ecart_type * np.sqrt(n))
print(risque(12)) # 0.0081for n in (10, 11, 12, 13): print(n, risque(n)) # 11 -> 5.4e-06, 12 -> 0.0081 : on autorise 11 usagersrisque <- function(n, moyenne = 75, ecart_type = 12, charge = 1000) { # P(somme des poids > charge) approchée par le TCL 1 - pnorm(charge, mean = n * moyenne, sd = ecart_type * sqrt(n))}risque(12) # 0.0081sapply(10:13, risque) # 11 -> 5.4e-06, 12 -> 0.0081 : on autorise 11 usagersmax(which(sapply(1:20, risque) <= 0.001)) # 11