cassionAnalyse de données

Leçon 7 sur 8

Unité · Ce que les nombres signifient

La zone dont les dossiers ont doublé est celle qui s'est améliorée

Le flux mensuel de Saint-Louis-du-Nord passe de 5,8 dossiers à 10,2 après juillet. Rien de la violence dans cette zone n'a changé. Un service a ouvert, et une courbe de dossiers mesure si les gens peuvent atteindre un bureau — jamais combien en avaient besoin.

PythonR120 minNorme humanitaire fondamentale (CHS)Définitions d'indicateurs de l'UNICEFCritères d'évaluation du CAD de l'OCDE

La courbe, et la lecture évidente

import pandas as pd

cases = pd.read_csv("protection-case-management-2024.v1.csv")
monthly = cases.groupby(["admin2", "opened_month"]).size().unstack(fill_value=0)
print(monthly)
library(dplyr)

cases |> count(admin2, opened_month) |>
  tidyr::pivot_wider(names_from = opened_month, values_from = n, values_fill = 0)

La ligne d’une zone monte et reste haute.

area = cases[cases["admin2"] == "Saint-Louis-du-Nord"]
month = area["opened_month"].str[5:].astype(int)
before = (month <= 6).sum() / 6
after = (month >= 7).sum() / 6
print(f"Jan-Jun: {before:.1f} cases a month")
print(f"Jul-Dec: {after:.1f} cases a month  ({after / before - 1:+.0%})")
cases |>
  filter(admin2 == "Saint-Louis-du-Nord") |>
  mutate(half = if_else(as.integer(substr(opened_month, 6, 7)) <= 6, "H1", "H2")) |>
  count(half) |> mutate(per_month = n / 6)

5,8 dossiers par mois avant juillet, 10,2 après — une hausse de 74 %, tandis qu’aucune autre zone ne bouge de plus de onze points dans un sens ou dans l’autre.

La lecture évidente est que les incidents de protection à Saint-Louis-du-Nord ont augmenté de 74 % au second semestre. Cette lecture est fausse, et c’est le détournement le plus courant des données de protection.

Ce qu’un compte de dossiers compte

Un dossier existe quand une personne a atteint un service, a bien voulu se confier, et qu’un travailleur social a ouvert un fichier. Le compte est donc le produit de quatre choses, dont seule la dernière est ce que les gens y lisent :

Le compte dépend de Ce qui change quand
L’existence d’un service à portée L’un ouvre, l’un ferme, une route est coupée
Le fait que les gens le sachent Une campagne de sensibilisation a lieu
La disposition à se confier La confiance monte ou baisse ; une mauvaise expérience circule
Le fait que quelqu’un ouvre un dossier Effectifs, charge de travail, pratique de référencement
L’incidence dans la population —

Les quatre premières ont bougé à Saint-Louis-du-Nord en juillet, parce qu’un service a ouvert. La cinquième n’est pas mesurée par ce fichier et ne peut pas l’être.

print("Case count = incidence x reporting rate x service availability x recording")
print("A change in the product does not tell you which factor moved.")
# One equation, five unknowns, one observation.

Le test qui les distingue

Vous ne pouvez pas prouver à partir de la seule courbe qu’il s’agit d’un effet de signalement. Vous pouvez rassembler des indices, et trois vérifications sont généralement disponibles.

Quelque chose a-t-il changé dans le service ? L’indice le plus fort et le moins statistique. Un nouveau service, un nouvel agent de proximité, un formulaire d’admission modifié ou un partenaire qui ferme produisent tous une marche d’escalier avec une date.

La composition a-t-elle changé ? La part de protection générale à Saint-Louis-du-Nord passe de 31,4 % à 41,0 % tandis que la VBG baisse de 40,0 % à 32,8 % — les nouveaux arrivants penchent vers la catégorie la moins stigmatisée, ce à quoi ressemble un accès amélioré plutôt qu’une flambée de violence.

def mix(frame):
    return frame["case_category"].value_counts(normalize=True).round(3)

print("before July:", mix(area[month <= 6]).to_dict())
print("after July: ", mix(area[month >= 7]).to_dict())
cases |> filter(admin2 == "Saint-Louis-du-Nord") |>
  mutate(half = if_else(as.integer(substr(opened_month, 6, 7)) <= 6, "H1", "H2")) |>
  count(half, case_category) |> mutate(share = n / sum(n), .by = half)

Les autres zones ont-elles bougé ? Une hausse confinée à une zone avec une explication administrative est un effet de signalement. Une hausse dans toutes les zones au même moment a plus de chances d’être réelle, ou de venir d’un changement du système de rapportage.

halves = cases.assign(half=(cases["opened_month"].str[5:].astype(int) > 6))
shift = halves.groupby(["admin2", "half"]).size().unstack()
shift["change"] = shift[True] / shift[False] - 1
print((shift["change"] * 100).round(1).sort_values())
cases |> mutate(half = as.integer(substr(opened_month, 6, 7)) > 6) |>
  count(admin2, half) |> tidyr::pivot_wider(names_from = half, values_from = n)

Une zone à +74,3 % ; les cinq autres entre −9,4 % et +11,3 %. Une seule zone bougeant sept fois plus que la plus large des autres a une cause administrative, et le travail est de la trouver plutôt que de publier une affirmation sur l’incidence.

Dites-le dans le rapport, dans la phrase à côté du nombre

Cases opened, Saint-Louis-du-Nord

  Jan-Jun    35 cases    5.8 per month
  Jul-Dec    61 cases   10.2 per month   +74%

  A case management service opened in the area in July. This figure measures
  the number of people who reached a service and disclosed; it is not a
  measure of the number of incidents. The rise is consistent with improved
  access and cannot be read as a rise in violence.

  The other five areas moved between -9% and +11% over the same period.

L’avertissement va à côté du nombre, non en note de bas de page. Une courbe de dossiers de protection sans cette phrase sera citée comme une tendance d’incidence dans la semaine, généralement par quelqu’un qui cite votre rapport fidèlement.

La conséquence que l’on manque

Si un compte de dossiers mesure l’accès, alors un programme qui réussit devrait voir son compte de dossiers monter, et un compte qui baisse est au mieux ambigu.

outcomes = pd.DataFrame({
    "observation": ["cases rise", "cases fall"],
    "good reading": ["outreach and access improved",
                     "incidents fell"],
    "bad reading": ["violence increased",
                    "service became unreachable, or trust was lost"],
})
print(outcomes)
# The same number supports opposite conclusions. The context decides.

Un programme de protection ne peut donc pas employer le volume de dossiers comme indicateur de performance dans un sens ni dans l’autre, et les indicateurs qui survivent sont ceux que ce cours a construits : aboutissement du circuit, délai d’accès au service, charge de dossiers, motifs de clôture. Chacun a un dénominateur qui n’est pas la population.

D’où vient réellement la prévalence

Énoncé clairement, car la question sera posée.

Des enquêtes de prévalence en population, conçues pour cela, avec une formation spécialisée des enquêteurs et des protocoles éthiques qu’un jeu de données de service n’a pas. Elles sont coûteuses, rares, et sont le seul instrument qui réponde à la question.

Jamais de données de service, à quelque niveau de sophistication que ce soit. Aucun ajustement du taux de signalement ne sauve un dénominateur qui vaut « les personnes ayant atteint un service ».

print("Question: how many women in this district experienced violence this year?")
print("Answerable from this dataset: no")
print("Instrument that answers it: a population-based prevalence survey")
# Saying "we cannot answer that with this" is the answer.

La suite

La dernière leçon assemble le tout en un rapport de protection — y compris la section qui énonce quelles analyses ont été demandées et refusées, et pourquoi cette section a sa place dans le document plutôt que dans un courriel que personne ne conserve.

Animer cette leçon

La leçon en diaporama, la prose étant reléguée dans les notes du présentateur plutôt que projetée. Produit à partir de cette page, dont il ne peut donc pas s'écarter.

Lancer le diaporamaLire les diapositives

Le PDF ne requiert aucun logiciel et se projette depuis n'importe quel poste. Le fichier PowerPoint est fait pour être modifié : appliquez la charte de votre organisation, retirez une section pour une séance plus courte, ou fusionnez deux leçons en atelier.