
Introduction to wisselstroom
wisselstroom.Rmd
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.
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 adata.frame
; -
make_flow_basics()
, for splitting up thatdata.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>