Leçon 8 sur 8
Unité · Ce que le rapport affirme
La section statistique qu'un relecteur ne peut pas démonter
Sept leçons ont produit onze nombres. Celle-ci les met dans un rapport — ce qui va dans le corps, ce qui va en annexe, ce qu'un relecteur demandera, et les quatre phrases qui répondent à chaque question avant qu'elle soit posée.
Ce que fait réellement un relecteur
Un relecteur lisant un rapport de programme fait quatre choses, dans cet ordre, et chacune trouve sa réponse dans quelque chose que ce cours a calculé.
| Le relecteur demande | Répondu par |
|---|---|
| « À quel point êtes-vous sûr de ce nombre ? » | L’intervalle — leçon 2 |
| « Cette différence est-elle réelle ? » | Le test et ses hypothèses — leçon 3 |
| « Est-ce que cela compte ? » | La taille d’effet dans l’unité de la décision — leçon 4 |
| « Combien de choses avez-vous regardées ? » | Le nombre de tests et la correction — leçon 5 |
L’ordre n’est pas celui dans lequel vous les avez calculées. L’intervalle vient en premier parce que c’est le seul qu’un lecteur puisse confronter à sa propre connaissance du programme, et le nombre de tests vient en dernier parce que c’est celui qu’on oublie de demander.
Les quatre phrases
Toute affirmation statistique d’un rapport peut s’écrire en quatre phrases, et la structure ci-dessous est ce que répète le bloc « rapportez-le en entier » à la fin de chaque leçon.
Un : le nombre et son intervalle. « L’aboutissement des orientations parmi les cas signalant un handicap vaut 26,7 % (IC à 95 % 21,1 à 33,2, n = 202). »
Deux : la comparaison et son test. « C’est 19,4 points en dessous des cas sans handicap signalé (46,2 %, n = 1 436 ; IC à 95 % sur la différence −26,1 à −12,8, test z à deux échantillons, p < 0,001). »
Trois : l’ampleur, dans l’unité de la décision. « Rapportée à la charge de cas 2024, cette différence vaut 39 cas qui auraient atteint un service si l’aboutissement avait égalé celui du reste de la charge. »
Quatre : ce que l’analyse ne peut pas dire. « La comparaison est observationnelle. Les cas ne sont pas randomisés et l’écart peut refléter la façon dont les cas signalant un handicap entrent dans le système plutôt que la façon dont ils y sont traités. »
import pandas as pd
import numpy as np
protection = pd.read_csv("protection-referrals-2024.v1.csv")
consenting = protection[protection["consent_to_refer"]]
disability = consenting["disability_reported"].isin([True, "true", "Yes"])
reached = consenting["referral_accepted"] & consenting["days_to_first_service"].notna()
k, n = reached[disability].sum(), disability.sum()
comparator = reached[~disability].mean()
print(f"cases short of the comparator rate: {comparator * n - k:.0f}")
# Sentence three is arithmetic, and it is the sentence a manager reads.
La troisième phrase est celle que les analystes sautent et dont les responsables ont besoin. Des points de pourcentage ne commandent rien ; trente-neuf cas si.
Corps, annexe et script
Trois endroits, et mettre un nombre au mauvais est l’échec le plus courant d’une section statistique.
Le corps porte l’affirmation. L’estimation, son intervalle, la comparaison, l’effet en unités de programme, et la limite. Cinq lignes par constat, pas plus.
L’annexe porte la machinerie. Noms des tests, statistiques, degrés de liberté, vérifications des hypothèses, nombre de comparaisons lancées, correction appliquée, et les analyses de sous-groupes qui n’ont rien trouvé.
Le script porte la reproduction. Chaque nombre des deux, produit par du code qui tourne à partir du fichier versionné — c’est pourquoi chaque bloc « rapportez-le en entier » de ce cours est imprimé par le script même qui l’a calculé.
def claim(label, k, n, digits=1):
p = k / n
z = 1.96
denom = 1 + z**2 / n
centre = (p + z**2 / (2 * n)) / denom
half = z * np.sqrt(p * (1 - p) / n + z**2 / (4 * n**2)) / denom
return (f"{label}: {p:.{digits}%} "
f"(95% CI {centre - half:.{digits}%} to {centre + half:.{digits}%}, n={n})")
print(claim("Referral completion, disability reported", 54, 202))
# Generate the sentence, do not type it. A typed interval drifts from its number.
Un nombre saisi à la main dans un document est un nombre qui sera faux après la prochaine correction de données. Produire la phrase relève de la même discipline que produire les figures depuis le jeu de données.
Le tableau d’annexe
annex = pd.DataFrame([
{"comparison": "Completion by disability status", "test": "two-sample z",
"statistic": "z = -5.21", "p": "<0.001", "n": "202 vs 1,436",
"effect": "-19.4 pts (CI -26.1 to -12.8)"},
{"comparison": "Over-age by sex", "test": "two-sample z",
"statistic": "z = 1.84", "p": "0.066", "n": "510 vs 542",
"effect": "+5.5 pts (CI -0.4 to +11.3)"},
{"comparison": "Attendance by sex", "test": "two-sample z",
"statistic": "z = 2.28", "p": "0.023", "n": "68,267 marks",
"effect": "+0.56 pts, risk ratio 1.006"},
{"comparison": "Attendance by school feeding", "test": "Welch t, school level",
"statistic": "t = 3.11, df 12.7", "p": "0.008", "n": "15 vs 9 schools",
"effect": "+5.2 pts (CI 1.6 to 8.8)"},
])
print(annex.to_string(index=False))
# One row per test run, including the ones that found nothing.
| Comparaison | Test | Statistique | p | Effet |
|---|---|---|---|---|
| Aboutissement selon le handicap | z à deux échantillons | z = −5,21 | <0,001 | −19,4 pts |
| Retard d’âge selon le sexe | z à deux échantillons | z = 1,84 | 0,066 | +5,5 pts |
| Présence selon le sexe | z à deux échantillons | z = 2,28 | 0,023 | +0,56 pt, RR 1,006 |
| Présence selon la cantine | t de Welch, niveau école | t = 3,11, ddl 12,7 | 0,008 | +5,2 pts |
| Retard d’âge par sexe, 24 écoles | z ×24 | 2 sur 24 à p<0,05 | — | 0 survit à Bonferroni |
Trois de ces cinq lignes sont en annexe et non dans le corps, parce qu’un écart non significatif, une significativité sans portée et une famille de tests nuls sont tous des choses qu’un relecteur doit pouvoir retrouver, et qu’aucune n’est un constat de programme.
Lister les tests qui n’ont rien trouvé est ce qui rend crédibles ceux qui ont trouvé quelque chose. Une annexe ne contenant que des tests réussis dit au relecteur que le compte a été arrangé.
Le paragraphe de limites, écrit depuis le cours
Quatre limites reviennent dans chaque analyse de cette plateforme, et chacune a une forme d’une ligne qui est honnête plutôt que défensive.
Comparaison observationnelle. « Les groupes n’ont pas été randomisés ; les différences peuvent refléter qui entre dans chaque groupe plutôt que ce qui leur arrive. »
Regroupement en grappes. « Le programme est attribué par école, donc l’analyse emploie 24 unités indépendantes. Des statistiques au niveau élève surestimeraient la précision d’un facteur 1,8. »
Comparaisons multiples. « Vingt-quatre tests au niveau école ont été lancés ; 1,2 résultat significatif est attendu par hasard et 2 ont été observés, dont aucun ne survit à la correction. »
Restriction de l’étendue. « La présence de cette cohorte va de 86,7 % à 97,8 % pour la moitié centrale, si bien que cette analyse ne peut rien dire des élèves à faible présence, là où un effet serait attendu. »
Chacune tient en une phrase et chacune devance une question précise. Un paragraphe de limites qui dit « les données comportent des limites » ne devance rien et se lit comme ayant quelque chose à cacher.
Que faire quand le nombre refuse de trancher
Trois des résultats de ce cours sont réellement non tranchés, et chacun appelle une action différente.
| Résultat | Pourquoi il ne tranche pas | Que faire |
|---|---|---|
| Retard d’âge par sexe, p = 0,066 | Sous-puissant pour un écart de 5 points | Le dire ; regrouper avec le passage suivant plutôt que fermer la question |
| Présence et littératie, r = 0,04 | Étendue restreinte | Rapporter le résultat nul et nommer la restriction |
| Cantine et présence, 24 grappes | Peu de grappes, observationnel | Rapporter l’intervalle ; ne pas revendiquer d’effet |
« Les données ne peuvent pas trancher » est un constat sur lequel un programme peut agir, parce que l’action consiste à collecter autrement. Ce n’est pas la même chose que n’avoir rien à rapporter, et la version qui met un programme en difficulté est celle qui rapporte quand même un nombre.
Rapportez-le en entier
Statistical methods
Proportions are reported with Wilson 95% confidence intervals. Group
comparisons use two-sample z-tests for proportions and Welch's t-test for
means. Where a programme is assigned above the level of the observation,
the analysis is conducted at the level of assignment.
Analyses were specified before the data were examined. Where a family of
comparisons was run, the number of tests is stated with the result and a
Bonferroni correction applied.
All figures are generated from the committed dataset files by the scripts
in this annex; no number in this report is typed by hand.
Findings reported in the body: 2. Comparisons run in total: 29.
La dernière ligne est celle qui change la façon dont la section est lue. Deux constats sur vingt-neuf comparaisons est un rapport défendable énoncé ouvertement ; deux constats sans dénominateur est une affirmation qu’un relecteur n’a aucun moyen de peser.
La suite
Les deux cours restants du module 5 poussent plus loin. La régression remplace la discipline « une comparaison à la fois » de ce cours par un modèle qui ajuste sur plusieurs choses en même temps — et hérite de tous les problèmes vus ici, y compris les grappes et les comparaisons multiples. L’évaluation d’impact s’attaque directement à la quatrième phrase : quels protocoles permettent d’écrire ceci a causé cela plutôt que ces deux groupes diffèrent.
Mais la discipline est complète ici. Chaque nombre d’un rapport de programme peut porter un intervalle, une taille d’effet, un nombre de tests et une limite, et le faire coûte quatre phrases. Les cours qui suivent rendent les nombres meilleurs ; celui-ci les rend honnêtes, et aucune dose du premier ne remplace le second.