cassionAnalyse de données

Retour à la leçonLeçon 2 sur 8Ce qu'il ne faut pas collecter

Dix-neuf cellules à un

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

    Ce que couvre cette leçon

    • Le jeu de données est anonyme et le tableau ne l'est pas
    • Pourquoi quatre et non un
    • Une règle, écrite comme du code
    • Que faire au lieu de publier la cellule
    • Le constat d'équité survit à la règle
    • La demande qu'il faut refuser
    • La suite
    Notes du présentateur
    Croisez zone, catégorie, tranche d'âge et sexe et ce jeu de données anonyme produit 200 cellules, dont 85 contiennent quatre cas ou moins et 19 en contiennent exactement un. Dans un jeu de données VBG, une cellule à un est une personne, et le tableau ne peut pas sortir des murs.
  2. Diapositive 2 / 24

    Le jeu de données est anonyme et le tableau ne l'est pas — En Python

    import pandas as pd
    
    referrals = pd.read_csv("protection-referrals-2024.v1.csv")
    
    cells = referrals.groupby(
        ["admin2", "case_category", "age_band", "sex"], dropna=False
    ).size()
    
    print(f"{len(cells)} cells")
    print(f"  holding 1 case:  {(cells == 1).sum()}")
    print(f"  holding 4 or fewer: {(cells <= 4).sum()}")
    Notes du présentateur
    Tout identifiant direct a disparu. Cela protège contre la lecture d'une ligne permettant de savoir de qui il s'agit. Cela ne protège pas contre le comptage.
  3. Diapositive 3 / 24

    Le jeu de données est anonyme et le tableau ne l'est pas — En R

    library(dplyr)
    
    referrals |>
      count(admin2, case_category, age_band, sex) |>
      summarise(cells = n(), of_one = sum(n == 1), of_four_or_fewer = sum(n <= 4))
  4. Diapositive 4 / 24

    Le jeu de données est anonyme et le tableau ne l'est pas

    • 200 cellules, dont 85 avec quatre cas ou moins, et 19 avec exactement un
    Notes du présentateur
    200 cellules, dont 85 avec quatre cas ou moins, et 19 avec exactement un. Une cellule à un dit : dans ce district, il y a eu cette année un cas de VBG concernant une fille de 0 à 11 ans. Quiconque travaille dans ce district peut savoir précisément de qui il s'agit. Le jeu de données ne l'a jamais nommée ; le tableau l'a fait.
  5. Diapositive 5 / 24

    Pourquoi quatre et non un

    • Une cellule à deux identifie les deux personnes l'une à l'autre — et à quiconque en connaît une
    • La différenciation récupère les cellules supprimées — Si un total de ligne est publié et que toutes les cellules de…
    Notes du présentateur
    L'instinct est de ne supprimer que les cellules à un. Cela ne suffit pas, pour deux raisons. Une cellule à deux identifie les deux personnes l'une à l'autre, et à quiconque en connaît une. La différenciation récupère les cellules supprimées. Si un total de ligne est publié et que toutes les cellules de cette ligne sauf une le sont aussi, la manquante est une soustraction.
  6. Diapositive 6 / 24

    Pourquoi quatre et non un — En Python

    by_area = referrals.groupby(["admin2", "case_category"]).size().unstack()
    print(by_area)
    print("\nIf one cell is suppressed and the row total is printed,")
    print("the suppressed cell is the total minus the others.")
  7. Diapositive 7 / 24

    Pourquoi quatre et non un — En R

    referrals |> count(admin2, case_category) |>
      tidyr::pivot_wider(names_from = case_category, values_from = n)
  8. Diapositive 8 / 24

    Pourquoi quatre et non un

    • Une règle de suppression exige donc un seuil et une suppression secondaire — supprimer les petites cellules, puis en…
    Notes du présentateur
    Une règle de suppression exige donc un seuil et une suppression secondaire : supprimer les petites cellules, puis en supprimer assez d'autres pour que les petites ne soient pas récupérables par soustraction. Un seuil de cinq est le plancher courant dans ce secteur ; certaines agences emploient dix.
  9. Diapositive 9 / 24

    Une règle, écrite comme du code — En Python (suite)

    THRESHOLD = 5
    
    def suppress(counts, threshold=THRESHOLD):
        """Primary suppression, then a secondary pass so rows cannot be differenced."""
        table = counts.copy()
        small = table < threshold
        table = table.mask(small, other=pd.NA)
    
        # Secondary: if a row has exactly one suppressed cell, the row total gives
        # it away. Suppress the next smallest cell in that row as well.
        for index, row in table.iterrows():
            if row.isna().sum() == 1:
                remaining = counts.loc[index][~small.loc[index]]
                if len(remaining):
                    table.loc[index, remaining.idxmin()] = pd.NA
        return table
  10. Diapositive 10 / 24

    Une règle, écrite comme du code — En Python (suite)

    
    print(suppress(by_area))
  11. Diapositive 11 / 24

    Une règle, écrite comme du code — En R

    suppress <- function(x, threshold = 5) ifelse(x < threshold, NA, x)
    # Plus the secondary pass: a row with exactly one NA is not suppressed at all.
  12. Diapositive 12 / 24

    Une règle, écrite comme du code

    • Écrivez la règle comme une fonction et appliquez-la à chaque tableau — Une règle appliquée à l'œil est appliquée de…
    Notes du présentateur
    Écrivez la règle comme une fonction et appliquez-la à chaque tableau. Une règle appliquée à l'œil est appliquée de façon inégale, et le seul tableau où on l'oublie est celui qui sera transféré.
  13. Diapositive 13 / 24

    Que faire au lieu de publier la cellule

    • Agréger vers le haut — Retirez une dimension
    Notes du présentateur
    La suppression est le dernier recours. Trois meilleures réponses viennent avant, et chacune préserve l'information que le demandeur voulait réellement. Agréger vers le haut. Retirez une dimension. Zone par catégorie n'a aucune cellule sous cinq ; zone par catégorie par âge par sexe en a quatre-vingt-cinq.
  14. Diapositive 14 / 24

    Que faire au lieu de publier la cellule — En Python

    coarse = referrals.groupby(["admin2", "case_category"]).size()
    print(f"cells under 5: {(coarse < 5).sum()} of {len(coarse)}")
  15. Diapositive 15 / 24

    Que faire au lieu de publier la cellule — En R

    referrals |> count(admin2, case_category) |> summarise(small = sum(n < 5))
  16. Diapositive 16 / 24

    Que faire au lieu de publier la cellule

    • Rapporter le taux, non l'effectif, sur un dénominateur assez grand pour le porter — « L'aboutissement est de 31 % pour…
    • Répondre à la question plutôt que fournir le tableau — Un demandeur qui réclame zone par âge par sexe veut généralement…
    Notes du présentateur
    Rapporter le taux, non l'effectif, sur un dénominateur assez grand pour le porter. « L'aboutissement est de 31 % pour les cas avec handicap signalé » est publiable ; « 3 cas sur 11 à Mirebalais » ne l'est pas. Répondre à la question plutôt que fournir le tableau. Un demandeur qui réclame zone par âge par sexe veut généralement savoir si les services atteignent les enfants. C'est un nombre unique sur un grand dénominateur, et il est publiable.
  17. Diapositive 17 / 24

    Le constat d'équité survit à la règle — En Python

    def completion(frame):
        consenting = frame[frame["consent_to_refer"]]
        reached = consenting[consenting["referral_accepted"] &
                             consenting["days_to_first_service"].notna()]
        return len(reached), len(consenting), len(reached) / len(consenting)
    
    disability = referrals["disability_reported"].isin([True, "true", "Yes"])
    print("reported:    %d/%d = %.1f%%" % completion(referrals[disability]))
    print("not reported: %d/%d = %.1f%%" % completion(referrals[~disability]))
    Notes du présentateur
    La crainte est que la suppression détruise l'analyse. Vérifiez-le.
  18. Diapositive 18 / 24

    Le constat d'équité survit à la règle — En R

    referrals |>
      filter(consent_to_refer) |>
      summarise(reached = sum(referral_accepted & !is.na(days_to_first_service)),
                n = n(), .by = disability_reported) |>
      mutate(completion = reached / n)
  19. Diapositive 19 / 24

    Le constat d'équité survit à la règle

    • 26,7 % contre 46,2 %, sur des dénominateurs de 202 et 1 436 — L'écart d'équité de dix-neuf points — le constat le plus…
    • Les analyses qui échouent au test de divulgation ne sont presque jamais celles qui comptent — Une désagrégation à…
    Notes du présentateur
    26,7 % contre 46,2 %, sur des dénominateurs de 202 et 1 436. L'écart d'équité de dix-neuf points — le constat le plus important de ce jeu de données — est calculé sur des dénominateurs très supérieurs à tout seuil de suppression et il est entièrement publiable. Les analyses qui échouent au test de divulgation ne sont presque jamais celles qui comptent. Une désagrégation à quatre entrées sur 1 850 cas répond rarement à une question que quelqu'un a posée ; elle résulte généralement du fait d'avoir versé toutes les variables catégorielles dans un groupby pour voir ce qui en sort.
  20. Diapositive 20 / 24

    La demande qu'il faut refuser — Exemple (suite)

    Request: case counts by commune, month and incident category.
    Response: declined.
    
      Commune-by-month cells hold zero to three cases. At that resolution a
      count identifies individuals to anyone working in the area, and the
      dataset cannot be re-identified back but a person can be.
    
      What I can provide instead:
        - the same counts at district by quarter, no cell below five
        - the completion rate and time to service for each commune, on
          annual denominators
        - a written answer to the question the request is for, if you tell me
          what decision it feeds
    
      If the requirement is genuinely commune-level operational planning, the
      right route is a data sharing agreement with the case management agency,
    Notes du présentateur
    Certaines doivent être refusées, et il vaut la peine de répéter la phrase.
  21. Diapositive 21 / 24

    La demande qu'il faut refuser — Exemple (suite)

      not an extract.
  22. Diapositive 22 / 24

    La demande qu'il faut refuser

    • Proposez trois solutions de remplacement et demandez quelle décision la demande alimente — Un refus sans alternative…
    Notes du présentateur
    Proposez trois solutions de remplacement et demandez quelle décision la demande alimente. Un refus sans alternative est remonté puis annulé par quelqu'un qui n'a pas lu cette leçon ; un refus avec trois alternatives se termine généralement par l'acceptation de l'une d'elles.
  23. Diapositive 23 / 24

    La suite

    • Les règles sont posées.
    Notes du présentateur
    Les règles sont posées. L'unité suivante porte sur l'analyse elle-même — en commençant par la porte à l'entrée du circuit qui décide qui figure au dénominateur, et ce n'est pas une décision de qualité des données.
  24. Diapositive 24 / 24

    La suite

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