Anropa Kolada från R
Aug 17, 2020
Filip Wästberg
6 minute read

I ett tidigare inlägg tittade jag på hur man kan hämta data direkt från SCB till R med hjälp av paketet pxweb.

SCB har massa intressant data men mycket är på en nationell nivå. En annan datakälla, som är helt inriktad på kommunal och regional statistik, är Kolada, som är Sveriges kommuner och regioners (SKR) webbtjänst för regional statistik.

Likt SCB har Kolada ett gränssnitt på webben, och precis som SCB har de också ett öppet API. Love Hansson, som är analytiker på Pensionsmyndigheten, har byggt ett paket för att anropa Kolada från R. Det här innebär att om du jobbar mycket med kommunal eller regional statistik kan du med hjälp av R-skript automatisera all inhämtning och rapportering av regional statistik från Kolada.

rKolada

Paketet installeras enkelt med install.packages("rKolada").

För att få en övergripande bild över Koladas datamodell och paketet rKolada kan jag varmt rekommendera Love Hanssons vignette som finns här.

Hur Kolada fungerar

På Koladas hemsida kan du enkelt söka efter olika KPI-er. Där kan du också få en enkel tabell och visualisering av resultatet. rKolada ger oss möjlighet att programmatiskt ta ut dessa tabeller, vilket underlättar om vi behöver ta ut statistik fler gånger än en.

Med funktionen get_kpi() får vi en tabell med alla KPI-er som finns tillgängliga.

library(rKolada)
library(tidyverse)

kpis <- get_kpi()

kpis
## # A tibble: 4,887 x 13
##    auspices description has_ou_data id    is_divided_by_g… municipality_ty…
##    <chr>    <chr>       <lgl>       <chr>            <int> <chr>           
##  1 E        Personalko… FALSE       N000…                0 K               
##  2 E        Personalko… FALSE       N000…                0 K               
##  3 X        Kommunalek… FALSE       N000…                0 K               
##  4 <NA>     Externa in… FALSE       N000…                0 K               
##  5 <NA>     Inkomstutj… FALSE       N000…                0 K               
##  6 <NA>     Kostnadsut… FALSE       N000…                0 K               
##  7 X        Reglerings… FALSE       N000…                0 K               
##  8 <NA>     Utjämnings… FALSE       N000…                0 K               
##  9 X        Införandeb… FALSE       N000…                0 K               
## 10 X        Strukturbi… FALSE       N000…                0 K               
## # … with 4,877 more rows, and 7 more variables: operating_area <chr>,
## #   ou_publication_date <chr>, perspective <chr>, prel_publication_date <chr>,
## #   publ_period <chr>, publication_date <chr>, title <chr>

Vi kan filtrera dessa med dplyr och stringr eller använda den inbyggda funktionen kpi_search():

kpi_bygglov <- kpi_search(kpis, c("bostäder som beviljats bygglov"), column = "description")

kpi_bygglov
## # A tibble: 1 x 13
##   auspices description has_ou_data id    is_divided_by_g… municipality_ty…
##   <chr>    <chr>       <lgl>       <chr>            <int> <chr>           
## 1 X        Antal bost… FALSE       N079…                0 K               
## # … with 7 more variables: operating_area <chr>, ou_publication_date <chr>,
## #   perspective <chr>, prel_publication_date <chr>, publ_period <chr>,
## #   publication_date <chr>, title <chr>

För att få ner data för detta KPI behöver 1) ett ID och 2) specificera vilken eller vilka kommuner du vill ha data för.

ID får du enkelt ut genom kpi_extract_ids().

kpi_extract_ids(kpi_bygglov)
## [1] "N07925"

De kommuner, eller regionala indelningar som finns, kan vi på motsvarande sätt få genom get_municipality().

get_municipality()
## # A tibble: 312 x 3
##    id    title      type 
##    <chr> <chr>      <chr>
##  1 1440  Ale        K    
##  2 1489  Alingsås   K    
##  3 0764  Alvesta    K    
##  4 0604  Aneby      K    
##  5 1984  Arboga     K    
##  6 2506  Arjeplog   K    
##  7 2505  Arvidsjaur K    
##  8 1784  Arvika     K    
##  9 1882  Askersund  K    
## 10 2084  Avesta     K    
## # … with 302 more rows

En bra sak med Kolada är att de för alla Sveriges kommuner har referenskommuner, kommuner som på olika sätt liknar kommunen du är intresserad av. På så sätt kan vi enkelt ta fram kommuner som är relevanta att jämföra med. I rKolada gör vi det med get_municipality_groups() och den tillhörande search-funktionen.

get_municipality_groups() %>% 
  municipality_grp_search("Finspång")
## # A tibble: 11 x 3
##    id      members          title                                          
##    <chr>   <list>           <chr>                                          
##  1 G123871 <df[,2] [7 × 2]> Liknande kommuner socioekonomi, Finspång, 2018 
##  2 G146009 <df[,2] [7 × 2]> Liknande regioner socioekonomi, Finspång, 2018 
##  3 G35908  <df[,2] [7 × 2]> Liknande kommuner grundskola, Finspång, 2018   
##  4 G36200  <df[,2] [7 × 2]> Liknande kommuner gymnasieskola, Finspång, 2018
##  5 G36492  <df[,2] [7 × 2]> Liknande kommuner IFO, Finspång, 2018          
##  6 G36784  <df[,2] [7 × 2]> Liknande kommuner äldreomsorg, Finspång, 2018  
##  7 G37368  <df[,2] [7 × 2]> Liknande kommuner, övergripande, Finspång, 2018
##  8 G39541  <df[,2] [7 × 2]> Liknande kommuner LSS, Finspång, 2018          
##  9 G85502  <df[,2] [7 × 2]> Liknande kommuner fritidshem, Finspång, 2018   
## 10 G85794  <df[,2] [7 × 2]> Liknande kommuner förskola, Finspång, 2018     
## 11 G87668  <df[,2] [7 × 2]> Liknande kommuner integration, Finspång, 2018

I slutändan har vi nu all metadata vi behöver och vill då få in den faktiska datan. För att få tag i den använder vi bara get_values(), då får vi tillbaka en data.frame med all data som vi frågat efter.

kpi_id <- kpi_search(kpis, c("bostäder som beviljats bygglov"),
                                  column = "description") %>% 
  kpi_extract_ids()

munic_grp <- get_municipality_groups() %>%
  municipality_grp_search("Liknande kommuner socioekonomi, Finspång") %>% 
  municipality_grp_extract_ids()

finspang_id <- get_municipality() %>%
  municipality_search("Finspång") %>% 
  municipality_extract_ids()

# Get values
grp_data <- get_values(
  kpi = kpi_id,
  municipality = c(
    munic_grp,
    finspang_id
  )
)

grp_data
## # A tibble: 24 x 8
##    kpi    municipality_id  year count gender value municipality municipality_ty…
##    <chr>  <chr>           <int> <int> <chr>  <dbl> <chr>        <chr>           
##  1 N07925 0562             2015     1 T       0.7  Finspång     K               
##  2 N07925 0687             2015     1 T       2.3  Tranås       K               
##  3 N07925 0884             2015     1 T       0.6  Vimmerby     K               
##  4 N07925 1082             2015     1 T       1.4  Karlshamn    K               
##  5 N07925 1272             2015     1 T       6    Bromölla     K               
##  6 N07925 1472             2015     1 T       1.4  Tibro        K               
##  7 N07925 1981             2015     1 T       3.8  Sala         K               
##  8 N07925 1984             2015     1 T       0.9  Arboga       K               
##  9 N07925 0562             2017     1 T       4.54 Finspång     K               
## 10 N07925 0687             2017     1 T       8.57 Tranås       K               
## # … with 14 more rows

Vi har nu data som antingen kan visualiseras, inkluderas i en Rmarkdown-genererad PDF-rapport, skrivas till en Excel, PowerPoint, lagra i en databas med mera.

Här nöjer vi oss med en enkel visualisering:

ggplot(grp_data, aes(x = year, y = value, color = municipality)) +
  geom_line() +
  labs(
    title = "Antal bostäder som beviljats bygglov under två senaste åren",
    subtitle = "Antal/100 invånare",
    caption = "Källa: SKR och SCB",
    y = "Antal/1000 invånare",
    x = "År",
    color = "Kommun"
  ) +
  theme_minimal() +
  ggthemes::scale_color_colorblind()

Ett stort tack till Love Hansson som lagt tid på att designa ett paket som jag tror kan underlätta för många analytiker på myndigheter, universitet och ute bland Sveriges kommuner och landsting.

/ Filip