cassionAnalyse de données

Retour à la leçonLeçon 8 sur 8La trace qui vous survit

Le journal qui répond à la question avant qu'elle soit posée

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

    Ce que couvre cette leçon

    • La question qui vous sera posée
    • Un journal est un tableau, pas un récit
    • Les sept colonnes, et ce qui justifie chacune
    • Produisez-le à partir du code
    • Le tableau avant-après est le livrable
    • Ce qui ne doit pas figurer dans le journal
    • Où vit le journal
    • L'annexe dont le rapport a besoin
    • Ce que ce cours vous laisse
    Notes du présentateur
    Une ligne par règle appliquée — laquelle, combien de lignes touchées, ce qui a changé, qui a validé. Produit par le code plutôt que rédigé après coup, et livré comme l'annexe qui met fin au débat.
  2. Diapositive 2 / 19

    La question qui vous sera posée

    • Lors d'une visite de suivi d'un bailleur — *« Votre charge de cas a baissé de 4 % entre le projet et le rapport final.…
    • Par le responsable de programme — *« Le trimestre dernier Gros-Morne était deuxième plus touchée. Elle est maintenant…
    • Par votre successeur, dans un courriel — « Il y a ici un script qui supprime des lignes. Savez-vous pourquoi ? »
    Notes du présentateur
    Elle arrive sous l'une de trois formes et elle arrive toujours. Chacune trouve réponse en trente secondes avec un journal de nettoyage, et pas du tout sans. Cette leçon est ce journal.
  3. Diapositive 3 / 19

    Un journal est un tableau, pas un récit

    • Une ligne par règle appliquée. Chaque ligne porte un compte
    Notes du présentateur
    Le réflexe est d'écrire un paragraphe dans la section méthodologie. Un paragraphe ne se compte pas, ne se compare pas au trimestre précédent et ne se vérifie pas. Une ligne par règle appliquée. Chaque ligne porte un compte.
  4. Diapositive 4 / 19

    Un journal est un tableau, pas un récit

    règlegravitélignesactioneffet sur l'indicateurdécidé pardate
    muac-rangeerror7excluesMAG 8,62 % à 8,63 %R. Cassion2026-07-14
    exact-duplicateerror12un exemplaire gardécharge 366 à 360R. Cassion2026-07-14
    re-registrationwarning6fusionnées après relecturecharge 360 à 354M. Joseph, superviseur2026-07-16
    oedema-yn-codingwarning25recodées en falseMAG inchangéeR. Cassion2026-07-14
    age-missingnote226gardées, signaléestableau par âge seulementR. Cassion2026-07-14
    district-mappingwarning75rattachées à HT07Nord-Ouest 14,7 % à 15,0 %A. Pierre, bureau terrain2026-07-15
    Notes du présentateur
    Lisez la colonne lignes de haut en bas et vous avez toute l'histoire de ce fichier. Lisez la colonne effet sur l'indicateur et vous avez la réponse à la question du bailleur, par avance.
  5. Diapositive 5 / 19

    Les sept colonnes, et ce qui justifie chacune

    • règle — l'identifiant de la table de règles de la leçon 5, pour que le journal et le code emploient le même nom. Si…
    • gravité — ce que le contrôle signifiait, pour qu'un lecteur puisse survoler jusqu'aux erreurs.
    • lignes — le compte. Ni « quelques-unes », ni « des valeurs aberrantes ». Un nombre.
    • action — exclues, corrigées, recodées, fusionnées, gardées et signalées. Cinq verbes couvrent presque…
    • effet sur l'indicateur — l'avant et l'après. C'est la colonne que l'on saute et la seule qu'un bailleur lise.
    • décidé par — une personne. Pas « l'équipe ». La règle sans nom en face est celle qui se révèle fausse.
  6. Diapositive 6 / 19

    Les sept colonnes, et ce qui justifie chacune (suite)

    • date — quand, pour que le journal se lise en regard de la version du résultat qu'il a produite.
  7. Diapositive 7 / 19

    Produisez-le à partir du code — En Python (suite)

    LOG = []
    
    
    def apply_step(df, rule, mask, action, note=""):
        before = indicator(df)
        if action == "exclude":
            out = df[~mask]
        elif action == "flag":
            out = df.assign(**{f"flag_{rule}": mask})
        else:
            raise ValueError(action)
        after = indicator(out)
    
        LOG.append({
            "rule": rule,
            "rows": int(mask.sum()),
    Notes du présentateur
    Un journal rédigé après coup, de mémoire, est une fiction, et il est toujours plus court que la vérité. Faites en sorte que chaque étape de nettoyage renvoie sa propre ligne de journal.
  8. Diapositive 8 / 19

    Produisez-le à partir du code — En Python (suite)

            "action": action,
            "before": before,
            "after": after,
            "effect": round(after - before, 4),
            "note": note,
        })
        return out
    
    
    muac = apply_step(muac, "muac-range", ~muac["muac_mm"].between(80, 220), "exclude")
    muac = apply_step(muac, "age-missing", muac["age_months"].isna(), "flag",
                      "kept; age-disaggregated tables only")
    
    log = pd.DataFrame(LOG)
    log.to_csv("outputs/cleaning-log.csv", index=False)
  9. Diapositive 9 / 19

    Produisez-le à partir du code — En R (suite)

    LOG <- list()
    
    apply_step <- function(df, rule, mask, action, note = "") {
      before <- indicator(df)
      out <- switch(action,
        exclude = df[!mask, ],
        flag    = dplyr::mutate(df, "flag_{rule}" := mask),
        stop("unknown action: ", action)
      )
      after <- indicator(out)
    
      LOG[[length(LOG) + 1]] <<- tibble::tibble(
        rule = rule, rows = sum(mask, na.rm = TRUE), action = action,
        before = before, after = after, effect = round(after - before, 4), note = note
      )
      out
  10. Diapositive 10 / 19

    Produisez-le à partir du code — En R (suite)

    }
    
    muac <- apply_step(muac, "muac-range", !dplyr::between(muac$muac_mm, 80, 220), "exclude")
    muac <- apply_step(muac, "age-missing", is.na(muac$age_months), "flag",
                       "kept; age-disaggregated tables only")
    
    readr::write_csv(dplyr::bind_rows(LOG), here::here("outputs", "cleaning-log.csv"))
  11. Diapositive 11 / 19

    Produisez-le à partir du code

    • Une étape ne peut pas avoir lieu sans être consignée — puisque consigner est ce que fait la fonction
    • L'effet est mesuré, pas estimé — before et after proviennent de la même fonction indicator(), évaluée sur les…
    Notes du présentateur
    Ce montage garantit deux choses que la seule discipline ne garantit pas. Une étape ne peut pas avoir lieu sans être consignée, puisque consigner est ce que fait la fonction. Le tentant df = df[df.muac_mm > 80] glissé à 18 heures un jour d'échéance est exactement la modification qui n'atteint jamais un journal écrit ; ici, il n'existe pas de manière plus courte de le faire que la manière consignée. L'effet est mesuré, pas estimé. before et after proviennent de la même fonction indicator(), évaluée sur les mêmes données à un instant d'écart. Personne n'a à se souvenir de ce que valait le chiffre.
  12. Diapositive 12 / 19

    Le tableau avant-après est le livrable — En Python

    print(f"Records received:  {len(raw):>6,}")
    print(f"Excluded:          {len(raw) - len(analysis):>6,}")
    print(f"Analysed:          {len(analysis):>6,}")
    print(f"GAM, raw:          {indicator(raw):>6.1%}")
    print(f"GAM, cleaned:      {indicator(analysis):>6.1%}")
    Notes du présentateur
    Agrégez le journal en trois lignes et il devient exploitable par un lecteur non technique.
  13. Diapositive 13 / 19

    Le tableau avant-après est le livrable — En R

    cat(sprintf("Records received: %6d\n", nrow(raw)))
    cat(sprintf("Excluded:         %6d\n", nrow(raw) - nrow(analysis)))
    cat(sprintf("Analysed:         %6d\n", nrow(analysis)))
    cat(sprintf("GAM, raw:         %6.1f%%\n", 100 * indicator(raw)))
    cat(sprintf("GAM, cleaned:     %6.1f%%\n", 100 * indicator(analysis)))
    Notes du présentateur
    Si les chiffres brut et nettoyé sont proches, dites-le — c'est la phrase la plus forte dont vous disposiez, car elle signifie que le constat ne dépend pas de votre jugement. S'ils sont éloignés, dites-le aussi, et attendez-vous à la discussion. Un nettoyage qui déplace un indicateur de trois points n'est pas un défaut de l'analyse ; c'est un constat sur la collecte des données, et le dissimuler est la seule version de tout ceci qui relève de la faute.
  14. Diapositive 14 / 19

    Ce qui ne doit pas figurer dans le journal

    • Aucun identifiant direct. Ni noms, ni numéros de téléphone, ni coordonnées GPS. Une ligne disant `fusion de CH03315…
    • Aucun petit effectif dans une catégorie sensible. « 3 lignes recodées, catégorie VBG viol, Marmelade » identifie…
    • Aucun détail en texte libre recopié d'une note de dossier. La règle est ce que vous avez appliqué, pas ce que…
    Notes du présentateur
    Le journal est une annexe. Il est envoyé par courriel, joint à des rapports et transféré, ce qui veut dire qu'il voyage plus loin que le jeu de données. Cette habitude s'apprend utilement sur des données nutritionnelles, où elle ne coûte rien, afin d'être automatique le jour où l'on vous confie une charge de cas de protection — où les principes ne sont pas des conseils.
  15. Diapositive 15 / 19

    Où vit le journal — Exemple

    outputs/
      profiles/muac-2024-q4.json        arrival profile      (lesson 1)
      validation/muac-2024-q4.json      validation findings  (lesson 7)
      cleaning-log.csv                  decisions            (this lesson)
      review/duplicate-candidates.csv   reviewed and signed  (lesson 4)
      tables/gam_by_commune.csv         the result
      tables/definitions.csv            numerator, denominator, source
    Notes du présentateur
    À côté du résultat, pas dans un document. Ces six fichiers constituent le compte rendu complet d'un trimestre. Quiconque dispose de l'export brut et de ce dossier peut reconstituer tout ce que vous avez fait et vérifier chaque chiffre, et c'est une affirmation bien plus solide que « l'analyse a été soignée ». Remarquez ce qui n'y est pas — le jeu de données nettoyé n'est pas le livrable. Le fichier brut reste en lecture seule et le fichier nettoyé est régénéré en exécutant le script. Un CSV nettoyé qui circule par courriel se détache de son journal en une semaine, et plus personne ne sait quelle version il tient.
  16. Diapositive 16 / 19

    L'annexe dont le rapport a besoin

    • Source et complétude des données — D'où vient le fichier, combien d'enregistrements, quelle part des unités de…
    • Nettoyage et exclusions — Le tableau du journal, ou son résumé avec le tableau complet en pièce jointe
    • Limites — Ce que le nettoyage n'a pas pu corriger
    Notes du présentateur
    Trois sections courtes, et elles ont leur place dans toute analyse que ce secteur produit. Source et complétude des données. D'où vient le fichier, combien d'enregistrements, quelle part des unités de rapportage attendues il couvre, sur quelle période. Nettoyage et exclusions. Le tableau du journal, ou son résumé avec le tableau complet en pièce jointe. Chaque exclusion avec son compte. Limites. Ce que le nettoyage n'a pas pu corriger. Le manquant non au hasard que vous soupçonnez sans pouvoir le démontrer. Les six enregistrements fusionnés qu'un superviseur a confirmés et les deux sur lesquels il hésitait. Le district dont le taux repose sur trente-trois ménages.
  17. Diapositive 17 / 19

    L'annexe dont le rapport a besoin

    L'annexe n'est pas un aveu. C'est la raison pour laquelle le chiffre du résumé exécutif peut être défendu, et la différence professionnelle entre un chiffre et une affirmation.
  18. Diapositive 18 / 19

    Ce que ce cours vous laisse

    • Vous savez prendre un export brut de programme, décrire honnêtement ce qui est arrivé, y trouver les défauts de quatre manières différentes, décider du traitement de chacun au regard d'une norme publiée, faire tourner ces décisions à nouveau le trimestre suivant sans vous, et remettre l'ensemble à un auditeur avec la démarche jointe.
    Notes du présentateur
    Vous savez prendre un export brut de programme, décrire honnêtement ce qui est arrivé, y trouver les défauts de quatre manières différentes, décider du traitement de chacun au regard d'une norme publiée, faire tourner ces décisions à nouveau le trimestre suivant sans vous, et remettre l'ensemble à un auditeur avec la démarche jointe. Le cours suivant de ce module, Jointures et restructuration des données de programme, prend le tableau propre et l'assemble avec les autres — ménage vers membre, registre vers dénominateur de population, registre de formation sanitaire vers agrégat DHIS2 — où le mode de défaillance n'est pas une valeur fausse mais un nombre de lignes qui a doublé pendant que vous le regardiez.
  19. Diapositive 19 / 19

    La suite

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