cassionAnalyse de données

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

Tari n'est pas en panne

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

    • Un seul état, plusieurs défaillances différentes
    • Le signal saisonnier, et là où il n'est pas
    • Classer chaque point à partir de sa propre séquence
    • La valeur d'état qui ressemble à la réponse sans l'être
    • La durée d'arrêt est une statistique de gestion
    • Rapportez les formes, non le seul taux
    • La suite
    Notes du présentateur
    Les puits protégés tournent à 74,7 % en saison humide et à 36,4 % en saison sèche. Les forages à pompe manuelle ne bougent presque pas. Le champ d'état ne distingue pas ces deux défaillances, la séquence des visites le peut.
  2. Diapositive 2 / 22

    Un seul état, plusieurs défaillances différentes

    Forme sur l'annéeCe que c'estQue faire
    À l'arrêt les mêmes mois chaque année, en service entre-tempsSaisonnier — la source se taritApprofondir, ou prévoir une alternative de saison sèche
    À l'arrêt une fois, puis en service après un intervallePanne — réparéeRegarder la longueur de l'intervalle
    À l'arrêt et le reste jusqu'à la finAbandonné ou en attente de piècesDéterminer lequel ; ce n'est pas la même chose
    En service et à l'arrêt à répétitionChronique — sous-entretenu ou surchargéProblème de gestion, non d'ouvrage
    Notes du présentateur
    functional_status dit qu'un point ne fonctionne pas. Il ne dit pas si la pompe est cassée, si la nappe a baissé, si le comité a cessé de percevoir les redevances, ou si la communauté est partie. Ces cas appellent quatre réponses différentes et l'une d'elles n'est pas une réparation. La séquence des visites peut les séparer, parce qu'ils ont des formes différentes dans le temps.
  3. Diapositive 3 / 22

    Le signal saisonnier, et là où il n'est pas — En Python

    import pandas as pd
    
    points = pd.read_csv("water-point-monitoring-2024.v1.csv", parse_dates=["visit_date"])
    WORKING = {"functional", "partially-functional"}
    DRY_MONTHS = {1, 2, 3, 11, 12}
    
    points["dry_season"] = points["visit_date"].dt.month.isin(DRY_MONTHS)
    points["ok"] = points["functional_status"].isin(WORKING)
    
    print(points.groupby("dry_season")["ok"].agg(["mean", "size"]).round(3))
  4. Diapositive 4 / 22

    Le signal saisonnier, et là où il n'est pas — En R

    library(dplyr)
    
    points |>
      mutate(dry = lubridate::month(visit_date) %in% c(1, 2, 3, 11, 12),
             ok = functional_status %in% c("functional", "partially-functional")) |>
      summarise(functionality = mean(ok), n = n(), .by = dry)
  5. Diapositive 5 / 22

    Le signal saisonnier, et là où il n'est pas

    • 67,8 % en saison sèche contre 79,4 % en saison humide — Onze points d'écart, qu'un rapport comparant une évaluation de…
    Notes du présentateur
    67,8 % en saison sèche contre 79,4 % en saison humide. Onze points d'écart, qu'un rapport comparant une évaluation de mars à une de juillet lirait comme un effondrement ou comme un redressement selon le sens de la soustraction. Ventilez maintenant par type de source, où se trouve réellement le constat.
  6. Diapositive 6 / 22

    Le signal saisonnier, et là où il n'est pas — En Python

    seasonal = (
        points.groupby(["source_type", "dry_season"])["ok"].mean().unstack()
    )
    seasonal.columns = ["wet", "dry"]
    seasonal["swing"] = seasonal["wet"] - seasonal["dry"]
    print((seasonal * 100).round(1).sort_values("swing", ascending=False))
  7. Diapositive 7 / 22

    Le signal saisonnier, et là où il n'est pas — En R

    points |>
      summarise(functionality = mean(ok), .by = c(source_type, dry)) |>
      tidyr::pivot_wider(names_from = dry, values_from = functionality)
  8. Diapositive 8 / 22

    Le signal saisonnier, et là où il n'est pas

    Type de sourceHumideSècheÉcart
    Puits protégé74,7 %36,4 %38,3
    Source protégée84,8 %41,0 %43,8
    Forage à pompe manuelle75,0 %76,1 %−1,1
    Borne de réseau95,9 %98,8 %−2,9
  9. Diapositive 9 / 22

    Le signal saisonnier, et là où il n'est pas

    • Deux types de source portent tout l'effet saisonnier et deux ne bougent pas du tout — Les puits peu profonds et les…
    Notes du présentateur
    Deux types de source portent tout l'effet saisonnier et deux ne bougent pas du tout. Les puits peu profonds et les sources puisent dans une nappe qui baisse ; un forage descend en dessous et un réseau dispose d'un réservoir. Les onze points de moyenne étaient un mélange d'un effet de quarante points et d'aucun effet. C'est là le constat. Les forages de ce parc n'ont pas de problème saisonnier et les puits en ont un, si bien qu'un programme de saison sèche qui réhabilite des forages réhabilite le mauvais ouvrage.
  10. Diapositive 10 / 22

    Classer chaque point à partir de sa propre séquence — En Python

    def classify(group):
        group = group.sort_values("visit_date")
        failures = group.loc[~group["ok"]]
        if failures.empty:
            return "never failed"
        if not group["ok"].tail(3).any() and len(group) >= 3:
            return "down at year end"
        if failures["dry_season"].all():
            return "seasonal"
        return "intermittent"
    
    shape = points.groupby("water_point_id").apply(classify, include_groups=False)
    print(shape.value_counts())
  11. Diapositive 11 / 22

    Classer chaque point à partir de sa propre séquence — En R

    points |>
      arrange(visit_date) |>
      summarise(
        shape = case_when(
          all(ok) ~ "never failed",
          !any(tail(ok, 3)) & n() >= 3 ~ "down at year end",
          all(dry[!ok]) ~ "seasonal",
          TRUE ~ "intermittent"
        ), .by = water_point_id) |>
      count(shape)
  12. Diapositive 12 / 22

    Classer chaque point à partir de sa propre séquence

    FormePoints
    Jamais défailli82
    Intermittent80
    Saisonnier46
    À l'arrêt en fin d'année34
  13. Diapositive 13 / 22

    Classer chaque point à partir de sa propre séquence

    • L'ordre des tests compte et c'est un jugement, non un détail — Un point qui ne défaille qu'en mois secs et qui est…
    • Notez l'ordre employé — Deux analystes avec le même fichier et des ordres différents produiront des effectifs…
    Notes du présentateur
    L'ordre des tests compte et c'est un jugement, non un détail. Un point qui ne défaille qu'en mois secs et qui est encore à l'arrêt en décembre satisfait les deux règles. Tester la permanence d'abord l'appelle abandonné ; tester la saisonnalité d'abord l'appelle saisonnier. Ce code teste la permanence d'abord, parce qu'un point qui n'a pas tourné depuis trois visites est un problème opérationnel maintenant quelle qu'en soit la cause — et parce que la lecture de décembre est celle sur laquelle un plan de janvier s'écrit. Notez l'ordre employé. Deux analystes avec le même fichier et des ordres différents produiront des effectifs différents et auront tous deux raison.
  14. Diapositive 14 / 22

    La valeur d'état qui ressemble à la réponse sans l'être — En Python

    ever_abandoned = points.loc[points["functional_status"].eq("abandoned"),
                                "water_point_id"].nunique()
    print(f"points ever recorded as abandoned: {ever_abandoned}")
    print(f"points down at the end of the year: 34")
    Notes du présentateur
    Le registre comporte un état abandoned, et il est tentant de l'employer directement.
  15. Diapositive 15 / 22

    La valeur d'état qui ressemble à la réponse sans l'être — En R

    points |> filter(functional_status == "abandoned") |>
      summarise(points = n_distinct(water_point_id))
  16. Diapositive 16 / 22

    La valeur d'état qui ressemble à la réponse sans l'être

    • Dérivez l'état de l'historique là où vous le pouvez, et employez l'état enregistré comme recoupement — Un champ qu'un…
    Notes du présentateur
    Dix-sept points sont enregistrés comme abandonnés lors d'une visite ; trente-quatre sont encore à l'arrêt en fin d'année. L'état est le jugement d'un enquêteur porté à une visite, et la séquence est une preuve. La moitié des points qui ne reviennent jamais n'ont jamais été étiquetés abandonnés, parce que l'enquêteur qui les a vus en juillet n'avait aucun moyen de savoir qu'ils seraient encore à l'arrêt en décembre. Dérivez l'état de l'historique là où vous le pouvez, et employez l'état enregistré comme recoupement. Un champ qu'un enquêteur remplit à partir d'une observation unique ne peut pas porter une information qui n'existe qu'à travers plusieurs observations.
  17. Diapositive 17 / 22

    La durée d'arrêt est une statistique de gestion — En Python

    down = points.loc[~points["ok"] & points["days_since_breakdown"].notna()]
    print(down.groupby("management")["days_since_breakdown"].agg(
        median="median", visits="size"
    ).sort_values("median"))
  18. Diapositive 18 / 22

    La durée d'arrêt est une statistique de gestion — En R

    points |>
      filter(!ok, !is.na(days_since_breakdown)) |>
      summarise(median_days = median(days_since_breakdown), n = n(), .by = management)
  19. Diapositive 19 / 22

    La durée d'arrêt est une statistique de gestion

    GestionJours d'arrêt médians à la visite
    Opérateur privé29
    Service public32
    Géré par une ONG48
    Comité communautaire68
    Notes du présentateur
    Un point en panne sous comité communautaire est à l'arrêt depuis plus de deux fois plus longtemps qu'un point sous opérateur privé. C'est le seul nombre du registre qui désigne une action plutôt qu'un ouvrage — la différence tient à une chaîne d'approvisionnement en pièces et à un fonds d'entretien, non à la pompe. Méfiez-vous des trente-sept lignes où un point est enregistré comme fonctionnel et porte malgré tout un days_since_breakdown : c'est la réponse du mois précédent reportée. Filtrez sur l'état, non sur la présence du champ.
  20. Diapositive 20 / 22

    Rapportez les formes, non le seul taux — Exemple

    Water point failure, 2024, 242 points
    
      Never failed                82    33.9%
      Intermittent                80    33.1%
      Seasonal (dry months only)  46    19.0%
      Down at year end            34    14.0%
    
      Seasonality is concentrated in protected wells (74.7% wet, 36.4% dry) and
      protected springs (84.8% wet, 41.0% dry). Handpump boreholes and piped
      schemes show no seasonal effect.
    
      Points classified as down at year end if not working at any of the last
      three visits; seasonal if every recorded failure fell in a dry month.
      Permanence tested before seasonality.
    Notes du présentateur
    Quatre effectifs et la règle qui les a produits. Un pourcentage de fonctionnalité unique enverrait un budget de réhabilitation vers les mauvais quarante-six points, car ils n'ont pas besoin d'être réhabilités — il leur faut une alternative de saison sèche, et leurs pompes vont bien.
  21. Diapositive 21 / 22

    La suite

    • Chaque nombre de cette leçon est calculé sur les visites qui ont été faites.
    Notes du présentateur
    Chaque nombre de cette leçon est calculé sur les visites qui ont été faites. Un district a manqué un tiers de ses tournées en saison des pluies, et les points manqués n'étaient pas un tiers au hasard — c'est la leçon suivante, et la raison pour laquelle sa fonctionnalité semble s'améliorer quand les routes se ferment.
  22. Diapositive 22 / 22

    La suite

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