cassionAnalyse de données

Leçon 1 sur 8

Unité · Comment la base est structurée

Ce qu'est réellement une valeur dans DHIS2

Cinq coordonnées, pas un nombre. Élément de données, combinaison d'options de catégories, unité d'organisation, période et ensemble de données — et la différence entre un élément de données et un indicateur, d'où part l'essentiel de la confusion sur les chiffres de routine.

PythonR90 minDéfinitions d'indicateurs de l'UNICEF

Une valeur a cinq coordonnées

L’extraction vaccinale ressemble à un tableur — formation sanitaire, période, antigène, doses. Dans le système d’origine, une valeur stockée est adressée par cinq choses, et les connaître toutes les cinq est ce qui rend un chiffre défendable.

Coordonnée Dans l’extraction Ce à quoi elle répond
Élément de données antigen plus la mesure Ce qui a été compté
Combinaison d’options de catégories absente Selon quelle ventilation
Unité d’organisation facility_id Où
Période period Quand
Ensemble de données absent Sur quel formulaire il a été collecté

Deux des cinq manquent à l’export, et c’est le cas normal. L’essentiel de cette leçon porte sur ce que ces deux-là portent et sur les disputes que leur absence provoque.

Élément de données — la chose qui est comptée

Un élément de données est la mesure brute que collecte un formulaire — « doses de penta3 administrées », « doses de BCG administrées ». C’est un décompte de quelque chose, saisi par une personne, et il est stocké exactement tel que saisi.

import pandas as pd

vax = pd.read_csv("vaccination-coverage-2024.v1.csv", parse_dates=["period"])
print(sorted(vax["antigen"].unique()))
print(vax.groupby("antigen")["doses_administered"].sum())
library(dplyr)
library(readr)

vax <- read_csv("vaccination-coverage-2024.v1.csv")

vax |> summarise(doses = sum(doses_administered), .by = antigen)

Six antigènes, six éléments de données. La colonne target_population est une septième valeur d’une autre nature, et dans une instance réelle ce ne serait généralement pas un élément de données du tout — c’est un dénominateur, stocké soit comme un élément de données saisi une fois par an, soit comme un attribut de l’unité d’organisation.

Demandez lequel des deux. Un dénominateur stocké comme élément annuel peut être révisé rétrospectivement ; stocké comme attribut, il change pour toutes les périodes d’un coup. Cette différence explique qu’un taux de couverture calculé en janvier puis en juin puisse différer sans aucune dose nouvelle.

Combinaisons de catégories — la ventilation intégrée à l’élément

Une combinaison de catégories découpe un élément de données en cellules que le formulaire collecte réellement. Le penta3 pourrait être ventilé par âge (moins d’un an / un an et plus) et par sexe, donnant quatre combinaisons d’options de catégories par élément.

Data element:  Penta3 doses administered
Category combo: Age (<1, 1+) x Sex (F, M)
Stored values:  4 per org unit per period

C’est là que loge le contresens le plus fréquent sur un export DHIS2. Si votre extraction a une ligne par antigène, formation et mois, l’une de deux choses est vraie, et elles ne s’équivalent pas.

  • L’élément n’a aucune ventilation, donc il y a une valeur et rien n’a été perdu.
  • L’export a agrégé les combinaisons d’options, auquel cas la ventilation existe dans le système et votre fichier ne peut pas la retrouver.
expected = (vax["facility_id"].nunique() * vax["period"].nunique()
            * vax["antigen"].nunique())
print(f"{expected} expected rows, {len(vax)} in the file")
c(expected = n_distinct(vax$facility_id) * n_distinct(vax$period) *
             n_distinct(vax$antigen),
  actual = nrow(vax))

38 × 12 × 6 = 2 736, et le fichier compte 2 736 lignes. La grille est exactement pleine, ce qui vous dit que l’export est au niveau de l’élément de données sans ventilation survivante. Si un rapport demande ensuite la couverture par sexe, la réponse n’est pas dans ce fichier, et elle est peut-être ou non dans le système.

Élément de données contre indicateur

La distinction qui cause le plus d’ennuis, et il vaut la peine d’être précis.

  • Un élément de données est stocké. Quelqu’un l’a saisi.
  • Un indicateur est calculé. Il a un numérateur, un dénominateur et un facteur, et DHIS2 l’évalue au niveau que vous demandez.
Indicator:   Penta3 coverage
Numerator:   #{Penta3 doses administered}
Denominator: #{Surviving infants}
Factor:      100

Trois conséquences qui reviennent sans cesse.

Un indicateur n’est pas stocké, donc il ne peut pas être faux dans la base. Si un taux de couverture est faux, c’est soit un élément de données, soit la définition de l’indicateur. Les deux ont des responsables et des remèdes différents.

L’indicateur est évalué au niveau demandé, et l’arithmétique est sommer-puis-diviser, non diviser-puis-moyenner. Demander la couverture au niveau du district somme numérateurs et dénominateurs sur les formations ; cela ne moyenne pas les couvertures par formation. C’est le comportement correct et c’est l’inverse de ce que fait d’ordinaire un utilisateur de tableur.

district = vax[vax["report_submitted"] == True]
correct = (district["doses_administered"].sum()
           / district["target_population"].sum())
wrong = (district["doses_administered"] / district["target_population"]).mean()
print(f"ratio of sums {correct:.3f}, mean of ratios {wrong:.3f}")
vax |>
  filter(report_submitted) |>
  summarise(ratio_of_sums = sum(doses_administered) / sum(target_population),
            mean_of_ratios = mean(doses_administered / target_population))

Un indicateur peut être demandé pour une période que les données ne soutiennent pas. Demandez la couverture annuelle et DHIS2 sommera douze numérateurs mensuels sur un dénominateur qui peut être une valeur annuelle ou une somme de valeurs mensuelles, selon la configuration de l’élément. Obtenir un nombre plausible ne prouve pas que l’agrégation était juste.

Ensembles de données — le formulaire, et ce que « attendu » veut dire

Un ensemble de données est le formulaire sur lequel un groupe d’éléments est collecté, affecté à un ensemble d’unités d’organisation, avec un type de période. C’est lui qui décide quelles unités sont censées rapporter, fondement de tout chiffre de complétude que le système produit.

reported = vax["report_submitted"] == True
print(f"{reported.sum()} of {len(vax)} facility-month-antigen values reported")
print(f"reporting rate {reported.mean():.1%}")
mean(vax$report_submitted)

76,5 %. Ce nombre n’a de sens que parce qu’une affectation d’ensemble de données dit que les 38 formations étaient censées transmettre chaque mois. Sans l’ensemble de données, il n’y a ni dénominateur ni complétude.

Remarquez aussi ce que l’extraction ne porte pas : le rapportage est ici tout ou rien par couple formation-mois pour les six antigènes, ce à quoi ressemble un ensemble de données unique contenant les six. Un système répartissant les antigènes sur deux ensembles montrerait des mois partiels, et cette structure serait visible dans les données.

partial = (
    vax[reported].groupby(["facility_id", "period"])["antigen"].nunique()
)
print(f"{(partial < 6).sum()} facility-months with only some antigens reported")
vax |>
  filter(report_submitted) |>
  summarise(antigens = n_distinct(antigen), .by = c(facility_id, period)) |>
  filter(antigens < 6) |>
  nrow()

Zéro. Un ensemble de données, six éléments, transmis ensemble.

Demandez les métadonnées, pas seulement les données

La conclusion pratique de cette leçon. Quand vous demandez une extraction, demandez les métadonnées avec.

  • Les définitions des éléments de données, y compris leur mode d’agrégation entre périodes (somme, moyenne, ou dernière valeur — cela compte énormément et personne ne le demande).
  • La combinaison de catégories de chaque élément, pour savoir ce qui a été réduit.
  • L’affectation des ensembles de données, pour savoir combien d’unités étaient attendues.
  • Les définitions d’indicateurs de tout ce qui est calculé, avec les expressions de numérateur et de dénominateur.

Quatre petits fichiers, et ils transforment un export en quelque chose à partir de quoi une fiche de référence peut s’écrire. Le cours Conception d’indicateurs exigeait une source détaillée jusqu’au champ ; voici à quoi cela ressemble quand la source est DHIS2.

La suite

Vous savez ce qu’est une valeur et où elle se situe. La leçon suivante la déplace — vers le haut d’une hiérarchie d’unités d’organisation qui n’est pas fixe, où une formation réaffectée d’un district à l’autre en mars donne un total de district qu’on ne peut pas simplement sommer.

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.