Atelier · Intermédiaire
Deux figures qui ne peuvent pas dériver
Construisez votre propre petite chaîne de figures, produisez deux graphiques pour un rapport EAH depuis l'enquête versionnée, et démontrez que le dispositif fonctionne en corrigeant le jeu de données et en regardant le graphique et sa légende bouger ensemble.
Un rapport EAH a besoin de deux figures : la couverture par district, et la distribution de la qualité de l’eau. Vous les construirez à travers une chaîne plutôt qu’en les exportant d’un carnet, et le laboratoire est fini quand un changement des données déplace à la fois le graphique et sa légende sans que vous touchiez à l’un ou à l’autre.
Le fichier
wash-household-survey-2024.v1.csv — 2 403 ménages répartis sur trois districts et
dix-huit communautés. Il porte les deux défauts documentés par le cours EAH : un
district écrit de quatre façons, et onze ménages dont la consommation totale a été
saisie dans une colonne par personne.
Préparez d’abord
project/
data/ read-only, the committed CSV
figures.py one function per figure, one main()
outputs/
figures/ generated SVG and the CSV beside each
report.md
Rien n’est dessiné à la main et rien n’est exporté d’un carnet. python figures.py
produit tout ce qui est dans outputs/, et supprimer outputs/ ne coûte rien.
Partie un : le squelette de la chaîne
Écrivez figures.py avec un main() qui crée le répertoire de sortie et appelle
chaque fonction de figure à son tour. Chaque fonction doit :
- lire depuis
data/, jamais depuis une variable définie ailleurs ; - renvoyer ou écrire à la fois un SVG et un CSV des valeurs qu’elle a tracées ;
- ne prendre aucun argument et ne dépendre d’aucun état global.
Testez-le en supprimant outputs/ et en relançant. S’il manque quelque chose, une
figure dépendait d’une chose que le script n’a pas produite.
Partie deux : la couverture par district
Source améliorée, et service de base — améliorée et à moins de trente minutes — par district.
Normalisez d’abord la colonne de district. Le cours EAH a établi que Nord-Ouest
apparaît de quatre façons ; sans regroupement, le pire district se fragmente et aucun
fragment ne paraît alarmant. Faites-le dans la fonction de figure, non en modifiant les
données.
Décidez, et écrivez la décision en commentaire :
- si les deux mesures sont des barres groupées ou deux panneaux ;
- si les districts sont triés par valeur ou laissés dans un ordre fixe ;
- quel est le maximum de l’axe.
Appliquez ensuite la leçon 7. L’axe des valeurs part de zéro parce que ce sont des barres. Si votre graphique est illisible en partant de zéro, le problème est la marque et non l’axe.
Partie trois : la distribution de la qualité de l’eau
E. coli au point de collecte. Le cours de statistiques a établi la forme : moyenne 29,6, médiane 0, 53,6 % des ménages testés exactement à zéro.
C’est le graphique difficile du laboratoire, parce qu’un histogramme d’une distribution gonflée en zéros est une barre énorme et onze invisibles.
Produisez deux versions et gardez la meilleure, avec la raison en commentaire :
- un diagramme en barres des classes de risque — rien de détecté, 1–10, 11–100, plus de 100 ;
- un histogramme en échelle logarithmique, avec les zéros traités explicitement.
Quelle que soit celle que vous gardez, la légende doit énoncer la part à zéro. Un résumé de cette variable qui ne le fait pas est l’échec par lequel le cours de statistiques a commencé.
Partie quatre : les légendes
Écrivez les deux légendes comme des f-strings calculées depuis les mêmes objets d’où les graphiques ont été tracés. Chacune doit porter le constat, le dénominateur, et une chose que la figure n’étaye pas.
caption = (
f"Improved water source against basic service, {n:,} households in "
f"{districts} districts. Counting improved sources overstates coverage in "
f"every district; the gap is households whose source is improved and more "
f"than thirty minutes away."
)
Aucun nombre de l’une ou l’autre légende ne doit être saisi. C’est la propriété que teste la dernière partie.
Partie cinq : démontrez qu’elles ne peuvent pas dériver
Ajoutez une ligne en tête de figures.py :
EXCLUDE_UNIT_ERRORS = True # the 11 households with total litres in a per-person column
Exécutez avec False, relevez chaque nombre des deux légendes, puis passez à True et
relancez.
Chaque nombre affecté, dans les deux graphiques comme dans les deux légendes, doit changer de lui-même. Si une légende dit encore 2 403 ménages après l’exclusion, ce nombre avait été saisi à la main.
Vérifiez vos nombres
| Attendu | |
|---|---|
| Ménages | 2 403 |
| Valeurs de district dans la colonne brute | 6 |
| Après normalisation | 3 |
| Source améliorée — centre / nord-ouest / sud-est | 88,0 % / 72,9 % / 78,2 % |
| Service de base — même ordre | 68,7 % / 48,0 % / 47,4 % |
| E. coli testée | 802 ménages |
| Aucune E. coli détectable | 430, soit 53,6 % |
| 1–10 / 11–100 / plus de 100 | 173 / 139 / 60 |
| Ménages au-dessus de 80 litres par personne | 11 |
Si vos chiffres de source améliorée diffèrent selon le district mais pas vos chiffres de service de base, le filtre des trente minutes est appliqué à la mauvaise colonne.
Les questions à traiter en prose
Trois phrases chacune.
1. Vous avez choisi entre des barres par classes et un histogramme logarithmique pour E. coli. Nommez le choix, et dites ce qu’un lecteur retiendrait de la version que vous avez rejetée et qui n’est pas vrai.
2. La colonne de district avait six valeurs pour trois districts. Expliquez pourquoi normaliser à l’intérieur de la fonction de figure vaut mieux que corriger le CSV, en termes de ce que chaque choix signifie pour la prochaine personne qui exécutera la chaîne.
3. Passer EXCLUDE_UNIT_ERRORS à True a changé certains nombres et pas d’autres.
Listez lesquels, et dites ce que cela vous apprend sur les figures que les onze lignes
influençaient.
Ce qu’il faut rendre
figures.py, exécutable depuis une copie propre parpython figures.py- deux SVG et deux CSV dans
outputs/figures/ report.mdavec les deux figures, leurs légendes, et une note méthodologique dans la forme du « rapportez-le en entier » de la leçon 8- un tableau avant-après montrant quels nombres ont bougé quand l’exclusion a été appliquée
- les trois réponses en prose
Comment savoir que c’est fini
Supprimez outputs/, relancez, tout se régénère. Ouvrez ensuite le CSV auprès de
chaque figure et vérifiez que chaque nombre de la légende y figure. Un nombre de
légende absent du CSV de sa propre figure vient d’ailleurs, et c’est l’échec que tout ce
dispositif sert à prévenir.
Ce que ce laboratoire n’est pas
Ce n’est pas une leçon de matplotlib. N’importe quelle bibliothèque de tracé fait cela, et le dispositif compte plus que l’outil — les figures de la plateforme elle-même n’emploient aucune bibliothèque de tracé et émettent du SVG directement, ce qui est un choix légitime pour deux types de graphique et mauvais pour vingt.
Ce n’est pas non plus une analyse EAH. L’écart de couverture et la distribution d’E. coli sont deux constats établis par les cours EAH et statistiques ; ils sont ici le matériau, et le livrable est la chaîne qui garde les graphiques honnêtes à leur sujet.