Validatie¶
De pipeline voert vóór de ETL automatisch een datakwaliteitscontrole uit op alle ruwe inputbestanden. Dit voorkomt dat fouten in de brondata pas later in de pipeline of in de output zichtbaar worden.
Gebruik --noetl om zowel de ETL als de validatie over te slaan (alleen als de data eerder al gevalideerd is).
Drie typen bevindingen¶
| Type | Gedrag | Wanneer gebruiken |
|---|---|---|
| Hard error | Pipeline stopt direct | Data is structureel onbruikbaar (ontbrekende kolommen, onleesbaar bestand) |
| Soft error | Pipeline vraagt om bevestiging | Data is twijfelachtig maar niet per se fout (onverwachte waarden, mogelijk verkeerd jaar) |
| Waarschuwing | Pipeline loopt door, melding in console | Automatisch gecorrigeerd, of niet-kritiek |
In geautomatiseerde runs (CI/CD) gebruik je --yes om de soft-error prompt te omzeilen.
Gevalideerde bestanden¶
Telbestanden (data/input_raw/telbestanden/)¶
| Controle | Type | Wat wordt gecheckt |
|---|---|---|
| Map bestaat | Hard error | data/input_raw/telbestanden/ moet bestaan |
| Bestanden aanwezig | Hard error | Minimaal één bestand met patroon telbestandY{jaar}W{week}.csv |
| Verplichte kolommen | Hard error | Studiejaar, Isatcode, Groepeernaam, Aantal, meercode_V, Herinschrijving, Hogerejaars, Herkomst |
| Weeknummer in bestandsnaam | Hard error | Weeknummer moet tussen 1 en 53 liggen |
| Collegejaar bereik | Soft error | Studiejaar buiten [huidig jaar − 15, huidig jaar + 2] |
| Herkomst geldige waarden | Soft error | Elke waarde in Herkomst moet N, E of R zijn |
| Herinschrijving geldige waarden | Soft error | Elke waarde moet J of N zijn |
| Hogerejaars geldige waarden | Soft error | Elke waarde moet J of N zijn |
| meercode_V = 0 | Soft error | Leidt tot deling door nul in ETL |
| Aantal < 0 | Soft error | Negatieve aantallen zijn inhoudelijk onjuist |
Ontbrekende waarden Aantal |
Waarschuwing / Soft error | > 5% ontbrekend → waarschuwing; > 30% → soft error |
| Gaten tussen weken | Waarschuwing | Gat van > 2 weken binnen een jaar |
| Witruimte in categorische waarden | Waarschuwing | Automatisch gestript ("J " → "J") |
Individuele aanmelddata (data/input_raw/individuele_aanmelddata.csv)¶
| Controle | Type | Wat wordt gecheckt |
|---|---|---|
| Bestand bestaat | Waarschuwing | Niet aanwezig → overgeslagen (individueel spoor werkt niet) |
| Verplichte kolommen | Hard error | Collegejaar, Croho, Inschrijfstatus, Datum Verzoek Inschr (via kolomnamen-mapping) |
| Ontbrekende waarden | Waarschuwing / Soft error | Per verplichte kolom, zelfde drempels als telbestanden |
Oktober-bestand (data/input_raw/oktober_bestand.xlsx)¶
| Controle | Type | Wat wordt gecheckt |
|---|---|---|
| Bestand bestaat | Waarschuwing | Niet aanwezig → studentaantallen worden niet berekend |
| Verplichte kolommen | Hard error | Collegejaar, Groepeernaam Croho, Aantal eerstejaars croho, EER-NL-nietEER, Examentype code, Aantal Hoofdinschrijvingen |
| Collegejaar bereik | Soft error | Zelfde bereikcontrole als telbestanden |
| Ontbrekende waarden | Waarschuwing / Soft error | Per verplichte kolom |
Pre-prediction checks¶
Vóór elke modelrun voert de pipeline drie aanvullende checks uit op de cumulatieve vooraanmelddata. Ze draaien per (jaar, week)-combinatie, na ETL maar vóór de modellen.
Alleen actief als cumulatieve data beschikbaar is
De pre-prediction checks worden overgeslagen als de pipeline zonder cumulatieve data draait (individueel-enkel modus, -d i). In dat geval is er geen Gewogen vooraanmelders-kolom om te valideren.
| Check | Type | Wat wordt gecheckt |
|---|---|---|
| Decimaalintegriteit | Hard stop | Gewogen vooraanmelders bevat strings met komma's of niet-numerieke waarden |
| Lege dataset | Hard stop | Geen rijen aanwezig voor het gevraagde jaar+week |
| Historisch realisme | Hard stop / waarschuwing | Afwijking t.o.v. dezelfde week vorig jaar per opleiding/herkomst/examentype |
Historisch realisme — drempelwaarden¶
Vergelijking per (Croho groepeernaam, Herkomst, Examentype):
| Situatie | Gedrag |
|---|---|
Afwijking > max(25, 70% van vorig jaar) |
Hard stop — pipeline stopt |
Afwijking > max(15, 30% van vorig jaar) |
Waarschuwing — pipeline loopt door |
De absolute vloer (max(…)) voorkomt vals-positieven bij kleine opleidingen: een programma met 10 studenten vorig jaar en 18 dit jaar (80% relatief, 8 absoluut) triggert geen hard stop omdat de absolute drempel (25) niet gehaald wordt.
Numerus-fixus-opleidingen (examentype Bachelor) worden overgeslagen — hun aanmeldpatroon is beleidsmatig bepaald en niet vergelijkbaar met het historische patroon.
Als er geen vorig-jaar-data beschikbaar is (nieuwe opleiding), wordt de check stilzwijgend overgeslagen.
Hard stop omzeilen met --yes¶
De decimaalcheck en lege-dataset-check zijn nooit te omzeilen: corrupte of afwezige data heeft geen veilige fallback. De historisch-realismecheck wél — gebruik --yes om een extreme afwijking te accepteren en door te gaan:
Met --yes verschijnt een waarschuwing in de console maar stopt de pipeline niet. Gebruik dit bewust: een extreme afwijking kan duiden op een Studielink-probleem dat je niet wilt meenemen in de modeltraining.
Post-prediction checks¶
Nadat het ensemble zijn voorspellingen heeft opgeleverd, voert de pipeline twee informatieve checks uit. Ze stoppen de pipeline nooit — ze printen alleen waarschuwingen in de console.
| Check | Wat wordt gecheckt |
|---|---|
| Trend-realisme YoY | Ensemble_prediction wijkt > 50% én > 20 absoluut af van Gewogen vooraanmelders dezelfde week vorig jaar |
| Trend-realisme WoW | Ensemble_prediction wijkt > 30% én > 15 absoluut af van de voorspelling van de vorige week |
| NF-cap overschrijding | Gesommeerde Ensemble_prediction per numerus-fixus-opleiding overschrijdt het geconfigureerde plafond |
Pre-master-rijen worden uitgesloten van de NF-cap-check: ze tellen niet mee als nieuwe eerstejaars.
De week-op-week-check slaat de eerste week van elke run over (geen vorige week beschikbaar) en week 39 (eerste week van het nieuwe aanmeldseizoen — de vorige week, 38, is het einde van het vorige seizoen en geen zinvolle referentie).
Alleen beschikbaar in combinatiemodus
De post-prediction checks zijn alleen actief als de pipeline wordt gestart met -d both of -d b. In cumulatief-enkel (-d c) of individueel-enkel (-d i) modus bestaat de Ensemble_prediction-kolom niet en worden de checks stilzwijgend overgeslagen.
Drempels aanpassen¶
De standaarddrempels voor NaN-percentages en jaarbereiken zijn instelbaar via configuration.json. Zie Configuratie — validation.
Een validatiefout oplossen¶
Hard error — ontbrekende kolommen:
De kolomnaam in jouw bestand wijkt af van de kanonieke naam. Voeg een kolomnamen-mapping toe in configuration.json onder columns.individual of columns.oktober.
Soft error — onverwacht collegejaar:
Controleer of het bestand het juiste studiejaar bevat. Als de afwijking verwacht is (bijv. historische data), kun je collegejaar_min_offset verhogen of met --yes doorgaan.
Soft error — ongeldige herkomstwaarden:
Jouw instelling gebruikt mogelijk "ONBEKEND" of een andere waarde. Voeg die toe aan validation.telbestand.herkomst_allowed in je configuratie.
Waarschuwing — witruimte gestript: De data wordt automatisch gecorrigeerd. Overweeg de brondata te corrigeren om dit te voorkomen.