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.
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.