The DUO Data: Background & Codebook
This module uses public data from DUO (Dienst Uitvoering Onderwijs), the Dutch government agency that administers and publishes education data. The data is about the doorstroomtoets, the test every Dutch student takes at the end of primary school, and the debate about whether that test is fair. This page gives you the background you need to understand the data, a codebook for every file, and a list of pitfalls to watch out for.
You don’t need to be Dutch, or know anything about the Dutch education system, to work with this data. You do need the handful of terms below, because they show up directly as column names and category labels.
Getting the data
The data is downloaded by an R script, so nobody has to download files by hand and everything is reproducible:
- In the worksheets, use
data/get-data.Rfrom the course repository (see the setup section of Worksheet 1). - For Assignment 2, use
scripts/01-get-data.Rin the template repository. It downloads the same four files and loads them into your R session.
Both scripts save the files in data/raw/. Never edit anything in that folder by hand. Anyone can recreate it by rerunning the script.
Background
The Dutch school system, just enough of it
Dutch primary school (basisonderwijs, PO) runs from groep 1 to groep 8, roughly ages 4 to 12. Most students attend a regular primary school (Bo); students who need extra support may attend a special primary school (Sbo, speciaal basisonderwijs).
At the end of groep 8, every student gets a school advice (schooladvies): the secondary-school (voortgezet onderwijs, VO) track that the student should go to. From the most practical to the most academic:
| Track | Full name | What it is |
|---|---|---|
| PRO | praktijkonderwijs | practical education, for students who need the most support |
| VMBO-B | basisberoepsgerichte leerweg | preparatory vocational education, basic track |
| VMBO-K | kaderberoepsgerichte leerweg | preparatory vocational education, “framework” track |
| VMBO-GT | gemengde/theoretische leerweg | preparatory vocational education, mixed/theoretical track |
| HAVO | hoger algemeen voortgezet onderwijs | senior general secondary education |
| VWO | voorbereidend wetenschappelijk onderwijs | pre-university education |
There is also VSO (voortgezet speciaal onderwijs), special-needs secondary education, which sits outside this ranking. A student can also get a combined advice, like VMBO-GT/HAVO, when the school thinks either track could fit.
The track a student starts in matters a lot: switching tracks later is possible, but not easy. This is why the advice, and everything that feeds into it, is a sensitive topic.
What is a doorstroomtoets?
Near the end of groep 8 (around February), every student takes a doorstroomtoets (“transfer test”; doorstroom = “flow-through”, toets = “test”). It is a standardized test of reading, language and maths. Its main purpose is to be an objective second opinion next to the teacher’s judgement: if a student scores higher than their teacher’s advice suggests, the school must reconsider (heroverweging) the advice. In principle, the advice can only be adjusted upwards.
The doorstroomtoets replaced the old eindtoets (“final test”, including the well-known Citotoets) from the 2023–2024 school year. Since then, schools can choose which doorstroomtoets their students take, from six approved providers:
| Code in the data | Test | Publisher | Notes |
|---|---|---|---|
LIB |
Leerling in Beeld | Cito B.V. | successor of the old Citotoets; used by almost half of all schools |
IEP |
IEP Eindtoets | Bureau ICE | used by about 40% of schools |
ROUTE8 |
Route 8 | A-VISION | digital and adaptive |
DIA |
Dia-Eindtoets | Diataal BV | |
AMN |
AMN Eindtoets | AMN B.V. | |
DOE |
Overheidsdoorstroomtoets | Stichting Cito | the free, government-funded test; used by less than 1% of schools |
Each provider reports its scores on its own scale, so an IEP score of 80 and a LIB score of 180 can’t be compared. To make the tests comparable, all results are also translated into reference levels (referentieniveaus): standardized skill levels that are meant to mean the same thing, whichever test a student took.
- 1F (fundamenteel niveau): the basic level, which nearly every student should reach.
- 1S (maths) and 2F (reading and language): the higher target level (streefniveau).
The fairness debate
The idea behind letting schools choose was that all six tests are equivalent. A series of investigations by the newspaper de Volkskrant, starting in January 2025, found that they are not:
- Reference levels differ by provider. For example, about 49% of students who took Route 8 reached reading level 2F, compared to about 80% of students who took the paper version of LIB. In maths, students who took LIB reached level 1S about twice as often as students who took Route 8.
- School advice differs by provider, even more starkly. students who took AMN got a PRO or VMBO-B advice about 18 times as often as students who took paper LIB (14.6% vs. 0.8%). Paper LIB students got a VWO advice 15.4% of the time, AMN students 4.4%.
- This is not (only) because different kinds of schools choose different tests. The obvious objection is that schools don’t choose a provider at random. Maybe schools with more disadvantaged students happen to prefer certain tests. The Volkskrant therefore compared schools with an equal schoolweging (a measure of how disadvantaged a school’s student population is, see the codebook). The gap between providers remained. In other words, it’s partly a property of the test itself.
- Test format matters too. According to the College voor Toetsen en Examens (CvTE), which oversees the tests, 77% of students with a VWO teacher advice got a VWO test result on the paper LIB test, compared to 43% on the digital IEP test.
Critics called the doorstroomtoets an “ongelijkheidsmachine” (“inequality machine”): a test that was introduced to make educational opportunities more equal might be doing the opposite. Reporting on the 2026 results found that the gaps between providers had narrowed somewhat, but not disappeared. Schools with a more disadvantaged population also adjust their advice more often than other schools.
Where things stand. Sector organisations (PO-Raad, VO-raad) and the Dutch parliament pushed for a single national test. On 2 July 2026, the State Secretary for Education announced a plan to go from six providers back to one national doorstroomtoets by school year 2029/2030, stating that “full comparability is a utopia”: every difference in test design shifts the results.
The numbers above come from the Volkskrant, CvTE and other sources (see Sources), which had access to student-level data. The DUO files you work with are school-level: you know how many students at a school reached each level, and which provider the school used, but not the results of individual students. Keep this in mind when you draw conclusions.
Codebook
All files contain data from the 2024–2025 school year, with one row per school location. The three DUO files (eindscores, referentieniveaus, schooladviezen) share the same identifying columns; schoolweging comes from a different organisation and is structured differently.
"<5" means “fewer than 5”
To protect students’ privacy, DUO hides every count below 5 and writes the text "<5" instead. This means that count columns are read into R as text, not numbers, and as.numeric() silently turns every "<5" into NA. See Pitfalls for how to deal with this.
Identifying columns (all DUO files)
| Column | Meaning |
|---|---|
PEILDATUM_LEERLINGEN / PEILDATUM |
reference date for the student counts (1 October 2024) |
PRIKDATUM |
date the data was extracted |
INSTELLINGSCODE |
school code (also known as the “BRIN” code), the school’s main ID |
VESTIGINGSCODE |
location code: which building, if a school has more than one |
INSTELLINGSNAAM_VESTIGING |
name of the school (location) |
POSTCODE_VESTIGING |
postal code |
PLAATSNAAM |
town or city |
GEMEENTENUMMER / GEMEENTENAAM |
municipality code / name |
PROVINCIE |
province (the Netherlands has 12) |
SOORT_PO |
school type: Bo (regular primary) or Sbo (special primary) |
DENOMINATIE_VESTIGING |
religious or educational denomination, e.g. Openbaar (public, non-denominational), Rooms-Katholiek (Roman Catholic), Protestants-Christelijk (Protestant Christian), Algemeen bijzonder (private, non-religious) |
BEVOEGD_GEZAG_NUMMER |
ID of the school board (bevoegd gezag) |
eindscores_2024-2025.csv
The average doorstroomtoets score per school, per provider. A school only has values for the provider(s) it used; the other providers’ columns are 0.
| Column | Meaning |
|---|---|
ONTHEFFING_REDEN_ND |
number of students exempted from taking a doorstroomtoets |
IEP_AANTAL / IEP_GEM |
number of students tested (aantal) / their average score (gemiddelde), IEP |
ROUTE8_AANTAL / ROUTE8_GEM |
same, Route 8 |
DIA_AANTAL / DIA_GEM |
same, Dia-Eindtoets |
AMN_AANTAL / AMN_GEM |
same, AMN Eindtoets |
DOE_AANTAL / DOE_GEM |
same, DOE (government test) |
LIB_AANTAL / LIB_GEM |
same, Leerling in Beeld |
The _GEM scores are on six different scales (e.g. IEP roughly 50–90, AMN roughly 320–460).
referentieniveaus_2024-2025.csv
The number of students per school who reached each reference level, for three subjects. Within a subject, the columns are mutually exclusive: add them up to get the number of students who took that part of the test.
| Column | Meaning |
|---|---|
REKENEN_LAGER1F |
students below the basic level 1F in maths (rekenen) |
REKENEN_1F |
students who reached 1F, but not 1S, in maths |
REKENEN_1S |
students who reached the maths target level 1S |
REKENEN_2F |
not used for maths in primary school (always 0) |
LV_LAGER1F / LV_1F / LV_2F |
the same for reading comprehension (leesvaardigheid); target level 2F |
TV_LAGER1F / TV_1F / TV_2F |
the same for language conventions: spelling and grammar (taalverzorging); target level 2F |
This file only contains regular primary schools (Bo), and has no information about which provider a school used. To compare reference levels between providers, you need to join it to eindscores.
schooladviezen_2024-2025.csv
The number of students per school who received each school advice (the final advice, after any reconsideration).
| Column | Meaning |
|---|---|
VSO |
special-needs secondary education |
PRO |
practical education |
VMBO_B |
VMBO, basic track |
VMBO_B_K |
combined advice VMBO-B / VMBO-K |
VMBO_K |
VMBO, “framework” track |
VMBO_K_GT |
combined advice VMBO-K / VMBO-GT |
VMBO_GT |
VMBO, mixed/theoretical track |
VMBO_GT_HAVO |
combined advice VMBO-GT / HAVO |
HAVO |
senior general secondary education |
HAVO_VWO |
combined advice HAVO / VWO |
VWO |
pre-university education |
ADVIES_NIET_MOGELIJK |
no advice possible |
Order, lowest to highest: PRO < VMBO_B < VMBO_K < VMBO_GT < HAVO < VWO, with the combined advices in between.
schoolweging_2022-2025.ods
Published by the Education Inspectorate (Onderwijsinspectie) and calculated by Statistics Netherlands (CBS). This is a spreadsheet workbook with one sheet per school year; the download scripts read the "2024-2025" sheet.
| Column | Meaning |
|---|---|
OVT |
school location ID, formatted like "00AP\|C1": the part before the \| is the INSTELLINGSCODE, the part after identifies the location |
Naam |
name of the school (location) |
BGNR |
ID of the school board (same as BEVOEGD_GEZAG_NUMMER) |
schoolweging |
how socio-economically disadvantaged the school’s student population is, based on e.g. the parents’ education level and income. Higher = more disadvantaged. Values run roughly from 20 to 40 |
aantal_leerlingen |
number of students the schoolweging is based on |
spreiding |
“spread”: how much the students within the school differ from each other in disadvantage |
Tips
Look out for these features in the data:
One row is one school, not one student. Every number is a count or average for a whole school. A school with 10 students in groep 8 counts as one row, just like a school with 100. Think about whether you want to weigh schools by their number of students, and be careful with conclusions about individual students.
Hidden counts (
"<5"). Convert these explicitly instead of lettingas.numeric()turn them intoNA. Ineindscoresthis affects only a few percent of schools. Inreferentieniveausandschooladviezenit affects the large majority of schools, because students are split over many small categories, so dropping those schools is not an option. A reasonable approach is to replace"<5"with 2.5 (the midpoint of 1–4) and check whether your conclusion changes when you use 1 or 4 instead.Wide format.
eindscoreshas a pair of columns per provider, instead of one “provider” column. Usepivot_longer()to get one row per school per provider, and keep the provider with the most students (about 96% of schools use exactly one provider). See Worksheet 1 for a worked example.Different score scales. Only compare providers on reference levels or school advice, never on the raw
_GEMscores.
Glossary
| Dutch | English | Meaning |
|---|---|---|
| aantal | number | e.g. IEP_AANTAL, aantal_leerlingen |
| basisonderwijs (Bo, PO) | primary education | regular primary school |
| bevoegd gezag | competent authority | the school board |
| CBS | Statistics Netherlands | the national statistics office |
| CvTE | Board of Tests and Examinations | oversees the doorstroomtoets providers |
| doorstroomtoets | transfer test | the standardized test at the end of primary school |
| DUO | Dienst Uitvoering Onderwijs | government agency that publishes the data |
| gemeente | municipality | GEMEENTENAAM |
| gemiddelde | average | e.g. IEP_GEM |
| groep 8 | group 8 | the final year of primary school (age ~11–12) |
| heroverweging | reconsideration | adjusting the school advice upwards after the test |
| instelling / vestiging | institution / location | a school can have multiple locations |
| leerling(en) | student(s) | |
| Onderwijsinspectie | Education Inspectorate | evaluates school quality; publishes schoolweging |
| provincie | province | PROVINCIE |
| referentieniveau | reference level | standardized skill level (1F, 1S, 2F) |
| schooladvies | school advice | the recommended secondary-school track |
| schoolweging | school weighting | how disadvantaged a school’s student population is |
| speciaal basisonderwijs (Sbo) | special primary education | primary school for students who need extra support |
| voortgezet onderwijs (VO) | secondary education |
Sources
Data
- DUO open onderwijsdata:
eindscores,referentieniveausandschooladviezen - Onderwijsinspectie:
schoolweging
Background (in Dutch; a browser’s translate function works well)
- Onderzoek Volkskrant benadrukt noodzaak van één doorstroomtoets — PO-Raad
- Doorstroomtoets vergroot kansenongelijkheid — VOS/ABB
- Doorstroomtoets is ‘ongelijkheidsmachine’ — VOS/ABB
- Gelijkheid blijft uit: doorstroomtoets 2026 toont hardnekkige verschillen — Nationale Onderwijsgids
- Discussies doorstroomtoets (5): verschillen tussen toetsaanbieders — Wij-leren.nl
- Discussies doorstroomtoets (3): Objectieve graadmeter of versterker van ongelijkheid? — Wij-leren.nl
- Onderzoek naar doorstroomtoetsen — Tweede Kamer
- Kabinet wil in 2030 terug naar één doorstroomtoets — PO-Raad
- Kamer wil snel één doorstroomtoets — VO-raad
- Staatssecretaris wil van 6 naar 1 doorstroomtoets — Rijksoverheid.nl
- Doorstroomtoets in het basisonderwijs — OCW in cijfers
- Overheidsdoorstroomtoets DOE — Cito
- Verschillen doorstroomtoets — Cito
