Skip to contents

Each year students start a study programme in institutions of higher education. In the academic year 2023/2024 126059 students started a programme at a university of applied sciences in the Netherlands where they did not study before1. These students are not all new in higher education. About 15% of them were previously enrolled in another institution. Switching institutions includes switching between research universities and universities of applied sciences. And of course next to students switching institutions, there are students switching programmes within their institutions.

With help of the package wisselstroom we can gain insight in the flows from and to our own (dutch) institution of higher education. It makes use of the institution specific files relating to the funding of the enrolments, the “bekostigingsbestanden”.

These insights can be used for instance to enhance study information, so that prospective students can make a better informed choice between study programmes.

This document gives a short introduction to the bekostigingsbestanden, and shows you how to apply the functions from the package wisselstroom to these files.

Note to readers outside of HEI Netherlands: this is very specific to the dutch higher educational system, so probably not relevant outside dutch HE.

Bekostigingsbestanden

Official documentation regarding these files can be found at the website of Dienst Uitvoering Onderwijs (DUO) of the Ministerie van Onderwijs en Wetenschappen: https://duo.nl/zakelijk/hoger-onderwijs/studentenadministratie/programma-van-eisen-bron-ho.jsp. This document also describes how to request the files regarding your HEI.

Purpose

A bekostigingsbestand is an analysis file specific for an institution of higher education in the Netherlands that contains funding decisions for all enrolments of that HEI for that funding year. In order to enable the HEI to check the decisions, it also contains information about all other enrolments and degrees obtained of the students involved.
So not only the enrolments at the own HEI, also enrolments at other HEIs.

A bekostigingsbestand can be requested containing information about maximum two years. That implies that we not only are able to gain insight in the programmes they enrolled in before, but also after enrolment in the programmes of the own HEI.

How to obtain the bekostigingsbestanden

Each institution has its own procedures.

Technical specifications bekostigingsbestand

  • The name of a bekostigingsbestand is relevant information. So do not alter this. The package wisselstroom contains an example bekostigingsbestand: “VLPBEK_2025_20240115_99XX.csv”.
    • VLPBEK tells us it is a voorlopig bekostigingsbestand (a preliminary file). Other options for the first 5 characters are DEFBEK (definitive file) or HISBEK (historical file).
    • 2025 is the year the funding relates to
    • 20240115 is the date the file was created by DUO
    • 99XX is the BRIN of the HEI; BRIN is an abbreviation of BasisRegistratieINstellingen, an administrative code
  • The size of a bekostigingsbestand depends on the HEI. For a larger university of applied sciences, and for the maximum time horizon it can be around 15MB (voorlopig bekostigingsbestand).
  • The file format is an UTF-8 coded csv, with a “|” as delimiter.
  • The file can be considered a container for 5 different sub files with records that are intermingled. Each sub file type has its own interpretation of the columns, so in order to interpret a value in a specific column of the csv, it is needed to also know the recordtype.

Since the DEFBEK’s are issued in may or june, the second year in the data does not describe the complete second year.

A screenshot of the example bekostigingsbestand:

Functions in the package

The package wisselstroom contains three main functions:

  • read_bek_data(), for reading in a defbek or vlpbek type of bekostigingsbestand, results in a data.frame;
  • make_flow_basics(), for splitting up that data.frame, and restricting to data necessary for:
  • make_flow_insights(), for calculations that help gain the insights.

Besides these three functions, there are some smaller functions:

  • plot_brinflows(), to gain insight in flows to and from the own institution, on an aggregated level;
  • after_degree(), to gain insight in specific flows after obtaining a final or propedeutical degree;
  • find_flows(), to gain insight in specific flows from or to another HEI

There is one helper function that does not need information from a bekostigingsbestand:

  • plot_sankeygradient(), to plot a sankey diagram with colors of the flows changing gradually from origin to destination

Flow descriptions

Every enrolment gets labelled with either stay, switch, stack, stop, start or special,depending on the enrolments of that student in both academic years of the bekostigingsbestand.

Seeing from the first academic year, the enrolments are proceeding to the following year as:

  • stay - an enrolment that is present in both years
  • switch - an enrolment that stops after the academic year without a final degree, and the student starts the following academic year in a program the student was not enrolled before
  • stack - an enrolment that ends in a final degree, as are the other enrolments of the student, and the student starts the following academic year in a program the student was not enrolled before
  • stop - all enrolments stop
  • special - some special cases, with multiple enrolments per student per academic year

Seeing from the last academic year, an enrolment can be:

  • start - an enrolment that was not present in the first academic year, that was not a stack or switch

Quick start

Install the package wisselstroom when not installed yet, and load it:

# devtools::install_github("cedanl/wisselstroom"), if not done before
library(wisselstroom)

After installing the package wisselstroom, and loading it, running the following lines will give you a quick insight in the flows regarding switch (change the path if you want to use your own bekostingsbestand):

# load the library
# specify the path to your data, here is the example data
path_to_mybekfile <- system.file("extdata", "VLPBEK_2025_20240115_99XX.csv", package = "wisselstroom")
# read in the data to a data.frame
vlp_data <- read_bek_data(path_to_mybekfile)
# make the basics
my_flow_basics <- make_flow_basics(vlp_data)
# make the insights
my_flow_insights <- make_flow_insights(my_flow_basics)
# have a look at the switches
my_flow_insights$switches
#> # A tibble: 9 × 8
#>   from_academic_year from_brin from_program to_academic_year to_enrolments    
#>   <chr>              <chr>     <chr>        <chr>            <chr>            
#> 1 2022/2023          73CC      51021        2023/2024        HBO-BA-99XX-31007
#> 2 2022/2023          73CC      51025        2023/2024        HBO-BA-99XX-31009
#> 3 2022/2023          74DD      51025        2023/2024        HBO-BA-99XX-31009
#> 4 2022/2023          99XX      31005        2023/2024        HBO-BA-71AA-31005
#> 5 2022/2023          99XX      31006        2023/2024        HBO-BA-99XX-31007
#> 6 2022/2023          99XX      31008        2023/2024        HBO-BA-71AA-31024
#> 7 2022/2023          99XX      31008        2023/2024        HBO-BA-99XX-31007
#> 8 2022/2023          99XX      31011        2023/2024        HBO-BA-72BB-31010
#> 9 2022/2023          99XX      31018        2023/2024        HBO-BA-99XX-31004
#> # ℹ 3 more variables: total_switch <int>, with_prop <int>, other <int>

Technical details

For more information regarding the calculations, read the vignette “Technical details”.