Aller au contenu

Comprenez la logique d'un test statistique

Une machine remplit des paquets de café censés peser 250 g. Sur 16 paquets, la masse moyenne vaut 249,2 g. La machine est-elle déréglée, ou bien ce petit écart est-il le fruit du hasard ? Arrêter la ligne pour rien coûte cher ; laisser partir des paquets trop légers aussi.

Un test statistique est une règle de décision qui tranche ce genre de question en contrôlant le risque de se tromper. Ce chapitre en démonte la mécanique sur ce cas simple ; les chapitres suivants déclineront la même logique pour d’autres paramètres.

On formalise la question par deux hypothèses sur la moyenne mm de la machine :

  • l’hypothèse nulle H0:m=250H_0 : m = 250, la machine est bien réglée ;
  • l’hypothèse alternative H1:m≠250H_1 : m \ne 250, elle est déréglée.

Ces deux hypothèses ne sont pas symétriques. H0H_0 est l’hypothèse de référence, celle du statu quo ou de la prudence, que l’on garde tant que les données ne la contredisent pas nettement. H1H_1 est ce que l’on cherche à mettre en évidence. Le raisonnement ressemble à un procès : l’accusé est présumé innocent (H0H_0) et on ne le condamne que sur des preuves suffisantes.

L’alternative peut être :

  • bilatérale : H1:m≠250H_1 : m \ne 250 (un écart dans un sens ou dans l’autre nous intéresse) ;
  • unilatérale : H1:m<250H_1 : m < 250 (seuls les paquets trop légers posent problème, par exemple pour une association de consommateurs), avec alors H0:m≥250H_0 : m \ge 250.

Quelle que soit la règle, deux erreurs sont possibles :

H0H_0 vraie (machine réglée)H1H_1 vraie (machine déréglée)
On conserve H0H_0bonne décisionerreur de seconde espèce (risque β\beta)
On rejette H0H_0erreur de première espèce (risque α\alpha)bonne décision (probabilité 1−β1 - \beta)
  • α\alpha, le niveau du test, est la probabilité de rejeter H0H_0 alors qu’elle est vraie : un faux positif, ici arrêter une machine bien réglée.
  • β\beta est la probabilité de conserver H0H_0 alors qu’elle est fausse : un faux négatif, ici laisser tourner une machine déréglée.
  • La puissance 1−β1 - \beta est la probabilité de détecter un écart qui existe vraiment.

On ne peut pas rendre α\alpha et β\beta petits en même temps à taille d’échantillon fixée : être plus exigeant pour rejeter (baisser α\alpha) fait rater plus d’écarts réels (augmenter β\beta). La convention est donc de fixer α\alpha (1 %, 5 % ou 10 %) et de choisir, parmi les tests de niveau α\alpha, le plus puissant.

Supposons, comme l’indique le constructeur, que la masse d’un paquet suit une loi N(m,σ2)\mathcal{N}(m, \sigma^2) avec σ=1,5\sigma = 1{,}5 g connu. On a n=16n = 16 et xˉ=249,2\bar x = 249{,}2 g.

  1. Hypothèses : H0:m=250H_0 : m = 250 contre H1:m≠250H_1 : m \ne 250.
  2. Niveau : α=5 %\alpha = 5\,\%.
  3. Statistique de test, dont on connaît la loi sous H0H_0 :
T0=n (Xˉn−m0)σ∼N(0,1) sous H0T_0 = \frac{\sqrt{n}\,(\bar X_n - m_0)}{\sigma} \sim \mathcal{N}(0, 1) \text{ sous } H_0

où m0=250m_0 = 250 est la valeur testée. T0T_0 mesure l’écart entre la moyenne observée et m0m_0, en nombre d’erreurs-types.

  1. Région critique RR : les valeurs de T0T_0 qui conduisent à rejeter H0H_0, choisies pour que PH0(T0∈R)=αP_{H_0}(T_0 \in R) = \alpha. Pour une alternative bilatérale, on rejette les valeurs trop grandes en valeur absolue : R=]−∞,−z1−α/2[∪]z1−α/2,+∞[R = \left] -\infty, -z_{1-\alpha/2} \right[ \cup \left] z_{1-\alpha/2}, +\infty \right[, avec z0,975=1,96z_{0,975} = 1{,}96.
  2. Valeur observée : t0=16 (249,2−250)/1,5=4×(−0,8)/1,5≈−2,13t_0 = \sqrt{16}\,(249{,}2 - 250)/1{,}5 = 4 \times (-0{,}8)/1{,}5 \approx -2{,}13.
  3. Décision et conclusion : ∣t0∣=2,13>1,96\lvert t_0 \rvert = 2{,}13 > 1{,}96, donc t0∈Rt_0 \in R : on rejette H0H_0 au niveau 5 %. Les données indiquent un déréglage de la machine.
−1,961,960t₀ = −2,13rejet (2,5 %)rejet (2,5 %)on conserve H₀loi de T₀ sous H₀ : N(0, 1)

On peut aussi exprimer la région critique directement sur xˉ\bar x : on rejette si xˉ\bar x sort de [250−1,96×1,5/4 ; 250+1,96×1,5/4]=[249,265 ; 250,735][250 - 1{,}96 \times 1{,}5/4 \ ;\ 250 + 1{,}96 \times 1{,}5/4] = [249{,}265 \ ;\ 250{,}735]. Avec 249,2 g, on est juste en dessous.

La p-valeur : jusqu’à quel niveau rejette-t-on ?

Section intitulée « La p-valeur : jusqu’à quel niveau rejette-t-on ? »

Le verdict « rejet à 5 % » perd de l’information : rejette-t-on de justesse ou de très loin ? La p-valeur répond. C’est la probabilité, si H0H_0 est vraie, d’observer une statistique au moins aussi extrême que celle obtenue :

p=PH0(∣T0∣≥∣t0∣)=2(1−Φ(∣t0∣))p = P_{H_0}\left( \lvert T_0 \rvert \ge \lvert t_0 \rvert \right) = 2\left(1 - \Phi(\lvert t_0 \rvert)\right)

où Φ\Phi est la fonction de répartition de N(0,1)\mathcal{N}(0, 1). Ici, p=2(1−Φ(2,13))≈0,033p = 2(1 - \Phi(2{,}13)) \approx 0{,}033.

La p-valeur est aussi le plus petit niveau α\alpha auquel on rejette H0H_0. D’où la règle : on rejette H0H_0 au niveau α\alpha si et seulement si p≤αp \le \alpha. Ici, on rejette à 5 % (0,033≤0,050{,}033 \le 0{,}05) mais pas à 1 % (∣t0∣=2,13<z0,995=2,576\lvert t_0 \rvert = 2{,}13 < z_{0,995} = 2{,}576).

−4−3−2−101234valeur de T₀0,00,10,20,30,4densitéseuil 5 % : ±1,96seuil 1 % : ±2,576t₀ = −2,13p = 2 × 0,0164 ≈ 0,033(les deux aires ambre)sous H₀ : N(0, 1)
La p-valeur est l'aire des deux queues au-delà de |t₀| = 2,13. Elle dépasse le seuil 1,96 (rejet à 5 %) mais pas 2,576 (conservation à 1 %).

Pour l’alternative unilatérale H1:m<250H_1 : m < 250, seule la queue gauche compte : p=Φ(−2,13)≈0,016p = \Phi(-2{,}13) \approx 0{,}016, et la région critique devient t0<−z0,95=−1,645t_0 < -z_{0,95} = -1{,}645.

Supposons que la machine soit en réalité réglée à m=249m = 249 g. Quelle est la probabilité que notre test (16 paquets, α=5 %\alpha = 5\,\%) le détecte ?

Sous cette hypothèse, T0T_0 n’est plus centrée : elle suit N(δ,1)\mathcal{N}(\delta, 1) avec δ=16 (249−250)/1,5≈−2,67\delta = \sqrt{16}\,(249 - 250)/1{,}5 \approx -2{,}67. La puissance vaut

1−β=P(∣T0∣>1,96)=Φ(−1,96−δ)+Φ(−1,96+δ)≈0,761 - \beta = P(\lvert T_0 \rvert > 1{,}96) = \Phi(-1{,}96 - \delta) + \Phi(-1{,}96 + \delta) \approx 0{,}76

Une fois sur quatre, un déréglage d’un gramme passerait inaperçu. Pour faire mieux, il faut plus de données :

Nombre de paquets nn49162536
Puissance pour m=249m = 2490,270,520,760,920,98

La puissance augmente avec la taille de l’échantillon, avec l’écart réel ∣m−m0∣\lvert m - m_0 \rvert et avec α\alpha ; elle diminue quand σ\sigma augmente. Pour atteindre 90 %, il faut n≥((z0,975+z0,90) σ/∣m−m0∣)2=((1,96+1,28)×1,5)2≈23,6n \ge \left( (z_{0,975} + z_{0,90})\,\sigma / \lvert m - m_0 \rvert \right)^2 = \left((1{,}96 + 1{,}28) \times 1{,}5\right)^2 \approx 23{,}6, soit 24 paquets. C’est ce calcul qu’on fait avant une expérience, par exemple avant un test A/B.

−6−4−1,9601,964valeur de T₀ (16 paquets, σ = 1,5)0,000,050,100,150,200,250,300,350,40densitéH₀ vraie :m = 250H₁ vraie : m = 249(T₀ centrée en −2,67)α/2 = 2,5 %β ≈ 0,24puissance1 − β ≈ 0,76
Les deux risques se lisent sur les mêmes seuils ±1,96 : α sous la courbe de H₀, β sous la courbe de H₁. Écarter les seuils réduit α mais agrandit β.
248249250251252vraie moyenne m de la machine (g)0,00,20,40,60,81,0probabilité de rejeter H₀α = 0,05 en m = 250puissance si m = 249n = 4 : 0,27n = 16 : 0,76n = 36 : 0,98
Toutes les courbes valent α = 5 % quand H₀ est vraie. Plus n est grand, plus elles se creusent étroitement : un même écart d'un gramme est détecté presque à coup sûr avec 36 paquets.

Test et intervalle de confiance : deux faces d’une même pièce

Section intitulée « Test et intervalle de confiance : deux faces d’une même pièce »

L’IC à 95 % de mm (avec σ\sigma connu) vaut 249,2±1,96×1,5/4=[248,46 ; 249,94]249{,}2 \pm 1{,}96 \times 1{,}5/4 = [248{,}46 \ ;\ 249{,}94]. Il ne contient pas 250.

Ce n’est pas un hasard. Pour un test bilatéral, on rejette H0:θ=θ0H_0 : \theta = \theta_0 au niveau α\alpha si et seulement si θ0\theta_0 n’appartient pas à l’IC de niveau 1−α1 - \alpha. L’intervalle donne même plus d’information que le test : il indique toutes les valeurs de mm compatibles avec les données.

248,5249,0249,5250,0250,5251,0masse (g)on conserve H₀ si x̄ ∈ [249,265 ; 250,735]IC à 95 % de m : [248,46 ; 249,94]x̄ = 249,2même demi-largeur1,96 × 1,5 / 4 = 0,735
Même demi-largeur, centres échangés : x̄ sort de la zone d'acceptation autour de 250 exactement quand 250 sort de l'intervalle autour de x̄.
# On raisonne directement sur le résumé : n = 16, moyenne 249.2, sigma = 1.5
z0 <- sqrt(16) * (249.2 - 250) / 1.5
2 * (1 - pnorm(abs(z0))) # p-valeur bilatérale : 0.033
power.t.test(delta = 1, sd = 1.5, power = 0.9, type = "one.sample") # n nécessaire (version Student)
import numpy as np
from scipy import stats
z0 = np.sqrt(16) * (249.2 - 250) / 1.5
print(z0, 2 * stats.norm.sf(abs(z0))) # -2.13 et 0.033
delta = np.sqrt(16) * (249 - 250) / 1.5
puissance = stats.norm.cdf(-1.96 - delta) + stats.norm.cdf(-1.96 + delta)
print(puissance) # 0.76
  • H0H_0 est l’hypothèse de référence, qu’on ne rejette que sur preuves ; H1H_1 est ce qu’on veut montrer (bilatérale ou unilatérale).
  • Erreur de première espèce : rejeter H0H_0 à tort (probabilité α\alpha, fixée) ; seconde espèce : la conserver à tort (β\beta) ; puissance =1−β= 1 - \beta.
  • Démarche : hypothèses, niveau, statistique de loi connue sous H0H_0, région critique, valeur observée, décision.
  • p-valeur : plus petit niveau qui conduit au rejet ; ce n’est pas la probabilité que H0H_0 soit vraie, et conserver H0H_0 ne la prouve pas.
  • La puissance croît avec nn et avec l’écart réel ; test bilatéral et intervalle de confiance sont équivalents.

Exercice · Formuler les hypothèses

facile

Pour chaque situation, écrivez H0H_0 et H1H_1 et dites si le test est unilatéral ou bilatéral.

  1. Un fabricant affirme que ses ampoules durent en moyenne au moins 10 000 heures ; une association de consommateurs veut le contredire.
  2. Un laboratoire vérifie qu’un appareil de mesure n’a pas de biais : la moyenne de mesures d’un étalon de 100 mg doit valoir 100 mg.
  3. Une équipe produit veut montrer que la nouvelle version d’une page augmente le taux de conversion, actuellement de 4 %.
Voir la solution
  1. H0:m≥10 000H_0 : m \ge 10\,000 contre H1:m<10 000H_1 : m < 10\,000 (unilatéral). L’association cherche à montrer que la durée est plus courte : c’est H1H_1.
  2. H0:m=100H_0 : m = 100 contre H1:m≠100H_1 : m \ne 100 (bilatéral) : un biais dans un sens ou dans l’autre pose problème.
  3. H0:p≤0,04H_0 : p \le 0{,}04 contre H1:p>0,04H_1 : p > 0{,}04 (unilatéral). L’amélioration est ce qu’il faut démontrer ; sans preuve, on garde le statu quo.

En code

import numpy as np
from scipy import stats
# Données fictives : le sens de H1 se traduit par l'argument alternative
rng = np.random.default_rng(0)
ampoules = rng.normal(9800, 500, size=30) # durées de vie (heures)
mesures = rng.normal(100.2, 0.5, size=20) # mesures de l'étalon (mg)
# 1. H1 : m < 10 000 (unilatéral à gauche)
print(stats.ttest_1samp(ampoules, 10000, alternative="less").pvalue) # 0.0008
# 2. H1 : m != 100 (bilatéral)
print(stats.ttest_1samp(mesures, 100, alternative="two-sided").pvalue) # 0.0004
# 3. H1 : p > 0.04 (unilatéral à droite), 52 conversions sur 1 000 visites
print(stats.binomtest(52, 1000, p=0.04, alternative="greater").pvalue) # 0.036

Exercice · Mener un test complet

moyen

Des bouteilles doivent contenir 1 000 mL. La machine a un écart-type connu de 6 mL et on suppose la normalité. Sur 36 bouteilles, xˉ=997,6\bar x = 997{,}6 mL. Testez au niveau 5 % si la machine sous-remplit en moyenne, puis donnez la p-valeur.

Voir la solution

On teste H0:m≥1 000H_0 : m \ge 1\,000 contre H1:m<1 000H_1 : m < 1\,000. Sous H0H_0 (à la frontière m=1 000m = 1\,000), T0=n(Xˉ−1 000)/6∼N(0,1)T_0 = \sqrt{n}(\bar X - 1\,000)/6 \sim \mathcal{N}(0,1).

t0=6×(997,6−1 000)/6=−2,4t_0 = 6 \times (997{,}6 - 1\,000)/6 = -2{,}4. La région critique unilatérale est t0<−1,645t_0 < -1{,}645 : on rejette H0H_0, la machine sous-remplit.

La p-valeur vaut Φ(−2,4)≈0,008\Phi(-2{,}4) \approx 0{,}008 : on rejetterait même au niveau 1 %.

En code

import numpy as np
from scipy import stats
n, moyenne, sigma, m0 = 36, 997.6, 6, 1000
t0 = np.sqrt(n) * (moyenne - m0) / sigma
print(t0, stats.norm.ppf(0.05)) # -2.4 < -1.645 : on rejette H0
print(stats.norm.cdf(t0)) # p-valeur unilatérale : 0.0082

Exercice · Planifier un test par sa puissance

difficile

On reprend la machine à café (σ=1,5\sigma = 1{,}5 g, test bilatéral à 5 %). On veut détecter un déréglage de 0,5 g avec une puissance de 80 %. Combien de paquets faut-il peser ? Commentez par rapport au déréglage de 1 g.

Voir la solution

On utilise n≥((z0,975+z0,80) σ/Δ)2n \ge \left((z_{0,975} + z_{0,80})\,\sigma/\Delta\right)^2 avec z0,80≈0,842z_{0,80} \approx 0{,}842 et Δ=0,5\Delta = 0{,}5 :

n≥((1,96+0,842)×1,5/0,5)2=(8,405)2≈70,6n \ge \left( (1{,}96 + 0{,}842) \times 1{,}5 / 0{,}5 \right)^2 = (8{,}405)^2 \approx 70{,}6

Il faut donc 71 paquets. Pour un déréglage de 1 g à la même puissance, on trouverait (2,802×1,5)2≈17,7(2{,}802 \times 1{,}5)^2 \approx 17{,}7, soit 18 paquets. Diviser l’écart à détecter par 2 multiplie la taille d’échantillon par 4 : la taille nécessaire varie comme 1/Δ21/\Delta^2.

En code

import numpy as np
from scipy import stats
from statsmodels.stats.power import tt_solve_power
sigma, alpha, puissance = 1.5, 0.05, 0.80
z = stats.norm.ppf(1 - alpha / 2) + stats.norm.ppf(puissance) # 1.96 + 0.842
for ecart in [0.5, 1.0]:
n = (z * sigma / ecart)**2
print(ecart, n, int(np.ceil(n))) # 0.5 -> 70.6 soit 71 ; 1.0 -> 17.7 soit 18
# Version Student (sigma estimé) : un peu plus de paquets
print(tt_solve_power(effect_size=0.5 / sigma, alpha=alpha, power=puissance)) # 72.6