Generieke functie die een data-frame omzet naar een peiljaar
wrapper_vertaal_naar_peiljaar.Rd
Deze functie wijzigt de indicatoren in een data-frame naar een bepaald peiljaar. Het is noodzakelijk dat het data-frame naast de indicatoren ook de kolommen 'jaar' en 'wijkcode' bevat. De functie maakt zelf een inschatting van het type kolom: bevat deze relatieve waarden (aandelen of percentages) of absolute waarden (aantallen).
Usage
wrapper_vertaal_naar_peiljaar(
df,
peiljaar,
model = "model.0",
regionaalniveau = "wijk",
kolommen_aantal = NULL,
kolommen_aandeel = NULL
)
Arguments
- df
data.frame dat omgezet moet worden
- peiljaar
jaar waarnaartoe de features moeten worden omgezet
- model
welk model wordt gekozen? Keuze uit c('model.0', 'model.1', 'model.2').
model.0 neemt alleen de postcode+huisnummer mee in de berekening;
model.1 neemt postcode+huisnummer+toevoeging waarvan de gebruiksfunctie 'woonfunctie' is;
model.2 lost een stelsel vergelijkingen op waarbij wordt uitgegaan van kleine wijzigingen in gemiddelde waarden per adres van jaar tot jaar
- regionaalniveau
op welk regionaalniveau moet de omzetting plaats vinden? Keuze uit 'wijk' en 'gemeente'.
- kolommen_aantal
character vector met kolomnamen van kolommen die uit aantallen bestaan, zoals 'aantal_inwoners' of 'aantal_65Plus'. Bij dit type kolommen moet voor een gecombineerde wijk de aantallen worden opgeteld. Indien deze parameter NULL is, probeert het algoritme zelf het type kolom te achterhalen.
- kolommen_aandeel
character vector met kolomnamen van kolommen die uit aandelen, gemiddeldes of percentages bestaan, zoals 'gemiddelde_huishoudgrootte' of 'percentage_65Plus'. Bij dit type kolommen moet voor een gecombineerde wijk een gewogen gemiddelde worden uitgerekend. Indien deze parameter NULL is, probeert het algoritme zelf het type kolom te achterhalen.
Details
Alle modellen zijn gebasseerd op het volgen van adressen door de tijd heen. Hierdoor kan worden achterhaalt bij welke wijk een adres hoort op in elk jaar. Vervolgens zijn er verschillende manieren om deze informatie te benutten. Er zijn drie modellen geïmplementeerd voor het uitvoeren van grenswijzigingen.
Model.0 gaat uit van een uniforme verdeling van wijkkenmerken over de wijk heen. Dat wil zeggen dat wordt aangenomen dat kenmerken, bijvoorbeeld het aantal 65-plussers, gelijkelijk verdeeld zijn over de wijk. Bij het delen van de wijk in kleinere stukken kunnen deze kenmerken dan evenredig met het aantal adressen in deze stukken worden toegekend. In Model.0 zijn adressen gedefinieerd als postcode + huisnummer. Huisnummertoevoegingen en gebruiksfunctie van adressen worden niet meegenomen. Model.0 is daarmee een heel toegankelijk model dat een redelijk goede grenswijziging uitvoerd, maar dat faalt in geval van wijken met veel huisnummertoevoegingen (bijvoorbeeld hoogbouw of flats) en wijken met veel adressen zonder woonfunctie (bijvoorbeeld winkels, scholen en fabrieken).
Model.1 werkt gelijk aan Model.0 maar neemt daarentegen wel de huisnummertoevoeging en gebruiksfunctie van het adres mee. In Model.1 worden alleen adressen met een woonfunctie beschouwt. Daarmee presteert Model.1 aanzienlijk beter dan Model.0 voor wijken met veel huisnummertoevoegingen en andere gebruiksfuncties dan wonen. Model.1 gaat echter nog wel altijd uit van een uniforme verdeling van de wijkkenmerken over de wijk heen. Daarnaast wordt er een VNG api gebruikt om de huisnummertoevoegingen en gebruiksfunctie te achterhalen Dat kost het tamelijk veel tijd om uit te voeren voor alle adressen in Nederland. Daarom zijn ook vooraf berekende omzetmatrices beschikbaar gesteld in deze repository.
Model.2 neemt een andere benadering. Hier worden adressen opgedeeld in blokken gedefinieerd door de overlappingen tussen wijken in het ene jaar en de wijken in het volgende jaar. Voor elk blok wordt een variabele gedefinieerd die het gemiddelde van een wijkkenmerk in dat blok weergeeft. Voor deze variabelen wordt een stelsel formules opgesteld zodat de sommen van de adressen maal de gemiddelden gelijk zijn aan de wijkkenmerken zoals gepubliceerd door het CBS. Daarnaast wordt aangenomen dat deze gemiddelden van jaar tot jaar nauwelijks wijzigen. Dat lijkt een redelijke aanname: bijvoorbeeld het gemiddelde aantal 65-plussers per adres zal van jaar tot jaar ongeveer gelijk zijn. Dit stelsel vergelijkingen wordt opgelost wat tot grensgewijzigde data leidt. In dit model wordt eveneens uitgegaan van adressen met huisnummertoevoegingen en woonfunctie.
Examples
library(grenswijzigen)
library(cbsodataR)
library(dplyr)
kolommen_te_laden <- c(
"WijkenEnBuurten", "Gemeentenaam_1",
"AantalInwoners_5", "k_65JaarOfOuder_12",
"GemiddeldeHuishoudensgrootte_32"
)
# laad de kerncijfers per wijk voor 2017 en 2018
df <- rbind(
cbs_get_data(
id="83765NED",
WijkenEnBuurten = has_substring("WK"),
select = kolommen_te_laden
) %>% mutate(jaar=2017),
cbs_get_data(
id="84286NED",
WijkenEnBuurten = has_substring("WK"),
select = kolommen_te_laden
) %>% mutate(jaar=2018)
) %>% rename(
wijkcode=WijkenEnBuurten,
gemeentenaam=Gemeentenaam_1,
aantal_inwoners=AantalInwoners_5,
aantal_65plus=k_65JaarOfOuder_12
)
# laat de wijken in Wageningen zien
print(filter(df, grepl("Wageningen", gemeentenaam)))
#> # A tibble: 14 × 6
#> wijkcode gemeentenaam aantal_inwoners aantal_65plus GemiddeldeHuishouden…¹
#> <chr> <chr> <int> <int> <dbl>
#> 1 "WK028900 … "Wageningen… 33885 5125 1.7
#> 2 "WK028901 … "Wageningen… 4570 800 1.9
#> 3 "WK028901 … "Wageningen… 4725 440 2.3
#> 4 "WK028902 … "Wageningen… 2480 5 1.1
#> 5 "WK028903 … "Wageningen… 2750 540 2.2
#> 6 "WK028904 … "Wageningen… 2085 360 2.2
#> 7 "WK028905 … "Wageningen… 3175 30 1.4
#> 8 "WK028906 … "Wageningen… 6895 1435 1.7
#> 9 "WK028907 … "Wageningen… 5190 750 1.8
#> 10 "WK028908 … "Wageningen… 2505 560 1.6
#> 11 "WK028909 … "Wageningen… 3530 505 1.4
#> 12 "WK028910 … "Wageningen… 2525 710 1.9
#> 13 "WK028911 … "Wageningen… 1175 405 2.3
#> 14 "WK028912 … "Wageningen… 1370 385 2.1
#> # ℹ abbreviated name: ¹GemiddeldeHuishoudensgrootte_32
#> # ℹ 1 more variable: jaar <dbl>
# Omzetten van de data van 2017 naar 2018
df_omgezet <- wrapper_vertaal_naar_peiljaar(
as.data.frame(df),
peiljaar = 2018,
model="model.2"
)
#> ----------------------------
#> De volgende kolommen worden niet meegenomen in de grensomzetting
#> wijkcode
#> gemeentenaam
#> jaar
#> gwb_code
#> ----------------------------
#> [1] "Aantal rijen omgezette data-frame: 3085"
#> [1] "Aantal rijen omgezette data-frame: 3085"
# laat de wijken in Wageningen zien
print(filter(df_omgezet, grepl("Wageningen", gemeentenaam)))
#> gwb_code jaar aantal_inwoners aantal_65plus GemiddeldeHuishoudensgrootte_32
#> 1 028901 2018 4725.000 440.000000 2.300000
#> 2 028901 2017 4729.277 422.893689 2.254756
#> 3 028902 2017 2480.632 2.473616 1.086976
#> 4 028902 2018 2480.000 5.000000 1.100000
#> 5 028903 2018 2750.000 540.000000 2.200000
#> 6 028903 2017 2751.938 532.249797 2.167788
#> 7 028904 2018 2085.000 360.000000 2.200000
#> 8 028904 2017 2086.185 355.258833 2.174806
#> 9 028905 2018 3175.000 30.000000 1.400000
#> 10 028905 2017 3177.715 19.140689 1.371744
#> 11 028906 2018 6895.000 1435.000000 1.700000
#> 12 028906 2017 6916.329 1349.684404 1.593126
#> 13 028907 2018 5190.000 750.000000 1.800000
#> 14 028907 2017 5198.683 715.267173 1.731809
#> 15 028908 2018 2505.000 560.000000 1.600000
#> 16 028908 2017 2507.733 549.068773 1.562280
#> 17 028909 2018 3530.000 505.000000 1.400000
#> 18 028909 2017 3533.583 490.668989 1.356198
#> 19 028910 2018 2525.000 710.000000 1.900000
#> 20 028910 2017 2527.318 700.728511 1.864797
#> 21 028911 2017 1175.408 403.367688 2.285217
#> 22 028911 2018 1175.000 405.000000 2.300000
#> 23 028912 2018 1370.000 385.000000 2.100000
#> 24 028912 2017 1370.201 384.197838 2.091296
#> berekend gemeentenaam wijkcode
#> 1 FALSE Wageningen WK028901
#> 2 TRUE Wageningen WK028901
#> 3 TRUE Wageningen WK028902
#> 4 FALSE Wageningen WK028902
#> 5 FALSE Wageningen WK028903
#> 6 TRUE Wageningen WK028903
#> 7 FALSE Wageningen WK028904
#> 8 TRUE Wageningen WK028904
#> 9 FALSE Wageningen WK028905
#> 10 TRUE Wageningen WK028905
#> 11 FALSE Wageningen WK028906
#> 12 TRUE Wageningen WK028906
#> 13 FALSE Wageningen WK028907
#> 14 TRUE Wageningen WK028907
#> 15 FALSE Wageningen WK028908
#> 16 TRUE Wageningen WK028908
#> 17 FALSE Wageningen WK028909
#> 18 TRUE Wageningen WK028909
#> 19 FALSE Wageningen WK028910
#> 20 TRUE Wageningen WK028910
#> 21 TRUE Wageningen WK028911
#> 22 FALSE Wageningen WK028911
#> 23 FALSE Wageningen WK028912
#> 24 TRUE Wageningen WK028912