cassionAnalyse de données

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.

PythonVotre propre machine180 min

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 par python figures.py
  • deux SVG et deux CSV dans outputs/figures/
  • report.md avec 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.