Testez une hypothèse
Le service marketing veut imprimer « 28 minutes d’autonomie » sur la boîte du drone. Les 10 batteries testées au chapitre 9 donnent 26,95 minutes en moyenne. Est-ce la preuve que la promesse est fausse, ou un simple aléa d’échantillonnage ? Et quand un second fournisseur propose des batteries qui tiennent en moyenne une minute de plus sur 10 essais, faut-il changer de fournisseur ?
Pour trancher ce genre de question de façon reproductible, on utilise un test statistique. Ce chapitre en présente la logique, le vocabulaire et les pièges, sur l’exemple des batteries. Le cours de Statistiques étend ensuite la démarche à d’autres tests (khi-deux, tests non paramétriques, régression).
La logique d’un test
Section intitulée « La logique d’un test »Un test confronte deux hypothèses sur la loi des données :
- l’hypothèse nulle , qui doit définir complètement la loi de la statistique utilisée, et que l’on suppose vraie jusqu’à preuve du contraire : ici, ;
- l’hypothèse alternative , souvent ce que l’on cherche à montrer : ici, (test bilatéral) ou (test unilatéral).
Le raisonnement est celui d’un procès : est « présumée innocente ». On calcule une statistique de test dont on connaît la loi sous , et l’on regarde si la valeur observée est plausible sous cette loi. Si elle est trop extrême, on rejette ; sinon, on la conserve, faute de preuves suffisantes.
Deux façons de se tromper
Section intitulée « Deux façons de se tromper »Comme la décision repose sur un échantillon aléatoire, elle peut être fausse de deux façons :
| vraie | vraie | |
|---|---|---|
| On rejette | erreur de 1re espèce (risque ) | bonne décision (puissance ) |
| On conserve | bonne décision | erreur de 2e espèce (risque ) |
- Le risque de première espèce est celui d’un « faux positif ». On le fixe à l’avance, souvent à 5 %.
- Le risque de seconde espèce est celui d’un « faux négatif ». Il n’est pas fixé : il dépend de l’écart réel entre la vérité et , et de la taille de l’échantillon.
- La puissance est la probabilité de détecter un effet qui existe vraiment.
Vous reconnaissez la matrice de confusion du test de dépistage du chapitre 2 : un test statistique est un classifieur binaire entre et , réglé pour limiter les faux positifs.
Tester une moyenne : le test de conformité
Section intitulée « Tester une moyenne : le test de conformité »La démarche pas à pas
Section intitulée « La démarche pas à pas »Si est vraie, le pivot du chapitre 9 devient une statistique entièrement calculable :
- est la valeur testée (28 minutes) ;
- est l’écart-type empirique corrigé, la taille de l’échantillon ;
- si est connu, on utilise à la place.
Au risque , la zone d’acceptation est l’intervalle où tombe avec probabilité sous : pour un test bilatéral. On rejette si la valeur observée en sort.
La p-valeur
Section intitulée « La p-valeur »Plutôt que de répondre seulement « rejet » ou « non-rejet », on donne en général la p-valeur : la probabilité, sous , d’obtenir une statistique au moins aussi extrême que celle observée. Pour un test bilatéral :
On rejette au risque si et seulement si . La p-valeur est donc aussi le plus petit risque pour lequel on rejetterait : elle permet à chacun d’appliquer son propre seuil.
Pour les batteries, . Si l’autonomie moyenne était vraiment de 28 minutes, un écart aussi grand n’arriverait qu’environ 6 fois sur 1 000 : c’est peu plausible.
autonomie <- c(26.1, 27.4, 25.8, 28.2, 26.9, 27.7, 25.5, 26.6, 28.0, 27.3)
t.test(autonomie, mu = 28) # t = -3.56, df = 9, p-value = 0.0061t.test(autonomie, mu = 28, alternative = "less") # version unilatérale : p divisée par 2
# Le même calcul à la maint_obs <- (mean(autonomie) - 28) / (sd(autonomie) / sqrt(10))2 * pt(-abs(t_obs), df = 9) # p-valeur bilatéraleLien avec l’intervalle de confiance
Section intitulée « Lien avec l’intervalle de confiance »Test et intervalle de confiance sont les deux faces d’une même médaille : on rejette au risque (en bilatéral) si et seulement si est en dehors de l’intervalle de confiance de niveau . L’intervalle du chapitre 9, , ne contient pas 28 : le rejet était prévisible. L’intervalle a l’avantage de montrer en plus l’ampleur de l’écart.
Comparer deux moyennes
Section intitulée « Comparer deux moyennes »Un second fournisseur propose ses batteries. Sur 10 essais, elles tiennent 28,0 minutes en moyenne, avec , contre 26,95 et pour le fournisseur actuel. La différence est-elle réelle ?
On teste à l’aide de la différence , que l’on standardise. Trois cas se présentent, selon ce que l’on sait des variances :
| Situation | Écart-type de | Loi sous |
|---|---|---|
| , connus | ||
| variances inconnues mais égales | , avec | |
| variances inconnues quelconques (Welch) | Student à degrés de liberté (formule de Welch-Satterthwaite) |
Dans le deuxième cas, est la variance commune estimée en regroupant les deux échantillons. Le troisième cas, le test de Welch, ne suppose pas l’égalité des variances ; c’est le choix par défaut de t.test en R, et le plus sûr en pratique.
actuel <- c(26.1, 27.4, 25.8, 28.2, 26.9, 27.7, 25.5, 26.6, 28.0, 27.3)nouveau <- c(27.9, 28.4, 27.1, 28.8, 27.6, 28.3, 27.0, 28.9, 27.8, 28.2)
t.test(actuel, nouveau) # Welch (défaut) : t = -2.93, df = 16.0, p-value = 0.0099t.test(actuel, nouveau, var.equal = TRUE) # variances supposées égales : df = 18, p-value = 0.0090Les tests sur les moyennes supposent des données normales, mais ils restent approximativement valables sans normalité quand les effectifs dépassent une trentaine, grâce au théorème central limite. Avec 10 mesures par groupe, comme ici, il faut que l’hypothèse de normalité soit plausible (un histogramme ou un diagramme quantile-quantile, qqnorm, aide à en juger).
La puissance : combien de mesures faut-il ?
Section intitulée « La puissance : combien de mesures faut-il ? »Fixer ne dit rien de la capacité du test à détecter un effet réel. Supposons l’écart-type connu, minute, et un test bilatéral de au risque 5 % avec batteries. Si la vraie moyenne est (un écart ), la statistique est centrée non plus sur 0, mais sur (la vraie moyenne est en dessous de 28). Le test étant bilatéral, seule la distance à 0 compte : le calcul est le même qu’avec . La puissance est la probabilité qu’elle sorte de :
où . Pour un écart plus faible, , la puissance tombe à 0,35 : le test passera à côté de l’effet près de deux fois sur trois.
La puissance augmente avec l’écart réel , avec la taille d’échantillon , quand la dispersion diminue, et quand augmente (on accepte plus de faux positifs pour moins de faux négatifs). Dans une comparaison de deux groupes à effectif total fixé, elle est maximale quand les deux groupes ont la même taille. En pratique, on dimensionne l’étude avant de collecter les données :
# Nombre de batteries pour détecter un écart de 0.5 minute avec 80 % de puissancepower.t.test(delta = 0.5, sd = 1, sig.level = 0.05, power = 0.80, type = "one.sample")# n = 33.4 environ : il faut 34 batteries (l'approximation normale donne 32)En résumé
Section intitulée « En résumé »- Un test oppose (loi connue, présumée vraie) à ; on rejette si la statistique observée est trop extrême sous .
- Le risque de 1re espèce (faux positif) est fixé ; le risque de 2e espèce (faux négatif) dépend de l’effet réel et de ; la puissance vaut .
- La p-valeur est la probabilité, sous , d’un résultat au moins aussi extrême ; on rejette si . Ce n’est pas .
- Conformité d’une moyenne : si est connu, sinon ; rejeter au risque équivaut à hors de l’intervalle de confiance à .
- Deux moyennes : test , test de Student à variances égales, ou test de Welch (défaut de
t.test). - On dimensionne une étude par un calcul de puissance (
power.t.test) ; « non significatif » ne prouve pas l’absence d’effet.
Exercices
Section intitulée « Exercices »Exercice · Un test avec écart-type connu
facileUne machine est réglée pour remplir des bouteilles à 500 mL, avec un écart-type connu de 6 mL. On contrôle 36 bouteilles : la moyenne vaut 498,2 mL. Au risque 5 %, la machine est-elle déréglée ? Donnez la p-valeur.
Voir la solution
contre . Sous , . La valeur observée est .
Elle reste dans la zone d’acceptation : on conserve . La p-valeur vaut , supérieure à 0,05.
Attention à la conclusion : on ne prouve pas que la machine est bien réglée, on constate seulement que 36 bouteilles ne suffisent pas à démontrer un dérèglement de cet ordre. En R : 2 * pnorm(-1.8).
En code
import numpy as npfrom scipy import stats
mu0, sigma, n, moyenne = 500, 6, 36, 498.2z = (moyenne - mu0) / (sigma / np.sqrt(n))p_valeur = 2 * stats.norm.sf(abs(z)) # bilatéral
print(z) # -1.8print(p_valeur) # 0.0719print(abs(z) > stats.norm.ppf(0.975)) # False : on conserve H0mu0 <- 500; sigma <- 6; n <- 36; moyenne <- 498.2z <- (moyenne - mu0) / (sigma / sqrt(n))p_valeur <- 2 * pnorm(-abs(z)) # bilatéral
z # -1.8p_valeur # 0.0719abs(z) > qnorm(0.975) # FALSE : on conserve H0Exercice · Un A/B test non significatif
moyenUn site teste deux versions de sa page d’accueil sur 1 000 visiteurs chacune. La version A convertit 50 visiteurs, la version B en convertit 70. Sous (même taux de conversion ), on estime par la proportion globale , et la statistique
suit approximativement .
- Calculez et la p-valeur bilatérale. Que concluez-vous au risque 5 % ?
- Le responsable produit en déduit que « la version B ne fait pas mieux ». Qu’en pensez-vous ?
Voir la solution
- . Le dénominateur vaut , donc et . Au risque 5 %, on ne rejette pas . En R,
prop.test(c(70, 50), c(1000, 1000), correct = FALSE)donne la même p-valeur (sa statistique du khi-deux vaut ). - C’est une erreur d’interprétation. Le test n’a pas montré l’absence d’effet : il a manqué de puissance. L’effet observé (+2 points, soit +40 % de conversions) serait considérable s’il était réel. Il faut soit prolonger le test pour augmenter , soit présenter l’intervalle de confiance de la différence, qui contient à la fois 0 et des gains importants.
En code
import numpy as npfrom scipy import statsfrom statsmodels.stats.proportion import proportions_ztest
conv = np.array([70, 50]) # conversions B puis An = np.array([1000, 1000])p_b, p_a = conv / np_global = conv.sum() / n.sum() # 0.06 sous H0
z = (p_b - p_a) / np.sqrt(p_global * (1 - p_global) * (1 / n[0] + 1 / n[1]))print(z, 2 * stats.norm.sf(abs(z))) # 1.883 0.0597print(proportions_ztest(conv, n)) # même z et même p-valeur
# IC de Wald à 95 % de la différence : il contient 0 et des gains importantsecart = np.sqrt(p_b * (1 - p_b) / n[0] + p_a * (1 - p_a) / n[1])print(p_b - p_a + np.array([-1, 1]) * 1.96 * ecart) # [-0.0008 0.0408]conv <- c(70, 50) # conversions B puis An <- c(1000, 1000)p <- conv / np_global <- sum(conv) / sum(n) # 0.06 sous H0
z <- (p[1] - p[2]) / sqrt(p_global * (1 - p_global) * (1 / n[1] + 1 / n[2]))c(z, 2 * pnorm(-abs(z))) # 1.883 0.0597
test <- prop.test(conv, n, correct = FALSE)test$statistic; test$p.value # X-squared = 3.55 (= z^2), p = 0.0597test$conf.int # -0.0008 0.0408 : contient 0 et des gains importantsExercice · Dimensionner une comparaison
difficileOn veut comparer deux fournisseurs de batteries dont l’autonomie a un écart-type commun connu minute. On utilisera un test bilatéral au risque 5 %, avec batteries par fournisseur.
- Montrez que, si la vraie différence des moyennes est , la puissance vaut approximativement (on néglige la probabilité de rejeter du « mauvais côté »).
- Quelle valeur de faut-il pour détecter minute avec une puissance de 80 % ?
- Pourquoi est-il préférable de prendre 50 batteries de chaque fournisseur plutôt que 20 d’un côté et 80 de l’autre ?
Voir la solution
- L’écart-type de vaut . Sous , suit . On rejette si ; du côté de l’effet, , où . L’autre côté est négligeable dès que l’effet n’est pas minuscule.
- On veut , soit (quantile d’ordre 0,8). Donc , soit : il faut 63 batteries par fournisseur, 126 au total.
- Avec des groupes de tailles et , . Pour : ; pour : . À effectif total égal, les groupes équilibrés donnent la plus petite variance de , donc la plus grande puissance.
En code
import numpy as npfrom scipy import stats
def puissance(n, delta=0.5, sigma=1.0, alpha=0.05): """Puissance approchée du test Z bilatéral, n batteries par fournisseur.""" sigma_d = sigma * np.sqrt(2 / n) return stats.norm.cdf(delta / sigma_d - stats.norm.ppf(1 - alpha / 2))
# 2. n tel que la puissance vaille 80 %u, v = stats.norm.ppf(0.975), stats.norm.ppf(0.80) # 1.96 0.842n_exact = 2 * ((u + v) * 1.0 / 0.5) ** 2print(n_exact, puissance(62), puissance(63)) # 62.79 0.7950 0.8013
# 3. Variance de D (en unités de sigma^2) selon la répartition de 100 batteriesfor n1, n2 in [(50, 50), (20, 80)]: print(n1, n2, 1 / n1 + 1 / n2) # 0.04 puis 0.0625puissance <- function(n, delta = 0.5, sigma = 1, alpha = 0.05) { # Puissance approchée du test Z bilatéral, n batteries par fournisseur sigma_d <- sigma * sqrt(2 / n) pnorm(delta / sigma_d - qnorm(1 - alpha / 2))}
# 2. n tel que la puissance vaille 80 %n_exact <- 2 * ((qnorm(0.975) + qnorm(0.80)) * 1 / 0.5)^2c(n_exact, puissance(62), puissance(63)) # 62.79 0.7950 0.8013# power.t.test (loi de Student, sd estimé) donne un résultat voisinpower.t.test(delta = 0.5, sd = 1, power = 0.80)$n # 63.77, soit 64 par groupe
# 3. Variance de D (en unités de sigma^2) selon la répartition de 100 batteriesc(1/50 + 1/50, 1/20 + 1/80) # 0.04 0.0625