cassionAnalyse de données

Leçon 2 sur 8

Unité · L'inscription et son dénominateur

En retard, et de plus en plus

Le retard d'âge vaut 17,0 % en première année et 50,8 % en sixième. Il monte parce que le redoublement le crée — 94,5 % des enfants ayant redoublé en 2023 sont en retard d'âge en 2024 — et parce qu'être en retard quadruple le risque de partir.

PythonR105 minObjectifs de développement durable (ODD)Définitions d'indicateurs de l'UNICEFEnquête par grappes à indicateurs multiples (MICS)

La définition, et le contrôle d’étendue qui doit venir avant

Un élève est en retard d’âge lorsque son âge dépasse l’âge officiel, qui vaut ici le numéro de l’année plus cinq.

import pandas as pd

enrolment = pd.read_csv("school-enrolment-2024.v1.csv")
print(enrolment["age_years"].describe().round(1))
print(f"ages above 20: {(enrolment['age_years'] > 20).sum()}")
library(dplyr)
enrolment |> summarise(min = min(age_years), max = max(age_years),
                       impossible = sum(age_years > 20))

Vingt et une lignes portent un âge supérieur à 20 dans un registre du primaire. SCH04 enregistre une partie de ses effectifs en mois, si bien qu’un enfant de neuf ans apparaît à 112. Une moyenne les absorberait ; un contrôle d’étendue les trouve, et la correction est une division et non une suppression.

clean = enrolment[enrolment["age_years"] <= 20].copy()
clean["official_age"] = clean["grade"] + 5
clean["over_age"] = clean["age_years"] > clean["official_age"]
enrolment |> filter(age_years <= 20) |>
  mutate(official_age = grade + 5, over_age = age_years > official_age)

Faites le contrôle d’étendue avant l’indicateur, non après. Un âge de 112 est en retard pour toutes les années, si bien qu’un indicateur calculé sur la colonne brute est techniquement exact pour vingt et un enfants et faux sur ce qu’il signifie.

Il se compose avec l’année d’études

primary = clean[(clean["school_year"] == 2024) & clean["grade"].between(1, 6)]
by_grade = primary.groupby("grade").agg(
    students=("student_id", "size"),
    over_age=("over_age", "mean"),
)
print((by_grade * [1, 100]).round(1))
primary |> summarise(n = n(), over_age = mean(over_age), .by = grade)
Année Âge officiel Élèves En retard d’âge
1 6 53 17,0 %
2 7 153 25,5 %
3 8 247 29,6 %
4 9 258 36,8 %
5 10 209 47,8 %
6 11 132 50,8 %

Le retard d’âge triple entre la première et la sixième année. Deux mécanismes produisent cette forme et ce ne sont pas le même problème.

L’entrée tardive place un enfant au-dessus de l’âge dès la première année et l’y maintient. Elle apparaît comme le plancher de 17,0 %, et l’intervention est l’inscription précoce.

Le redoublement crée le retard d’âge pendant la scolarité. Il apparaît comme la montée, et l’intervention est entièrement différente.

previous = clean[clean["school_year"] == 2023].set_index("student_id")
current = clean[clean["school_year"] == 2024].copy()
current["last_year"] = current["student_id"].map(previous["end_of_year_status"])

print(current.groupby("last_year")["over_age"].agg(["mean", "size"]).round(3))
enrolment |>
  filter(age_years <= 20) |>
  select(student_id, school_year, grade, age_years, end_of_year_status) |>
  tidyr::pivot_wider(names_from = school_year,
                     values_from = c(grade, age_years, end_of_year_status))

94,5 % des élèves ayant redoublé en 2023 sont en retard d’âge en 2024, contre 30,6 % de ceux qui ont été promus. Le redoublement ne corrèle pas avec le retard d’âge ; il le cause, avec un an de décalage, et le registre permet d’observer le mécanisme plutôt que de l’inférer.

Notez que la comparaison doit se faire entre années. En 2023 un redoublant n’est pas encore en retard d’âge — il est dans son année à l’âge normal, et l’année supplémentaire apparaît en septembre suivant.

Pourquoi cela compte : le lien avec l’abandon

year23 = clean[clean["school_year"] == 2023]
dropout = year23.groupby("over_age")["end_of_year_status"].apply(
    lambda s: (s == "dropped-out").mean()
)
counts = year23.groupby("over_age").size()
print(pd.DataFrame({"dropout": (dropout * 100).round(1), "n": counts}))
enrolment |> filter(school_year == 2023) |>
  summarise(dropout = mean(end_of_year_status == "dropped-out"),
            n = n(), .by = over_age)
Élèves Ont abandonné
En retard d’âge 478 19,5 %
À l’âge attendu 814 4,8 %

Être en retard quadruple le risque de partir, et c’est ce qui boucle la chaîne : un enfant redouble, prend du retard d’âge, et devient alors bien plus susceptible d’abandonner que ce que le redoublement visait à prévenir.

Le redoublement n’est donc pas une intervention neutre. Il est présenté comme une seconde chance et il augmente de façon mesurable la probabilité de partir tout à fait. Ce constat s’obtient à partir de deux colonnes d’un registre, et c’est l’argument le plus fort que ce jeu de données soutient.

La désagrégation qui ne donne rien

Le retard d’âge est inhabituel parmi les indicateurs éducatifs en ce que les ventilations évidentes montrent très peu.

for column in ("sex", "disability_reported", "displacement_status"):
    print(primary.groupby(column, dropna=False)["over_age"].agg(
        ["mean", "size"]).round(3), "\n")
primary |> summarise(over_age = mean(over_age), n = n(), .by = sex)
Ventilation En retard d’âge n
Garçons 39,2 % 510
Filles 33,8 % 542
Handicap signalé 33,7 % 89
Sans handicap signalé 36,7 % 963

Cinq points entre garçons et filles, sur 510 et 542 élèves. C’est à la limite de ce que produit la variation d’échantillonnage, donc calculez l’intervalle avant d’écrire la phrase — la machinerie du cours sur les enquêtes, sur exactement le type d’écart qui se publie comme un constat et disparaît au passage suivant.

Le handicap montre trois points en sens inverse sur 89 élèves, ce qui est du bruit sur un dénominateur aussi petit.

Une désagrégation qui ne montre presque rien est un résultat. Le retard d’âge est ici un phénomène de système porté par le redoublement et l’entrée tardive, non une inéquité de groupe — et le dire est plus utile que de chasser un sous-groupe jusqu’à en trouver un.

Rapportez le profil, non le chiffre principal

Over-age enrolment, primary, 2024

  Overall                     36.4%   383 of 1,052 primary enrolees
  Grade 1                     17.0%   the late-entry floor
  Grade 6                     50.8%   after five years of repetition
  Repeated in 2023            94.5%   over-age in 2024, against 30.6% promoted

  Dropout, over-age           19.5%   against 4.8% in-age (2023 cohort)

  21 ages recorded in months at SCH04, corrected by division.
  Sex difference is 39.2% (boys) against 33.8% (girls); report with an
  interval or not at all.

Le profil par année est le livrable, car 36,4 % au total pourrait signifier une entrée tardive uniforme ou un redoublement qui s’accumule, et ces deux cas appellent des programmes différents.

La suite

Tous les enfants de cette leçon sont inscrits. Savoir s’ils sont en classe relève d’un autre registre et d’un autre nombre — et la leçon suivante en trouve deux, distants de vingt-six points, dans le même fichier.

Animer cette leçon

La leçon en diaporama, la prose étant reléguée dans les notes du présentateur plutôt que projetée. Produit à partir de cette page, dont il ne peut donc pas s'écarter.

Lancer le diaporamaLire les diapositives

Le PDF ne requiert aucun logiciel et se projette depuis n'importe quel poste. Le fichier PowerPoint est fait pour être modifié : appliquez la charte de votre organisation, retirez une section pour une séance plus courte, ou fusionnez deux leçons en atelier.