Leçon 2 sur 8
Unité · Regardez-la d'abord
Une proportion de zéro avec un intervalle jusqu'à 24 %
Douze enfants, aucun en retard d'âge. L'intervalle du manuel dit 0 % à 0 %. Le bon dit 0 % à 24,3 %, et l'écart entre ces deux réponses décide si vous agiriez sur cette cellule.
Pourquoi une estimation ponctuelle n’est pas un résultat
Chaque proportion du module 4 a été calculée sur un échantillon — de ménages, de cas, d’élèves. Un autre échantillon de la même population aurait produit un nombre différent, et un intervalle de confiance dit de combien.
import pandas as pd
import numpy as np
wash = pd.read_csv("wash-household-survey-2024.v1.csv")
open_defecation = wash["sanitation_facility"].eq("open-defecation")
k, n = open_defecation.sum(), len(wash)
print(f"{k}/{n} = {k / n:.1%}")
library(dplyr)
wash |> summarise(k = sum(sanitation_facility == "open-defecation"), n = n())
319 sur 2 403 — 13,3 %. L’intervalle là-dessus est étroit, parce que l’échantillon est grand. Sur des cellules plus petites il ne l’est pas, et tout l’intérêt de le calculer est qu’on ne peut pas savoir dans quel cas on se trouve en regardant le pourcentage.
Wilson, non Wald
La formule que la plupart des gens apprennent est l’intervalle de Wald :
p ± 1,96 × sqrt(p(1-p)/n). Elle est simple, c’est celle qu’un manuel montre en
premier, et elle échoue précisément là où vous en avez besoin.
def wald(k, n, z=1.96):
p = k / n
se = np.sqrt(p * (1 - p) / n)
return p - z * se, p + z * se
def wilson(k, n, z=1.96):
p = k / n
denom = 1 + z**2 / n
centre = (p + z**2 / (2 * n)) / denom
half = z * np.sqrt(p * (1 - p) / n + z**2 / (4 * n**2)) / denom
return centre - half, centre + half
for k, n in [(0, 12), (1, 20), (3, 11)]:
print(f"{k}/{n} = {k/n:.1%}")
print(f" Wald [{wald(k, n)[0]:.1%}, {wald(k, n)[1]:.1%}]")
print(f" Wilson [{wilson(k, n)[0]:.1%}, {wilson(k, n)[1]:.1%}]")
# R has this built in and it is the Wilson interval by default.
prop.test(0, 12)$conf.int
binom.test(1, 20)$conf.int
| Cellule | Wald | Wilson |
|---|---|---|
| 0 sur 12 | [0,0 %, 0,0 %] | [0,0 %, 24,3 %] |
| 1 sur 20 | [−4,6 %, 14,6 %] | [0,9 %, 23,6 %] |
| 3 sur 11 | [1,0 %, 53,6 %] | [9,7 %, 56,6 %] |
Wald affirme qu’une cellule sans événement n’a aucune incertitude, et il produit des probabilités négatives. Les deux sont absurdes et les deux apparaissent dans de vrais rapports, parce que c’est la formule dont on se souvient.
Employez Wilson, ou prop.test en R et
statsmodels.stats.proportion.proportion_confint(method="wilson") en Python. Cela
ne coûte rien et cela ne casse pas aux bornes.
Lisez la largeur, pas seulement les bornes
cases = [
("Open defecation", 319, 2403),
("Cholera case fatality", 38, 974),
("Cholera CFR, Nord district", 24, 381),
("Referral completion, disability reported", 54, 202),
("Over-age, grade 6", 67, 132),
]
for name, k, n in cases:
lo, hi = wilson(k, n)
print(f"{name:42} {k/n:6.1%} [{lo:.1%}, {hi:.1%}] width {hi-lo:.1%}")
# Same five, and the width is the column to read.
| Estimation | Valeur | Intervalle à 95 % | Largeur |
|---|---|---|---|
| Défécation à l’air libre | 13,3 % | 12,0–14,7 % | 2,7 pts |
| Létalité du choléra | 3,9 % | 2,9–5,3 % | 2,5 pts |
| Létalité, district Nord | 6,3 % | 4,3–9,2 % | 4,9 pts |
| Aboutissement, handicap signalé | 26,7 % | 21,1–33,2 % | 12,1 pts |
| Retard d’âge, sixième année | 50,8 % | 42,3–59,1 % | 16,8 pts |
Le retard d’âge en sixième vaut 50,8 % et pourrait se situer entre 42 % et 59 %. Le cours d’éducation a rapporté ce nombre à une décimale près. La décimale n’est pas fausse, elle est simplement sans objet — le second chiffre de 50,8 ne porte aucune information à n=132.
Deux choses gouvernent la largeur et une seule dépend de vous. La taille d’échantillon, décidée par le plan ; et la proximité de la proportion à 50 %, décidée par le monde. Une proportion proche de 50 % a l’intervalle le plus large possible, et les 6,3 % de Nord sont plus serrés que les 50,8 % de sixième malgré un n plus grand.
L’écrire dans une phrase
C’est ce sur quoi porte l’ossature de ce cours, et c’est un problème de rédaction autant que de statistique.
Pas ceci : « 50,8 % des élèves de sixième sont en retard d’âge. »
Ni ceci : « 50,8 % (IC à 95 % 42,3–59,1) des élèves de sixième sont en retard d’âge. » Correct, et un lecteur saute la parenthèse.
Ceci : « Entre quatre et six élèves de sixième sur dix sont en retard d’âge (50,8 %, IC à 95 % 42,3–59,1, n=132). »
Mettez l’intervalle en mots d’abord, puis donnez les nombres. Les mots sont ce que lit un non-analyste et ils portent l’incertitude ; les nombres sont ce que vérifie un analyste.
def sentence(label, k, n):
lo, hi = wilson(k, n)
return (f"{label}: {k/n:.1%} (95% CI {lo:.1%} to {hi:.1%}, n={n})")
print(sentence("Grade 6 over-age", 67, 132))
# Generate the string in code so the number and its interval cannot drift apart.
Quand l’intervalle change la décision
Le test de l’utilité d’un intervalle est de savoir si une valeur quelconque qu’il contient mènerait ailleurs.
lo, hi = wilson(38, 974)
threshold = 0.01 # Sphere: cholera CFR below 1%
print(f"CFR {38/974:.1%}, interval [{lo:.1%}, {hi:.1%}]")
print(f"entire interval above the {threshold:.0%} threshold: {lo > threshold}")
prop.test(38, 974)$conf.int
La létalité du choléra vaut 3,9 % avec un intervalle de 2,9 % à 5,3 %, et le seuil Sphère vaut 1 %. Toute valeur de l’intervalle est au-dessus du seuil, si bien que la conclusion — cette réponse échoue au standard — ne dépend pas de l’endroit où se situe la vérité dans l’intervalle.
C’est là qu’on peut agir sur une estimation ponctuelle : quand tout l’intervalle dit la même chose. Là où il enjambe le seuil, le rapport honnête dit que les données ne tranchent pas, et la leçon suivante porte sur un écart où c’est exactement ce qui se produit.
Trois intervalles que ce cours ne calculera pas ainsi
Une proportion issue d’un échantillon en grappes. Le cours sur les enquêtes a établi qu’un plan en grappes élargit l’intervalle du facteur d’effet de plan, et la formule ci-dessus suppose un tirage aléatoire simple. L’appliquer à des données en grappes sous-estime la largeur, parfois d’un facteur deux.
Une médiane ou une moyenne asymétrique. Les intervalles présentés ici sont pour des proportions. Une médiane exige un bootstrap ou une méthode de rangs, et une moyenne sur la distribution d’E. coli de la leçon 1 n’a besoin ni de l’un ni de l’autre — elle a besoin d’un autre résumé.
Un effectif sans dénominateur. « 142 cas ont été signalés » n’a pas d’intervalle, car ce n’est l’estimation de rien. C’est un décompte de ce qui a été enregistré, et le cours de protection a consacré une leçon à pourquoi.
Rapportez-le comme une fourchette
Over-age enrolment, grade 6
50.8% 95% CI 42.3 to 59.1, n = 132
Between four and six students in ten. The interval is wide because grade 6
holds 132 students; a difference of five points against another grade would
not be distinguishable at this sample size.
La dernière phrase est la plus utile. Elle dit d’avance au lecteur quelles comparaisons ce nombre peut porter, ce qui l’empêche de faire celle qu’il ne peut pas.
La suite
Un intervalle dit à quel point un nombre est incertain. La leçon suivante place deux nombres côte à côte et demande si l’écart entre eux est réel — sur deux écarts laissés ouverts par le module 4, dont les réponses sont opposées.