Leçon 6 sur 8
Unité · Repérer les sites qui méritent une visite
Ce que dit le dernier chiffre
Préférence de chiffres, attraction des valeurs rondes, et l'étalonnage qui sépare un constat du bruit. Les tailles d'une équipe se terminent par ,0 ou ,5 dans soixante-neuf pour cent des cas ; la formation la plus suspecte du district se révèle être du hasard.
Les mesures ont une texture
Un nombre produit par la lecture d’un instrument a une texture particulière — son dernier chiffre est quasi uniforme, car la valeur vraie a autant de chances de tomber n’importe où dans la plus petite division de l’échelle.
Un nombre produit par estimation, arrondi ou souvenir a une autre texture. Il se regroupe sur les cinq et les zéros, sur les années entières, sur les multiples de dix. Ce regroupement est la préférence de chiffres, et il se mesure sans se déplacer.
C’est l’outil principal de la dimension d’intégrité, et cette leçon consacre autant de temps à ce qu’il ne peut pas montrer qu’à ce qu’il montre.
Le contrôle
import pandas as pd
smart = pd.read_csv("smart-nutrition-survey-2024.v1.csv")
smart["terminal"] = (smart["height_cm"] * 10).round() % 10
by_team = (
smart.assign(rounded=smart["terminal"].isin([0, 5]))
.groupby("team")
.agg(rounded_share=("rounded", "mean"), n=("rounded", "size"))
)
print((by_team["rounded_share"] * 100).round(0))
library(dplyr)
smart |>
mutate(terminal = round(height_cm * 10) %% 10,
rounded = terminal %in% c(0, 5)) |>
summarise(rounded_share = mean(rounded), n = n(), .by = team)
| Équipe | Tailles finissant par ,0 ou ,5 | Enfants mesurés |
|---|---|---|
| 1 | 18 % | 217 |
| 2 | 69 % | 248 |
| 3 | 18 % | 248 |
| 4 | 23 % | 217 |
Deux chiffres terminaux possibles sur dix font 20 % en l’absence de préférence. Les équipes 1, 3 et 4 sont à 18 %, 18 % et 23 % — ce à quoi ressemble une mesure. L’équipe 2 est à 69 %.
Ce n’est pas un résultat marginal et cela n’exige aucun test. Rien dans une population ne fait tomber les tailles des enfants d’une équipe sur des demi-centimètres trois fois et demie plus souvent que celles de tout le monde. C’est la façon dont l’équipe a lu la toise — arrondir au demi-centimètre le plus proche au lieu de lire le millimètre.
L’attraction des âges, et pourquoi ce n’est la faute de personne
Le même phénomène sur les âges, où il est quasi universel dans ce secteur.
ages = smart["age_months"].dropna()
whole_years = (ages % 12 == 0).mean()
print(f"{whole_years:.0%} of ages fall on an exact multiple of 12 months")
print(ages.value_counts().reindex([22, 23, 24, 25, 26]))
smart |>
filter(!is.na(age_months)) |>
summarise(whole_years = mean(age_months %% 12 == 0))
smart |> count(age_months) |> filter(age_months %in% 22:26)
| Âge en mois | 22 | 23 | 24 | 25 | 26 |
|---|---|---|---|---|---|
| Enfants | 21 | 15 | 66 | 19 | 17 |
Soixante-six enfants à exactement vingt-quatre mois contre quinze et dix-neuf de part et d’autre, et quatre-vingts à trente-six contre vingt-huit et dix-sept. Sur l’ensemble de l’enquête, 24 % des âges tombent sur une année entière exacte, contre environ 9 % attendus si les âges étaient répartis uniformément.
Cela compte pour une raison précise et concrète, non par curiosité. Les normes de croissance de l’OMS changent de table de référence à 24 mois, et les groupes d’âge SMART sont bornés aux multiples de 12 mois — l’attraction dépose donc un gros paquet d’enfants exactement sur les bornes où la classification change.
Et la cause n’est presque jamais la négligence. Les actes de naissance ne sont pas universels ; une accompagnante à qui l’on demande l’âge d’un enfant répondra « deux ans » ; un calendrier d’événements locaux aide mais a ses limites. Consignez-le comme un constat sur la méthode de détermination de l’âge, avec une action corrective portant sur les calendriers et le questionnement, non comme une erreur d’enquêteur.
Étalonnez sur ce que produit le hasard
Vient maintenant ce qui sépare un contrôle exploitable d’une machine à accuser. Exécutez le contrôle des nombres ronds sur l’extraction vaccinale.
reported = vax[vax["reported"]].copy()
base_rate = (reported["doses_administered"] % 10 == 0).mean()
by_facility = (
reported.assign(round_number=reported["doses_administered"] % 10 == 0)
.groupby("facility_id")
.agg(rounds=("round_number", "sum"), n=("round_number", "size"))
)
by_facility["share"] = by_facility["rounds"] / by_facility["n"]
print(f"district base rate: {base_rate:.3f}")
print(by_facility.nlargest(3, "share"))
base_rate <- mean(vax$doses_administered[vax$report_submitted] %% 10 == 0)
by_facility <- vax |>
filter(report_submitted) |>
summarise(rounds = sum(doses_administered %% 10 == 0), n = n(), .by = facility_id) |>
mutate(share = rounds / n) |>
arrange(desc(share))
Le taux de base du district est de 10,4 % — exactement l’attendu. La pire formation, FAC020, rapporte un nombre rond 14 fois sur 60, soit 23 %. Plus du double du taux du district. En soi cela ressemble à un constat.
Testez-le.
from scipy.stats import binomtest
worst = by_facility.nlargest(1, "share").iloc[0]
p = binomtest(int(worst["rounds"]), int(worst["n"]), base_rate,
alternative="greater").pvalue
print(f"p = {p:.4f}, Bonferroni across 38 facilities: {min(1, p * 38):.3f}")
worst <- by_facility[1, ]
p <- binom.test(worst$rounds, worst$n, base_rate, alternative = "greater")$p.value
c(p = p, bonferroni = min(1, p * 38))
p = 0,003 pris isolément, et 0,11 après correction pour avoir regardé trente-huit formations. Trois formations passent sous p = 0,05 sans correction, et 1,9 sont attendues par hasard. Trois contre 1,9, cela ne veut rien dire.
Une seconde raison de laisser tomber. Les doses mensuelles de FAC020 vont de cinq à treize, si bien que « se termine par zéro » signifie presque toujours que la valeur était exactement dix. Sur des effectifs aussi petits, le contrôle n’a aucune puissance pour distinguer l’arrondi de l’arithmétique.
Le résultat est : aucun indice de préférence de chiffres dans le rapportage vaccinal. C’est un vrai constat, il a pris quatre lignes, et c’est celui qu’il faut espérer.
Pourquoi le cas négatif compte davantage
Ce qui rend ce contrôle dangereux tient surtout à ce qu’on l’exécute presque toujours sur des données où rien ne cloche, avec l’espoir de trouver quelque chose.
Trois règles qui le maintiennent honnête.
- Calculez le taux de base sur les données, pas sur la théorie. Les chiffres terminaux ne sont pas uniformes quand les effectifs sont petits, quand un formulaire a une valeur par défaut, ou quand les doses viennent en flacons de dix.
- Corrigez du nombre d’unités examinées. Tester trente-huit formations à 5 % produit environ deux positifs sur des données propres, à chaque fois.
- Exigez un mécanisme. Les 69 % de l’équipe 2 en ont un — l’équipe a lu la toise au demi-centimètre le plus proche. Si vous ne savez pas nommer de mécanisme plausible, vous avez un nombre et non un constat.
Ce que vous avez le droit d’écrire
La formulation n’est pas une politesse ; elle décide de la suite.
| N’écrivez pas | Écrivez |
|---|---|
| « Les données de FAC020 semblent fabriquées » | « FAC020 rapporte des nombres ronds plus souvent que la moyenne du district ; l’écart n’est pas significatif après ajustement pour le nombre de formations examinées » |
| « Les mesures de l’équipe 2 ne sont pas fiables » | « Les tailles de l’équipe 2 se terminent par ,0 ou ,5 dans 69 % des cas contre 18 à 23 % pour les autres équipes, ce qui est compatible avec une lecture de la toise au demi-centimètre » |
| « Les âges sont inexacts » | « 24 % des âges tombent sur une année entière exacte contre 9 % attendus, ce qui indique que l’âge a été estimé plutôt que documenté pour une part substantielle des enfants » |
La colonne de droite dit ce qui a été observé, son ampleur, et le mécanisme avec lequel c’est compatible. Celle de gauche dit ce que quelqu’un a fait. Une seule des deux produit une action corrective, et une seule survit à sa présentation à l’équipe qu’elle décrit.
La suite
Vous avez maintenant des constats — un effondrement de complétude, un facteur de vérification de 1,42, une équipe qui arrondit ses tailles. Aucun n’est encore une cause, et aucun n’est actionnable. La leçon suivante montre comment passer d’un défaut à ce qui l’a produit, et pourquoi « il faut former le personnel » est presque toujours la mauvaise réponse.