cassionAnalyse de données

Leçon 6 sur 8

Unité · Estimer correctement

Les ménages que vous n'avez pas eus

Cinquante-quatre entretiens manquants concentrés dans la strate la moins semblable aux autres, deux grappes de remplacement qui changent une probabilité que personne ne recalcule, et l'hypothèse sur laquelle repose tout ajustement.

PythonR120 minEnquête démographique et de santé (EDS)Enquête par grappes à indicateurs multiples (MICS)Enquête SMARTNorme humanitaire fondamentale (CHS)

La non-réponse n’est pas une donnée manquante

Une valeur manquante est une question sans réponse. La non-réponse est un ménage tiré et jamais enquêté, et la différence compte car la non-réponse ne laisse aucune ligne — le cas le plus difficile du cours de nettoyage, dans un décor où la base de sondage dit exactement combien de lignes devraient s’y trouver.

selected = frame[frame["selected"] == True]

response = selected.groupby("stratum").agg(
    selected=("households_selected", "sum"),
    interviewed=("households_interviewed", "sum"),
)
response["rate"] = response["interviewed"] / response["selected"]
print(response)
frame |>
  filter(selected) |>
  summarise(selected = sum(households_selected),
            interviewed = sum(households_interviewed), .by = stratum) |>
  mutate(rate = interviewed / selected)
Strate Tirés Enquêtés Réponse
Urbain 350 316 90,3 %
Rural accessible 350 337 96,3 %
Rural reculé 350 343 98,0 %

996 sur 1 050. Un taux de réponse global de 95 % se lit comme excellent, et le fait utile n’est pas la moyenne — c’est que le déficit se concentre en zone urbaine, qui est aussi la moins touchée par l’insécurité alimentaire, de vingt points.

Une analyse non ajustée sous-représente donc exactement la strate qui tirerait l’estimation vers le bas. Le sens du biais se déduit de ce seul tableau, avant toute modélisation.

L’ajustement, et l’hypothèse qui le porte

L’ajustement de la leçon 2 gonfle la pondération de chaque ménage répondant pour qu’il porte les non-répondants de sa propre zone.

survey["nr_adjustment"] = 14 / survey["ea_id"].map(
    selected.set_index("ea_id")["households_interviewed"]
)
print(survey.groupby("stratum")["nr_adjustment"].mean().round(3))
survey |> summarise(mean_adjustment = mean(14 / households_interviewed), .by = stratum)

L’hypothèse est que les non-répondants ressemblent aux répondants de la même zone. Elle n’est pas gratuite et n’est pas testable depuis l’enquête, donc elle a sa place dans la section des limites, en toutes lettres.

La non-réponse a été ajustée à l’intérieur de chaque zone de dénombrement. La réponse urbaine était de 90,3 % contre 96 à 98 % en rural. Si les non-répondants urbains sont systématiquement mieux lotis que les répondants urbains — les concessions fermées et l’absence en journée le suggèrent — l’estimation ajustée reste légèrement trop élevée.

Remarquez ce que fait ce paragraphe. Il nomme le sens du biais résiduel après ajustement, ce qui est le maximum qu’une enquête puisse honnêtement offrir.

Ajustez au bon niveau

Trois niveaux sont possibles et ils ne se valent pas.

  • Dans la zone. Ce que fait cette enquête. Le meilleur quand la réponse varie entre zones, ce qui est toujours le cas.
  • Dans la strate. Plus grossier, et cela jette l’information selon laquelle une zone a eu quatre refus et sa voisine aucun.
  • Dans une classe de réponse. Regroupez les zones selon un facteur prédictif de la réponse — densité urbaine, jour de marché, sécurité — et ajustez dans le groupe. Meilleur que la strate quand les zones sont petites, car une zone à trois entretiens donne un facteur d’ajustement instable.

Ce dernier point compte ici — une zone à très peu d’entretiens aboutis reçoit un gros ajustement issu d’un petit dénominateur, et une seule zone de ce type peut déplacer l’estimation d’une strate. Vérifiez.

weights_by_area = survey.groupby("ea_id")["weight"].first().sort_values()
print(weights_by_area.tail(3))
print(f"largest weight / smallest: {weights_by_area.max() / weights_by_area.min():.1f}x")
survey |>
  summarise(weight = first(weight), n = n(), .by = ea_id) |>
  arrange(desc(weight)) |>
  head(3)

Écrêtez ou signalez toute pondération très éloignée des autres. Une pondération valant trois fois la base de sa strate est une zone faisant le travail de trois, et elle gonfle la variance sans ajouter d’information. L’écrêtage est un jugement assorti d’un coût — il introduit un léger biais pour retirer une grande variance — et comme tout jugement de ce cours il s’écrit avec son seuil.

Les grappes de remplacement

Deux zones du rural reculé n’ont pas pu être atteintes et ont été remplacées. La base l’enregistre.

replacements = frame[frame["replacement_for"].notna()]
print(replacements[["ea_id", "stratum", "households", "replacement_for"]])
frame |> filter(!is.na(replacement_for)) |>
  select(ea_id, stratum, households, replacement_for)

C’est là qu’un plan cesse discrètement d’être celui qui a été documenté, et il existe deux traitements défendables.

Traiter le remplacement comme l’original. Le choix pragmatique, et ce que fait presque tout le monde. Cela suppose que la zone de remplacement est échangeable avec celle qu’elle remplace — raisonnable si le remplacement était aléatoire dans la strate, ce que le protocole devrait dire et ne dit souvent pas.

Traiter l’original comme une non-réponse au niveau de la grappe. Plus honnête et plus difficile : la strate compte en réalité 23 grappes répondantes et non 25, et ses pondérations se gonflent en conséquence.

remote_areas = (frame["stratum"] == "rural-remote") & (frame["selected"] == True)
responding = int(remote_areas.sum()) - len(replacements)
print(f"25 selected, {responding} reached, cluster-level adjustment "
      f"{25 / responding:.3f}")
c(selected = 25, reached = 23, adjustment = 25 / 23)

L’écart sur cette enquête est faible. La raison de le faire explicitement n’est pas l’ampleur de la correction, c’est que les zones inaccessibles ne forment jamais un sous-ensemble aléatoire. Une zone qu’on ne peut pas atteindre en février est reculée, ou peu sûre, ou inondée, et ce sont précisément les conditions associées aux résultats mesurés. La remplacer par une zone accessible retire systématiquement les pires cas.

Signalez le remplacement même si vous le traitez comme échangeable. « Deux des 25 grappes du rural reculé ont été remplacées pour cause d’inaccessibilité ; les deux remplaçantes étaient accessibles, de sorte que l’estimation du rural reculé est probablement conservatrice » est une phrase dont le lecteur a besoin et qu’il ne peut pas reconstituer.

Les taux de réponse ont leur place dans le rapport

report = response.reset_index()
report["non_response_bias_risk"] = ["high", "low", "low"]
report["adjustment"] = "within enumeration area"
print(report)
tibble::tribble(
  ~stratum,            ~selected, ~interviewed, ~rate,  ~risk,
  "urban",                   350,          316, 0.903, "high",
  "rural-accessible",        350,          337, 0.963, "low",
  "rural-remote",            350,          343, 0.980, "low"
)

Quatre colonnes et une appréciation du risque. Un rapport d’enquête qui donne un taux de réponse global unique a caché la seule chose de la non-réponse qui affecte l’estimation — l’endroit où elle est tombée.

Quand la réponse est assez mauvaise pour s’arrêter

Il n’existe pas de seuil universel, et la recommandation honnête est comparative plutôt qu’absolue.

  • Au-dessus de 90 % — ajustez et rapportez. Le biais résiduel est en général faible devant l’erreur d’échantillonnage.
  • De 80 à 90 % — ajustez, rapportez, et décrivez le sens probable du biais résiduel. Ne comparez pas à un tour précédent au taux de réponse très différent sans le dire.
  • En dessous de 80 % — l’ajustement porte trop de charge. Rapportez l’estimation avec une réserve bien visible, ou rapportez par strate là où la réponse était suffisante.
  • En dessous de 60 % dans une strate — l’estimation de cette strate n’est pas utilisable, et le dire est le constat correct.

La comparaison la plus importante est celle avec le tour précédent. Une estimation qui a bougé de cinq points entre deux tours, alors que la réponse a bougé de quinze, a une explication alternative évidente qu’il faut traiter avant toute explication programmatique.

La suite

Vous avez une estimation, un plan et un compte rendu honnête de ce qui lui manque. La leçon suivante en fait ce qui se publie — un intervalle, de la bonne forme, avec le bon nombre de décimales, et la phrase qui l’entoure.

Animer cette leçon

La leçon en diaporama, la prose étant reléguée dans les notes du présentateur plutôt que projetée. Produit à partir de cette page, dont il ne peut donc pas s'écarter.

Lancer le diaporamaLire les diapositives

Le PDF ne requiert aucun logiciel et se projette depuis n'importe quel poste. Le fichier PowerPoint est fait pour être modifié : appliquez la charte de votre organisation, retirez une section pour une séance plus courte, ou fusionnez deux leçons en atelier.