cassionAnalyse de données

Retour à la leçonLeçon 5 sur 8Le service est une année, non une journée

74,4 %, 33,9 %, 83,3 %

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

    Ce que couvre cette leçon

    • Ce que rend possible un registre à visites répétées
    • Taux un : la part des visites ayant trouvé un point en service
    • Taux deux : la part des points en service à chaque fois
    • Taux trois : la part des personnes disposant d'un point en service
    • Lequel rapporter
    • Les deux points comptés deux fois
    • La suite
    Notes du présentateur
    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.
  2. Diapositive 2 / 22

    Ce que rend possible un registre à visites répétées — En Python

    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())
    Notes du présentateur
    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.
  3. Diapositive 3 / 22

    Ce que rend possible un registre à visites répétées — En R

    library(dplyr)
    
    points |> summarise(visits = n(), water_points = n_distinct(water_point_id))
    points |> count(functional_status)
    Notes du présentateur
    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.
  4. Diapositive 4 / 22

    Taux un : la part des visites ayant trouvé un point en service — En Python

    WORKING = {"functional", "partially-functional"}
    working = points["functional_status"].isin(WORKING)
    
    print(f"visit-level functionality: {working.mean():.1%} of {len(points):,} visits")
  5. Diapositive 5 / 22

    Taux un : la part des visites ayant trouvé un point en service — En R

    points |> summarise(functionality = mean(functional_status %in%
                        c("functional", "partially-functional")), n = n())
  6. Diapositive 6 / 22

    Taux un : la part des visites ayant trouvé un point en service

    • 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…
    • Partiellement fonctionnel compte comme en service — Un point qui tourne à débit réduit fournit de l'eau, et le classer…
    Notes du présentateur
    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.
  7. Diapositive 7 / 22

    Taux deux : la part des points en service à chaque fois — En Python

    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()}")
  8. Diapositive 8 / 22

    Taux deux : la part des points en service à chaque fois — En R

    points |>
      summarise(always = all(functional_status %in%
                c("functional", "partially-functional")), .by = water_point_id) |>
      summarise(share = mean(always), n = n())
  9. Diapositive 9 / 22

    Taux deux : la part des points en service à chaque fois

    • 33,9 % — 82 points sur 242
    • Les deux taux ne se contredisent pas — 74,4 % des visites et 33,9 % des points sont vrais tous les deux, du même…
    Notes du présentateur
    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.
  10. Diapositive 10 / 22

    Taux trois : la part des personnes disposant d'un point en service — En Python

    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%}")
  11. Diapositive 11 / 22

    Taux trois : la part des personnes disposant d'un point en service — En R

    points |>
      filter(!is.na(users_estimated)) |>
      summarise(weighted = sum(users_estimated[functional_status %in%
                c("functional", "partially-functional")]) / sum(users_estimated))
  12. Diapositive 12 / 22

    Taux trois : la part des personnes disposant d'un point en service

    • 83,3 % — près de neuf points au-dessus du chiffre par visite
    Notes du présentateur
    83,3 %, près de neuf points au-dessus du chiffre par visite. La raison est dans les types de source.
  13. Diapositive 13 / 22

    Taux trois : la part des personnes disposant d'un point en service — En Python

    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))
  14. Diapositive 14 / 22

    Taux trois : la part des personnes disposant d'un point en service — En R

    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)
  15. Diapositive 15 / 22

    Taux trois : la part des personnes disposant d'un point en service

    Type de sourceFonctionnalitéUsagers typiques
    Borne de réseau97,2 %environ 1 290
    Forage à pompe manuelle75,5 %environ 280
    Source protégée66,6 %environ 200
    Puits protégé58,1 %environ 185
  16. Diapositive 16 / 22

    Taux trois : la part des personnes disposant d'un point en service

    • Les points qui desservent le plus de monde tombent le moins en panne — Pondérer par la population fait donc monter le…
    Notes du présentateur
    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.
  17. Diapositive 17 / 22

    Lequel rapporter — Exemple

    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%.
    Notes du présentateur
    Les trois, et c'est un des cas où trois nombres sont vraiment la bonne réponse.
  18. Diapositive 18 / 22

    Lequel rapporter

    • 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…
    Notes du présentateur
    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.
  19. Diapositive 19 / 22

    Les deux points comptés deux fois — En Python

    duplicates = points[points["water_point_id"].str.startswith("WP09")]
    print(duplicates.groupby("water_point_id")["community"].agg(["nunique", "first"]))
  20. Diapositive 20 / 22

    Les deux points comptés deux fois — En R

    points |> filter(startsWith(water_point_id, "WP09")) |> count(water_point_id)
    Notes du présentateur
    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.
  21. Diapositive 21 / 22

    La suite

    • Deux tiers de ces points ont défailli au moins une fois.
    Notes du présentateur
    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.
  22. Diapositive 22 / 22

    La suite

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