cassionAnalyse de données

Retour à la leçonLeçon 1 sur 8Regardez-la d'abord

Une moyenne de 29,6 et une médiane de zéro

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

    Ce que couvre cette leçon

    • Calculez le résumé en dernier
    • Regardez la forme
    • Trois formes et ce que chacune exige
    • Quand l'asymétrie est l'erreur de données
    • Ce qu'il faut rapporter pour chaque forme
    • L'histogramme qu'il faut toujours tracer
    • La suite
    Notes du présentateur
    Le dénombrement moyen d'E. coli dans les ménages testés vaut 29,6 UFC/100 mL. La médiane vaut 0. Plus de la moitié de l'échantillon n'a aucune contamination détectable, et la moyenne décrit une queue qui monte à 608.
  2. Diapositive 2 / 27

    Calculez le résumé en dernier — En Python

    import pandas as pd
    
    wash = pd.read_csv("wash-household-survey-2024.v1.csv")
    ecoli = wash["ecoli_cfu_100ml"].dropna()
    
    print(ecoli.describe().round(1))
  3. Diapositive 3 / 27

    Calculez le résumé en dernier — En R

    library(dplyr)
    
    wash |> filter(!is.na(ecoli_cfu_100ml)) |>
      summarise(n = n(), mean = mean(ecoli_cfu_100ml),
                median = median(ecoli_cfu_100ml), sd = sd(ecoli_cfu_100ml))
  4. Diapositive 4 / 27

    Calculez le résumé en dernier

    Valeur
    n802
    Moyenne29,6
    Médiane0,0
    Écart-type85,6
    Maximum608
  5. Diapositive 5 / 27

    Calculez le résumé en dernier

    • La moyenne vaut 29,6 et la médiane 0 — Ces deux nombres décrivent les mêmes 802 ménages, et un seul des deux en décrit…
    Notes du présentateur
    La moyenne vaut 29,6 et la médiane 0. Ces deux nombres décrivent les mêmes 802 ménages, et un seul des deux en décrit un. Plus de la moitié des ménages testés n'ont aucune E. coli détectable. La moyenne est ce qu'on obtient en moyennant un grand groupe de zéros avec un petit groupe de très grands nombres, et elle atterrit dans une zone où presque personne ne se trouve.
  6. Diapositive 6 / 27

    Regardez la forme — En Python

    bins = [-1, 0, 10, 100, 1000]
    labels = ["0 (none detected)", "1-10", "11-100", ">100"]
    print(pd.cut(ecoli, bins, labels=labels).value_counts().reindex(labels))
    print(f"\nskew: {ecoli.skew():.2f}")
  7. Diapositive 7 / 27

    Regardez la forme — En R

    wash |> filter(!is.na(ecoli_cfu_100ml)) |>
      count(band = cut(ecoli_cfu_100ml, c(-1, 0, 10, 100, Inf)))
  8. Diapositive 8 / 27

    Regardez la forme

    BandeMénagesPart
    0 — rien de détecté43053,6 %
    1–1017321,6 %
    11–10013917,3 %
    >100607,5 %
  9. Diapositive 9 / 27

    Regardez la forme

    • Asymétrie +4,04 — Une distribution symétrique a une asymétrie proche de zéro ; au-delà d'environ +1, la moyenne et la…
    • C'est pourquoi le cours EAH rapportait des classes de risque et non une moyenne — Les classes ne sont pas un choix de…
    Notes du présentateur
    Asymétrie +4,04. Une distribution symétrique a une asymétrie proche de zéro ; au-delà d'environ +1, la moyenne et la médiane répondent à des questions différentes. C'est pourquoi le cours EAH rapportait des classes de risque et non une moyenne. Les classes ne sont pas un choix de présentation — ce sont le seul résumé qui survit à une distribution de cette forme.
  10. Diapositive 10 / 27

    Trois formes et ce que chacune exige — En Python (suite)

    import numpy as np
    
    def profile(series, name):
        s = series.dropna()
        return {
            "indicator": name, "n": len(s),
            "mean": round(s.mean(), 1), "median": round(s.median(), 1),
            "skew": round(s.skew(), 2),
        }
    
    points = pd.read_csv("water-point-monitoring-2024.v1.csv")
    protection = pd.read_csv("protection-referrals-2024.v1.csv")
    
    print(pd.DataFrame([
        profile(wash["ecoli_cfu_100ml"], "E. coli, CFU/100mL"),
        profile(points["days_since_breakdown"], "days a water point is down"),
    Notes du présentateur
    Passez les mêmes trois nombres sur quatre indicateurs de quatre cours et le motif saute aux yeux.
  11. Diapositive 11 / 27

    Trois formes et ce que chacune exige — En Python (suite)

        profile(protection["days_to_first_service"], "days to first service"),
        profile(wash["litres_per_person_day"], "litres per person per day"),
    ]))
  12. Diapositive 12 / 27

    Trois formes et ce que chacune exige — En R

    # One function, four indicators, four different answers about which summary
    # to report.
  13. Diapositive 13 / 27

    Trois formes et ce que chacune exige

    IndicateurnMoyenneMédianeAsymétrie
    E. coli, UFC/100 mL80229,60,0+4,04
    Jours d'arrêt d'un point d'eau709125,756,0+1,64
    Jours jusqu'au premier service72810,19,0+0,52
    Litres par personne et par jour2 40324,223,7+8,54
  14. Diapositive 14 / 27

    Trois formes et ce que chacune exige

    • Le délai jusqu'au premier service est presque symétrique — moyenne 10,1, médiane 9,0, asymétrie +0,52
    • Les jours d'arrêt d'un point d'eau sont fortement asymétriques à droite — une moyenne de 125,7 contre une médiane de…
    • Les litres par personne et par jour paraissent presque symétriques et portent une asymétrie de +8,54 — C'est cette…
    Notes du présentateur
    Le délai jusqu'au premier service est presque symétrique — moyenne 10,1, médiane 9,0, asymétrie +0,52. Une moyenne est un résumé honnête et un écart-type signifie quelque chose. Les jours d'arrêt d'un point d'eau sont fortement asymétriques à droite — une moyenne de 125,7 contre une médiane de 56, parce qu'une poignée de points abandonnés sont en panne depuis plus de 600 jours. Rapportez la médiane et les quartiles. Les litres par personne et par jour paraissent presque symétriques et portent une asymétrie de +8,54. C'est cette combinaison qui est intéressante.
  15. Diapositive 15 / 27

    Quand l'asymétrie est l'erreur de données — En Python

    litres = wash["litres_per_person_day"].dropna()
    print(f"median {litres.median():.1f}, p90 {litres.quantile(0.90):.1f}, "
          f"max {litres.max():.1f}")
    print(f"above 80: {(litres > 80).sum()} households")
  16. Diapositive 16 / 27

    Quand l'asymétrie est l'erreur de données — En R

    wash |> summarise(median = median(litres_per_person_day),
                      p90 = quantile(litres_per_person_day, 0.9),
                      max = max(litres_per_person_day))
  17. Diapositive 17 / 27

    Quand l'asymétrie est l'erreur de données — En Python

    clean = litres[litres <= 80]
    print(f"after removing 11 rows: skew {clean.skew():.2f}, "
          f"mean {clean.mean():.1f}, median {clean.median():.1f}")
    Notes du présentateur
    Médiane 23,7, quatre-vingt-dixième centile 33,7, maximum 277,6. La statistique d'asymétrie ne décrit pas la population ; elle détecte onze mauvaises lignes. Ces onze sont les ménages dont la consommation totale a été saisie dans une colonne par personne — le défaut qu'enseignait le cours EAH. Il arrive ici par l'autre bout : une asymétrie très en décalage avec l'écart interquartile est un signal de qualité des données avant d'être un constat de distribution.
  18. Diapositive 18 / 27

    Quand l'asymétrie est l'erreur de données — En R

    # Recompute after the correction and see whether the shape was real.
  19. Diapositive 19 / 27

    Quand l'asymétrie est l'erreur de données

    • Onze lignes sur 2 403 et l'asymétrie passe de +8,54 à +0,06 — Moyenne 23,5, médiane 23,6 — une distribution symétrique…
    • Calculez l'asymétrie, puis décidez si c'est un constat ou un bogue — Les deux sont courants et se distinguent en…
    Notes du présentateur
    Onze lignes sur 2 403 et l'asymétrie passe de +8,54 à +0,06. Moyenne 23,5, médiane 23,6 — une distribution symétrique depuis le début, portant une forme qui appartenait entièrement à une erreur d'unité. Calculez l'asymétrie, puis décidez si c'est un constat ou un bogue. Les deux sont courants et se distinguent en regardant les valeurs extrêmes, non en regardant la statistique.
  20. Diapositive 20 / 27

    Ce qu'il faut rapporter pour chaque forme

    FormeRapportezNe rapportez pas
    À peu près symétriqueMoyenne et écart-type—
    Asymétrique à droiteMédiane et écart interquartileUne moyenne sans la médiane à côté
    Gonflée en zérosLa part à zéro, puis la distribution du resteUne moyenne, tout court
    Proportion bornéeLa proportion et son intervalleUn écart-type
  21. Diapositive 21 / 27

    Ce qu'il faut rapporter pour chaque forme

    • E. coli est gonflée en zéros — ce qui est un cas distinct de la simple asymétrie : 53,6 % de l'échantillon se trouve…
    Notes du présentateur
    E. coli est gonflée en zéros, ce qui est un cas distinct de la simple asymétrie : 53,6 % de l'échantillon se trouve exactement sur une valeur, et aucun résumé continu ne décrit cela. Le rapport en deux parties — combien sont à zéro, et parmi les autres, à quel point — est le seul honnête.
  22. Diapositive 22 / 27

    Ce qu'il faut rapporter pour chaque forme — Exemple

    E. coli at point of collection, 802 households tested
    
      No detectable E. coli        53.6%   430 households
      Among the 372 with any detected:
        median                     13 CFU/100 mL
        interquartile range        5 to 49
        maximum                    608
    
      Mean over all 802 households is 29.6 CFU/100 mL. It is not reported as a
      summary because 53.6% of the sample sits at zero and the mean falls in a
      range occupied by almost no household.
  23. Diapositive 23 / 27

    L'histogramme qu'il faut toujours tracer — En Python

    import matplotlib.pyplot as plt
    
    fig, axes = plt.subplots(1, 2, figsize=(9, 3))
    axes[0].hist(ecoli, bins=40)
    axes[0].set_title("E. coli, raw")
    axes[1].hist(np.log1p(ecoli), bins=40)
    axes[1].set_title("log(1 + E. coli)")
    plt.tight_layout()
  24. Diapositive 24 / 27

    L'histogramme qu'il faut toujours tracer — En R

    hist(wash$ecoli_cfu_100ml, breaks = 40)
    hist(log1p(wash$ecoli_cfu_100ml), breaks = 40)
  25. Diapositive 25 / 27

    L'histogramme qu'il faut toujours tracer

    • Tracez-le avant de résumer, à chaque fois, et ne le mettez pas dans le rapport — L'histogramme est un instrument pour…
    • Deux minutes d'observation auraient évité chaque erreur de cette leçon — et c'est tout l'argument en faveur de cette…
    Notes du présentateur
    Tracez-le avant de résumer, à chaque fois, et ne le mettez pas dans le rapport. L'histogramme est un instrument pour vous, non un constat pour le lecteur — son rôle est de vous dire quel résumé est honnête, et une fois qu'il l'a fait, le résumé entre et l'histogramme reste dehors. Deux minutes d'observation auraient évité chaque erreur de cette leçon, et c'est tout l'argument en faveur de cette habitude.
  26. Diapositive 26 / 27

    La suite

    • Vous savez maintenant quel nombre unique décrit un indicateur.
    Notes du présentateur
    Vous savez maintenant quel nombre unique décrit un indicateur. La leçon suivante porte sur l'ampleur de son erreur possible, et sur la notation qui la transporte dans une phrase sur laquelle un lecteur peut agir.
  27. Diapositive 27 / 27

    La suite

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