# Définitions des variables — Assiduité scolaire et alerte précoce à l'abandon

Documentation technique du projet *Assiduité scolaire et alerte précoce à
l'abandon*. Elle définit chaque variable sur laquelle repose le signalement de
risque, énonce le seuil et son origine, et consigne les trois décisions de
données qui changent la composition de la liste de visites.

- **Jeux de données sources :** `school-attendance-2024.v1.csv` (70 245 lignes de
  présence) et `school-roster-2024.v1.csv` (1 202 lignes de liste), 24 écoles
- **Analyse :** `notebooks/dropout-early-warning.python.fr.ipynb`
- **Décision éclairée :** quels élèves reçoivent une visite à domicile avant la
  fin du trimestre
- **Normes appliquées :** ODD 4.1

Tous les jeux de données de cette plateforme sont synthétiques. Aucun élève réel
n'y est représenté.

---

## 1. Ce que le modèle est, et n'est pas

C'est une **règle**, non un classifieur entraîné : un seuil sur une variable,
choisi pour qu'un directeur puisse dire pourquoi un élève figure sur la liste. Il
n'y a ni modèle ajusté, ni jeu d'entraînement, ni chiffre d'exactitude, parce
qu'il n'y a pas d'étiquette de résultat — personne dans ce jeu de données n'est
enregistré comme ayant abandonné.

C'est une limite, non un oubli. Une liste ordonnée qu'un directeur peut expliquer
vaut ici davantage qu'un score qu'il ne peut pas expliquer, et toute affirmation
d'exactitude serait fabriquée.

---

## 2. Unité d'analyse et jointure

Une ligne par élève (1 200 après résolution), construite à partir des
jours-élèves.

| Étape | Règle |
| --- | --- |
| Déduplication de la liste | Trier par `grade` (manquants en dernier), garder la première ligne par `student_id` |
| Jointure | `attendance` joint à gauche à la liste résolue, `validate="many_to_one"` |
| Ensemble d'analyse | Jours-élèves avec une valeur présent/absent résolue |

**Deux élèves figurent deux fois sur la liste**, un transfert non enregistré
ayant laissé les deux inscriptions actives. `validate="many_to_one"` transforme
l'inflation silencieuse de lignes qui en résulte en erreur là où elle se produit ;
sans cela, la présence de ces deux élèves serait comptée deux fois et tous deux
pèseraient double dans chaque taux d'école.

La déduplication conserve la ligne portant une classe renseignée lorsqu'il en
existe une, car la classe est affichée au directeur.

Jours-élèves analysés : **69 974** sur 70 245 (271 lignes ne portent aucune valeur
présent/absent exploitable et sont exclues).

---

## 3. Les variables

Toutes les variables sont calculées **uniquement sur les jours que l'école de
l'élève a saisis**. Voir le §5 pour la raison, qui est la décision porteuse de
tout le reste.

### 3.1 `days_recorded`

| | |
| --- | --- |
| **Définition** | Nombre de jours-élèves avec une valeur présent/absent résolue |
| **Usage** | Dénominateur de `attendance_rate` ; contrôle de vraisemblance sur les dossiers minces |

### 3.2 `attendance_rate`

| | |
| --- | --- |
| **Numérateur** | Jours de présence |
| **Dénominateur** | `days_recorded` |
| **Usage** | Tri de la liste de visites à l'intérieur de l'ensemble signalé — **pas** le signalement lui-même |

À l'échelle du district : **0,884**.

### 3.3 `trailing_absences`

| | |
| --- | --- |
| **Définition** | Longueur de la série ininterrompue d'absences se terminant au dernier jour saisi pour l'élève |
| **Usage** | Affiché sur la liste de visites |

### 3.4 `school_days_missed` — **la variable de signalement**

| | |
| --- | --- |
| **Définition** | Nombre de jours saisis pour l'élève postérieurs à son dernier jour de présence |
| **Dénominateur** | Aucun — c'est un décompte, non un taux |
| **Usage** | Le signalement de risque |

Pour un élève jamais présent, la valeur est `days_recorded`.

### 3.5 `at_risk`

```
at_risk = school_days_missed > 15
```

15 **jours d'école**, non jours calendaires — environ trois semaines de
trimestre. Le chiffre vient de la constatation du programme lui-même :
l'assiduité s'érode sur environ trois semaines avant qu'un élève cesse de venir,
et c'est cette érosion qui rend l'alerte précoce possible. C'est une décision de
programme, et ce document est l'endroit où elle est consignée comme telle.

**Signalés : 72 élèves sur 1 200 (6,0 %).**

---

## 4. Pourquoi une série récente plutôt qu'un total faible

Le signal est une série récente d'absences, non un total faible. Un élève qui a
manqué quinze jours en février puis est revenu n'est pas dans la même situation
que celui qui a manqué les quinze derniers jours, et un seuil sur le taux
d'assiduité ne les distingue pas.

`attendance_rate` ne sert qu'à ordonner l'ensemble signalé, de sorte qu'un élève
assidu à 95 % et arrêté depuis trois semaines se classe différemment d'un élève à
40 % tout le trimestre. Ordre de tri : `school_days_missed` décroissant, puis
`attendance_rate` croissant.

---

## 5. Les trois décisions de données qui changent la liste

### 5.1 Le codage des présences doit être harmonisé avant tout décompte

Une école a saisi `Y`/`N` ; les autres ont saisi `true`/`false`. Une conversion
booléenne transforme silencieusement `Y`/`N` en valeurs manquantes.

| Traitement | Assiduité du district |
| --- | ---: |
| Conversion booléenne naïve | 0,874 |
| Codage harmonisé | 0,884 |

L'écart d'un point sur le taux du district sous-estime les dégâts : **cette école
fournit alors l'essentiel du haut de n'importe quel classement de risque**, pour
un accident de codage et non pour un abandon. La table de correspondance est une
liste d'autorisation explicite (`true/TRUE/Y/y/yes` → présent,
`false/FALSE/N/n/no` → absent). Tout ce qui en sort reste manquant et est exclu —
271 lignes.

### 5.2 Une ligne absente est une fermeture, non une absence

**SCH07 et SCH18 ont été fermées 15 jours d'école, du 11 au 29 mars 2024.** Ces
jours-élèves n'ont jamais été saisis — ils sont totalement absents du fichier.

Rien ne dérape jusqu'au moment où les variables sont construites sur une matrice
élève × date, forme naturelle pour une variable de série continue, parce que le
réindexage sur le calendrier complet du district invente des lignes jamais saisies
et que le remplissage évident est « absent ».

| Traitement | Élèves signalés | Part issue des deux écoles fermées |
| --- | ---: | ---: |
| Fermeture comptée absente | 130 | 44,6 % |
| Jours saisis seulement | 85 | 15,3 % |

Ces deux écoles regroupent **9,8 %** de la liste. Compter les fermetures comme des
absences leur fait porter 45 % des signalements — la liste de visites devient une
liste d'enfants dont l'école était fermée.

**Le correctif n'est pas un ajustement. C'est de ne pas réindexer.** Chaque
variable est calculée sur les jours que l'école de l'élève a saisis, ce qu'énonce
le §3.

### 5.3 La surreprésentation résiduelle est rapportée, non corrigée

Après correction, les deux écoles fermées portent encore **18,1 %** des
signalements contre 9,8 % des élèves. Cet écart est laissé en place et énoncé dans
le rapport : une fermeture de trois semaines est un déclencheur plausible d'un
désengagement réel, et le corriger retirerait précisément les élèves que le
programme a le plus besoin de visiter.

Taux de signalement par école :

| École | Élèves | Signalés | Taux |
| --- | ---: | ---: | ---: |
| SCH07 | 61 | 7 | 11,5 % |
| SCH24 | 54 | 6 | 11,1 % |
| SCH18 | 56 | 6 | 10,7 % |
| SCH15 | 47 | 5 | 10,6 % |
| SCH09 | 49 | 4 | 8,2 % |
| SCH14 | 48 | 4 | 8,3 % |
| SCH01 | 55 | 4 | 7,3 % |
| SCH22 | 56 | 4 | 7,1 % |

Une école dont le taux de signalement dépasse nettement les autres appelle une
conversation sur l'école, non sur quinze élèves pris séparément. Les directeurs
reçoivent la liste de leur propre école ; le chargé de programme reçoit ces
effectifs.

---

## 6. Classe manquante

Environ 3 % des lignes de liste n'ont aucune classe. Ces élèves sont **tout de
même classés** — la classe n'entre dans aucune variable. Elle figure sur la liste
uniquement pour qu'un directeur sache de quelle classe s'enquérir, et une classe
manquante ne doit jamais retirer un élève d'une liste de visites.

---

## 7. Ce que la liste classe

**Un risque, non un abandon.** Un élève sur cette liste peut avoir été transféré,
être malade, ou aider à la maison pendant la récolte. Le produit est une
conversation à avoir avant la fin du trimestre, non un statut à enregistrer — et
une visite à domicile qui traite d'emblée l'élève comme un décrocheur sera la
dernière que cette famille acceptera.

---

## 8. Limites

1. **Aucune étiquette de résultat**, donc aucune sensibilité ni spécificité
   mesurable. Le seuil est un jugement de programme, et la formulation honnête est
   « élèves au sujet desquels le programme veut poser une question », non « élèves
   qui vont abandonner ».
2. **Les transferts sont invisibles.** Un élève parti dans une autre école est
   identique à un élève qui a cessé de venir. Les deux doublons de liste prouvent
   que l'enregistrement des transferts est imparfait.
3. **L'absence n'a pas de code de motif.** Maladie, travail, coût et
   désengagement sont indiscernables, et appellent des réponses différentes.
4. **Troncature de fin de trimestre.** Un élève qui décroche lors des quinze
   derniers jours ne peut pas accumuler 15 jours manqués avant la fin du
   trimestre, et la règle ne le signalera pas. Exécuter la règle en milieu de
   trimestre autant qu'en fin de trimestre atténue ce défaut.
5. **Les fermetures sont inférées des jours d'école manquants**, non d'un
   calendrier saisi. Une école à la fois fermée et défaillante en saisie serait
   indiscernable d'une école seulement fermée.

---

## 9. Reproduire cette analyse

```bash
pnpm examples:build
```

Puis exécuter `notebooks/dropout-early-warning.python.fr.ipynb`. Il requiert
pandas et numpy et lit les deux CSV en HTTPS.

Les deux jeux de données sont versionnés par nom de fichier et immuables ; une
correction est publiée en `.v2.csv` avec ce document révisé en même temps.

---

## 10. Journal des versions

| Date | Modification |
| --- | --- |
| 27/07/2026 | Première émission, sur les jeux de données v1. |
