Aan de slag met staat1cho

Wat doet dit package?

staat1cho berekent vier studie-indicatoren per instroomcohort op basis van de 1CHO-aanlevering van DUO:

De pipeline

De functies werken in vaste volgorde. Elke stap bouwt voort op de vorige.

maak_basisbestand()
    └── maak_instroom_cohort()  ──┐
    └── maak_diploma_behaald()  ──┼── bereken_rendement()   ──┐
                                  ├── bereken_uitval()       ──┼── combineer_indicatoren()
                                  └── bereken_studiewissel() ──┘

Voorbeeld met synthetische data

maak_synthetische_1cho() maakt een fictieve instelling met complete studieloopbanen in het formaat van de 1cijferho-enriched output. We schrijven die weg als CSV en lezen hem in zoals je dat met een echte aanlevering doet.

synth <- maak_synthetische_1cho(n_per_jaar = 100, jaren = 2014:2023)
pad <- tempfile(fileext = ".csv")
readr::write_delim(synth, pad, delim = ";", na = "")

basis <- maak_basisbestand(pad)
laatste_jaar <- max(basis$inschrijvingsjaar)
laatste_jaar
#> [1] 2023

Stap 1: instroomcohort

maak_instroom_cohort() filtert op nieuwe eerstejaarsstudenten: hoofdinschrijving en verblijfsjaar 1 aan de instelling.

cohorten <- maak_instroom_cohort(basis, soort_ho = "hoger beroepsonderwijs")
table(cohorten$inschrijvingsjaar)
#> 
#> 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 
#>  100  100  100  100  100  100  100  100  100  100

Stap 2: diploma en rendement

maak_diploma_behaald() zoekt het vroegste diploma per student, met de opleiding waarin het behaald is. bereken_rendement() bepaalt of dat binnen 3, 5 of 8 jaar was.

diploma <- maak_diploma_behaald(basis)
rendement <- bereken_rendement(cohorten, diploma, laatste_jaar = laatste_jaar)
table(rendement$eerstejaar_instelling, rendement$rendement_5jr)
#>       
#>        Diploma binnen 5 jaar Diploma na 5 jaar Geen diploma
#>   2014                    66                14           20
#>   2015                    61                18           21
#>   2016                    57                12           31
#>   2017                    57                19           24
#>   2018                    52                20           28
#>   2019                    58                 0           42
#>   2020                     0                 0            0
#>   2021                     0                 0            0
#>   2022                     0                 0            0
#>   2023                     0                 0            0
#>       
#>        Nog niet waarneembaar
#>   2014                     0
#>   2015                     0
#>   2016                     0
#>   2017                     0
#>   2018                     0
#>   2019                     0
#>   2020                   100
#>   2021                   100
#>   2022                   100
#>   2023                   100

Cohorten vanaf 2020 zitten nog geen 5 jaar in de data. Die studenten krijgen “Nog niet waarneembaar” en tellen niet mee in percentages. Zonder deze regel zou het rendement voor recente cohorten kunstmatig instorten.

Stap 3: uitval

bereken_uitval() bepaalt de status van elke student: diploma behaald, zittend of uitgevallen. Het peiljaar wordt afgeleid uit de data.

uitval <- bereken_uitval(basis, diploma, cohorten)
table(uitval$status)
#> 
#> Diploma behaald     Uitgevallen         Zittend 
#>             479             201             320

Stap 4: studiewissel

bereken_studiewissel() detecteert of een student binnen 1 of 3 jaar van opleiding is gewisseld.

wissel <- bereken_studiewissel(basis, cohorten, diploma, uitval)
table(wissel$studiewissel_1jr)
#> 
#>          Geen switch bepaald      Gewisseld binnen 1 jaar 
#>                          131                           79 
#> Niet gewisseld binnen 1 jaar        Nog niet waarneembaar 
#>                          690                          100

Stap 5: combineren

combineer_indicatoren() voegt alle stappen samen tot één analysebestand.

indicatoren <- combineer_indicatoren(cohorten, rendement, uitval, wissel)
head(indicatoren[, c("inschrijvingsjaar", "opleidingscode", "status", "rendement", "uitval", "studiewissel")])
#> # A tibble: 6 × 6
#>   inschrijvingsjaar opleidingscode status          rendement uitval studiewissel
#>               <int> <fct>          <fct>           <chr>     <chr>  <chr>       
#> 1              2014 35501          Diploma behaald Diploma … Niet … Niet gewiss…
#> 2              2014 34401          Diploma behaald Diploma … Niet … Niet gewiss…
#> 3              2014 35501          Diploma behaald Diploma … Niet … Niet gewiss…
#> 4              2014 35501          Diploma behaald Diploma … Niet … Niet gewiss…
#> 5              2014 34402          Uitgevallen     Geen dip… Uitge… Niet gewiss…
#> 6              2014 34401          Diploma behaald Diploma … Niet … Gewisseld b…

Studentniveau of inschrijvingsniveau?

Op studentniveau (standaard) telt een student één keer, in de opleiding waarin die student instroomt. Alle uitkomsten gelden voor de hele instelling: een student die wisselt en in een andere opleiding een diploma haalt, telt bij de instroomopleiding als “Diploma behaald”. De kolom diploma_in_instroomopleiding laat zien hoe vaak dat gebeurt:

table(indicatoren$diploma_in_instroomopleiding, useNA = "ifany")
#> 
#> FALSE  TRUE  <NA> 
#>    50   429   521

Op inschrijvingsniveau is elke opleiding een eigen cohort: een wissel telt als uitval uit de oude opleiding en als instroom in de nieuwe. Kies dit niveau als je opleidingen met elkaar wilt vergelijken.

cohort_ins <- maak_instroom_cohort(basis, "hoger beroepsonderwijs", niveau = "inschrijving")
nrow(cohort_ins) - nrow(cohorten)  # extra cohorten door wissels
#> [1] 79

Benchmarkrapport

maak_benchmarkrapport() aggregeert per sector, opleidingsvorm, niveau en instroomjaar, met privacyonderdrukking van kleine groepen. schrijf_benchmarkrapport() slaat het op als Excel met toelichting en metadata.

rapport <- maak_benchmarkrapport(indicatoren)
rapport[rapport$sector == "totaal", c("inschrijvingsjaar", "n", "pct_uitval_1jr", "pct_rendement_5jr")]
#> # A tibble: 10 × 4
#>    inschrijvingsjaar     n pct_uitval_1jr pct_rendement_5jr
#>                <int> <dbl>          <dbl>             <dbl>
#>  1              2014   100             11                66
#>  2              2015   100             11                61
#>  3              2016   100             18                57
#>  4              2017   100             13                57
#>  5              2018   100             17                52
#>  6              2019   100             13                58
#>  7              2020   100             13                NA
#>  8              2021   100             15                NA
#>  9              2022   100             20                NA
#> 10              2023   100             NA                NA

Dashboard

Voor interactieve verkenning kun je het dashboard starten en het CSV-bestand uploaden:

start_dashboard()

Een vast script: pipeline.R

Wil je het rapport elk jaar op precies dezelfde manier maken, zonder door het dashboard te klikken? Download staat1cho als ZIP en open pipeline.R in RStudio. Vul bovenin het pad naar je _enriched.csv in (met /, ook op Windows):

pad_1cho    <- "C:/Tools/1cijferho/data/02-output/EV21PL24_enriched.csv"
niveau      <- "student"    # of "inschrijving"
vakhawv_pad <- ""           # pad naar VAKHAVW..._decoded.csv, of leeg
vlpbek_pad  <- ""           # nog leeg laten

Kies Session > Set Working Directory > To Source File Location en klik op Source. De pipeline zet het benchmarkrapport en de tussenbestanden in de map Output/<jaar> naast pipeline.R.

Overzicht van de functies

Functie Wat het doet
start_dashboard() Start het interactieve Shiny-dashboard
maak_basisbestand() Laadt het 1CHO-bestand en voegt labelkolommen toe
maak_instroom_cohort() Maakt het cohortbestand aan (nieuwe instromers)
maak_diploma_behaald() Bepaalt diplomaresultaten per student
bereken_rendement() Rendement binnen 3, 5 en 8 jaar
bereken_uitval() Uitvalstatus binnen 1 en 3 jaar
bereken_studiewissel() Studiewissel binnen 1 en 3 jaar
combineer_indicatoren() Voegt alle indicatoren samen, met vooropleiding, eerstejaars HO en het attribuut peildatum
lees_vakhawv() / verrijk_met_vakhawv() Leest VAKHAVW-vakcijfers en koppelt ze per student
lees_bekostiging() / verrijk_met_bekostiging() Leest een VLPBEK-bestand en koppelt de bekostigingsstatus (koppelt nog niet aan echte EV-bestanden, zie ?lees_bekostiging)
is_gepseudonimiseerd() Herkent gepseudonimiseerde persoonsnummers
maak_benchmarkrapport() Geaggregeerd rapport met peildatum en privacyonderdrukking (groepen < 30, cellen < 5)
schrijf_benchmarkrapport() Slaat het benchmarkrapport op als Excel met toelichting, validatie en metadata
maak_synthetische_1cho() Synthetisch 1CHO-bestand met bekende uitkomsten voor demo en validatie
DEFINITIES, BEKOSTIGINGSTATUS_CODES Definities van de indicatoren en de DUO-redencodes

Invoer

staat1cho verwacht de _enriched.csv van 1cijferho: puntkomma-gescheiden, UTF-8, kolomnamen in snake_case. Het dashboard controleert na het uploaden of de verplichte kolommen aanwezig zijn. De kolommen hoogste_vooropleiding_voor_het_ho_omschrijving_vooropleiding en eerste_jaar_in_het_hoger_onderwijs zijn optioneel; zonder die kolommen worden vooropleiding en eerstejaars HO “onbekend”.

Het package vraagt R 4.1.0 of nieuwer. Voor het dashboard zijn daarnaast bslib, DT, ggplot2, plotly, scales, tidyr en writexl nodig.