cassionAnalyse de données

Retour à la leçonLeçon 4 sur 8Comparer deux groupes

p = 0,023, et un tiers d'une journée

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

    Ce que couvre cette leçon

    • Un résultat significatif sur lequel personne ne devrait agir
    • Convertissez-la dans l'unité de la décision
    • Pourquoi p est devenu petit : c'était le n
    • Rapportez une taille d'effet à côté de chaque p
    • Fixez le seuil avant de tester
    • Les quatre cas
    • Rapportez-le en entier
    • La suite
    Notes du présentateur
    Les garçons sont présents à 88,77 % et les filles à 88,21 %. Sur 68 267 pointages, c'est significatif à p = 0,023. C'est aussi une différence d'un tiers de journée scolaire par enfant et par trimestre, sur laquelle aucun programme n'agirait et aucun ne devrait.
  2. Diapositive 2 / 27

    Un résultat significatif sur lequel personne ne devrait agir — En Python (suite)

    import pandas as pd
    import numpy as np
    from statsmodels.stats.proportion import proportions_ztest
    
    attendance = pd.read_csv("school-attendance-2024.v1.csv")
    enrolment = pd.read_csv("school-enrolment-2024.v1.csv")
    current = enrolment[enrolment["school_year"] == 2024]
    
    MARKS = {"true": True, "Y": True, "false": False, "N": False}
    marked = attendance[attendance["present"].isin(MARKS)].copy()
    marked["attended"] = marked["present"].map(MARKS)
    marked = marked.merge(current[["student_id", "sex"]], on="student_id")
    
    by_sex = marked.groupby("sex")["attended"].agg(["sum", "size"])
    print(by_sex)
    
  3. Diapositive 3 / 27

    Un résultat significatif sur lequel personne ne devrait agir — En Python (suite)

    stat, p = proportions_ztest(by_sex["sum"], by_sex["size"])
    print(f"z = {stat:.2f}, p = {p:.4f}")
  4. Diapositive 4 / 27

    Un résultat significatif sur lequel personne ne devrait agir — En R

    library(dplyr)
    
    marked |> summarise(k = sum(attended), n = n(), .by = sex)
    prop.test(c(29655, 30749), c(33408, 34859))
  5. Diapositive 5 / 27

    Un résultat significatif sur lequel personne ne devrait agir

    GroupePrésencesPointagesTaux
    Garçons29 65533 40888,77 %
    Filles30 74934 85988,21 %
  6. Diapositive 6 / 27

    Un résultat significatif sur lequel personne ne devrait agir

    • Différence 0,56 point de pourcentage. z = 2,28, p = 0,023
    Notes du présentateur
    Différence 0,56 point de pourcentage. z = 2,28, p = 0,023. Selon la convention qu'emploie tout rapport, c'est une différence significative de présence selon le sexe. Elle passerait une relecture. Elle n'est aussi, opérationnellement, rien du tout.
  7. Diapositive 7 / 27

    Convertissez-la dans l'unité de la décision — En Python

    term_days = marked["attendance_date"].nunique()
    gap = 0.0056
    print(f"{term_days} school days in the term")
    print(f"0.56 points = {gap * term_days:.2f} days per student per term")
  8. Diapositive 8 / 27

    Convertissez-la dans l'unité de la décision — En R

    # The statistic is in percentage points. The decision is in days.
  9. Diapositive 9 / 27

    Convertissez-la dans l'unité de la décision

    • Soixante jours de classe, donc 0,56 % vaut 0,34 jour — environ un tiers de journée par enfant et par trimestre
    • Convertissez toujours un effet dans l'unité où se prend la décision — Les points de pourcentage sont l'unité de…
    Notes du présentateur
    Soixante jours de classe, donc 0,56 % vaut 0,34 jour — environ un tiers de journée par enfant et par trimestre. Aucune intervention sur la présence n'est conçue à cette résolution. Aucun directeur d'école ne peut agir dessus. Aucune ligne budgétaire ne bouge. Le résultat est réel, reproductible, statistiquement significatif et opérationnellement vide, et ces quatre choses sont parfaitement compatibles. Convertissez toujours un effet dans l'unité où se prend la décision. Les points de pourcentage sont l'unité de l'analyste ; les journées, les enfants, les cas et les francs sont celle du programme.
  10. Diapositive 10 / 27

    Pourquoi p est devenu petit : c'était le n — En Python

    for scale in (0.05, 0.2, 1.0):
        k = (by_sex["sum"] * scale).round().astype(int)
        n = (by_sex["size"] * scale).round().astype(int)
        stat, p = proportions_ztest(k, n)
        print(f"n = {n.sum():>6,}  difference {k[1]/n[1] - k[0]/n[0]:+.2%}  p = {p:.3f}")
    Notes du présentateur
    Le p répond à « à quel point ces données seraient surprenantes s'il n'y avait aucune différence », et la surprise croît avec la taille d'échantillon à effet constant.
  11. Diapositive 11 / 27

    Pourquoi p est devenu petit : c'était le n — En R

    # Same proportions, smaller n, and the p-value walks back across 0.05.
  12. Diapositive 12 / 27

    Pourquoi p est devenu petit : c'était le n

    ÉchantillonDifférencep
    5 % des pointages (n=3 413)+0,62 %0,570
    20 % (n=13 654)+0,55 %0,314
    100 % (n=68 267)+0,56 %0,023
  13. Diapositive 13 / 27

    Pourquoi p est devenu petit : c'était le n

    • L'effet n'a jamais changé. Seul l'échantillon a changé — Un p est une affirmation sur la force de la preuve, non sur…
    • Un p seul ne peut donc jamais vous dire si quelque chose compte — Il vous dit si vous pouvez écarter zéro, et zéro est…
    Notes du présentateur
    L'effet n'a jamais changé. Seul l'échantillon a changé. Un p est une affirmation sur la force de la preuve, non sur l'ampleur, et avec un échantillon assez grand toute différence devient significative. Un p seul ne peut donc jamais vous dire si quelque chose compte. Il vous dit si vous pouvez écarter zéro, et zéro est rarement la comparaison intéressante.
  14. Diapositive 14 / 27

    Rapportez une taille d'effet à côté de chaque p

    MesurePourSe lit comme
    Différence en points de pourcentageDeux proportionsLa réponse directe
    Rapport de risquesDeux proportions, événements raresCombien de fois plus probable
    d de CohenDeux moyennesÉcarts-types de séparation
    Notes du présentateur
    Trois mesures d'effet couvrent presque tout ce dont un rapport de programme a besoin.
  15. Diapositive 15 / 27

    Rapportez une taille d'effet à côté de chaque p — En Python

    p_boys, p_girls = by_sex["sum"] / by_sex["size"]
    print(f"difference: {p_boys - p_girls:+.2%} points")
    print(f"risk ratio: {p_boys / p_girls:.3f}")
  16. Diapositive 16 / 27

    Rapportez une taille d'effet à côté de chaque p — En R

    # Two lines. There is no excuse for a p-value with no effect size beside it.
  17. Diapositive 17 / 27

    Rapportez une taille d'effet à côté de chaque p

    • Rapport de risques 1,006 — Les garçons sont présents 0,6 % plus souvent en termes relatifs — une autre façon de dire le…
    Notes du présentateur
    Rapport de risques 1,006. Les garçons sont présents 0,6 % plus souvent en termes relatifs — une autre façon de dire le même rien. Comparez à l'écart selon le handicap de la leçon précédente : une différence de 19,4 points et un rapport de risques de 0,58, c'est-à-dire que les cas signalant un handicap aboutissent à un peu plus de la moitié du taux. Les deux mêmes nombres, calculés de la même façon, décrivent un constat dans un cas et du bruit dans l'autre, et seule la taille d'effet les distingue.
  18. Diapositive 18 / 27

    Fixez le seuil avant de tester — En Python

    MEANINGFUL = 0.03      # 3 points of attendance, about 1.8 days a term
    
    observed = p_boys - p_girls
    print(f"observed {observed:+.2%}, threshold {MEANINGFUL:.0%}")
    print(f"large enough to act on: {abs(observed) >= MEANINGFUL}")
    Notes du présentateur
    La défense contre les deux erreurs — courir après un rien significatif, et écarter un quelque chose non significatif — consiste à décider d'avance quelle ampleur de différence changerait ce que vous faites.
  19. Diapositive 19 / 27

    Fixez le seuil avant de tester — En R

    # Write the threshold in the analysis plan, not after seeing the result.
  20. Diapositive 20 / 27

    Fixez le seuil avant de tester

    • Trois points de présence font environ 1,8 jour par trimestre — c'est-à-dire l'échelle à laquelle un programme de suivi…
    Notes du présentateur
    Trois points de présence font environ 1,8 jour par trimestre, c'est-à-dire l'échelle à laquelle un programme de suivi serait conçu. Les 0,56 observés en valent le cinquième. Écrire MEANINGFUL avant de lancer le test est ce qui empêche le seuil de se déplacer là où le résultat est tombé. C'est la même discipline que le tableau des facteurs de confusion du cours d'épidémiologie : décidez la règle avant de voir le nombre auquel elle s'appliquera.
  21. Diapositive 21 / 27

    Les quatre cas — En Python

    cases = pd.DataFrame([
        ("significant, large",     "report it",                    "disability gap, -19.4 pts"),
        ("significant, small",     "report the effect size, say it is small", "attendance by sex, 0.56 pts"),
        ("not significant, large", "report the interval; underpowered", "over-age by sex, +5.5 pts"),
        ("not significant, small", "report as no evidence of a difference", "-"),
    ], columns=["case", "what to do", "example in this course"])
    print(cases)
  22. Diapositive 22 / 27

    Les quatre cas — En R

    # Four quadrants, and only one of them is "publish the p-value".
  23. Diapositive 23 / 27

    Les quatre cas

    • La troisième ligne est celle qu'on traite mal — L'écart de retard d'âge selon le sexe valait 5,5 points avec p = 0,066,…
    Notes du présentateur
    La troisième ligne est celle qu'on traite mal. L'écart de retard d'âge selon le sexe valait 5,5 points avec p = 0,066, et l'instinct est de rapporter « pas de différence ». Le rapport correct dit que l'étude n'a pas pu trancher une différence d'une ampleur qui aurait compté — ce qui est une affirmation sur l'échantillon, et un argument pour en prendre un plus grand plutôt que pour fermer la question.
  24. Diapositive 24 / 27

    Rapportez-le en entier — Exemple

    Attendance by sex, February to April 2024
    
      Boys    88.77%   29,655 of 33,408 marks
      Girls   88.21%   30,749 of 34,859 marks
    
      Difference +0.56 percentage points (p = 0.023, risk ratio 1.006).
    
      Equivalent to 0.34 school days per child per term. Below the 3-point
      threshold set in the analysis plan and not reported as a programme
      finding. The p-value is small because the analysis has 68,267 marks, not
      because the difference is large.
  25. Diapositive 25 / 27

    Rapportez-le en entier

    • La dernière phrase est ce qui rend le bloc honnête — Un lecteur qui ne voit que « p = 0,023 » supposera que la…
    Notes du présentateur
    La dernière phrase est ce qui rend le bloc honnête. Un lecteur qui ne voit que « p = 0,023 » supposera que la différence compte, et la phrase qui dit pourquoi elle ne compte pas tient sur une ligne.
  26. Diapositive 26 / 27

    La suite

    • Chaque test jusqu'ici portait sur une comparaison.
    Notes du présentateur
    Chaque test jusqu'ici portait sur une comparaison. La leçon suivante en lance vingt-trois d'un coup, sur un effet qui n'existe pas, et compte combien reviennent « significatives ».
  27. Diapositive 27 / 27

    La suite

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