cassionAnalyse de données

Retour à la leçonLeçon 2 sur 8Le contrefactuel

Une différence standardisée de 0,85, quand la limite est 0,1

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

    Ce que couvre cette leçon

    • Construisez le tableau d'équilibre avant tout le reste
    • Ce qu'est la différence standardisée, et pourquoi pas une valeur p
    • Ce que la randomisation aurait acheté
    • Quand la randomisation est refusée, et que dire
    • Les trois questions à poser avant un protocole d'évaluation
    • Rapportez-le en entier
    • La suite
    Notes du présentateur
    Quinze écoles ont la cantine et neuf non. Elles diffèrent de 0,85 écart-type sur la littératie initiale et de 0,68 sur la taille, et le Centre compte cinq écoles avec cantine pour une sans. Voilà à quoi ressemble un groupe de comparaison quand personne n'a randomisé.
  2. Diapositive 2 / 26

    Construisez le tableau d'équilibre avant tout le reste — En Python (suite)

    import pandas as pd
    import numpy as np
    
    enrolment = pd.read_csv("school-enrolment-2024.v1.csv")
    current = enrolment[(enrolment["school_year"] == 2024)
                        & (enrolment["age_years"] <= 20)]   # drop the age outliers
    roster = pd.read_csv("school-roster-2024.v1.csv").drop_duplicates(
        "student_id", keep="last")
    joined = current.merge(roster[["student_id", "school_id", "feeding_programme"]],
                           on="student_id", suffixes=("", "_r"))
    joined["over_age"] = joined["age_years"] > joined["grade"] + 5
    joined["displaced"] = joined["displacement_status"] != "resident"
    
    by = joined.groupby("school_id")
    schools = pd.DataFrame({
        "feeding_programme": by["feeding_programme"].first(),
  3. Diapositive 3 / 26

    Construisez le tableau d'équilibre avant tout le reste — En Python (suite)

        "baseline": by["baseline"].mean(),      # from the assessment file
        "age_years": by["age_years"].mean(),
        "size": by.size(),
        "over_age": by["over_age"].mean(),
        "disability": by["disability_reported"].mean(),
        "displaced": by["displaced"].mean(),
        "district": by["admin2"].first(),
    }).reset_index()
    
    def std_diff(treated, control):
        pooled = np.sqrt((treated.var(ddof=1) + control.var(ddof=1)) / 2)
        return (treated.mean() - control.mean()) / pooled
    
    for column in ["baseline", "age_years", "size", "over_age",
                   "disability", "displaced"]:
        t = schools[schools["feeding_programme"]][column].dropna()
  4. Diapositive 4 / 26

    Construisez le tableau d'équilibre avant tout le reste — En Python (suite)

        c = schools[~schools["feeding_programme"]][column].dropna()
        print(f"{column:12} {t.mean():8.4f} {c.mean():8.4f}"
              f"  std.diff {std_diff(t, c):+.3f}")
  5. Diapositive 5 / 26

    Construisez le tableau d'équilibre avant tout le reste — En R

    library(dplyr)
    
    schools |>
      summarise(across(c(baseline, age_years, size, over_age), mean),
                .by = feeding_programme)
  6. Diapositive 6 / 26

    Construisez le tableau d'équilibre avant tout le reste

    CaractéristiqueAvec cantine (15)Sans (9)Différence standardisée
    Littératie initiale54,10 %51,05 %+0,85
    Âge moyen9,659,42+0,79
    Taille de l'école50,344,8+0,68
    Handicap signalé7,6 %9,7 %−0,52
    Déplacé ou retourné23,7 %26,9 %−0,51
    Retard d'âge39,2 %36,8 %+0,43
  7. Diapositive 7 / 26

    Construisez le tableau d'équilibre avant tout le reste

    • Le seuil conventionnel vaut 0,10, et chacune des six le dépasse — quatre d'entre elles d'un facteur cinq ou plus
    Notes du présentateur
    Le seuil conventionnel vaut 0,10, et chacune des six le dépasse — quatre d'entre elles d'un facteur cinq ou plus.
  8. Diapositive 8 / 26

    Construisez le tableau d'équilibre avant tout le reste — En Python

    print(pd.crosstab(schools["district"], schools["feeding_programme"]))
  9. Diapositive 9 / 26

    Construisez le tableau d'équilibre avant tout le reste — En R

    table(schools$district, schools$feeding_programme)
  10. Diapositive 10 / 26

    Construisez le tableau d'équilibre avant tout le reste

    DistrictSans cantineAvec cantine
    Artibonite33
    Centre15
    Nord-Ouest15
    Sud42
  11. Diapositive 11 / 26

    Construisez le tableau d'équilibre avant tout le reste

    • Deux districts sont à cinq contre un en faveur du programme et un est à deux contre quatre — Tout ce qui diffère par…
    Notes du présentateur
    Deux districts sont à cinq contre un en faveur du programme et un est à deux contre quatre. Tout ce qui diffère par ailleurs entre le Centre et le Sud voyage avec chaque comparaison d'écoles avec et sans cantine.
  12. Diapositive 12 / 26

    Ce qu'est la différence standardisée, et pourquoi pas une valeur p — En Python

    t = schools[schools["feeding_programme"]]["baseline"]
    c = schools[~schools["feeding_programme"]]["baseline"]
    from scipy import stats
    print(f"std.diff {std_diff(t, c):+.3f}   p = {stats.ttest_ind(t, c).pvalue:.3f}")
  13. Diapositive 13 / 26

    Ce qu'est la différence standardisée, et pourquoi pas une valeur p — En R

    # Both, and only one of them is the right tool.
  14. Diapositive 14 / 26

    Ce qu'est la différence standardisée, et pourquoi pas une valeur p

    • Différence standardisée +0,85, p = 0,064 — Un relecteur ne lisant que la valeur p conclurait que les écoles sont…
    • La valeur p d'un test d'équilibre confond le déséquilibre et la taille d'échantillon — ce qui est l'inverse de ce dont…
    • Rapportez la différence standardisée, qui ne dépend pas de n — Au-delà de 0,10 c'est un déséquilibre qu'il faut traiter…
    Notes du présentateur
    Différence standardisée +0,85, p = 0,064. Un relecteur ne lisant que la valeur p conclurait que les écoles sont équilibrées sur la littératie initiale. Elles ne le sont pas ; l'échantillon compte 24 écoles et le test n'a presque aucune puissance. La valeur p d'un test d'équilibre confond le déséquilibre et la taille d'échantillon, ce qui est l'inverse de ce dont une vérification d'équilibre a besoin. Vingt-quatre unités passeront tous les tests d'équilibre jamais écrits et deux mille en échoueront à certains par hasard. Rapportez la différence standardisée, qui ne dépend pas de n. Au-delà de 0,10 c'est un déséquilibre qu'il faut traiter ; au-delà de 0,25 c'est un déséquilibre qu'un ajustement par régression ne sauvera pas.
  15. Diapositive 15 / 26

    Ce que la randomisation aurait acheté

    • Cette dernière proposition est toute la valeur — L'ajustement peut corriger un déséquilibre de littératie initiale…
    Notes du présentateur
    Non pas l'équilibre sur tout — l'équilibre en espérance, sur tout, y compris les variables que vous n'avez pas mesurées. Cette dernière proposition est toute la valeur. L'ajustement peut corriger un déséquilibre de littératie initiale parce qu'elle est dans le fichier. Il ne peut pas corriger un déséquilibre de motivation du directeur, du fait que l'école a été choisie parce que quelqu'un a plaidé pour elle, ou de sa distance au bureau du district — dont rien n'est enregistré nulle part.
  16. Diapositive 16 / 26

    Ce que la randomisation aurait acheté — En Python

    rng = np.random.default_rng(20260729)
    draws = []
    for _ in range(2000):
        assigned = rng.permutation(schools["feeding_programme"].values)
        t = schools["baseline"][assigned]
        c = schools["baseline"][~assigned]
        draws.append(std_diff(t, c))
    print(f"under random assignment, |std.diff| > 0.85 in "
          f"{np.mean(np.abs(draws) > 0.85):.1%} of draws")
  17. Diapositive 17 / 26

    Ce que la randomisation aurait acheté — En R

    # Permute the assignment 2,000 times and see how unusual the real split is.
  18. Diapositive 18 / 26

    Ce que la randomisation aurait acheté

    • Réaffecter au hasard les mêmes 24 écoles produit un déséquilibre de cette ampleur dans 5,3 % de 2 000 tirages — Le…
    Notes du présentateur
    Réaffecter au hasard les mêmes 24 écoles produit un déséquilibre de cette ampleur dans 5,3 % de 2 000 tirages. Le partage observé est donc inhabituel sans être impossible — ce qui est exactement la mauvaise conclusion à en tirer. La question n'est pas de savoir si ce déséquilibre aurait pu survenir par hasard ; c'est qu'il n'est pas survenu par hasard, parce que personne n'a randomisé.
  19. Diapositive 19 / 26

    Quand la randomisation est refusée, et que dire

    ObjectionLa réponse honnête
    « On ne peut pas priver des écoles dans le besoin »Randomisez l'ordre d'un déploiement par vagues ; tout le monde est servi, la séquence est aléatoire
    « C'est le ministère qui choisit les écoles »Randomisez à l'intérieur de la liste éligible du ministère, ou évaluez la règle d'éligibilité comme un protocole à seuil
    « C'est déjà en cours »Dites-le, employez un protocole de comparaison, et publiez le tableau d'équilibre
    « Le bailleur veut des résultats cette année »Un essai randomisé sous-dimensionné et des différences de différences bien argumentées sont tous deux défendables ; un avant-après non
    Notes du présentateur
    Elle l'est généralement, et les raisons sont le plus souvent bonnes.
  20. Diapositive 20 / 26

    Quand la randomisation est refusée, et que dire

    • Le déploiement par vagues est le protocole le plus sous-employé de ce secteur — Tout programme qui s'étend sur trois…
    • Là où rien de tout cela n'est possible, le tableau d'équilibre est ce que vous devez au lecteur — Ce n'est pas une…
    Notes du présentateur
    Le déploiement par vagues est le protocole le plus sous-employé de ce secteur. Tout programme qui s'étend sur trois ans a un ordre randomisable, et le randomiser ne coûte rien et n'écarte aucune des objections ci-dessus. Là où rien de tout cela n'est possible, le tableau d'équilibre est ce que vous devez au lecteur. Ce n'est pas une formalité : c'est la preuve sur laquelle il décide quelle part de l'ajustement il doit croire.
  21. Diapositive 21 / 26

    Les trois questions à poser avant un protocole d'évaluation

    • Qui a décidé qui reçoit le programme, et sur quoi ? — Si la réponse est une règle, vous avez peut-être un protocole à…
    • Y a-t-il quelque chose de mesuré avant le début du programme ? — Sans point de départ, les différences de différences…
    • Combien d'unités ont été affectées ? — Non pas combien de personnes ont été mesurées — combien d'écoles, de centres, de…
    Notes du présentateur
    Qui a décidé qui reçoit le programme, et sur quoi ? Si la réponse est une règle, vous avez peut-être un protocole à seuil. Si c'est le jugement d'une personne, vous avez une confusion que vous ne pouvez pas énumérer. Y a-t-il quelque chose de mesuré avant le début du programme ? Sans point de départ, les différences de différences de la leçon suivante sont indisponibles et il ne vous reste qu'une coupe transversale. Combien d'unités ont été affectées ? Non pas combien de personnes ont été mesurées — combien d'écoles, de centres, de villages, de camps. Ce nombre fixe la précision, et la leçon 6 montre ce qu'achètent 24.
  22. Diapositive 22 / 26

    Rapportez-le en entier — Exemple (suite)

    Comparability of feeding and non-feeding schools
    
      15 schools with the programme, 9 without. Assignment was not randomised.
    
      Standardised differences at baseline:
        Baseline literacy     +0.85      School size        +0.68
        Mean age              +0.79      Disability         -0.52
        Displacement          -0.51      Over-age           +0.43
    
      All six characteristics exceed the 0.10 conventional threshold and all six
      exceed 0.25. Programme schools are concentrated in Centre and
      Nord-Ouest (5 of 6 schools in each) and scarce in Sud (2 of 6).
    
      Balance tests are not reported as p-values: with 24 units they would show
      balance regardless. The standardised difference does not depend on n.
    
  23. Diapositive 23 / 26

    Rapportez-le en entier — Exemple (suite)

      The comparison is adjusted for baseline literacy and district. Adjustment
      cannot address unmeasured differences in why these schools were selected,
      and no result in this report should be read as an effect of the programme
      alone.
  24. Diapositive 24 / 26

    Rapportez-le en entier

    • Le dernier paragraphe est là où une évaluation gagne ou perd un relecteur — et sa longueur est la bonne : deux phrases,…
    Notes du présentateur
    Le dernier paragraphe est là où une évaluation gagne ou perd un relecteur, et sa longueur est la bonne : deux phrases, énonçant la limite sans s'en excuser.
  25. Diapositive 25 / 26

    La suite

    • Si les deux groupes différaient au départ, la façon d'employer ce point de départ est de le soustraire.
    Notes du présentateur
    Si les deux groupes différaient au départ, la façon d'employer ce point de départ est de le soustraire. La leçon suivante le fait formellement, obtient une estimation de −0,96 point, et consacre l'essentiel de sa longueur à l'hypothèse qui la rend signifiante — hypothèse que deux passages de mesure ne peuvent pas tester.
  26. Diapositive 26 / 26

    La suite

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