cassionAnalyse de données

Retour à la leçonLeçon 6 sur 8La charge de dossiers

Les dossiers non clos sont les longs

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 / 31

    Ce que couvre cette leçon

    • Le calcul évident est biaisé
    • Corrigez d'abord les durées impossibles
    • Trois façons honnêtes de le rapporter
    • La censure n'est pas répartie uniformément
    • Le motif de clôture est un jugement
    • Rapportez-le en entier
    • La suite
    Notes du présentateur
    Le délai médian de clôture vaut quatre mois sur les 636 dossiers clos. 472 autres sont encore ouverts, dont 140 dépassent déjà quatre mois, et la protection de l'enfance est censurée à 58 % contre 32 % pour la protection générale — la même statistique signifie donc des choses différentes selon la colonne.
  2. Diapositive 2 / 31

    Le calcul évident est biaisé — En Python

    import pandas as pd
    
    cases = pd.read_csv("protection-case-management-2024.v1.csv")
    
    opened = cases["opened_month"].str[5:].astype(int)
    closed = cases["closed_month"].str[5:].astype("Int64")
    duration = closed - opened
    
    print(f"closed cases: {duration.notna().sum()}")
    print(f"median months to closure: {duration.median()}")
    print(f"still open: {duration.isna().sum()} ({duration.isna().mean():.1%})")
  3. Diapositive 3 / 31

    Le calcul évident est biaisé — En R

    library(dplyr)
    
    cases |>
      mutate(opened = as.integer(substr(opened_month, 6, 7)),
             closed = as.integer(substr(closed_month, 6, 7)),
             duration = closed - opened) |>
      summarise(closed = sum(!is.na(duration)),
                median = median(duration, na.rm = TRUE),
                open = sum(is.na(duration)))
  4. Diapositive 4 / 31

    Le calcul évident est biaisé

    • Quatre mois, sur 636 dossiers sur 1 108 — Les 472 autres sont encore ouverts à la clôture de décembre, et ils ne sont…
    Notes du présentateur
    Quatre mois, sur 636 dossiers sur 1 108. Les 472 autres sont encore ouverts à la clôture de décembre, et ils ne sont pas manquants — ils sont censurés. Le biais a un sens et il se voit directement.
  5. Diapositive 5 / 31

    Le calcul évident est biaisé — En Python

    still_open = 12 - opened[duration.isna()] + 1
    print(f"open cases already past 4 months: {(still_open > 4).sum()}")
    print(f"longest open: {still_open.max()} months and counting")
  6. Diapositive 6 / 31

    Le calcul évident est biaisé — En R

    cases |> filter(is.na(closed_month)) |>
      mutate(so_far = 12 - as.integer(substr(opened_month, 6, 7)) + 1) |>
      summarise(past_four = sum(so_far > 4), longest = max(so_far))
  7. Diapositive 7 / 31

    Le calcul évident est biaisé

    • 140 des dossiers ouverts le sont déjà depuis plus longtemps que le dossier clos médian — et l'un l'est depuis onze mois
    Notes du présentateur
    140 des dossiers ouverts le sont déjà depuis plus longtemps que le dossier clos médian, et l'un l'est depuis onze mois. Chacun d'eux se clôturera à une durée supérieure à quatre mois, ou jamais. Les supprimer rend la réponse plus petite que la vérité, systématiquement.
  8. Diapositive 8 / 31

    Corrigez d'abord les durées impossibles — En Python

    impossible = duration.notna() & (duration <= 0)
    print(f"cases closing on or before the month they opened: {impossible.sum()}")
    print(cases.loc[impossible, ["opened_month", "closed_month"]])
  9. Diapositive 9 / 31

    Corrigez d'abord les durées impossibles — En R

    cases |> filter(!is.na(closed_month),
                    closed_month <= opened_month) |> nrow()
  10. Diapositive 10 / 31

    Corrigez d'abord les durées impossibles

    • Sept dossiers se clôturent un mois antérieur à leur ouverture — La contradiction est invisible dans chaque colonne…
    Notes du présentateur
    Sept dossiers se clôturent un mois antérieur à leur ouverture. La contradiction est invisible dans chaque colonne prise seule et produit des durées négatives qu'un median() absorbe sans broncher. Décidez et consignez : les exclure, ou traiter le mois de clôture comme une faute de saisie et le fixer au mois d'ouverture. Sept dossiers ne déplaceront pas la médiane ; c'est la discipline de les trouver et de les déclarer qui manquera la prochaine fois si vous la sautez.
  11. Diapositive 11 / 31

    Trois façons honnêtes de le rapporter

    • Rapporter la médiane avec la censure énoncée — L'option correcte la moins coûteuse
    Notes du présentateur
    Rapporter la médiane avec la censure énoncée. L'option correcte la moins coûteuse.
  12. Diapositive 12 / 31

    Trois façons honnêtes de le rapporter — Exemple

    Median time to closure: 4 months (636 closed cases).
    472 cases (42.6%) were still open at the cut-off and are excluded; 140 of
    them have already been open longer than 4 months, so the true median is
    higher.
  13. Diapositive 13 / 31

    Trois façons honnêtes de le rapporter

    • Rapporter une courbe d'aboutissement par mois — Quelle part des dossiers ouverts au mois m était close dans les k…
    Notes du présentateur
    Rapporter une courbe d'aboutissement par mois. Quelle part des dossiers ouverts au mois m était close dans les k mois, calculée uniquement sur les dossiers disposant d'au moins k mois de suivi. C'est l'approche par cohorte et elle emploie correctement les dossiers censurés tant qu'ils ont été observés.
  14. Diapositive 14 / 31

    Trois façons honnêtes de le rapporter — En Python

    def closed_within(k):
        eligible = cases[opened <= 12 - k]
        dur = (eligible["closed_month"].str[5:].astype("Int64")
               - eligible["opened_month"].str[5:].astype(int))
        return (dur <= k).sum() / len(eligible), len(eligible)
    
    for k in (3, 6, 9):
        share, n = closed_within(k)
        print(f"closed within {k} months: {share:.1%} (n={n})")
  15. Diapositive 15 / 31

    Trois façons honnêtes de le rapporter — En R

    # For each k, restrict to cases with k months of possible follow-up.
  16. Diapositive 16 / 31

    Trois façons honnêtes de le rapporter

    • Rapporter le délai de clôture pour une seule cohorte à suivi complet — Les dossiers ouverts en janvier ont onze mois…
    • Les trois sont défendables et la première ne suffit pas seule — Une médiane sans énoncé de censure à côté est la…
    Notes du présentateur
    Rapporter le délai de clôture pour une seule cohorte à suivi complet. Les dossiers ouverts en janvier ont onze mois d'observation ; ceux de novembre en ont un. Se restreindre à la cohorte précoce répond honnêtement à une question plus étroite. Les trois sont défendables et la première ne suffit pas seule. Une médiane sans énoncé de censure à côté est la version qui sera citée.
  17. Diapositive 17 / 31

    La censure n'est pas répartie uniformément — En Python

    by_category = pd.DataFrame({
        "closed": duration.notna().groupby(cases["case_category"]).sum(),
        "open": duration.isna().groupby(cases["case_category"]).sum(),
    })
    by_category["censored"] = by_category["open"] / by_category.sum(axis=1)
    print(by_category.round(3))
  18. Diapositive 18 / 31

    La censure n'est pas répartie uniformément — En R

    cases |> summarise(closed = sum(!is.na(closed_month)),
                       open = sum(is.na(closed_month)), .by = case_category) |>
      mutate(censored = open / (open + closed))
  19. Diapositive 19 / 31

    La censure n'est pas répartie uniformément

    CatégorieClosOuvertsCensureMédiane des clos
    Protection de l'enfance13117958 %5 mois
    VBG25517340 %4 mois
    Protection générale25012032 %4 mois
  20. Diapositive 20 / 31

    La censure n'est pas répartie uniformément

    • La protection de l'enfance est censurée à 58 % et la protection générale à 32 % — Les deux médianes de ce tableau sont…
    • Une censure inégale rend une comparaison de médianes trompeuse dans un sens précis — le groupe le plus censuré est…
    Notes du présentateur
    La protection de l'enfance est censurée à 58 % et la protection générale à 32 %. Les deux médianes de ce tableau sont donc calculées sur des fractions très différentes de leurs cohortes, et l'écart entre cinq mois et quatre mois sous-estime l'écart réel. Une censure inégale rend une comparaison de médianes trompeuse dans un sens précis : le groupe le plus censuré est celui dont la médiane est la plus sous-estimée, c'est-à-dire le groupe qui paraît déjà le plus mal loti.
  21. Diapositive 21 / 31

    Le motif de clôture est un jugement — En Python

    print(cases["closure_reason"].value_counts(normalize=True).round(3))
  22. Diapositive 22 / 31

    Le motif de clôture est un jugement — En R

    cases |> filter(!is.na(closure_reason)) |> count(closure_reason) |>
      mutate(share = n / sum(n))
  23. Diapositive 23 / 31

    Le motif de clôture est un jugement

    MotifPart des clôtures
    Objectifs du plan atteints29,1 %
    Perte de contact27,2 %
    Retrait de la survivante13,1 %
    Clôture administrative11,3 %
    Déménagement9,7 %
    Transfert à une autre agence9,6 %
  24. Diapositive 24 / 31

    Le motif de clôture est un jugement

    • Seules 29,1 % des clôtures correspondent à un plan mené à terme — C'est le chiffre principal, et c'est celui par lequel…
    Notes du présentateur
    Seules 29,1 % des clôtures correspondent à un plan mené à terme. C'est le chiffre principal, et c'est celui par lequel commence une conversation de supervision. Mais regardez comment les motifs se répartissent par zone avant d'y croire.
  25. Diapositive 25 / 31

    Le motif de clôture est un jugement — En Python

    by_area = pd.crosstab(cases["admin2"], cases["closure_reason"], normalize="index")
    print((by_area[["closed-administratively", "lost-contact"]] * 100).round(1))
  26. Diapositive 26 / 31

    Le motif de clôture est un jugement — En R

    cases |> filter(!is.na(closure_reason)) |>
      count(admin2, closure_reason) |> mutate(share = n / sum(n), .by = admin2)
  27. Diapositive 27 / 31

    Le motif de clôture est un jugement

    • Hinche classe 36,2 % de ses clôtures en closed-administratively contre 3,8 % à 9,8 % partout ailleurs — et son taux…
    • Un motif de clôture est le jugement d'un travailleur social, non une observation — Une distribution qui diffère…
    Notes du présentateur
    Hinche classe 36,2 % de ses clôtures en closed-administratively contre 3,8 % à 9,8 % partout ailleurs, et son taux de perte de contact affiche 20,2 % contre jusqu'à 38,9 %. Le fourre-tout absorbe le motif dont un superviseur a besoin. Un motif de clôture est le jugement d'un travailleur social, non une observation. Une distribution qui diffère fortement d'un bureau à l'autre est donc une question sur les bureaux avant d'être une question sur les dossiers — et le remède est une conversation sur le codage, non un ajustement statistique.
  28. Diapositive 28 / 31

    Rapportez-le en entier — Exemple (suite)

    Case closure, 1,108 cases
    
      Closed by the cut-off              636    57.4%
      Still open                         472    42.6%    censored, not missing
      Median months to closure             4              of closed cases only
        open cases already past 4 months  140              so the true median is higher
    
      Censoring by category: child protection 58%, GBV 40%, general 32%.
      Medians are not comparable across those columns.
    
      Closure reasons (of 636 closures)
        Case plan objectives met       29.1%
        Lost contact                   27.2%
        Survivor withdrew              13.1%
        Closed administratively        11.3%    36.2% in Hinche, 3.8-9.8% elsewhere
        Relocated                       9.7%
  29. Diapositive 29 / 31

    Rapportez-le en entier — Exemple (suite)

        Transferred                     9.6%
    
      7 cases record a closing month before their opening month and are excluded.
  30. Diapositive 30 / 31

    La suite

    • Tout dans cette unité porte sur des dossiers déjà dans le système.
    Notes du présentateur
    Tout dans cette unité porte sur des dossiers déjà dans le système. La dernière unité demande ce que signifie le nombre de dossiers lui-même — et pourquoi une zone dont le compte de dossiers a doublé est généralement celle où quelque chose s'est bien passé.
  31. Diapositive 31 / 31

    La suite

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