cassionAnalyse de données

Retour à la leçonLeçon 2 sur 8Ce que qualité veut dire ici

Les deux indicateurs que personne ne calcule

Le même diaporama que les téléchargements, rendu sous forme de page. Lancez le diaporama pour le présenter en plein écran — les flèches ou un clic avancent d'une diapositive, Échap quitte.

Diapositives · PDFDiapositives · PowerPoint

  1. Diapositive 1 / 22

    Ce que couvre cette leçon

    • Deux indicateurs, et aucun n'est dans le rapport
    • La complétude du rapportage
    • Décomposez toujours de trois façons
    • Le piège du dénominateur
    • La promptitude exige un champ que vous n'avez peut-être pas
    • Lisez tous les autres chiffres à travers ces deux-là
    • La suite
    Notes du présentateur
    Complétude et promptitude du rapportage, chacune avec son dénominateur. Onze formations sanitaires sur trente-huit ont rapporté en août, et tout taux de couverture de ce mois est une affirmation sur ces onze-là.
  2. Diapositive 2 / 22

    Deux indicateurs, et aucun n'est dans le rapport

    • Ouvrez presque n'importe quel rapport sanitaire de routine de ce secteur et vous y trouverez la couverture, la charge de cas, les taux de guérison et les ruptures de stock.
    Notes du présentateur
    Ouvrez presque n'importe quel rapport sanitaire de routine de ce secteur et vous y trouverez la couverture, la charge de cas, les taux de guérison et les ruptures de stock. Vous y trouverez très rarement les deux chiffres qui disent quelle part du district ces figures décrivent. Ils sont bon marché. Les deux sortent de l'extraction que vous avez déjà — enfin, l'un des deux — et les deux changent la manière dont il faut lire tous les autres nombres du rapport.
  3. Diapositive 3 / 22

    La complétude du rapportage — En Python

    import pandas as pd
    
    vax = pd.read_csv("vaccination-coverage-2024.v1.csv", parse_dates=["period"])
    vax["reported"] = vax["report_submitted"] == True
    
    print(f"overall reporting rate: {vax['reported'].mean():.1%}")
    
    by_month = vax.groupby(vax["period"].dt.strftime("%Y-%m"))["reported"].mean()
    print((by_month * 100).round(0))
    Notes du présentateur
    Le taux de rapportage est la part des rapports attendus qui ont effectivement été transmis. Le mot qui travaille est attendus.
  4. Diapositive 4 / 22

    La complétude du rapportage — En R

    library(dplyr)
    library(readr)
    
    vax <- read_csv("vaccination-coverage-2024.v1.csv")
    
    mean(vax$report_submitted)
    
    vax |>
      mutate(month = format(period, "%Y-%m")) |>
      summarise(reporting_rate = mean(report_submitted), .by = month) |>
      arrange(month)
  5. Diapositive 5 / 22

    La complétude du rapportage

    MoisTaux de rapportage
    Janvier92 %
    Février82 %
    Mars74 %
    Avril à juillet82 à 87 %
    Août29 %
    Septembre45 %
    Octobre95 %
    Novembre et décembre76 à 87 %
    Notes du présentateur
    Août et septembre ne sont pas une oscillation. Onze formations sanitaires sur trente-huit ont rapporté en août et dix-sept en septembre. Tout taux de couverture d'août est une affirmation sur onze formations, et le publier à côté de celui de juillet sans le dire revient à comparer deux districts différents. Remarquez aussi que l'effondrement et la reprise sont simultanés dans tout le district. C'est la signature d'un événement de système — un stock de formulaires papier, une grève, un serveur, un superviseur parti — et non de formations qui défaillent individuellement. Une évaluation qui soulève 27 constats séparés pour août a mal lu le motif.
  6. Diapositive 6 / 22

    Décomposez toujours de trois façons — En Python

    by_facility = vax.groupby("facility_id")["reported"].mean().sort_values()
    print(by_facility.head(6))
    print(f"{(by_facility == 1).sum()} facilities reported every month")
    
    by_type = vax.groupby("facility_type")["reported"].mean()
    print((by_type * 100).round(1))
    Notes du présentateur
    Un nombre unique masque tout ce qui mérite d'être su. Décomposez le taux de rapportage par période, par unité de rapportage et par type d'unité.
  7. Diapositive 7 / 22

    Décomposez toujours de trois façons — En R

    vax |> summarise(rate = mean(report_submitted), .by = facility_id) |> arrange(rate) |> head(6)
    
    vax |> summarise(rate = mean(report_submitted), .by = facility_type)
  8. Diapositive 8 / 22

    Décomposez toujours de trois façons

    Type de formationTaux de rapportage
    Centre de santé82,8 %
    Hôpital de district75,0 %
    Poste de santé71,7 %
    Notes du présentateur
    Les six pires formations sont toutes à 58 % — sept mois sur douze — et seules deux sur trente-huit ont rapporté tous les mois. Le gradient par type est le constat actionnable : ce sont les postes de santé qui rapportent le moins bien, ce qui désigne la distance de supervision, les effectifs ou le transport plutôt qu'une formation en particulier.
  9. Diapositive 9 / 22

    Le piège du dénominateur — En Python

    # WRONG: the share of reports that were submitted, among reports that were submitted
    wrong = vax[vax["reported"]]["reported"].mean()          # always 1.0
    Notes du présentateur
    L'erreur unique qui rend un taux de rapportage inutile.
  10. Diapositive 10 / 22

    Le piège du dénominateur — En R

    # WRONG
    vax |> filter(report_submitted) |> summarise(rate = mean(report_submitted))
  11. Diapositive 11 / 22

    Le piège du dénominateur — En Python

    EXPECTED_FACILITIES = pd.read_csv("facility-master-list.csv")["facility_id"]
    
    expected = len(EXPECTED_FACILITIES) * vax["period"].nunique()
    submitted = vax.loc[vax["reported"], ["facility_id", "period"]].drop_duplicates().shape[0]
    print(f"{submitted} of {expected} expected facility-months")
    Notes du présentateur
    Évident une fois écrit. Cela ne l'est pas quand le filtre est six lignes plus haut dans une chaîne, et c'est exactement ce qui arrive lorsqu'on lit une extraction DHIS2 ne contenant que les rapports transmis. Si l'extraction ne comporte aucune ligne pour les unités non déclarantes, le taux de rapportage ne peut pas y être calculé du tout — il vous faut la liste des unités attendues, prise ailleurs.
  12. Diapositive 12 / 22

    Le piège du dénominateur — En R

    expected  <- nrow(facility_master) * n_distinct(vax$period)
    submitted <- vax |> filter(report_submitted) |> distinct(facility_id, period) |> nrow()
    Notes du présentateur
    La liste de référence fait autorité, exactement comme la base administrative de population dans le cours précédent. Une formation fermée et une formation qui a cessé de rapporter sont identiques dans l'extraction et constituent des constats totalement différents, et seule la liste de référence les distingue.
  13. Diapositive 13 / 22

    La promptitude exige un champ que vous n'avez peut-être pas — En Python

    submissions["days_late"] = (
        submissions["submitted_on"] - submissions["deadline"]
    ).dt.days
    
    print(f"on time: {(submissions['days_late'] <= 0).mean():.1%}")
    print(f"median days late, of those late: "
          f"{submissions.loc[submissions['days_late'] > 0, 'days_late'].median():.0f}")
    Notes du présentateur
    La promptitude est la part des rapports transmis avant l'échéance, et le retard médian des autres.
  14. Diapositive 14 / 22

    La promptitude exige un champ que vous n'avez peut-être pas — En R

    submissions <- submissions |>
      mutate(days_late = as.integer(submitted_on - deadline))
    
    c(on_time = mean(submissions$days_late <= 0),
      median_late = median(submissions$days_late[submissions$days_late > 0]))
  15. Diapositive 15 / 22

    La promptitude exige un champ que vous n'avez peut-être pas

    • Cette extraction ne permet pas ce calcul — et le dire est en soi un constat d'évaluation
    Notes du présentateur
    Cette extraction ne permet pas ce calcul, et le dire est en soi un constat d'évaluation. Il n'y a pas d'horodatage de transmission dans le fichier — seulement report_submitted, un indicateur sans date. DHIS2 enregistre un lastUpdated par ensemble de valeurs et une date de complétude par enregistrement, si bien que le champ existe dans le système et n'a pas été repris dans l'export. Consignez-le tel quel.
  16. Diapositive 16 / 22

    La promptitude exige un champ que vous n'avez peut-être pas

    Constat. La promptitude ne peut pas être évaluée. L'extraction mensuelle porte un indicateur de transmission mais aucune date de transmission, alors que DHIS2 en enregistre une. Action corrective. Ajouter la date de complétude à l'extraction standard. Responsable. Point focal SNIS. Échéance. Prochaine extraction trimestrielle.
    Notes du présentateur
    Une dimension que vous ne pouvez pas mesurer est un constat sur le système de rapportage, non une lacune de votre évaluation. Rapportez-la dans le même tableau que le reste.
  17. Diapositive 17 / 22

    Lisez tous les autres chiffres à travers ces deux-là

    • La couverture, à 76,5 % de rapportage. Un total de district est une borne inférieure, pas une estimation. Écrivez «…
    • Une tendance mensuelle. La baisse d'août est une baisse de rapportage jusqu'à preuve du contraire. Tracez le taux…
    • Un classement de formations. Des formations ayant rapporté sept mois sur douze ne peuvent pas être classées face à…
    Notes du présentateur
    L'intérêt de les calculer en premier tient à ce qu'ils vous autorisent à dire ensuite.
  18. Diapositive 18 / 22

    Lisez tous les autres chiffres à travers ces deux-là — En Python

    monthly = (
        vax[vax["reported"]]
        .groupby(vax["period"].dt.strftime("%Y-%m"))
        .apply(lambda g: g["doses_administered"].sum() / g["target_population"].sum())
        .rename("coverage")
        .to_frame()
    )
    monthly["reporting_rate"] = by_month
    print(monthly.round(3))
  19. Diapositive 19 / 22

    Lisez tous les autres chiffres à travers ces deux-là — En R

    vax |>
      mutate(month = format(period, "%Y-%m")) |>
      summarise(
        coverage = sum(doses_administered[report_submitted]) /
                   sum(target_population[report_submitted]),
        reporting_rate = mean(report_submitted),
        .by = month
      )
  20. Diapositive 20 / 22

    Lisez tous les autres chiffres à travers ces deux-là

    Deux colonnes, toujours adjacentes. Un taux de couverture sans son taux de rapportage est un nombre sans étiquette, et l'étiquette est ce qui l'empêche d'être mal lu.
  21. Diapositive 21 / 22

    La suite

    • Complétude et promptitude disent si un rapport est arrivé.
    Notes du présentateur
    Complétude et promptitude disent si un rapport est arrivé. La leçon suivante dit s'il était juste — le recomptage face au registre source, le facteur de vérification qu'il produit, et la bande de tolérance qui en fait une décision.
  22. Diapositive 22 / 22

    La suite

    Lire la leçon complète, avec le code exécutable Retour à la leçon