4 min read

Ladda hem data från SCB med R del 1 - pxweb

När jag började lära mig R för ett antal år sedan så var något av det krångligaste att läsa in externa data för att få något att jobba med. Numera är det betydligt enklare än det var för åtta - nio år sedan då det ständiga rådet var att spara data som en textfil innan man läste in den i R.

Ett av mina favoritverktyg för att ladda hem SCB-data är ett paket till R som heter pxweb och kan installeras från CRAN. Det är inte begränsat bara till SCB, utan kan även läsa in data från den norska och den finska statistikmyndigheten, Konjunkturinstitutet, Folkhälsomyndigheten m.fl. myndigheter. En stor fördel med pxweb är att det kringgår SCB:s begränsning på att man kan ladda hem högst 50 000 celler genom att frågor med för stora uttag automatiskt splittas upp i mindre delar.

Så här får man upp en meny där man kan välja tema och variabler från SCB:s öppna databas:

library(pxweb)
df <- interactive_pxweb(api = "api.scb.se", version = "v1", lang = "sv")

Kommandot öppnar en meny i consol-fönstret där du kan välja teman och sedan fortsätta att navigera i en struktur med undermenyer:

# Content of 'api.scb.se' at current (1) node level:
# =====================================================================
# 1.  [AA] Ämnesövergripande statistik
# 2.  [AM] Arbetsmarknad
# 3.  [BE] Befolkning
# 4.  [BO] Boende, byggande och bebyggelse
# 5.  [EN] Energi
# 6.  [FM] Finansmarknad
# 7.  [HA] Handel med varor och tjänster
# 8.  [HE] Hushållens ekonomi
# 9.  [HS] Hälso- och sjukvård
# 10. [JO] Jord- och skogsbruk, fiske
# 11. [KU] Kultur och fritid
# 12. [LE] Levnadsförhållanden
# 13. [ME] Demokrati
# 14. [MI] Miljö
# 15. [NR] Nationalräkenskaper
# 16. [NV] Näringsverksamhet
# 17. [OE] Offentlig ekonomi
# 18. [PR] Priser och konsumtion
# 19. [SO] Socialtjänst
# 20. [TK] Transporter och kommunikationer
# 21. [UF] Utbildning och forskning
# 
# Enter the data (number) you want to explore:
# ('esc' = Quit, 'b' = Back) 

I exemplet ovan har jag valt att navigera mig fram till SCB:s befolkningsstatistik och genom menyvalen tankat hem en tabell med befolkningstal för riket från 1968 till 2017. Jag har även svarat ja till att pxweb ska spara frågan byggt genom menyvalen så att jag enkelt ska kunna upprepa den. Den sparade frågan visas nedan:

library(pxweb)
df <- 
  get_pxweb_data(url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/BE/BE0101/BE0101A/BefolkningNy",
             dims = list(Region = c('00'),
                         Civilstand = c('*'),
                         Alder = c('tot'),
                         Kon = c('*'),
                         ContentsCode = c('BE0101N1'),
                         Tid = c('*')),
             clean = TRUE)
## Warning: 'get_pxweb_data' is deprecated.
## Use 'pxweb_get_data' instead.
## See help("Deprecated")
## Warning: 'get_pxweb_dims' is deprecated.
## Use 'pxweb_advanced_get' instead.
## See help("Deprecated")
## Warning: data.table::melt() is now used with get_pxweb_data(..., clean = TRUE).
## The order of the data may be different, please check your results.

En mindre bra sak med pxweb är att det inte går att välja bort dimensioner. Den dataframe jag hämtat från SCB innehåller alla dimensioner som SCB redovisar i vald tabell:

head(df)
##     region civilstånd        ålder     kön ContentsCode  Tid  values
## 1 00 Riket     ogifta totalt ålder     män    Folkmängd 1968 1833641
## 2 00 Riket     ogifta totalt ålder kvinnor    Folkmängd 1968 1585685
## 3 00 Riket      gifta totalt ålder     män    Folkmängd 1968 1909250
## 4 00 Riket      gifta totalt ålder kvinnor    Folkmängd 1968 1914963
## 5 00 Riket     skilda totalt ålder     män    Folkmängd 1968   91094
## 6 00 Riket     skilda totalt ålder kvinnor    Folkmängd 1968  120606

Även om jag bara är intresserad av totalbefolkningen i Sverige så måste jag alltså välja kön, ålder och civilstånd. Vill jag ha bara ha totalbefolkningen så måste jag därför aggregera bort oönskade variabler. En annan irriterande sak är att alla icke-numeriska variabler görs om till factor. Även årtalet blir en factor och inte av typ date eller integer, vilket vore rimligare. Jag väljer därför att först göra om alla variabler av typ factor till character med hjälp av dplyrs “mutate_if”-funktion. Därefefter aggregerar jag bort alla dimensioner förutom år och antal invånare. Sedan typkonverterar jag årtalen till heltal (integer):

library(dplyr)

# Gör om alla variabler av typ factor till character
df <- mutate_if(df, is.factor, as.character)

df <- df %>%
  select(år = Tid, values) %>%
  group_by(år) %>%
  summarise(values = sum(values)) %>%
  ungroup() %>%
  mutate(år = as.integer(år))

Nu har vi fått en tablell som bara innehåller år och totalbefolkning:

head(df)
## # A tibble: 6 x 2
##      år  values
##   <int>   <dbl>
## 1  1968 7931193
## 2  1969 8004270
## 3  1970 8081142
## 4  1971 8115165
## 5  1972 8129129
## 6  1973 8144428

Ett annat problem med data från SCB är att variabelnamnen ibland kan innehålla flera ord och även svenska tecken (som å, ä, ö). Oftast funkar det med svenska tecken i variabelnamn, men ibland kan det ställa till problem, så det är klokt att alltid ersätta dem med något annat. Det ska jag skriva mera om någon annan gång.