cassionAnalyse de données

Retour à la leçonLeçon 3 sur 8Inscrit n'est pas présent

88 % de présence, 62 % des élèves

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

    Ce que couvre cette leçon

    • Un registre, deux questions
    • L'assiduité moyenne quotidienne
    • La proportion d'élèves assidus
    • Sur lequel un programme est jugé
    • Énoncez le seuil, et d'où il vient
    • La décision de dénominateur que personne ne prend explicitement
    • Rapportez la paire
    • La suite
    Notes du présentateur
    L'assiduité moyenne quotidienne vaut 88,4 %. La part des élèves présents au moins 90 % de leurs jours pointés vaut 62,1 %. Les deux viennent des mêmes 70 245 lignes, et les vingt-six points d'écart sont les enfants qu'une moyenne ne voit pas.
  2. Diapositive 2 / 25

    Un registre, deux questions — En Python

    import pandas as pd
    
    attendance = pd.read_csv("school-attendance-2024.v1.csv")
    print(f"{len(attendance):,} rows, {attendance['student_id'].nunique():,} students")
    print(attendance["present"].value_counts(dropna=False))
  3. Diapositive 3 / 25

    Un registre, deux questions — En R

    library(dplyr)
    attendance |> count(present)
  4. Diapositive 4 / 25

    Un registre, deux questions

    • La colonne present a cinq valeurs, non deux — SCH09 a saisi Y et N au lieu de true et false sur 873 de ses…
    Notes du présentateur
    La colonne present a cinq valeurs, non deux. SCH09 a saisi Y et N au lieu de true et false sur 873 de ses lignes, et 271 jours n'ont jamais été pointés dans un sens ni dans l'autre. Une conversion booléenne transforme ces 873 observations réelles en valeurs manquantes et retire discrètement une école du dénominateur.
  5. Diapositive 5 / 25

    Un registre, deux questions — En Python

    MARKS = {"true": True, "Y": True, "false": False, "N": False}
    marked = attendance[attendance["present"].isin(MARKS)].copy()
    marked["attended"] = marked["present"].map(MARKS)
    print(f"usable marks: {len(marked):,} of {len(attendance):,}")
  6. Diapositive 6 / 25

    Un registre, deux questions — En R

    attendance |>
      mutate(attended = case_when(present %in% c("true", "Y") ~ TRUE,
                                  present %in% c("false", "N") ~ FALSE)) |>
      filter(!is.na(attended))
    Notes du présentateur
    Le même fichier répond maintenant à deux questions différentes.
  7. Diapositive 7 / 25

    L'assiduité moyenne quotidienne — En Python

    ada = marked["attended"].mean()
    print(f"average daily attendance: {ada:.1%}")
  8. Diapositive 8 / 25

    L'assiduité moyenne quotidienne — En R

    marked |> summarise(ada = mean(attended))
  9. Diapositive 9 / 25

    L'assiduité moyenne quotidienne

    • 88,4 % — Chaque pointage compte une fois, si bien qu'un élève présent 60 jours sur 60 et un élève présent 30 sur 60…
    Notes du présentateur
    88,4 %. Chaque pointage compte une fois, si bien qu'un élève présent 60 jours sur 60 et un élève présent 30 sur 60 contribuent à proportion de leur nombre de pointages. C'est le nombre qu'un ministère rapporte et ce qu'un indicateur de système doit être. Il répond à à quel point la classe est remplie un jour moyen, ce qui est la bonne question pour les effectifs, la cantine et les manuels.
  10. Diapositive 10 / 25

    La proportion d'élèves assidus — En Python

    by_student = marked.groupby("student_id")["attended"].agg(["mean", "size"])
    eligible = by_student[by_student["size"] >= 20]
    
    for threshold in (0.80, 0.85, 0.90):
        share = (eligible["mean"] >= threshold).mean()
        print(f"attending at least {threshold:.0%} of marked days: {share:.1%}")
  11. Diapositive 11 / 25

    La proportion d'élèves assidus — En R

    marked |>
      summarise(rate = mean(attended), days = n(), .by = student_id) |>
      filter(days >= 20) |>
      summarise(across(everything(), ~ mean(rate >= 0.9)))
  12. Diapositive 12 / 25

    La proportion d'élèves assidus

    SeuilÉlèves l'atteignant
    Au moins 80 % des jours87,3 %
    Au moins 85 %78,9 %
    Au moins 90 %62,1 %
  13. Diapositive 13 / 25

    La proportion d'élèves assidus

    • 62,1 % au seuil de 90 %, contre une assiduité moyenne quotidienne de 88,4 % — Les deux nombres sont écartés de…
    • Une moyenne sur des pointages décrit le système ; une proportion sur des élèves décrit des enfants — Une école où…
    Notes du présentateur
    62,1 % au seuil de 90 %, contre une assiduité moyenne quotidienne de 88,4 %. Les deux nombres sont écartés de vingt-six points et aucun n'est faux. Une moyenne sur des pointages décrit le système ; une proportion sur des élèves décrit des enfants. Une école où chaque enfant manque un jour sur huit et une école où sept enfants sur huit sont présents parfaitement tandis qu'un ne vient jamais ont la même assiduité moyenne quotidienne et des problèmes entièrement différents.
  14. Diapositive 14 / 25

    Sur lequel un programme est jugé

    • Rapportez les deux, et mettez en tête celui qui correspond à la décision
    Notes du présentateur
    Rapportez les deux, et mettez en tête celui qui correspond à la décision.
  15. Diapositive 15 / 25

    Sur lequel un programme est jugé

    La décisionLe nombre
    Combien de repas, de pupitres, de manuelsAssiduité moyenne quotidienne
    Quels enfants ont besoin d'une visite de suiviProportion sous le seuil
    Si une intervention a marchéLes deux, car ils peuvent bouger en sens opposés
  16. Diapositive 16 / 25

    Sur lequel un programme est jugé — En Python

    struggling = eligible[eligible["mean"] < 0.75]
    print(f"students below 75%: {len(struggling)} "
          f"({len(struggling) / len(eligible):.1%})")
    print(f"their marks as a share of all marks: "
          f"{struggling['size'].sum() / eligible['size'].sum():.1%}")
    Notes du présentateur
    Cette dernière ligne est celle qu'il faut intérioriser. Une intervention qui fait passer les plus mauvais assidus de 40 % à 60 % ne déplace presque pas l'assiduité moyenne quotidienne et ne déplace pas du tout la proportion au-dessus de 90 % — et serait enregistrée comme un échec par l'un ou l'autre nombre pris seul.
  17. Diapositive 17 / 25

    Sur lequel un programme est jugé — En R

    # The students furthest behind are a small share of the rows and the whole
    # of the problem.
  18. Diapositive 18 / 25

    Énoncez le seuil, et d'où il vient — En Python

    sensitivity = {f"{t:.0%}": f"{(eligible['mean'] >= t).mean():.1%}"
                   for t in (0.75, 0.80, 0.85, 0.90, 0.95)}
    print(sensitivity)
    Notes du présentateur
    Le seuil de 90 % est une convention, non un standard, et il fait l'essentiel du travail dans ces 62,1 %. Portez-le à 85 % et le chiffre devient 78,9 %.
  19. Diapositive 19 / 25

    Énoncez le seuil, et d'où il vient — En R

    # Print the curve, not the point.
    Notes du présentateur
    À 95 % il vaut 39,8 % et à 75 % il vaut 90,5 %. Publiez le seuil à côté du nombre, à chaque fois. Deux rapports citant « la proportion d'élèves assidus » à des seuils différents produisent des chiffres incomparables qui ont tous deux l'air officiel — le même défaut que les deux jeux de seuils du score de consommation alimentaire, dans un autre secteur.
  20. Diapositive 20 / 25

    La décision de dénominateur que personne ne prend explicitement

    • Sans lui — un élève inscrit la dernière semaine du trimestre et présent trois jours sur trois apparaît comme assidu à…
    • Avec lui — vous avez exclu précisément les élèves arrivés tard et partis tôt, qui sont ceux qu'un programme d'assiduité…
    Notes du présentateur
    by_student ci-dessus a été filtré aux élèves ayant au moins vingt jours pointés. C'est un choix et il doit être déclaré. Sans lui, un élève inscrit la dernière semaine du trimestre et présent trois jours sur trois apparaît comme assidu à 100 %, et un élève pointé deux fois apparaît dans la queue de distribution. Avec lui, vous avez exclu précisément les élèves arrivés tard et partis tôt, qui sont ceux qu'un programme d'assiduité veut le plus voir.
  21. Diapositive 21 / 25

    La décision de dénominateur que personne ne prend explicitement — En Python

    print(f"students with any marks:      {len(by_student)}")
    print(f"students with 20 or more:     {len(eligible)}")
  22. Diapositive 22 / 25

    La décision de dénominateur que personne ne prend explicitement — En R

    # Two denominators, both defensible, and the report says which.
    Notes du présentateur
    Ici les deux sont presque identiques, si bien que le choix ne déplace pas la réponse. Dans un registre couvrant une année entière il la déplacerait beaucoup, et l'habitude de le déclarer est ce qui rend le chiffre transportable.
  23. Diapositive 23 / 25

    Rapportez la paire — Exemple

    Attendance, February to April 2024
    
      Average daily attendance         88.4%   69,974 usable marks
      Students attending 90%+ of days  62.1%   1,200 students with 20+ marks
      Students attending 85%+          78.9%
      Students below 75%                9.5%   114 students, the follow-up list
    
      SCH09 recorded 873 marks as Y/N rather than true/false; recoded, not
      dropped. 271 days were never marked and are excluded from both figures.
  24. Diapositive 24 / 25

    La suite

    • Les deux nombres de cette leçon divisent par des jours qui ont été pointés.
    Notes du présentateur
    Les deux nombres de cette leçon divisent par des jours qui ont été pointés. La leçon suivante porte sur les jours qui ne sont pas du tout dans le fichier — quinze, dans deux écoles, qui transforment une grève en urgence d'abandon si on les laisse faire.
  25. Diapositive 25 / 25

    La suite

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