cassionAnalyse de données

Retour à la leçonLeçon 2 sur 8Le dénominateur, c'est l'épidémiologie

Des dénominateurs enchaînés

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

    • La forme
    • Deux façons d'exprimer chaque étape
    • Le premier dénominateur est le difficile
    • La cascade vaccinale
    • Surveillez le sens de l'abandon
    • Dessinez-la, mais rapportez le tableau
    • La suite
    Notes du présentateur
    Une cascade est une suite où le dénominateur de chaque étape est le numérateur de la précédente. 1 850 cas de protection deviennent 757 atteignant un service, et le nombre utile n'est pas les 41 % — c'est le maillon qui a le plus perdu.
  2. Diapositive 2 / 22

    La forme — Exemple

    people living with HIV
      -> diagnosed
        -> on treatment
          -> virally suppressed
    Notes du présentateur
    La cascade de traitement du VIH est l'exemple le plus connu et la structure est générale. Chaque flèche est une proportion, et le dénominateur de chaque étape est l'étape précédente. C'est ce qui en fait une cascade plutôt que quatre indicateurs séparés, et ce qui rend l'arithmétique digne d'attention. La cascade de soins de la tuberculose a la même forme — cas incidents estimés, notifiés, mis sous traitement, traités avec succès — et c'est aussi celle de tout circuit de référencement, de tout calendrier vaccinal, et de tout programme dont on peut sortir entre deux étapes.
  3. Diapositive 3 / 22

    Deux façons d'exprimer chaque étape — En Python (suite)

    import pandas as pd
    
    referrals = pd.read_csv("protection-referrals-2024.v1.csv")
    
    steps = [
        ("cases", len(referrals)),
        ("consented", (referrals["consent_to_refer"] == True).sum()),
        ("referral made", ((referrals["consent_to_refer"] == True)
                           & (referrals["referral_made"] == True)).sum()),
        ("reached a service", ((referrals["consent_to_refer"] == True)
                               & (referrals["referral_made"] == True)
                               & (referrals["referral_accepted"] == True)).sum()),
    ]
    
    first = steps[0][1]
    previous = None
  4. Diapositive 4 / 22

    Deux façons d'exprimer chaque étape — En Python (suite)

    for name, count in steps:
        line = f"{name:20} {count:5}  {count / first:6.1%} of all"
        if previous:
            line += f"   {count / previous:6.1%} of previous"
        print(line)
        previous = count
  5. Diapositive 5 / 22

    Deux façons d'exprimer chaque étape — En R

    library(dplyr)
    
    referrals |>
      summarise(
        cases = n(),
        consented = sum(consent_to_refer),
        referred = sum(consent_to_refer & referral_made),
        reached = sum(consent_to_refer & referral_made & referral_accepted)
      )
  6. Diapositive 6 / 22

    Deux façons d'exprimer chaque étape

    ÉtapenSur le totalSur la précédente
    Cas1 850100 %—
    Ont consenti au référencement1 63888,5 %88,5 %
    Référencement émis1 14261,7 %69,7 %
    Ont atteint un service75740,9 %66,3 %
  7. Diapositive 7 / 22

    Deux façons d'exprimer chaque étape

    • Les deux colonnes sont nécessaires et elles disent des choses différentes
    • Classez par perte conditionnelle, agissez sur la plus grande
    Notes du présentateur
    Les deux colonnes sont nécessaires et elles disent des choses différentes. La colonne sur le total est la cascade telle qu'on la dessine d'ordinaire — un escalier descendant de 100 % à 41 %. Elle dit à un bailleur quelle part de la charge de cas aboutit. La colonne sur la précédente est celle qui identifie le problème. La plus grosse perte unique se situe à « référencement émis » : 30,3 % des personnes ayant consenti n'ont jamais vu de référencement émis. C'est une étape sous le contrôle de l'organisation, et elle est invisible dans la première colonne, où la chute de 88,5 % à 61,7 % ressemble à celle de 61,7 % à 40,9 %. Classez par perte conditionnelle, agissez sur la plus grande.
  8. Diapositive 8 / 22

    Deux façons d'exprimer chaque étape — En Python

    losses = pd.DataFrame(steps, columns=["step", "n"])
    losses["lost"] = losses["n"].shift(1) - losses["n"]
    losses["conditional_loss"] = losses["lost"] / losses["n"].shift(1)
    print(losses.dropna().sort_values("conditional_loss", ascending=False))
  9. Diapositive 9 / 22

    Deux façons d'exprimer chaque étape — En R

    tibble::tibble(step = c("consented", "referred", "reached"),
                   n = c(1638, 1142, 757), previous = c(1850, 1638, 1142)) |>
      mutate(conditional_loss = (previous - n) / previous) |>
      arrange(desc(conditional_loss))
  10. Diapositive 10 / 22

    Le premier dénominateur est le difficile

    • VIH — les personnes vivant avec le VIH. Personne ne les compte ; le chiffre vient d'un modèle, et tout « %…
    • Tuberculose — les cas incidents estimés. De même, et l'écart entre estimés et notifiés est le constat phare de la…
    • Protection — les personnes ayant subi un incident. Inconnaissable, et la raison pour laquelle la cascade de…
    Notes du présentateur
    Toute cascade a une étape qui ne se compte pas, seulement s'estime, et c'est toujours la première.
  11. Diapositive 11 / 22

    Le premier dénominateur est le difficile — En Python

    print("cascade base: cases known to the system, not people in need")
  12. Diapositive 12 / 22

    Le premier dénominateur est le difficile — En R

    # The base of this cascade is cases the system saw. It is not incidence.
  13. Diapositive 13 / 22

    Le premier dénominateur est le difficile

    • Dites quelle base vous avez employée — Une cascade partant d'un besoin estimé et une partant des cas déjà dans le…
    Notes du présentateur
    Dites quelle base vous avez employée. Une cascade partant d'un besoin estimé et une partant des cas déjà dans le système se ressemblent et veulent dire des choses complètement différentes — la première mesure si le système atteint les gens, la seconde seulement s'il les traite.
  14. Diapositive 14 / 22

    La cascade vaccinale — En Python

    vax = pd.read_csv("vaccination-coverage-2024.v1.csv")
    reported = vax[vax["report_submitted"] == True]
    doses = reported.groupby("antigen")["doses_administered"].sum()
    
    for first_dose, last_dose in [("penta1", "penta3"), ("mcv1", "mcv2")]:
        dropout = (doses[first_dose] - doses[last_dose]) / doses[first_dose]
        print(f"{first_dose} -> {last_dose}: {doses[first_dose]:,} -> "
              f"{doses[last_dose]:,}, dropout {dropout:.1%}")
    Notes du présentateur
    L'extraction vaccinale en porte une, et elle n'exige aucun dénominateur modélisé puisque chaque étape est comptée.
  15. Diapositive 15 / 22

    La cascade vaccinale — En R

    doses <- vax |> filter(report_submitted) |>
      summarise(doses = sum(doses_administered), .by = antigen)
  16. Diapositive 16 / 22

    La cascade vaccinale

    • Penta1 vers penta3 : 13,8 % d'abandon. Première vers seconde dose de rougeole : 22,9 %
    • C'est robuste au dénominateur — Numérateur et dénominateur viennent des mêmes formations aux mêmes mois, si bien qu'une…
    • Cela mesure le mécanisme — La couverture monte si davantage d'enfants commencent ; l'abandon ne baisse que si davantage…
    Notes du présentateur
    Penta1 vers penta3 : 13,8 % d'abandon. Première vers seconde dose de rougeole : 22,9 %. Deux choses que cela rend possible et qu'un taux de couverture ne permet pas. C'est robuste au dénominateur. Numérateur et dénominateur viennent des mêmes formations aux mêmes mois, si bien qu'une projection de recensement vieille de neuf ans ne peut pas le déplacer. Le cours sur la conception d'indicateurs avançait cet argument ; ici c'est la raison pour laquelle l'abandon est souvent le meilleur indicateur à rapporter. Cela mesure le mécanisme. La couverture monte si davantage d'enfants commencent ; l'abandon ne baisse que si davantage d'enfants qui commencent terminent aussi, ce que change réellement une intervention de rappel ou de recherche des perdus de vue.
  17. Diapositive 17 / 22

    Surveillez le sens de l'abandon — En Python

    if doses["penta3"] > doses["penta1"]:
        print("negative dropout: check the denominator and the period")
  18. Diapositive 18 / 22

    Surveillez le sens de l'abandon — En R

    if (doses$doses[doses$antigen == "penta3"] > doses$doses[doses$antigen == "penta1"])
      warning("negative dropout")
    Notes du présentateur
    Un abandon négatif — plus de troisièmes doses que de premières — est arithmétiquement possible et signifie toujours quelque chose de précis : une campagne de rattrapage, un problème de bornes de période, ou des enfants vaccinés ailleurs pour la dose antérieure. Ce n'est pas une erreur à ramener à zéro, c'est un constat à expliquer.
  19. Diapositive 19 / 22

    Dessinez-la, mais rapportez le tableau — En Python

    cascade = pd.DataFrame({
        "step": ["Cases", "Consented", "Referral made", "Reached service"],
        "n": [1850, 1638, 1142, 757],
    })
    cascade["of_all"] = cascade["n"] / cascade["n"].iloc[0]
    cascade["of_previous"] = cascade["n"] / cascade["n"].shift(1)
    cascade["base"] = "cases known to the system"
    Notes du présentateur
    Un graphique en cascade est l'une des rares visualisations par défaut réellement bonnes de ce secteur — les barres descendantes rendent les pertes immédiates. Mais le graphique ne montre que la colonne sur le total, alors publiez le tableau à côté avec les deux.
  20. Diapositive 20 / 22

    Dessinez-la, mais rapportez le tableau — En R

    tibble::tribble(
      ~step,             ~n,
      "Cases",         1850,
      "Consented",     1638,
      "Referral made", 1142,
      "Reached",        757
    ) |> mutate(of_all = n / first(n), of_previous = n / lag(n))
    Notes du présentateur
    Quatre colonnes, et la dernière — la base — est ce qui empêche un lecteur de comparer votre cascade à celle de quelqu'un d'autre partie d'ailleurs.
  21. Diapositive 21 / 22

    La suite

    • Une cascade est un ensemble de décomptes déjà agrégés.
    Notes du présentateur
    Une cascade est un ensemble de décomptes déjà agrégés. L'unité suivante revient aux enregistrements individuels — une liste linéaire d'épidémie, où l'analyse commence par mettre 975 cas dans l'ordre du temps et demander quelle forme ils dessinent.
  22. Diapositive 22 / 22

    La suite

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