Leçon 4 sur 8
Unité · Ce que le plan achète
L'effet de plan, et celui qui est sorti sous un
La mise en grappes coûte de la précision, la stratification en rachète, et l'effet de plan est le solde. 1,60 pour l'insécurité alimentaire et 0,91 pour l'accès à l'eau, sur les mêmes 996 entretiens.
Ce que c’est
L’effet de plan est un rapport.
deff = variance under this design / variance under simple random sampling
Un effet de plan de 2 signifie que votre estimation est aussi précise que l’aurait été un sondage aléatoire simple de moitié moindre. Il convertit un échantillon de 996 en taille d’échantillon effective — le nombre d’observations indépendantes que votre enquête vaut réellement.
effective n = n / deff
C’est cette seconde quantité qu’il faut mettre dans un rapport. « 996 ménages, échantillon effectif 623 » en dit plus que chacun des deux nombres, et c’est la réponse honnête à « quelle était la taille de votre enquête ».
Pourquoi les grappes vous coûtent
Les ménages d’une même zone de dénombrement se ressemblent. Ils partagent un point d’eau, un marché, une route, une récolte. Le deuxième ménage interrogé dans une zone vous apprend donc moins que le premier, et le quatorzième très peu.
La mesure de cette ressemblance est la corrélation intra-grappe, et elle se traduit directement en pénalité.
deff_clustering = 1 + (m - 1) * ICC
avec m le nombre d’entretiens par grappe.
import pandas as pd
by_area = (
survey.assign(insecure=survey["food_insecure"] == "true")
.groupby("ea_id")["insecure"]
.agg(["mean", "size"])
)
p = (survey["food_insecure"] == "true").mean()
m = by_area["size"].mean()
between = by_area["mean"].var(ddof=0)
icc = (between - p * (1 - p) / m) / (p * (1 - p))
print(f"mean cluster size {m:.1f}, ICC {icc:.3f}, "
f"clustering deff {1 + (m - 1) * icc:.2f}")
by_area <- survey |>
summarise(rate = mean(food_insecure == "true"), n = n(), .by = ea_id)
p <- mean(survey$food_insecure == "true")
m <- mean(by_area$n)
icc <- (var(by_area$rate) * (nrow(by_area) - 1) / nrow(by_area) -
p * (1 - p) / m) / (p * (1 - p))
c(m = m, icc = icc, deff = 1 + (m - 1) * icc)
Sur cette enquête — 13,3 entretiens par zone, ICC de 0,11, effet de plan dû aux grappes d’environ 2,4.
Deux choses à retenir sur l’ICC.
- C’est une propriété du résultat, pas de l’enquête. La source d’eau est très regroupée — un village a un forage ou n’en a pas. La taille du ménage l’est à peine. Un effet de plan par résultat, toujours.
- Les valeurs publiées sont la meilleure estimation disponible. Les rapports EDS et SMART publient des effets de plan, et employer celui du tour précédent pour le même indicateur au même endroit vaut infiniment mieux que supposer 1.
Pourquoi la stratification en rachète
La stratification fait l’inverse. En forçant l’échantillon à couvrir chaque strate, elle supprime la possibilité d’un échantillon tombé surtout dans une seule — et cette possibilité fait partie de la variance d’un sondage aléatoire simple.
Le gain est grand exactement quand les strates diffèrent beaucoup sur le résultat. L’accès à une source améliorée va de 88 % en urbain à 41 % en rural reculé, et la stratification garantit que ces strates sont représentées en proportions fixes plutôt qu’au hasard.
Le solde, mesuré
Les deux forces tirent en sens inverse, donc calculez l’effet de plan sur les données plutôt que de raisonner dessus. Estimez la variance sous le plan réel et divisez par ce qu’aurait donné un sondage aléatoire simple.
import numpy as np
def design_effect(df, outcome, weight="weight"):
p = np.average(df[outcome] == "true", weights=df[weight])
total_w = df[weight].sum()
variance = 0.0
for _, stratum in df.groupby("stratum"):
areas = stratum.groupby("ea_id").apply(
lambda g: (g[weight] * ((g[outcome] == "true") - p)).sum()
)
n = len(areas)
if n < 2:
continue
variance += n / (n - 1) * ((areas - areas.mean()) ** 2).sum()
variance /= total_w**2
srs = p * (1 - p) / len(df)
return p, np.sqrt(variance), variance / srs
for outcome in ["food_insecure", "improved_water_source"]:
p, se, deff = design_effect(survey, outcome)
print(f"{outcome:24} p={p:.1%} se={se:.4f} deff={deff:.2f} "
f"n_eff={len(survey) / deff:.0f}")
library(survey)
design <- svydesign(ids = ~ea_id, strata = ~stratum, weights = ~weight,
data = survey, nest = TRUE)
svymean(~I(food_insecure == "true"), design, deff = TRUE)
svymean(~I(improved_water_source == "true"), design, deff = TRUE)
| Résultat | Estimation | Effet de plan | n effectif |
|---|---|---|---|
| Insécurité alimentaire | 29,1 % | 1,60 | 623 |
| Source d’eau améliorée | 69,8 % | 0,91 | 1 098 |
Celui qui est sous un
Relisez la deuxième ligne. Un effet de plan de 0,91 signifie que l’enquête est plus précise qu’un sondage aléatoire simple de même taille.
Ce n’est pas une erreur, et c’est le résultat le plus utile de cette leçon. L’accès à l’eau diffère énormément entre strates — 88 %, 62 %, 41 % — et la stratification garantit que les trois entrent dans l’estimation en proportions fixes. La variance qu’un sondage aléatoire simple porte du fait de ne pas savoir combien de ménages urbains il attrapera est entièrement supprimée, et ce gain l’emporte sur la perte due aux grappes.
L’insécurité alimentaire diffère aussi entre strates, mais sa corrélation intra-zone est plus forte, si bien que les grappes l’emportent et le solde vaut 1,60.
« Effet de plan » n’est donc pas synonyme de « pénalité ». C’est le solde de deux forces opposées, et laquelle l’emporte dépend du résultat. Un rapport d’enquête citant un effet de plan unique pour toute l’enquête a moyenné ce qui ne doit pas l’être.
Remarquez aussi que le chiffre calculé plus haut pour les seules grappes valait 2,4, et que l’effet de plan complet du même résultat vaut 1,60. La différence est ce qu’a acheté la stratification, et cela mérite d’être rapporté quand vous défendez un plan de sondage.
D’où viennent les effets de plan quand vous n’en avez pas
Il vous en faut un avant que l’enquête existe, et il n’y a pas encore de données. Par ordre de préférence.
- Le tour précédent de la même enquête, même indicateur, même zone. Presque toujours disponible et presque toujours ignoré.
- Un rapport d’enquête publié pour le même indicateur dans un contexte comparable. Les rapports EDS tabulent les effets de plan ; les rapports de plausibilité SMART les énoncent.
- Une convention. Les enquêtes SMART supposent couramment 1,5 pour l’anthropométrie ; les évaluations humanitaires emploient souvent 2,0 pour les résultats au niveau ménage.
- 1,0 n’est jamais une hypothèse défendable pour une enquête en grappes, et un protocole qui l’emploie a sous-dimensionné l’enquête de moitié.
Rapportez-le
summary = pd.DataFrame({
"outcome": ["Food insecure", "Improved water source"],
"estimate": ["29.1%", "69.8%"],
"ci_95": ["25.5-32.7%", "67.0-72.5%"],
"deff": [1.60, 0.91],
"n": [996, 996],
"n_effective": [623, 1098],
})
tibble::tribble(
~outcome, ~estimate, ~deff, ~n_effective,
"Food insecure", "29.1%", 1.60, 623,
"Improved water source", "69.8%", 0.91, 1098
)
Cinq colonnes, une ligne par indicateur, et cela a sa place en annexe de tout rapport d’enquête. Cela permet à un lecteur de juger l’estimation, de la comparer à une autre enquête et de dimensionner le tour suivant — trois choses impossibles à partir du seul pourcentage.
La suite
Vous avez un effet de plan, donc une erreur type, donc de quoi cesser de calculer
tout cela à la main. La leçon suivante déclare le plan une fois au logiciel et
laisse chaque estimation en hériter — survey sous R, et l’arithmétique
équivalente en Python.