Leçon 1 sur 8
Unité · Ce qu'il ne faut pas collecter
Les colonnes qui n'y sont pas
Ce jeu de données a quatorze colonnes et aucun nom, aucune coordonnée, aucun texte libre, aucune date d'incident, aucune localisation sous le district et aucun détail sur l'auteur. Chacune de ces absences est une décision, et chacune se justifie par ce dont l'analyse a besoin.
Commencez par le schéma, non par les données
import pandas as pd
referrals = pd.read_csv("protection-referrals-2024.v1.csv")
print(referrals.columns.tolist())
print(f"{len(referrals):,} cases, {len(referrals.columns)} columns")
library(dplyr)
referrals |> glimpse()
Quatorze colonnes pour 1 850 cas de protection. Listez maintenant ce que contient un système de gestion de cas et que cet extrait ne contient pas :
| Absent | Pourquoi |
|---|---|
| Nom, coordonnées | Ne sortent jamais du système de gestion de cas, en aucune circonstance |
| Récit en texte libre | Identifiant par construction, et aucune analyse ne le lit |
| Date de l’incident | Jointe à une zone et à une catégorie, fréquemment identifiante |
| Localisation sous l’admin2 | Un village plus une catégorie, c’est une personne |
| Âge exact | La tranche d’âge répond à toutes les questions de désagrégation que l’âge peut traiter |
| Type d’incident, lien avec l’auteur | Ne sont pas partagés du tout hors de l’agence de gestion de cas |
Chaque ligne de ce tableau est une décision que quelqu’un a prise, et chacune se défend en nommant l’analyse qu’elle n’empêche pas. C’est le test : non pas « est-ce sensible » mais « que serais-je incapable de calculer sans cela ».
Le principe, énoncé comme une règle sur des colonnes
Les principes de gestion de l’information VBG s’enseignent habituellement comme de l’éthique. Ce sont aussi, concrètement, des instructions sur un schéma :
- Collecter le minimum nécessaire. Si aucun indicateur n’a besoin d’un champ, le conserver n’est que du risque.
- Partager moins que ce que l’on détient. L’extrait d’analyse n’est pas le dossier. Chaque pas vers l’extérieur retire des champs.
- Ne jamais partager de données au niveau de l’incident hors de l’agence de gestion de cas. Agréger ou ne pas envoyer.
- Le consentement gouverne l’usage. Une personne qui consent à un référencement n’a pas consenti à un jeu de données de recherche.
- La sécurité d’abord, toujours. Là où une analyse et la sécurité d’une survivante s’opposent, c’est l’analyse qui cède.
minimum = {
"who": ["age_band", "sex", "disability_reported"],
"where": ["admin1", "admin2"],
"when": ["referral_month"],
"what": ["case_category", "service_requested"],
"pathway": ["consent_to_refer", "referral_made", "referral_accepted",
"days_to_first_service", "case_status"],
}
print({k: len(v) for k, v in minimum.items()})
# Five groups of fields, each earning its place by an indicator that needs it.
Chaque champ de cet extrait correspond à un indicateur.
days_to_first_service existe parce que le standard clinique de 72 heures pour
les soins de santé VBG l’exige ; disability_reported existe parce que l’écart
d’équité est le constat que ce jeu de données a été bâti pour faire apparaître. Un
champ sans indicateur derrière lui n’a rien à faire dans l’extrait.
Ce que coûte le grossissement, mesuré
L’affirmation selon laquelle le grossissement ne coûte rien doit être vérifiée plutôt qu’assénée.
print(referrals["age_band"].value_counts(dropna=False))
print(referrals["referral_month"].nunique(), "distinct periods")
print(referrals["admin2"].nunique(), "areas")
referrals |> count(age_band)
referrals |> summarise(periods = n_distinct(referral_month),
areas = n_distinct(admin2))
Cinq tranches d’âge, douze mois, six zones. Demandez maintenant ce qu’ajouteraient un âge exact et une date exacte :
- Promptitude : mesurée en jours du référencement au service, ce qui est déjà une durée et n’exige aucune date de calendrier.
- Saisonnalité : le mois est la résolution la plus fine à laquelle se lit une tendance de protection, et une série hebdomadaire sur 1 850 cas serait du bruit.
- Désagrégation par âge : les tranches sont les catégories de rapportage. Un enfant, un adolescent, un adulte en âge de travailler et une personne âgée sont les quatre distinctions que fait tout indicateur de protection.
Le grossissement ne coûte donc rien que quiconque ait demandé. C’est ce qui le rend défendable, et c’est pourquoi l’argument est analytique plutôt que simplement prudent.
Celle qui est une vraie perte
Toutes les omissions ne sont pas gratuites, et prétendre le contraire est la façon dont un argument de protection des données perd sa crédibilité.
Retirer le type d’incident empêche de dire quelles formes de violence le circuit de référencement sert le plus mal. C’est une perte analytique réelle, et la réponse n’est pas que cela n’a pas d’importance. La réponse est que cette analyse a sa place à l’intérieur de l’agence de gestion de cas, conduite par ceux qui détiennent les données, et que ce qui en sort est la conclusion et non le fichier.
print("Question: does the pathway serve some incident types worse than others?")
print("Where it can be answered: inside the case management agency")
print("What leaves the agency: the finding, not the disaggregation")
# The right answer to "we need incident type" is often "we will run it and
# send you the result", not "no".
« Vous ne pouvez pas avoir le fichier, et voici la réponse à votre question » est la réponse professionnelle, et elle est disponible bien plus souvent qu’un refus sec ou qu’une remise discrète.
Les 62 tranches d’âge vides
missing = referrals["age_band"].isna()
print(f"{missing.sum()} cases with no age band ({missing.mean():.1%})")
print(referrals.loc[missing, "case_category"].value_counts())
referrals |> filter(is.na(age_band)) |> count(case_category)
La tranche d’âge est à la fois la désagrégation la plus employée et le champ le plus souvent manquant dans les données d’admission réelles, parce qu’elle se demande à un moment où la demander est intrusive. Soixante-deux cas font 3,4 % et ne sont pas répartis uniformément, si bien qu’un tableau désagrégé par âge a un dénominateur plus petit que le tableau de circuit à côté de lui et doit le dire.
L’envie d’imputer est ici mauvaise pour une raison propre à ce secteur : une tranche d’âge imputée, rattachée à un cas réel dans un jeu de données de protection, est un attribut fabriqué d’une personne identifiable.
Ce qu’il faut écrire dans la note méthodologique
Data handling
Analysis extract holds 14 fields for 1,850 cases. It contains no name,
contact detail, free text, incident date, location below admin2, exact age,
incident type or perpetrator detail.
Age is recorded in five bands and time in months. Both are sufficient for
every indicator reported here, and both reduce the risk that a row can be
matched to a person.
Incident-level fields remain in the case management system. Analyses
requiring them are run by the case management agency and reported as
findings rather than shared as data.
62 cases (3.4%) have no age band. Age-disaggregated figures are computed on
1,788 cases and are labelled accordingly.
Écrivez ceci avant les résultats, non en annexe. Un rapport de protection dont la section de traitement des données est à la fin a invité chaque lecteur à sauter la seule partie qui gouverne ce que le reste a le droit de dire.
La suite
Retirer des colonnes réduit le risque sans l’éliminer. La leçon suivante porte sur ce qui arrive quand on croise les colonnes restantes, et sur le point où un jeu de données parfaitement anonyme produit un tableau qui identifie quelqu’un.