Leçon 5 sur 8
Unité · Le service est une année, non une journée
74,4 %, 33,9 %, 83,3 %
Trois taux de fonctionnalité issus d'un seul registre, tous exacts. Ils diffèrent parce qu'ils comptent des visites, des points et des personnes, et un seul répond à la question qu'on pose réellement à un programme d'eau.
Ce que rend possible un registre à visites répétées
Toute la première unité est une coupe transversale. Une enquête ménage dit quel service existait le jour où l’enquêteur est passé, et elle ne peut structurellement pas dire combien de temps dans l’année l’eau a été là.
Le registre de suivi le peut, parce qu’il revisite les mêmes points.
import pandas as pd
points = pd.read_csv("water-point-monitoring-2024.v1.csv", parse_dates=["visit_date"])
print(f"visits: {len(points):,}")
print(f"water points: {points['water_point_id'].nunique()}")
print(points["functional_status"].value_counts())
library(dplyr)
points |> summarise(visits = n(), water_points = n_distinct(water_point_id))
points |> count(functional_status)
2 629 visites sur 242 points, en douze tournées mensuelles. Cette structure permet trois taux de fonctionnalité différents, et l’écart entre eux n’est pas une chicane de méthode — ce sont trois questions différentes.
Taux un : la part des visites ayant trouvé un point en service
WORKING = {"functional", "partially-functional"}
working = points["functional_status"].isin(WORKING)
print(f"visit-level functionality: {working.mean():.1%} of {len(points):,} visits")
points |> summarise(functionality = mean(functional_status %in%
c("functional", "partially-functional")), n = n())
74,4 %. C’est ce que publie presque tout rapport sur les points d’eau, et cela répond à « si je visite un point au hasard, sera-t-il en service ? »
C’est le plus facile à calculer et le plus facile à biaiser, parce que le dénominateur est les visites faites et non les visites dues. La leçon 7 y est entièrement consacrée.
Partiellement fonctionnel compte comme en service. Un point qui tourne à débit réduit fournit de l’eau, et le classer en panne mettrait un problème d’attente dans la même catégorie qu’un forage tari. Dites de quel côté de la ligne vous le placez, car des analystes raisonnables divergent et les deux réponses sont écartées de trois points.
Taux deux : la part des points en service à chaque fois
by_point = points.assign(ok=working).groupby("water_point_id")["ok"]
always = by_point.all()
print(f"point-level functionality: {always.mean():.1%} of {len(always)} points")
print(f"points that failed at least once: {(~always).sum()}")
points |>
summarise(always = all(functional_status %in%
c("functional", "partially-functional")), .by = water_point_id) |>
summarise(share = mean(always), n = n())
33,9 % — 82 points sur 242. Deux tiers du parc ont défailli au moins une fois dans l’année.
Cela répond à une autre question : « combien de ces ouvrages sont fiables ? » Et c’est le nombre dont un gestionnaire de patrimoine a besoin, car un point qui fonctionne trois visites sur quatre n’est pas les trois quarts d’une desserte en eau — c’est une desserte trouée qu’un ménage doit combler autrement.
Les deux taux ne se contredisent pas. 74,4 % des visites et 33,9 % des points sont vrais tous les deux, du même fichier, en même temps. Un point peut fonctionner la plupart du temps et défaillir quand même dans l’année, et un parc peut être majoritairement en service et majoritairement peu fiable.
Taux trois : la part des personnes disposant d’un point en service
served = points.dropna(subset=["users_estimated"])
population_weighted = (
served.loc[served["functional_status"].isin(WORKING), "users_estimated"].sum()
/ served["users_estimated"].sum()
)
print(f"population-weighted functionality: {population_weighted:.1%}")
points |>
filter(!is.na(users_estimated)) |>
summarise(weighted = sum(users_estimated[functional_status %in%
c("functional", "partially-functional")]) / sum(users_estimated))
83,3 %, près de neuf points au-dessus du chiffre par visite. La raison est dans les types de source.
print(points.groupby("source_type").agg(
points=("water_point_id", "nunique"),
median_users=("users_estimated", "median"),
functionality=("functional_status", lambda s: s.isin(WORKING).mean()),
).round(3))
points |>
summarise(n = n_distinct(water_point_id),
median_users = median(users_estimated, na.rm = TRUE),
functionality = mean(functional_status %in%
c("functional", "partially-functional")), .by = source_type)
| Type de source | Fonctionnalité | Usagers typiques |
|---|---|---|
| Borne de réseau | 97,2 % | environ 1 290 |
| Forage à pompe manuelle | 75,5 % | environ 280 |
| Source protégée | 66,6 % | environ 200 |
| Puits protégé | 58,1 % | environ 185 |
Les points qui desservent le plus de monde tombent le moins en panne. Pondérer par la population fait donc monter le chiffre, et l’écart entre 74,4 % et 83,3 % est un énoncé réel sur qui supporte les pannes : les usagers des puits protégés, qui sont les moins nombreux par point et les plus mal servis.
Lequel rapporter
Les trois, et c’est un des cas où trois nombres sont vraiment la bonne réponse.
Water point functionality, 2024
Visit-level 74.4% 1,957 of 2,629 monitoring visits
Point-level 33.9% 82 of 242 points working at every visit
Population-weighted 83.3% of an estimated 96,700 users
Partially functional counted as working (134 visits).
Two points were re-registered after a handover and are counted twice;
removing them moves the visit-level figure to 74.7%.
S’il faut n’en donner qu’un, donnez le taux pondéré par la population et dites-le, car le standard porte sur des personnes et non sur des ouvrages. Mais publiez le taux par point à côté, car c’est lui qui dit que le parc n’est pas fiable, et le taux pondéré le masque derrière une poignée de réseaux bien tenus.
Les deux points comptés deux fois
duplicates = points[points["water_point_id"].str.startswith("WP09")]
print(duplicates.groupby("water_point_id")["community"].agg(["nunique", "first"]))
points |> filter(startsWith(water_point_id, "WP09")) |> count(water_point_id)
Deux points ont été transférés d’un programme à un autre et réenregistrés sous de nouveaux identifiants, si bien que le registre les détient deux fois et que chaque dénominateur est trop grand de deux points. L’effet est faible — 74,4 % devient 74,7 % — et la taille de l’effet n’est pas la raison de corriger. Un registre patrimonial qui compte double se trompe sur ce qui existe, et la première chose que l’on en fait ensuite est de planifier un budget de maintenance.
La suite
Deux tiers de ces points ont défailli au moins une fois. Ce nombre traite un forage tari en février exactement comme un point abandonné depuis mars, et la leçon suivante les sépare — au moyen de la séquence des visites plutôt que du champ d’état, car le champ d’état ne peut pas les distinguer.