Leçon 3 sur 8
Unité · La fiche de référence
La fiche de référence, champ par champ
Une page par indicateur, treize champs, et un test qui dit quand elle est finie — remettez-la à un second analyste et voyez s'il obtient votre chiffre sans poser de question.
Le test que la fiche doit passer
Une fiche de référence d’indicateur est finie quand un analyste compétent qui ne vous a jamais rencontré peut calculer votre chiffre à partir d’elle, sur les données brutes, sans vous poser de question.
C’est le seul test qui vaille, et il est impitoyable. Presque toutes les fiches en circulation y échouent aux trois mêmes endroits — la source du dénominateur est nommée mais pas spécifiée, les exclusions ne sont pas listées, et personne n’a écrit quoi faire quand une unité de rapportage reste silencieuse.
Les champs
| Champ | Ce qu’il contient |
|---|---|
| Nom | Y compris l’unité de mesure |
| Définition | Une phrase lisible par un non-analyste |
| Numérateur | La condition exacte, en mots |
| Dénominateur | La population exacte, et sa provenance |
| Exclusions | Ce qui est délibérément écarté, et pourquoi |
| Unité de mesure | Pourcentage, décompte, pour 1 000, litres par personne et par jour |
| Sens | Plus haut est mieux, plus bas est mieux, ou ni l’un ni l’autre |
| Désagrégation | Les découpages rapportés, et l’effectif minimal par cellule |
| Fréquence | À quelle cadence il est calculé, et le délai de rapportage |
| Source | Système, table, champ. Pas « les registres du programme » |
| Méthode de calcul | Assez pour que l’arithmétique soit sans ambiguïté |
| Décision éclairée | Ce qui change selon la valeur |
| Limites connues | Ce que le chiffre ne peut pas soutenir |
Treize champs, la plupart d’une ligne. Une fiche prend vingt minutes et ne se réécrit jamais.
Exemple travaillé — couverture penta3
Name penta3_coverage_percent_monthly
Definition The share of the target infant population that received a third
dose of pentavalent vaccine in the month.
Numerator Third doses of pentavalent vaccine administered, as reported by
facilities that submitted a monthly report for that month.
Denominator Surviving infants in the catchment, from the MoH population
estimates 2024, projected from the 2015 census at 2.4% annual
growth, summed across facilities that reported.
Exclusions Facility-months with report_submitted = false are excluded from
both numerator and denominator. Doses given to children outside
the catchment are not separable and remain in the numerator.
Unit Percent
Direction Higher is better
Disaggregation Month, facility type, district. Minimum cell 30 in denominator.
Frequency Monthly, reported 6 weeks after month end
Source DHIS2 data element PENTA3_DOSES, org unit level 4, monthly
Computation 100 * sum(doses) / sum(target_population), over reporting
facility-months only. Not the mean of facility-level rates.
Decision Whether a district is prioritised for outreach in the next
quarterly microplan.
Limitations Reporting completeness was 76.5% in 2024 and fell to 29% in
August; the figure is a lower bound in any month where
completeness is below 90%. Catchments overlap, so facility-level
values are unreliable; use district level or above.
Lisez ensemble les lignes d’exclusions et de calcul, car c’est là que le test des deux analystes échoue le plus souvent.
« Sur les seuls couples formation-mois ayant rapporté. Non la moyenne des taux par formation. » Ces deux phrases tranchent un écart de plusieurs points et aucune n’est impliquée par la définition. Un rapport de sommes et une moyenne de rapports sont deux nombres différents, et les deux sont des lectures raisonnables de « couverture ».
Le champ que tout le monde omet
Décision éclairée manque à la plupart des modèles en usage, et c’est le champ
qui travaille le plus.
Le remplir a trois effets, tous trois inconfortables de façon utile.
- Il révèle les indicateurs qui n’éclairent rien. Certains restent exigés — un bailleur les demande — et c’est une réponse légitime. Écrivez « exigence de rapportage bailleur, aucune décision opérationnelle » et cessez d’y consacrer de l’effort analytique.
- Il révèle les indicateurs qui éclairent deux décisions. Une couverture servant à la fois à prioriser des sorties de proximité et à déclencher une commande d’intrants exige deux définitions, sinon l’une des deux décisions se prend sur le mauvais chiffre.
- Il fixe la précision nécessaire. Un indicateur qui priorise un district doit avoir raison sur le classement. Un indicateur qui déclenche une commande doit avoir raison sur le niveau. Ce sont deux exigences différentes et elles ne coûtent pas la même chose.
Gardez-la à côté du code
Une fiche de référence dans un fichier Word au fond d’une boîte mail est une fiche qui dérive. Stockez-la comme donnée à côté du script qui calcule l’indicateur.
import json
from pathlib import Path
sheet = json.loads(Path("indicators/penta3_coverage.json").read_text())
assert sheet["denominator_source"], "denominator source is required"
assert sheet["decision_informed"], "an indicator with no decision needs saying so"
numerator = vax.loc[vax["reported"] & (vax["antigen"] == "penta3"),
"doses_administered"].sum()
denominator = vax.loc[vax["reported"] & (vax["antigen"] == "penta3"),
"target_population"].sum()
print(f"{sheet['name']}: {100 * numerator / denominator:.1f}")
sheet <- jsonlite::read_json(here::here("indicators", "penta3_coverage.json"),
simplifyVector = TRUE)
stopifnot(nzchar(sheet$denominator_source), nzchar(sheet$decision_informed))
vax |>
filter(report_submitted, antigen == "penta3") |>
summarise(value = 100 * sum(doses_administered) / sum(target_population))
Deux gains. Les assertions font échouer l’exécution quand une fiche est
incomplète, ce qui est le geste que fait le schéma de contenu de cette
plateforme. Et la fiche voyage avec le résultat, si bien qu’un tableau et ses
définitions circulent ensemble — l’habitude introduite par le cours de
fondamentaux avec un definitions.csv à côté de chaque sortie.
Écrivez les exclusions en code, pas en prose
Le champ des exclusions est celui qui a le plus de chances d’être vrai dans le document et faux dans le script. Comblez l’écart en produisant l’un à partir de l’autre.
EXCLUSIONS = [
("non-reporting facility-months", lambda d: ~d["reported"]),
("other antigens", lambda d: d["antigen"] != "penta3"),
]
remaining = vax.copy()
for label, rule in EXCLUSIONS:
dropped = rule(remaining).sum()
remaining = remaining[~rule(remaining)]
print(f"excluded {dropped:>5} rows: {label}")
print(f"{len(remaining)} rows in the indicator")
EXCLUSIONS <- list(
"non-reporting facility-months" = function(d) !d$report_submitted,
"other antigens" = function(d) d$antigen != "penta3"
)
remaining <- vax
for (label in names(EXCLUSIONS)) {
rule <- EXCLUSIONS[[label]]
cat(sprintf("excluded %5d rows: %s\n", sum(rule(remaining)), label))
remaining <- remaining[!rule(remaining), ]
}
L’affichage produit est le champ des exclusions, avec ses comptes. Collez-le dans la fiche et les deux ne peuvent plus diverger.
Versionnez-la
Une définition d’indicateur change. Quand elle change, la série se casse, et la cassure doit être visible.
version 2.1
changed 2026-07-28
change Denominator restricted to reporting facilities. Previously all
facilities, with non-reporters counted at their target population,
which understated coverage by about 23% in August 2024.
effect Series revised from 2024-01. Values before v2.1 are not comparable.
N’améliorez jamais une définition en silence. Un taux de couverture qui monte de huit points parce que la définition a changé, présenté dans le même graphique que les trimestres précédents, est le constat faux le plus convaincant qu’un système de suivi-évaluation puisse produire.
Le test des deux analystes, en pratique
Une fois par trimestre, prenez un indicateur, remettez la fiche et l’extraction brute à un collègue qui ne l’a pas écrite, et comparez. Cela prend une heure et trouve des choses qu’aucune relecture du document ne trouve.
Ce qu’il fait typiquement remonter.
- Le collègue a pris le mois calendaire ; vous aviez pris le mois de rapportage.
- Le collègue a calculé une moyenne de taux par formation ; vous un rapport de sommes.
- Le collègue a inclus l’hôpital de district ; votre extraction l’excluait à cause d’un filtre de niveau d’unité d’organisation que personne n’a documenté.
Chacun de ces cas est une fiche à laquelle il manquait une ligne. Le but de l’exercice est de trouver la ligne, pas de savoir qui avait raison.
La suite
Le champ qui engendre plus de désaccords que les douze autres réunis est le dénominateur. La leçon suivante lui est entièrement consacrée — le choisir, le défendre, et dire honnêtement ce qu’il exclut.