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.