Tere tulemast andmekaeve sajandisse, Statistikaamet! Ehk kuidas uuest andmebaasist R-iga andmeid tõmmata

Viimaks on jõudnud ka Eesti Statistikaamet nii kaugele, et enam ei pea nende kodulehelt andmete alla laadimiseks hiirega kümneid kordi klikkima. Teades andmetabeli nime, on nüüd võimalik uuest andmebaasist andmeid otse alla laadida XML-faili kujul niinimetatud SDMX (Statistical Data and Metadata eXchange) vormingus. Järgnevalt jagan enda kogemusi, kuidas seda teha programmiga R. Soovitan lugeda ka Statistikaameti põgusat juhendit, lk 16) selle teema kohta.

Üks võimalus on andmed automaatselt alla laadida paketiga rsdmx (vt info CRANis või paketi ühe autori Emmanuel Blondeli tutvustavat ettekannet]).

Installeerime ja aktiveerime paketi rsdmx, võtame viimase versiooni githubist, ja teised paketid dplyr ja ggplot2 andmete töötlemiseks ning kuvamiseks.

devtools::install_github("opensdmx/rsdmx")
library(rsdmx)
library(dplyr)
library(ggplot2)

Teades tabeli nime, mida soovime alla laadida, nt IT32: 16-74-aastased arvuti- ja internetikasutajad isikute rühma järgi, võime otse kogu tabeli alla laadida pannes tabeli nime linki GetData nii nagu allosas. Osavamad kasutajad võivad lingi täpsema kuju abil ka kohe piirata tunnuste ja väärtuste hulka, mida alla laadida, aga mulle tundus, et lihtsam on kogu tabel alla laadida ja pärast R-s valida tunnuseid ja väärtuseid.

#Määrame ajutise faili tf, kuhu veebilehe alla laeme juhuks, kui suur fail
tf <- tempfile(tmpdir = tdir <- tempdir())
download.file("http://andmebaas.stat.ee/restsdmx/sdmx.ashx/GetData/IT32/all", tf)
#loeme andmed ajutisest failist sisse
temp_sdmx <- readSDMX(tf, isURL = FALSE)
#teeme andmetabeliks
andmetabel <- as.data.frame(temp_sdmx)
str(andmetabel)
## 'data.frame':    2000 obs. of  6 variables:
##  $ DIM2       : chr  "1" "1" "1" "1" ...
##  $ DIM3       : chr  "1" "1" "1" "1" ...
##  $ DIM4       : chr  "1" "1" "1" "1" ...
##  $ TIME_FORMAT: chr  "P1Y" "P1Y" "P1Y" "P1Y" ...
##  $ obsTime    : chr  "2005" "2006" "2007" "2008" ...
##  $ obsValue   : num  624 641 670 674 726 ...

Esialgne valmis tabel sisaldab lisaks väärtustele tunnuses obsVAlue tunnuste nimede asemel mittemidagiütlevaid dimensioone DIM2, DIM3, …, ja nende väärtuste tähistusi. Vajalikud tähistused saame alla laadida kombineerides tabeli nime teistsuguse lingiga GetDataStructure . Tunnuste DIM2, DIM3, …, selgitused saame allalaetava objekti andmestruktuur väljalt concepts.

andmetestrukt <- readSDMX("http://andmebaas.stat.ee/restsdmx/sdmx.ashx/GetDataStructure/IT32")
#tunnuste selgitused
tunnused <- as.data.frame(andmetestrukt@concepts)
#et täpitähti õigesti näitaks
tunnused$Name.et <- iconv(tunnused$Name.et, "UTF-8")
tunnused
##            id agencyID                 Name.en                     Name.et
## 1        DIM2  STAT_EE    Group of individuals                Isikute rühm
## 2        DIM3  STAT_EE Using computer/Internet Arvuti/Interneti kasutamine
## 3        DIM4  STAT_EE               Indicator                     Näitaja
## 4        TIME  STAT_EE                    Year                       Aasta
## 5   OBS_VALUE  STAT_EE                                            
## 6 TIME_FORMAT  STAT_EE                                            
## 7  OBS_STATUS  STAT_EE                                            
##                   en
## 1               
## 2               
## 3               
## 4               
## 5  Observation Value
## 6        Time Format
## 7 Observation Status

Nüüd näeme, et DIM2 on pikalt kirjutades “Isikute rühm”  DIM3 on “Arvuti/Interneti kasutamine” jne.

Tunnuste kodeeringute väärtused saame sama andmetestrukt objekti väljadelt codelists. Nende tähised on kujul, mis sisaldab tabeli ja dimensiooni nime, nt “CL_IT32_DIM2” jne

#tunnuste väärtuste nimed, lähme kaks korda sisse välja codelists ja võtame sealt id-d
margenditelist <- slot(andmetestrukt, "codelists")
margenditenimed <- sapply(slot(margenditelist, "codelists"), function(x) slot(x, "id"))
margenditenimed
## [1] "CL_IT32_DIM2"        "CL_IT32_DIM3"        "CL_IT32_DIM4"       
## [4] "CL_IT32_TIME"        "CL_IT32_OBS_STATUS"  "CL_IT32_TIME_FORMAT"

Konkreetsed väärtused saame andmetabelitesse või lisatunnustena soovi korral juurde siduda. Pakun all ühe variandi, eks nupukamad R-i kasutajad ilmselt oskavad seda lihtsamalt teha.

#kirjutame märgendid tabelitesse
for(i in margenditenimed) {
  #paneme tabelite nimedeks muutujatega samad nimed
  assign(substr(i,nchar("CL_IT32_")+1, nchar(i)), as.data.frame(slot(andmetestrukt, "codelists"), codelistId = i))
}
#ja seome kõigile DIM-algusega tunnustele juurde eesti- ja inglise keelsed märgendid
for(i in grep("DIM", names(andmetabel), value=TRUE)) {
  andmetabel <- merge(andmetabel, get(i), by.x=i, by.y = "id" )
  names(andmetabel)[names(andmetabel) == 'label.en'] <- paste0(i,'label.en')
  names(andmetabel)[names(andmetabel) == 'label.et'] <- paste0(i,'label.et')
  }

Ongi tabel valmis koos kõigi märgenditega ja võime andmeid kasutama hakata. Näiteks joonistame internetikasutajate osakaalu vanusrühmade lõikes:

andmetabel %>% filter(DIM3label.et=="Interneti kasutamine",
                      DIM4label.et=="Osatähtsus vastavas rühmas,%",
                      grepl("aastased", DIM2label.et)) %>%
  ggplot(aes(x=as.numeric(obsTime), y=obsValue, color=DIM2label.et)) +
  geom_line() +
  scale_x_continuous(breaks = seq(2005, 2017, 2)) +
  labs(y = "Interneti kasutajate osakaal, %",
       x = "",
       colour = "",
       title = "Interneti kasutajate osakaal eri vanusrühmades",
       subtitle = "Andmed: Statistikaamet, tabel IT32") +
  theme(text=element_text(size=14))

plot of chunk joonis

Analoogselt võime võtta mõne muu tabeli, näiteks leibkondade kulutuste struktuuri tabelist LE207: Leibkonnaliikme kulutused aastas leibkonnapea haridustaseme järgi. Dubleerides ülal tehtut, kuvame alkoholi- ja tubakatoodete kulutuste keskmise osakaalu leibkonna kulude struktuur leibkonna pea haridusetaseme järgi.

tf <- tempfile(tmpdir = tdir <- tempdir())
download.file("http://andmebaas.stat.ee/restsdmx/sdmx.ashx/GetData/LE207/all", tf)
andmetabel <- readSDMX(tf, isURL = FALSE) %>% as.data.frame()
andmetestrukt <- readSDMX("http://andmebaas.stat.ee/restsdmx/sdmx.ashx/GetDataStructure/LE207")
tunnused <- as.data.frame(andmetestrukt@concepts)
tunnused$Name.et <- iconv(tunnused$Name.et, "UTF-8")
margenditelist <- slot(andmetestrukt, "codelists")
margenditenimed <- sapply(slot(margenditelist, "codelists"), function(x) slot(x, "id"))
for(i in margenditenimed) {
  assign(substr(i,nchar("CL_LE207_")+1, nchar(i)), as.data.frame(slot(andmetestrukt, "codelists"), codelistId = i))
}
for(i in grep("DIM", names(andmetabel), value=TRUE)) {
  andmetabel <- merge(andmetabel, get(i), by.x=i, by.y = "id" )
  names(andmetabel)[names(andmetabel) == 'label.en'] <- paste0(i,'label.en')
  names(andmetabel)[names(andmetabel) == 'label.et'] <- paste0(i,'label.et')   
} 

andmetabel %>% filter(DIM2label.et=="Osatähtsus (kulutused kokku = 100), %", DIM3label.et=="Alkoholjoogid ja tubakas") %>%
  ggplot(aes(x=as.numeric(obsTime), y=obsValue, color=DIM4label.et)) +
  geom_line() +
  geom_point()+
  #scale_x_continuous(breaks = seq(2010, 2017, 1)) +
  labs(y = "Osakaal, %",
       x = "",
       colour = "",
       title = "Alkoholi ja tubakatoodete kulutuste osakaal leibkondade eelarves \n leibkonnapea hariduse järgi",
       subtitle = "Andmed: Statistikaamet, tabel LE207") +
  theme(text=element_text(size=14))

plot of chunk unnamed-chunk-7

Jõudu tööle!

Advertisements
Rubriigid: Uncategorized. Salvesta püsiviide oma järjehoidjasse.

3 Responses to Tere tulemast andmekaeve sajandisse, Statistikaamet! Ehk kuidas uuest andmebaasist R-iga andmeid tõmmata

  1. Andres Võrk ütles:

    Kirjutasin ülaltoodud käsud kokku ka ühte funktsiooni ja panin faili githubi.
    https://github.com/AndresVork/rsdmx_esa

  2. Janno ütles:

    Väga äge vidin, juba kasutan 🙂 Aga see täpsema päringu tegemise oskus tasub küll kõigil kasutajatel kiiresti ära õppida, sest suuremaid tabeleid loeb ikka väga kaua sisse.

  3. Andres Võrk ütles:

    Lisasime Taaviga ka funktsiooni, millega saab otsida ESA andmebaasist tabelite pealkirjadest märksõnu. Järsku kellelgi kasu.
    https://github.com/AndresVork/rsdmx_esa/blob/master/search_esa_fn.R

Lisa kommentaar

Täida nõutavad väljad või kliki ikoonile, et sisse logida:

WordPress.com Logo

Sa kommenteerid kasutades oma WordPress.com kontot. Logi välja /  Muuda )

Google+ photo

Sa kommenteerid kasutades oma Google+ kontot. Logi välja /  Muuda )

Twitter picture

Sa kommenteerid kasutades oma Twitter kontot. Logi välja /  Muuda )

Facebook photo

Sa kommenteerid kasutades oma Facebook kontot. Logi välja /  Muuda )

Connecting to %s