# Sources and construction: collège panel for the 2015 priority-education reform

All files were downloaded on 2026-10-03. The data.education.gouv.fr exports were taken as
`.../api/explore/v2.1/catalog/datasets/<id>/exports/xlsx` (the CSV export of the full DNB file
exceeds the fetch size limit; xlsx is the same table) and converted to CSV by a converter kept with the raw files and not in the repository.
Raw files are in `raw/`, build tools in `build/`, run from the repository root in this order:
`dune exec data/schools/build/status.exe`, then `panel.exe`, `outcomes.exe` and
`resources.exe` (each takes the data directory as an optional argument, default
`data/schools`). Then
`dune exec data/schools/build/compact.exe data/schools data/schools/panel.csv` writes the
committed `panel.csv` from `transitions_2015.csv`, `dnb.csv` and `covariates.csv`, and
`dune exec data/schools/build/pagefind.exe TXT QUOTE...` lists the pages of a `pdftotext` dump that hold each quote,
to check the page numbers cited. No value was imputed or typed by hand
except the cost/pay figures in `resources.csv`, each of which cites its page.

## Year conventions

- `status.csv`, `status_panel.csv`, `covariates.csv`: **year = rentrée** (school year year/year+1).
  The reform map applies from year 2015 (rentrée 2015). Year 2014 carries the 102-network
  REP+ *préfiguration*.
- `dnb.csv`: **year = DNB session** (June). Session 2016 is the first exam sat by pupils who
  spent their 3e in a reformed collège (rentrée 2015); session 2015 is the last fully pre-reform one.
- IPS: `rentree_scolaire` "2016-2017" is stored as 2016.

## Data sources

| File in raw/ | Dataset id (data.education.gouv.fr unless stated) | Coverage | Used for |
|---|---|---|---|
| colleges_ep.xlsx/csv | `fr-en-colleges-ep` "Collèges éducation prioritaire" (modified 2026-01-29) | public collèges, France + DOM, rentrée 2011-2019, 47 552 rows | EP label `appartep` (ECLAIR, RRS, REPPLUS, REP, HEP), enrolment, divisions, rural/urban (`zonage3`, CATAEU2010), QPV, "sensible", commune, académie, coordinates |
| effectifs.xlsx/csv | `fr-en-college-effectifs-niveau-sexe-lv` (selected columns) | all collèges incl. private, rentrée 2019-2025 | flags `rep`, `rep0` (= REP+), sector, enrolment (total, SEGPA, ULIS) |
| etablissements_ep_2023.xlsx/csv | `fr-en-etablissements-ep` | EP establishments and those within 300 m of a QPV, label `ep_2022_2023` | cross-check and resolution of 2022 flags |
| annuaire_colleges.xlsx/csv | `fr-en-annuaire-education`, filter type = Collège, extract of 2026-10-03 | open collèges | current label `appartenance_education_prioritaire` (stored as year 2026), sector, commune |
| rep_colleges_2018.xlsx/csv | `fr-en-reseau-education-prioritaire-colleges` (modified 2018-10-01) | tête-de-réseau collèges, 2014 (REP+ only) to 2019 | cross-check only |
| BO_liste_REP_2015_V3.xls | data.gouv.fr "Réseau d'Education prioritaire des écoles", https://static.data.gouv.fr/resources/reseau-deducation-prioritaire-des-ecoles/20150206-162228/BO_liste_REP_2015_V3.xls | official REP+ list of the 2015 map (352 collèges) | cross-check only |
| dnb_etab.xlsx/csv | `fr-en-dnb-par-etablissement` (modified 2026-09-23, no longer updated) | all establishments, sessions 2006-2021, 139 580 rows | DNB inscrits, présents, admis, mentions |
| ivac.xlsx/csv | `fr-en-indicateurs-valeur-ajoutee-colleges` (IVAC) | collèges, sessions 2022-2025 | DNB candidates, pass rate, mentions and value added by series (G, P) |
| ips_2016_2021, ips_2022, ips_2023on | `fr-en-ips_colleges`, `fr-en-ips-colleges-ap2022`, `fr-en-ips-colleges-ap2023` | collèges, rentrée 2016-2025 | IPS and its within-school s.d. |
| moyens_he_es.xlsx/csv | `fr-en-moyens_enseignants_2d_public` | public establishments, rentrée 2023-2025 | H/E (teaching hours per pupil), E/S (pupils per teaching group), level "Collège" |
| catalog.xlsx/csv | catalogue export of data.education.gouv.fr | 306 datasets | dataset discovery |
| ccomptes2018_* | Cour des comptes, *L'éducation prioritaire*, Oct. 2018: report, synthèse, data zip https://www.ccomptes.fr/sites/default/files/2018-10/20181017-donnees-education-prioritaire.zip | | evaluations, costs, staffing ratios by académie |
| ccomptes2025_* | Cour des comptes, *L'éducation prioritaire, une politique publique à repenser*, May 2025: report and data zip | | evaluations, costs 2014-2023, pay supplements |
| ipp_note28_2017.pdf | IPP Note n° 28 (Bouguen, Grenet, Gurgand), Sept. 2017 | | ex ante class-size evidence |
| ipp_2025_demographie.pdf | IPP (Charousset, Grenet, Guyon, Souidi), June 2025 chapter | | not used (text not extractable) |

## Output files

### status.csv — one row per (uai, year, source); 116 704 rows
`uai, year, label, label_raw, source`. Labels:
- `ECLAIR`, `RRS` (pre-2015 map, from `fr-en-colleges-ep`, 2011-2014). ECLAIR replaced RAR in 2011.
- `REP+_PREFIG` = `appartep` "REPPLUS" in rentrée 2014 (103 collèges of the 102 préfiguration networks).
- `REP+`, `REP`, `HEP` (hors éducation prioritaire, public).
- `PRIVATE` (private collèges, 2019+ from effectifs and 2026 from the annuaire; private schools are never EP).
- `REP_AND_REP+_FLAGS`: effectifs 2022 has both `rep` and `rep0` set for 42 collèges (data error; see below).
Sources overlap in 2019 (colleges-ep and effectifs) and 2022 (effectifs and etablissements-ep) so that agreement can be checked.

### status_panel.csv — one harmonised label per (uai, year); 109 979 rows, 10 666 UAI, 2011-2026
Priority: `fr-en-colleges-ep` (2011-2019) > effectifs (2019-2025) > annuaire (2026).
The 42 double-flagged 2022 rows are resolved with `fr-en-etablissements-ep` (2 cases: 1 REP, 1 REP+)
or set to `HEP` when the collège is absent from that list of all EP establishments (40 cases;
all 40 are HEP in both 2021 and 2023). The `note` column says so.

### transitions_2015.csv — one row per collège observed in 2013-2015
Labels 2013-2026, `group_2015` (2014 label -> 2015 label) and `changes_after_2015`.

| group_2015 | collèges |
|---|---|
| entrant_REP (HEP 2014 -> REP 2015) | 185 (30 in DOM, incl. 10 Mayotte) |
| entrant_REP+ (HEP -> REP+) | 17 (10 in DOM) |
| leaver_from_RRS (RRS -> HEP) | 187 (10 in DOM) |
| leaver_from_ECLAIR (ECLAIR -> HEP) | 2 |
| never_EP_2014_2015 (HEP -> HEP) | 3 996 |
| stayer_RRS_to_REP / _to_REP+ | 500 / 83 |
| stayer_ECLAIR_to_REP / _to_REP+ | 56 / 147 |
| stayer_REP+_PREFIG_to_REP+ | 103 |
| not_observed_2014_or_2015 | 23 |

Using 2013 (before the préfiguration) as the pre-period gives the same entrant/leaver
sets: HEP->REP 183, HEP->REP+ 19, RRS->HEP 187, ECLAIR->HEP 2.

Changes after 2015: 14 collèges change label between 2016 and 2026: 11 in Guyane in 2016
(10 REP->REP+, 1 HEP->REP+), 0300059B (Gard) REP->REP+ in 2018, 0300062E (Gard) HEP->REP in 2018,
0755747P (Paris) HEP->REP in 2017. Rentrée 2025 to 2026 (annuaire): no
label change among collèges present in both.

### dnb.csv — one row per (uai, session, series); 174 756 rows, 9 663 UAI (7 286 typed COLLEGE)
`uai, year, series, type, sector, registered, candidates, admitted, pass_rate, pass_rate_published,
admitted_no_mention, mention_ab, mention_b, mention_tb, mentions_total, written_mean, va_pass_rate,
va_written, source`.
- 2006-2021, `series = ALL`, source `fr-en-dnb-par-etablissement`: candidates = `presents`,
  `pass_rate = 100 * admis / presents` (2 decimals). The published `taux_de_reussite` is the same
  ratio truncated (not rounded) to one decimal, kept as `pass_rate_published`. All types of
  establishments are kept (`type` column) so lycées/EREA can be dropped.
- 2022-2025, `series = G` (série générale) and `P` (professionnelle), source IVAC:
  `candidates = nb_candidats_*`, `pass_rate = taux_de_reussite_*`, written mean and value added
  (G only for VA and mentions). **`admitted` is blank**: IVAC does not publish it. IVAC suppresses
  results below 20 candidates and VA below 40 pupils.
- **Series break**: up to 2021 the rate pools both series; from 2022 use G (or recombine G and P
  with candidate weights). 2020 is the Covid session (continuous assessment only).

### covariates.csv — one row per (uai, year); 183 134 rows, 11 966 UAI, 2006-2026
`sector, commune, departement, academie_code, academie` (from colleges-ep, effectifs, IPS, DNB, annuaire),
`zonage3_urban_rural` (urbain / intermédiaire / rural) and `cataeu2010` (2011-2019), `commune_type_depp`
(DEPP typology, partial), `qpv` (2015-2019), `sensible`, `ips`, `ips_sd` (2016-2025),
`pupils` (2011-2025), `pupils_excl_segpa_ulis`, `pupils_6e`, `pupils_3e_gen`, `pupils_segpa`, `pupils_ulis`,
`divisions` and derived `pupils_per_division` (= pupils / divisions incl. SEGPA, 2011-2019),
`pupils_3e_late`, `pupils_6e_from_ep_school`, `pupils_latin_greek`, `to_2nde_gt`, `to_voc` (3e flows),
`dcol`, `h_per_pupil` and `pupils_per_structure` (2023-2025, level Collège), `segpa_section`,
`opening_date`, coordinates, and `sources` listing the contributing files.
Département codes are normalised to 2 characters for metropolitan France ("036" -> "36").

### resources.csv — tidy indicators, 561 rows
Ministry EP spending 2014-2023 (Md€, Cour 2025 G1), surcoût 2015-16 and per pupil 2016, teacher FTE
per 1 000 pupils 2017-18, national collège H/E, E/S, E/D (2011/2013/2015/2016) by ECLAIR-REP+/RRS-REP/HEP,
the same three ratios by académie for 2016 (Cour 2018 annexes 15-17; the third block is mislabelled E/S
in the Cour file but matches H/E), REP/REP+ pay supplements 2015 and after 2021, dédoublement jobs and cost.

### class_size.csv — pupils per teaching structure by public collège, 2023-2025; 18 570 rows
From `fr-en-moyens_enseignants_2d_public` ("Indicateurs d'encadrement H/E et E/S à la rentrée dans
le secteur public", modified 2026-06-09, 38 484 records), CSV export
`https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-moyens_enseignants_2d_public/exports/csv?delimiter=%3B`
downloaded on 2026-10-16 (5 343 720 bytes), built by
`dune exec data/schools/build/class_size.exe -- EXPORT.csv data/schools/class_size.csv`.
Level « Collège » only; `pupils` (pupils in divisions, the H/E denominator), `hours` (weekly teaching
hours, the E/S denominator) and `pupil_hours` (pupils of each structure weighted by its hours, the
E/S numerator), so that E/S = `pupil_hours` / `hours` and a group's E/S pools its collèges. 101
collège rows marked « ns » are left out. Check: `pupil_hours` / `hours` gives the published `e_s`
to 0.006 on every row. The file has no number of divisions, so pupils per division (E/D, the unit of
the State's indicator P141-3-2) cannot be formed from it.

### divisions.csv — pupils and divisions by public collège, rentrées 2015-2019; 26 458 rows
From `fr-en-colleges-ep` (modified 2026-01-29), CSV export with
`select=id,uai,appartep,secteur,dept,nbeleves,nbsegpa,d`, downloaded on 2026-10-16 (659 216 bytes,
47 552 rows, every one public), built by
`dune exec data/schools/build/divisions.exe -- EXPORT.csv data/schools/divisions.csv`: `uai`,
`year` (rentrée), `ep` (the label of that rentrée: REP+, REP or HEP), `pupils` (`nbeleves`) and
`divisions` (`d`, « Nombre de divisions »), for 2015-2019. Pupils over divisions pooled by label
gives the Cour des comptes 2018 figures for rentrée 2016 exactly (REP+ 21.32, REP 22.19, HEP 25.03).
No dataset gives divisions by collège after 2019: the catalogue searches « division », « divisions »,
« nombre de classes », « structures », « taille des classes » and « élèves par classe » return no
collège-level divisions; `fr-en-moyens_enseignants_2d_public` has hours and pupils, and
`fr-en-taille-colleges-lycees` and `fr-en-effectifs-second-degre` have national or pupil counts only.

## Checks performed

- 2019 overlap, colleges-ep vs effectifs: 4 195 HEP, 730 REP, 364 REP+ agree; no disagreement.
- BO 2015 REP+ list: all 352 collèges are REP+ in colleges-ep 2015.
- Tête-de-réseau list 2015: 729 REP and 349 REP+ heads agree with colleges-ep; 10 head UAIs not in colleges-ep.
- Counts per year in colleges-ep: 2011 297 ECLAIR + 784 RRS; 2015 352 REP+ + 742 REP (= Cour 2018
  annexe 7: 352 REP+, 742 REP, 1 094 in total incl. Mayotte).
- 2025 effectifs vs 2026 annuaire: 732 REP and 370 REP+ identical.
- Comparison with published counts of the 2015 movers: Cour 2025 (PDF p.24) gives "195 sorties et
  206 entrées de réseaux", close to the 189 leaving and 202 entering collèges here. Cour 2018 (PDF p.23)
  says "deux collèges ECLAIR ainsi que 96 collèges appartenant à un [RRS] sont sortis" and "118 collèges
  qui n'étaient pas en ECLAIR ont été labellisés REP+"; this panel finds 187 RRS leavers and
  17 + 83 = 100 non-ECLAIR collèges entering REP+ (107 measured from 2013). The 187-vs-96 gap is not
  explained by DOM (10) and is unresolved; the counts here follow the ministry's own school file.

## Gaps

- **No school-level EP status before rentrée 2011** (RAR/RRS 2006-2010). Only académie counts exist
  (Cour 2018 annexes 7 and 9: 1 119 collèges in RAR+RRS in 2006). DNB outcomes start in 2006, so
  2006-2010 outcomes can be used but the status in those years is unobserved (ECLAIR 2011 largely
  continues RAR).
- EP status for 2020-2025 comes from the binary flags in the enrolment file, not from a dedicated EP file.
- No school-level class size or staffing before 2023 except `pupils_per_division` (2011-2019). No school-level
  teacher counts, teacher experience or pay; those exist only as national or académie aggregates in the Cour files.
- IPS starts in 2016 (one year after the reform); no pre-reform school IPS is published. The pre-reform
  "indice synthétique" used to draw the 2015 map (scale 0-20) is not published at school level.
- DNB 2022+ has no number admitted; the general/professional series split creates a break at 2022.
- DEPP evaluation PDFs could not be downloaded (see evaluations.md).
