<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>API | appareto</title>
    <link>/category/api/</link>
      <atom:link href="/category/api/index.xml" rel="self" type="application/rss+xml" />
    <description>API</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>nl-nl</language><copyright>appareto by bridges It</copyright><lastBuildDate>Fri, 16 Apr 2021 00:00:00 +0000</lastBuildDate>
    <image>
      <url>/images/icon_hu0dd4792f4cd0cbf7f048c96fd32a1834_4301_512x512_fill_lanczos_center_2.png</url>
      <title>API</title>
      <link>/category/api/</link>
    </image>
    
    <item>
      <title>Gebruik CBS Open Data in R</title>
      <link>/2021/04/16/gebruik-cbs-open-data-in-r/</link>
      <pubDate>Fri, 16 Apr 2021 00:00:00 +0000</pubDate>
      <guid>/2021/04/16/gebruik-cbs-open-data-in-r/</guid>
      <description>
&lt;script src=&#34;/2021/04/16/gebruik-cbs-open-data-in-r/
index.nl_files/header-attrs/header-attrs.js&#34;&gt;&lt;/script&gt;


&lt;div id=&#34;inleiding&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Inleiding&lt;/h1&gt;
&lt;p&gt;In deze post een eenvoudig voorbeeld hoe je makkelijk open data van het CBS kunt downloaden m.b.v. &lt;a href=&#34;https://cran.r-project.org/web/packages/cbsodataR/&#34;&gt;cbsodataR&lt;/a&gt; om er daarna een analyse op te doen in R, bv om een tree te bouwen m.b.v. recursive partitioning (party)&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;de-cbs-data-api&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;De CBS data API&lt;/h1&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(tidyverse)
library(cbsodataR)
library(party)
library(knitr)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Om informatie over alle datasets te krijgen kun je ‘cbs_get_datasets’ gebruiken&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ds &amp;lt;- cbs_get_datasets(&amp;quot;Language&amp;quot; = &amp;quot;en&amp;quot;)
print(paste(nrow(ds), &amp;quot;datasets&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;844 datasets&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan krijg je 844 records met de volgende informatie per dataset:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;names(ds)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##  [1] &amp;quot;Updated&amp;quot;             &amp;quot;Identifier&amp;quot;          &amp;quot;Title&amp;quot;              
##  [4] &amp;quot;ShortTitle&amp;quot;          &amp;quot;ShortDescription&amp;quot;    &amp;quot;Summary&amp;quot;            
##  [7] &amp;quot;Modified&amp;quot;            &amp;quot;MetaDataModified&amp;quot;    &amp;quot;ReasonDelivery&amp;quot;     
## [10] &amp;quot;ExplanatoryText&amp;quot;     &amp;quot;OutputStatus&amp;quot;        &amp;quot;Source&amp;quot;             
## [13] &amp;quot;Language&amp;quot;            &amp;quot;Catalog&amp;quot;             &amp;quot;Frequency&amp;quot;          
## [16] &amp;quot;Period&amp;quot;              &amp;quot;SummaryAndLinks&amp;quot;     &amp;quot;ApiUrl&amp;quot;             
## [19] &amp;quot;FeedUrl&amp;quot;             &amp;quot;DefaultPresentation&amp;quot; &amp;quot;DefaultSelection&amp;quot;   
## [22] &amp;quot;GraphTypes&amp;quot;          &amp;quot;RecordCount&amp;quot;         &amp;quot;ColumnCount&amp;quot;        
## [25] &amp;quot;SearchPriority&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;kerncijfers-buurten-en-wijken&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Kerncijfers Buurten en Wijken&lt;/h1&gt;
&lt;p&gt;Ook kun je via de API zoeken in de beschrijvingen van de datasets en ben voor nu geinteresseerd in de Kerncijfers wijken en buurten. De resultaten zijn gesorteerd op basis van een query score, de eerste 5 zijn:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;res &amp;lt;- cbs_search(c(&amp;quot;Kerncijfers,wijken,buurten&amp;quot;), 
                  language=&amp;quot;nl&amp;quot;, 
                  format=&amp;quot;raw&amp;quot;, 
                  verbose = FALSE)
kable(res$response$docs %&amp;gt;% select(1:2) %&amp;gt;% head(5))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;PublicationKey&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;PublicationTitle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84799NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84583NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84286NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;83765NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2017&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;83487NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Na download lijkt de dataset van 2020 op moment van schrijven niet compleet vandaar verder met de versie van 2019 met ID &lt;strong&gt;84583NED&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;metadata &amp;lt;- cbs_get_meta(&amp;quot;84583NED&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dat zijn 157 variabelen, in deze post gebruik ik een beperkt aantal variabelen op gemeenteniveau gerelateerd aan stedelijkheid en type bedrijven in de gemeente. We halen wel de hele dataset op en filteren dan lokaal om optimale controle te hebben. Het is ook mogelijk via de API te filteren, maar dat geeft soms onverwachte resultaten omdat er bijvoorbeeld extra spaties achter een waarde staan.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;data_all &amp;lt;- cbs_get_data(&amp;quot;84583NED&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Van de opgehaalde data wil ik met de volgende variabelen verder werken.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;mycols &amp;lt;- c(&amp;quot;Gemeentenaam_1&amp;quot;,
            &amp;quot;MateVanStedelijkheid_115&amp;quot;,  
            &amp;quot;BedrijfsvestigingenTotaal_91&amp;quot;, 
            &amp;quot;ALandbouwBosbouwEnVisserij_92&amp;quot;,
            &amp;quot;BFNijverheidEnEnergie_93&amp;quot;, 
            &amp;quot;GIHandelEnHoreca_94&amp;quot;,
            &amp;quot;HJVervoerInformatieEnCommunicatie_95&amp;quot;,
            &amp;quot;KLFinancieleDienstenOnroerendGoed_96&amp;quot;,
            &amp;quot;MNZakelijkeDienstverlening_97&amp;quot;,       
            &amp;quot;RUCultuurRecreatieOverigeDiensten_98&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En alleen op gemeente niveau, niet voor bv buurten of wijken en ‘versimpeling’ van de namen van de variabelen.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;data_gemeentes &amp;lt;- data_all %&amp;gt;% 
  filter(str_detect(SoortRegio_2, &amp;quot;Gemeente&amp;quot;)) %&amp;gt;%
  select(all_of(mycols)) 

data_gemeentes &amp;lt;- data_gemeentes %&amp;gt;% 
    rename_with(str_replace, pattern = &amp;quot;_\\d+$&amp;quot;, replacement = &amp;quot;&amp;quot;)

names(data_gemeentes)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##  [1] &amp;quot;Gemeentenaam&amp;quot;                      &amp;quot;MateVanStedelijkheid&amp;quot;             
##  [3] &amp;quot;BedrijfsvestigingenTotaal&amp;quot;         &amp;quot;ALandbouwBosbouwEnVisserij&amp;quot;       
##  [5] &amp;quot;BFNijverheidEnEnergie&amp;quot;             &amp;quot;GIHandelEnHoreca&amp;quot;                 
##  [7] &amp;quot;HJVervoerInformatieEnCommunicatie&amp;quot; &amp;quot;KLFinancieleDienstenOnroerendGoed&amp;quot;
##  [9] &amp;quot;MNZakelijkeDienstverlening&amp;quot;        &amp;quot;RUCultuurRecreatieOverigeDiensten&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ik bewerk de data om deze geschikt te maken voor de analyse in gedachte, o.a. type bedrijven als percentage van het totaal aantal bedrijven en mate van stedelijkheid als factor.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;frac &amp;lt;- function(deel, totaal) {
  deel/totaal*100
  }

data_gemeentes_analyse &amp;lt;- data_gemeentes %&amp;gt;% 
  as_tibble() %&amp;gt;%
  dplyr::mutate(ALandbouwBosbouwEnVisserijF = frac(ALandbouwBosbouwEnVisserij, BedrijfsvestigingenTotaal),
                BFNijverheidEnEnergieF = frac(BFNijverheidEnEnergie, BedrijfsvestigingenTotaal),
                GIHandelEnHorecaF = frac(GIHandelEnHoreca, BedrijfsvestigingenTotaal),
                HJVervoerInformatieEnCommunicatieF = frac(HJVervoerInformatieEnCommunicatie, BedrijfsvestigingenTotaal),
                KLFinancieleDienstenOnroerendGoedF = frac(KLFinancieleDienstenOnroerendGoed, BedrijfsvestigingenTotaal),
                MNZakelijkeDienstverleningF = frac(MNZakelijkeDienstverlening, BedrijfsvestigingenTotaal),
                RUCultuurRecreatieOverigeDienstenF = frac(RUCultuurRecreatieOverigeDiensten,BedrijfsvestigingenTotaal)
                ) %&amp;gt;%
  mutate(MateVanStedelijkheid = as_factor(MateVanStedelijkheid))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;mate-van-stedelijkheid-a.d.h.v.-percentage-landbouw&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Mate van stedelijkheid a.d.h.v. percentage landbouw&lt;/h1&gt;
&lt;p&gt;Om een idee te krijgen van bv het percentage landbouw, bosbouw en visserij verdeeld over de gemeentes:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qplot(data_gemeentes_analyse$ALandbouwBosbouwEnVisserijF, geom = &amp;quot;histogram&amp;quot;, bins=30)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-9-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;landbouwtree &amp;lt;- ctree(MateVanStedelijkheid ~ ALandbouwBosbouwEnVisserijF, data = data_gemeentes_analyse)
plot(landbouwtree, 
     main=&amp;quot;Mate van stedelijkheid a.d.h.v. het % bedrijven landbouw, bosbouw en visserij&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-10-1.png&#34; width=&#34;1440&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% 
    filter(stringr::str_detect(Gemeentenaam, gemeente)) %&amp;gt;% 
    select(ALandbouwBosbouwEnVisserijF)
  pred &amp;lt;- -1
  if (nrow(gemeente_sample &amp;gt; 0)) {
    pred &amp;lt;- Predict(ptree, as.list(gemeente_sample))    
  } else {
    print(paste(&amp;quot;Geen data voor&amp;quot;, gemeente))
  }

  pred
}

voorspel_stedelijkheid_ok &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}

voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Oss&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] TRUE&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Waalwijk&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] FALSE&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Eindhoven&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] TRUE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Een overzicht maken van de voorspellingen t.o.v. echte waarde:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspelling_ok &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, 
               function(x) { 
                 as.integer(
                   voorspel_stedelijkheid_ok(landbouwtree, 
                                         data_gemeentes_analyse, 
                                         x)) }) %&amp;gt;% flatten_int()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;Geen data voor Bergen (L.)                             &amp;quot;
## [1] &amp;quot;Geen data voor Bergen (NH.)                            &amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hoe vaak is deze voorspelling goed?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-13-1.png&#34; width=&#34;672&#34; /&gt;
Is niet meteen indrukwekkend. Om het effect te zien van het gebruik van de de classificatie tree hieronder het verhaal als er random ‘voorspeld’ zou zijn.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_random &amp;lt;- function(ptree, data, gemeente) {
  pred &amp;lt;- sample(1:5, 1)
}

voorspel_stedelijkheid_random_ok &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% dplyr::filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid_random(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}

voorspelling_random &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, function(x) { 
  as.integer(voorspel_stedelijkheid_random_ok(NULL, data_gemeentes_analyse, x)) }) %&amp;gt;% 
  flatten_int()

par(mfrow = c(1:2))
barplot(table(voorspelling_random), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))
barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-14-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;mate-van-stedelijkheid-a.d.h.v.-percentage-type-bedrijven&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Mate van stedelijkheid a.d.h.v. percentage type bedrijven&lt;/h1&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;partybedrijven &amp;lt;- ctree(MateVanStedelijkheid ~ ., 
                        data = data_gemeentes_analyse %&amp;gt;% select(-Gemeentenaam))
plot(partybedrijven, 
     main=&amp;quot;Mate van stedelijkheid a.d.h.v. % verschillende types bedrijven&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticblah-1.png&#34; width=&#34;1440&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid2 &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% filter(stringr::str_detect(Gemeentenaam, gemeente)) %&amp;gt;% 
    select(-Gemeentenaam, -MateVanStedelijkheid)
  pred &amp;lt;- -1
  if (nrow(gemeente_sample &amp;gt; 0)) {
    pred &amp;lt;- Predict(ptree, as.list(gemeente_sample))    
  } else {
    print(paste(&amp;quot;Geen data voor&amp;quot;, gemeente))
  }

  pred
}

voorspel_stedelijkheid_ok2 &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% 
    dplyr::filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid2(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspelling_ok2 &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, function(x) { 
  as.integer(voorspel_stedelijkheid_ok2(partybedrijven, data_gemeentes_analyse, x)) }) %&amp;gt;% 
  flatten_int()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;Geen data voor Bergen (L.)                             &amp;quot;
## [1] &amp;quot;Geen data voor Bergen (NH.)                            &amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;par(mfrow = c(1:2))
barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))
barplot(table(voorspelling_ok2), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-17-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Dat is maar een kleine verbetering, maar genoeg voor hier en nu, qua analyse meer in de toekomst. Het ging vooral om snel wat te laten zien m.b.t. cbsodataR.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>
