Kuidas riigiraha.fin.ee andmete abil asutustevahelisi rahavooge vaadata

Tartu Ülikooli Infotehnoloogia mõju-uuringute keskuse (CITIS) üks tegevusi on avaandmete kasutamise populariseerimine tudengite ja avalikkuse seas. Seekord vaataks, kuidas saab kergesti kasutada riigiraha.fin.ee lehel toodud valitsussektorisse kuuluvate üksuste raamatupidamise andmeid asutustevaheliste seosete visualiseerimiseks ja analüüsimiseks. Näite toon enda lemmikuurimisvaldkonnast – Eesti tervishoiust.

Järgmisel joonisel on esitatud riigiraha andmete põhjal Eesti haiglatevahelised rahavood aastal 2013, mis on tasutud teineteisele tervishoiuteenuse osutamise eest. (Joonisel on esitatud nooled vaid juhul, kui aastased summad on suuremad kui 10 tuhat eurot.)

tulemus

Nagu arvata võiski on absoluutsummadena suuremad tervishoiuteenuste osutamise rahavood ka suuremate haiglate vahel: Lastehaiglast ja Lääne-Tallinna Keskhaiglast PERHi; PERHist ja Ida-Viru Keskhaiglast TÜ Kliinikumi: TÜ Kliinikumist PERHi ja Ida-Tallina Keskhaiglasse jne.

Selle joonise alusandmete kättesaamine ja lihtsama joonise tegemine on tegelikult imelihtne, eriti kui teil on sama nupukad ja abivalmis kolleegid nagu mul.

Joonise tegemise esimeseks sammuks on tõmmata vajalikud lähteandmed sobival kujul alla riigiraha lehelt. Näiteks kasutades järgmist otseaadressi, saab andmed CSV või Exceli kujul alla laadida hiire paremkliki abil. (href=http://riigiraha.fin.ee/geoqlik/proxy/QvAJAXZfc/singleobject.htm?document=Riigiraha.qvw&host=local&anonymous=true&object=CH320&select=AASTA,(2013)&select=PERIOOD,1&select=UKSUSID,015312,016303,016305,016306,100307,100308,100309,179302, 185304,310307,357301,358301,402306,561306,588303,591303,594303,599303) (NB! Kui klikid, siis oota, andmete laadimine tabelisse võtab aega ligi 10-15 sekundit!)

Ülal toodud aadressi olulisteks komponentideks on:

  • objekti nimetus (object) – Meie näites CH320, kus on toodud kõik asutuste väljaminekud. Vajatava tabeli numbri leidmine on pisut keeruline, sest nende loetelu ma ei suutnud riigiraha.fin.ee lehelt leida. Meie saime numbri esmalt otse rahandusministeeriumist. Hiljem kirjutasin Pythonis koodi, mis otsib aadressidelt tabelite moodi lehed üles ja teeb meile võimaliku tabelite sisukorra.
  • aasta (AASTA) – meie näites 2013.
  • andmete sagedus (PERIOOD) – võib olla kas aasta nagu meie näites (1), kvartal (2) või kuu (3).
  • üksused (UKSUSID), mille kohta soovime infot saada – meie näites on loetletud valitsussektorisse kuuluvate haiglate koodid. Need koodid leiab üles saldo.fin.ee-l lehel asuvast failist Tehingupartnerid.xls

Kui andmete allalaadimist tuleb teha sageli või on soov katsetada eri perioode ja üksusi, siis saab andmete allalaadimist ka mõningal määral automatiseerida. Näiteks mina jooksutasin selleks Chrome’i veebilehitsejat, mis Seleniumi abiga Pythonis automaatselt Exceli faili alla laadis (minu näitefail). Otse veebilehelt andmeid R-i mugavalt ei õnnestunud laadida. Kui mõni R-i friik selle ära lahendab, andke teada.

Allalaetud Exceli andmefail ise näeb välja järgmisel kujul:

 sisendandmedexcelis

 

Kui andmed on allalaetud, siis on vaid vaja mõne tarkvaraga neid sobivalt filtreerida ja agregeerida ning ongi tulemus käes.Kõige kiirem on seda teha muidugi Excelis tavapärase Pivot tabeliga, kasutades sobivaid filtreid.

rahavoodexcel2.png

Kuid kui analüüsi teha sageli ning tahta ka tulemusi graafiliselt kuvada, siis võib kasutada R-i abi, mida omal viisil olen allosas püüdnud teha. (Palun R-i ekspertidel olla kriitikaga leebe kuid konstruktiivne).

R-i vajalike lisapakettidena läheb vaja, midagi millega Exceli fail alla laadida, nt  readxl. Graafiku tegemiseks kasutame lisapaketti igraph. Ning andmete teisendamiseks muidugi paketti dplyr .

#Exceli importimiseks
install.packages("devtools")
devtools::install_github("hadley/readxl")
#Andmete töötlemiseks
install.packages("dplyr")
#Jooniste kuvamiseks
install.packages("igraph") 
library(readxl)
library(dplyr)
library(igraph)
#avame ülaltoodud riigiraha.fin.ee aadressilt allalaetud Exceli faili
sisendfail<-read_excel("andmed2013.xls")

Paketi igraphpuhul on vajalik, et andmed oleksid esitatud voogude failis, kus esimeses kahes veerus on objektide id tunnused, kust vood algavad ja kuhu lähevad ning soovi korral järgnevates veergudes vooge iseloomustavad näitajad.

Voogude faili struktuur

from to Voo suurus
Id1 Id2 Summa1
Id2 Id3 Summa2
Id2 Id1 Summa3

Teine fail, mida on otstarbekas kasutada, on objekte kirjeldav fail, kus esimeses veerus peab olema id tunnus ja järgmistes muud omadused, mida tahame joonisel kuvada, näiteks asutuse nimi ja suurus.

Otspunktide faili struktuur

asutuseID nimi lisatunnus
Id1 PERH Käive1
Id2 SA TÜ Käive2
Id3 ITK Käive3

Alljärgnevalt ongi tehtud riigiraha lehelt alla laetud Exceli failist mõlemad otspunktide ja voogude failid. Esmalt tuleb tähele panna, et alla laetud lähtefailis oli lisaridasid kommentaaridega või kogusummaga, millest soovime lahti saada. Seetõttu kasutame filtrit, et jätame alles vaid need read, kus on olemas meie poolt valitud aastaarv. Lisaks lühendame natuke muutujate nimesid.

Sisseloetud Exceli fail näeb R-s välja järgmine.

head(sisendfail)
## # A tibble: 6 × 10
##   Aasta   Kuu                                 Üksus
##                                     
## 1 Kokku Kokku                                 Kokku
## 2  2013    12         179302 SA Ida-Viru Keskhaigla
## 3  2013    12 016305 SA Põhja-Eesti Regionaalhaigla
## 4  2013    12         179302 SA Ida-Viru Keskhaigla
## 5  2013    12         179302 SA Ida-Viru Keskhaigla
## 6  2013    12             016306 SA Viljandi Haigla
## # ... with 7 more variables: Konto , Valdkond ,
## #   Tegevusala , Tehingupartner , Finantseerimisallikas ,
## #   Rahavoog , `Väljaminekud absoluutarv tuhandetes` 
#esmane puhastus
andmed%
  filter(grepl("2013", Aasta)) %>%
  select(Üksus, Tehingupartner, `Väljaminekud absoluutarv tuhandetes`, Konto)
#kui jäi puuduvaid väärtuseid sisse, viskame välja
andmed=na.omit(andmed)
#ja uued pealkirjad
colnames(andmed)<-c("yksus", "partner", "makse", "konto")

Seejärel saame valmis teha objekte kirjeldava andmestiku nodes. Jätame alles id-tunnuse, haigla nime pisut puhastatud kujul ja teeme ka haigla väljaminekute kogusumma, et pärast oleks parem joonisel kuvada haiglate suurust.

#leiame haigla suurust iseloomustava näitaja
nodes%
  select(yksus, makse) %>%
  group_by(yksus) %>%
  summarize(suurus=sum(makse))
#haigla tekstiline nimi algab peale numbrit
nodes$nimi<-substr(nodes$yksus, 7, 100)
#haigla nimest viskame välja lühendid AS, SA ja As 
nodes$nimi<-gsub("SA", "", nodes$nimi)
nodes$nimi<-gsub("AS", "", nodes$nimi)
nodes$nimi<-gsub("As ", "", nodes$nimi)  
nodes$id=substr(nodes$yksus, 1, 6)  
#ja jätame alles vajalikud muutujad ning järjestame id järgi, 
#et oleks mugav vaadata  
nodes <- nodes %>% select(id, nimi, suurus) %>% arrange(id) 
#tulemuseks on haiglate loetelu id ja väljamaksete kogusummaga (tuh eurot)
nodes
## # A tibble: 17 × 3
##        id                          nimi     suurus
##                                    
## 1  015312                Hiiumaa Haigla   2071.850
## 2  016303      Tartu Ülikooli Kliinikum 141248.552
## 3  016305   Põhja-Eesti Regionaalhaigla 149405.065
## 4  016306               Viljandi Haigla  14935.021
## 5  100307      Ida-Tallinna Keskhaigla   78389.361
## 6  100308    Lääne-Tallinna Keskhaigla   44014.310
## 7  100309          Tallinna Lastehaigla  19759.723
## 8  179302           Ida-Viru Keskhaigla  32389.628
## 9  185304                 Narva Haigla   19080.819
## 10 310307                  Pärnu Haigla  34706.197
## 11 357301                 Põlva Haigla    4884.977
## 12 402306            Kuressaare Haigla    8386.363
## 13 561306                 Valga Haigla    5656.267
## 14 588303              Järvamaa Haigla    6775.377
## 15 591303                Rakvere Haigla  14417.688
## 16 594303          Rapla Maakonnahaigla   4489.612
## 17 599303            Lõuna-Eesti Haigla   7819.659

Seejärel teeme valmis haiglatevaheliste tervishoiuteenuste vaheliste voogude andmestiku. Alljärgnevalt on lihtsuse huvides kuvatud joonisel ainult aastaseid rahavoogusid, mis on suuremad kui 10 000 eurot.

#leiame üksuse ja partneri id numbrid nimest
andmed$from=substr(andmed$yksus, 1, 6)
andmed$to=substr(andmed$partner, 1, 6)

#vaja jätte alles id-d ja summad ning agregeerida, 
#nii et jäävad alles vaid omavahelised. 
links %>%
  #jääb alles vaid tervishoiuteenuste eest maksmine
  filter(grepl("552230 Tervishoiuteenused", konto)) %>%
  #valime vajalikud tunnused
  select(from, to, makse) %>%
  #summeerime vood konkreetsete haiglate vahel
  group_by(from, to) %>%
  summarize(vood=sum(makse)) %>%
  #jätame alles vaid need vood, kus ka tehingupartneriks oleks haigla, 
  #kuid mitte ise
  filter(to %in% andmed$from,to!=from) %>%
  #jätame alles vaid vood, kus aastane summa on vähemalt 10000 eurot
  filter(vood>10)

#tulemus
links
## Source: local data frame [46 x 3]
## Groups: from [17]
## 
##      from     to      vood
##            
## 1  015312 016305  10.68026
## 2  015312 100307  24.93643
## 3  016303 016305  91.25026
## 4  016303 100307  25.91082
## 5  016303 100308  10.53907
## 6  016303 100309  10.00512
## 7  016303 179302  71.27568
## 8  016303 599303  15.54878
## 9  016305 016303 393.11765
## 10 016305 100307  15.29962
## # ... with 36 more rows

Kasutades lisapaketti igraph saame kujutada haiglate vahelisi seoseid graafiliselt või vaadata maatrikskujul. Käsus anname info, mis on seoste fail (d=links), mis on otspunktide fail (vertices=nodes) ja kas tahame nooltega jooni. Joonisel saab hiljem soovi korral erinevaid seadeid muuta.

#teisendame failid igraph objektiks
haiglatevork <- graph_from_data_frame(d=links, vertices=nodes, directed=TRUE) 

Võimalikke paigutuse tüüpe on palju. Sõltuvalt objektide ja seoste arvust saab leida sobivaima graafiku. Alljärneval joonisel on joone paksus võrdeline rahavoo suurusega ja haiglat iseloomustava ringi suurus positiivses seos haigla summaarsete väljamaksetega.

#üks võimalik joonis
par(mfrow=c(1,1), mar=c(0.5,0.5,0.5,0.5))
#et graafik oleks reprotseeritav
set.seed(3000)
plot(haiglatevork, layout=layout_randomly, edge.arrow.size=.3, 
edge.curved=1, edge.width=links$vood/100, edge.color="blue", 
vertex.size=nodes$suurus^(1/4),vertex.color="orange", 
vertex.label=nodes$nimi, vertex.label.color="black", vertex.label.cex=0.6) 

ver5

Käsitsi saab jooni ja otspunkti tõmmata paremini graafikul, mis on saadud käsuga tkplot. Üks võimalikke realisatsioone ongi esitatud sissekande alguses .

tkplot(haiglatevork, layout=layout_randomly, edge.arrow.size=.7, 
edge.curved=1,   edge.width=links$vood/50, edge.color="blue", 
vertex.size=nodes$suurus^(1/3), vertex.color="orange", 
vertex.label=nodes$nimi,vertex.label.color="black", vertex.label.cex=1) 

Analoogselt saab siis ilma suurema vaevata analüüsida ja kuvada ka teiste valitsemissektorisse kuuluvate asutuste omavahelisi rahavooge kasutades riigiraha.fin.ee andmeid.

Käesoleva postituse valmimisele olid mulle suureks abiks Taavi Unt ja Märten Veskimäe CITISest ning Eesti kõige entusiastlikuma R-i õpetaja Indrek Seppo konspektid. Finantstoe eest tänan Tartu Ülikooli rektori fondi.

Advertisements
Rubriigid: Näpunäide, Uncategorized | Lisa kommentaar

Kuidas R-ga saldo.fin.ee andmeid vaadata?

Koos kolleegidega TÜ CITISest katsetasin, kuidas saldo.fin.ee lehelt mugavalt riigiasutuste avalikke finantsandmeid kätte saada. Näib, et R saab sellega päris kenasti hakkama.

Alljärgnevalt on esitatud üks näitejoonis, mille tegin ja mis näitab, kuidas kaks kõige suuremat tervishoiuasutust Eestis esikoha pärast võistlevad.

tervishoid

Selle joonise jaoks on saldo.fin.ee lehelt R-is käsuga read_html tõmmatud alla aruanne nimega “Tulemiaruanne, detailne, koos bilansivälise informatsiooniga” aastate 2004-2015 jaoks kahe asutuse kohta. Käsuga html_table saab andmed kätte. Tsükliga üle asutuste ja aastate saab kokku tõsta mitme perioodi andmed.

Ebamugavaks teeb asja see, et andmebaasi aadressis ei esine asutuse tehingupartneri kood vaid mingi teine id number, mis tuleb esimesel korral käsitsi kontrollida (ja loota, et see ei muutu üle aastate). Samuti muutus ajaperioodide numeratsiooni loogika andmebaasi aadressis 2007. aastal. Sellest hoolimata näib R-i abil andmete allatõmbamine olevat efektiivsem kui ükshaaval raportite kokkutõstmine.

 

Alljärgnev on üks võimalik viis, kuidas neid andmeid alla laadida. (Vabandage R-i fännid kui midagi väga kummalist leiate, see on eluaegse Stata kasutaja kirjutatud.) R-i fail on leitav ka siit: http://kodu.ut.ee/~avork/files/seminarid/saldofinee2.R

#Andres Võrk, Taavi Unt, TÜ Johan Skytte poliitikauuringute instituut, CITIS

#install.packages(“rvest”)
#install.packages(“ggplot2”)
library(rvest)
library(ggplot2)

#teeme tühja põhja andmetele
tempmatrix=matrix(1,1,5)
colnames(tempmatrix)=c(“Konto”, “Nimetus”, “Summa”, “Periood”, “Asutus”)
minutabel<-data.frame(tempmatrix)

#toome andmed näiteks kahe asutuse ja kõigi aastate jaoks
for (j in c(2278, 2280)){
for (i in c(8, 12, 16, 20, 32, 44, 56, 68, 80, 92, 104, 116)) {
leht <- read_html(paste0(“https://saldo.fin.ee/saldo/reportManagement.longprofit.report.action?partnerId=&#8221;,j,”&periodId=”,i,”&”))
temptabel<-html_table(html_nodes(leht, “table”)[[2]])
colnames(temptabel)=c(“Konto”, “Nimetus”, “Summa”)
temptabel$Asutus=j
if (i<20) { #kvartaalne indeks
temptabel$Periood=2004+(i-8)/4
}
else {  #aastane indeks
temptabel$Periood=2007+(i-20)/12
}
print(mean(temptabel$Periood))  #lihtsalt, et näha, kas kood jookseb
minutabel=rbind(minutabel, temptabel)
}
}

minutabel <- table[-c(1), ] #kustutame esimese ajutise rea uuesti ära
minutabel$Summa<-gsub(” “, “”,minutabel$Summa)
minutabel$Summa<-as.numeric(sub(“,”, “.”,minutabel$Summa))

#ongi valmis tabel
head(minutabel)

#Alljärgnev on näide, kuidas ülal joonis tehti. Kindlasti on palju efektiivsemaid ja elegantsemaid viise

#joonisel üle aastate Põhja-Eesti Regionaalhaigla ja Tartu Ülikooli Kliinikumi tulu tervishoiust
#Tulud tervishoiust, Konto==3223
thtulud<-subset(minutabel, Konto==3223)
#Asutuste nimed
thtulud$Tervishoiuasutus=gsub(2280, “PERH” , thtulud$Asutus)
thtulud$Tervishoiuasutus=gsub(2278, “SA TÜK” ,thtulud$Tervishoiuasutus)
thtulud$Tervishoiuasutus=as.factor(thtulud$Tervishoiuasutus)
#teeme eurodeks enne 2011 aasta näitajad
thtulud$Summa[thtulud$Periood< 2011] <- thtulud$Summa[thtulud$Periood< 2011]/15.6466
#jagame läbi miljonitega
thtulud$Summa<- thtulud$Summa/1000000

#faktoriks, siis ei jäta teljele auke
thtulud$Periood=as.factor(thtulud$Periood)

ggplot(data=thtulud, aes(x=Periood, y=Summa, group=Tervishoiuasutus)) +
geom_line(aes(color=Tervishoiuasutus)) +
geom_point(aes(color=Tervishoiuasutus)) + ylab(“Tulu tervishoiust, mln EUR”) + xlab(“Aasta”) +
labs(title=”Rebimine Eesti tervishoiuturul”)

ggsave(“graafik.png”)

Rubriigid: Näpunäide, Uncategorized | Lisa kommentaar

Kuidas Stataga Eurostatist andmeid tõmmata? (Ja kuhu Eesti valitsus siis ka kulutab?)

Tudengitel on sageli vaja Eurostati andmebaasist võtta andmeid ning teha jooniseid või statistilist analüüsi riikide omavaheliseks võrdlemiseks kas enda uurimistöödes või kodutöödes. Stata jaoks on kirjutatud käske, mis suhtlevad otse Eurostati teenusega BulkDownload (vt http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing) ja teevad sellega andmete korduva analüüsi lihtsamaks.

Üks mugav käsk selleks on “eurostatuse”, kuid see eeldab lisaks pakkimisprogrammi 7-zip olemasolu Windowsi arvutis (vt http://www.7-zip.org/download.html). Eurostati andmete tõmbamiseks peab teadma ka tabeli nime, nt gov_10a_exp ja muutujate nimetusi tabelis, nii et esimest korda peaks ikka veebiversioonis tabeli lahti tegema. Tabelite loetelu on olemas siin http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=table_of_contents_en.pdf

Alljärgnevalt ongi toodud paar joonist, mis on automaatselt Stataga tehtud tõmmates Eurostatist lähteandmed ja lõppeb jooniste salvestamisega. Täielik kood, mida kasutasin on sissekande lõpus. Võib olla saab sealt mõne nipi ka jooniste jaoks.

Lühikommentaar jooniste kohta ka. Eesti avaliku sektori tervishoiukulud olid 2014. aastal SKPst 5.1%, samas kui EL25 keskmine oli 7.3%.Kui me kulutaks läbi avaliku sektori sama palju enda rikkusest tervishoiule kui Euroopa Liidu riigid keskmiselt, siis oleks meil ca 400 miljonit eurot lisaraha.

Eesti avalik sektor kulutabki  vähem raha kui ELis keskmiselt – 38% Eesti versus 48,4% EL25. Meie põhjanaabrid veelgi enam – Soome 58,1% ja Rootsi 51,8%. Kuid ka sellest rahast, mida Eesti valitsus kulutab, on tervise valdkonna kulud väiksemad kui EL-s keskmiselt- vastavalt 13.5% Eestis ja 15% EL-25 keskmiselt.

Seega on poliitiline otsustamiskoht kas suurendada tervishoiukulutusi läbi avaliku sektori kulutuste suurendamise üldse või jagada ümber avaliku sektori kulutuste sees. Kuhu me siis praegu suhteliselt enam kulutame kui Euroopa Liidus keskmiselt? Näiteks on meil kõrgema osakaaluga kaitsekulutused, sisejulgeolek, majandus ja haridus.

shareofgdp

structure

 

Ja siin on toodud Stata täielik kood tudengitele, millega need jooniste aluseks olevad andmed on automaatselt Eurostatist toodud ja joonised tehtud. (Ettevaatust lokaalsete muutujate ülakomadega, need võivad otse veebist kopeerides  muuta kuju.)

(do-fail ise siin: http://kodu.ut.ee/~avork/files/seminarid/cofogjoonis.do)

——————————

*installeerime käsu
ssc install eurostatuse
*eeldab, et 7-zip on Windowsi kataloogis C:\Program Files\7-Zip\7zG.exe

clear
*märkida ära, mis tabelit soovitakse, mis riike (geo), mis aastast (start) ja mis teisi muutujaid, vt ka help faili

eurostatuse  gov_10a_exp, noflags label long geo(EE LV LT SE FI EU25) start(2014) ///
    keepdim(TOTAL GF01 GF02 GF03 GF04 GF05 GF06 GF07 GF08 GF09 GF10 GF1001; TE; S13; PC_GDP PC_TOT; TE)
/*
Eurostati andmete tõmbamiseks peab teadma tabeli nime, nt gov_10a_exp ja muutujate nimetusi tabelis, nii et esimest korda peaks ikka veebiversioonis tabeli lahti tegema. */

*ja alljärgnev on juba lihtsalt joonise tegemine
*mõningane teisendus tekstimuutujatest numbrimuutujaks, et oleks mugavam
encode cofog99_label, gen(liik) label(liik)
encode unit, gen(measure) label(measure)
keep liik geo gov_10a_exp measure

*lihtsalt salvestame, kui kellelgi soovi mitte iga kord tõmmata uuesti andmeid
save cofog2014, replace
use cofog2014, clear

*et hoida alles väärtuste märgendid, mida reshape käsk automaatselt ümber ei tee kirjutame lokaalsesse muutujasse märgendid – alljärgneva peaks tegema kõik koos kuni reani replace gov_10a_exp11…”, muidu lokaalsed muutujad ei püsi mälus
* salvestame mällu väärtuste nimed
 levelsof liik, local(liik_levels)       /* teeme local list’i kõikides liik muutuja väärtustest */
foreach val of local liik_levels {       /* käime kõik väärtused */
local liikvl`val’: label liik `val’   /*üle ja salvestame lokaalsesse muutujasse*/
}

*teisendame andmeid joonisele mugavamaks esitamiseks
reshape wide gov_10a_exp, i(measure geo) j(liik)

*ja paneme tagasi väärtused nimeks
foreach value of local liik_levels {
         label variable gov_10a_exp`value’ “` liikvl`value””
 }

*viimaks leiame sotsiaalkulud ilma kulutusteta haigushüvitistele ja puuetega inimestele
replace gov_10a_exp11=gov_10a_exp11-gov_10a_exp10
label var gov_10a_exp11 “Social protection, excl. sickness & disability”

*ja määrame riikide järjekorra joonisel
gen minujrk=1 if geo==”EE”
replace minujrk=2 if geo==”LV”
replace minujrk=3 if geo==”LT”
replace minujrk=4 if geo==”EU25″
replace minujrk=5 if geo==”SE”
replace minujrk=6 if geo==”FI”

*ja teeme joonised

graph bar (asis) gov_10a_exp6 gov_10a_exp10 gov_10a_exp11 gov_10a_exp1 gov_10a_exp2 ///
    gov_10a_exp3 gov_10a_exp4 gov_10a_exp5 gov_10a_exp7 gov_10a_exp8 gov_10a_exp9 if measure==1, over(geo, sort(minujrk)) stack ///
    legend(cols(1) size(small) lcolor(pink) position(3) order(11 10 9 8 7 6 5 4 3 2 1) width(100)  ///
    symysize(5) symxsize(5) )     ///
    title(“Structure and level of government spending” “(% of GDP, 2014)”, span size(medium))  ///
    note(“Source: Eurostat, table gov_10a_exp, retrieved on `c(current_date)'”) ///
    name(shareofGDP, replace)
    
graph bar (asis) gov_10a_exp6 gov_10a_exp10 gov_10a_exp11 gov_10a_exp1 gov_10a_exp2 ///
    gov_10a_exp3 gov_10a_exp4 gov_10a_exp5 gov_10a_exp7 gov_10a_exp8 gov_10a_exp9 if measure==2, over(geo, sort(minujrk)) stack ///
    legend(cols(1) size(small) lcolor(pink) position(3) order(11 10 9 8 7 6 5 4 3 2 1) width(100)  ///
    symysize(5) symxsize(5) )     ///
    title(“Relative structure of government spending” “(% of total, 2014)”, span size(medium))  ///
    note(“Source: Eurostat, table gov_10a_exp, retrieved on `c(current_date)'”) ///
    name(structure, replace)
    
graph export shareofGDP.png, name(shareofGDP)  replace
graph export structure.png, name(structure)  replace

 

Rubriigid: Näpunäide, Uncategorized | Lisa kommentaar

Euroopa ja maailma kaart R-is

Lubasin Centari R-ikoolitusel, et kirjutan lühidalt, kuis R-is Euroopa või maailmakaarti teha. Sobib ehk siia kah.

Ris on, nagu ikka, hunnik erinevaid võimalusi kaarti ehitada (vt nt seda artiklit, kus tutvustatakse rworldmap’i poolt pakutavaid võimalusi; siin on suht detailselt kirjeldatud, kuidas andmeid google mapsile kanda), kuid ma näitan, kuis seda teha riikide tasandil ggplotis – nii saavad graafikud kõik ühtse stiili ja saab kasutada ggploti kõikmõeldavaid lisavõimalusi.

Olgu meil andmed. Võtame nt Eurostatist tööpuuduse andmed (andmetabel “une_rt_m” ehk unemployment rate montly), filtreerime sealt välja sesoonselt tasandamata kõikide vanuste ja sugude peale kokku oleva tööpuuduse nt 2015. aasta juunikuu seisuga:

 
library("eurostat") 
library("dplyr")

tqqpuudus <- get_eurostat("une_rt_m") 

tqqpuudus <- tqqpuudus %>% 
      filter(s_adj=="NSA", sex=="T", time=="2015-06-01", age=="TOTAL") 

head(tqqpuudus)

   s_adj   age sex geo       time values
1   NSA TOTAL   T  AT 2015-06-01    5.6
2   NSA TOTAL   T  BE 2015-06-01    8.3
3   NSA TOTAL   T  BG 2015-06-01    9.5

Nagu näha on meil nüüd andmestik, kus kaks huvitavat muutujat: geo, mis sisaldab kahetähelist riigitähist ja values, mis sisaldab parasjagu mõõdetud tööpuudusemäära.

Kui me soovime seda panna kaardile, siis on meil

1) vaja maps paketti

2) seejärel võtame sealt ggplotile sobival kujul välja maailmakaardi (käsuga map_data(“world”)

3) see sisaldab küll piirkonna identifikaatorit, kuid lisame sinna juurde veel mitmesuguseid iso-standardile vastavaid indikaatoreid (nt kahetäheline riiginimi, mida meie Eurostati andmetega vaja läheb) – selleks ühendame ta andmetabeliga iso3166, mis maps-paketis kenasti kaasas. Ja muudame seal paar vähestandardset asja ära, vähemalt Eurostatiga ühilduvaks. Kui teistsuguste andmestikega vajalikku riiki kaardile mitte ei teki, tasub need ühilduvustabelid üle vaadata.

4) ühendame kaardiandmetega andmed, mida soovime kuvada

5) kanname kõik kaardile.

Eelnev võib R-i keeles esmalt keeruline tunduda, kuid reaalselt saab järgnevat peaaegu täielikult copy-pasteda, muuta tuleb vaid paari üksikut kohta:

 
library("ggplot2") 
library("maps") 
library("dplyr") 


kaart <- map_data("world") 

#Teeme väikest keemiat. Selles andmestikus on riiginimed veidi 
#kummalisel kujul. Järgnevast piisab Euroopa jaoks, muu maailma
#tarvis tuleb uuesti üle vaadata (probleem tekib nt Hong Kongi
#jms-ga.

iso3166$mapname[iso3166$mapname=="Finland(?!:Aland)"] <- "Finland"
iso3166$mapname[iso3166$mapname=="Norway(?!:Bouvet|:Svalbard|:Jan Mayen)"] <- "Norway"
iso3166$mapname[iso3166$mapname=="UK(?!r)"] <- "UK"
iso3166$a2[iso3166$a2=="GB"] <- "UK" #ärge küsige
iso3166$a2[iso3166$a2=="GR"] <- "EL" #palju neid krdi standardeid on?


#ühendame kaardiandmetega mitmesugused riiginimeandmed: 
kaart2 <- right_join(kaart, iso3166, by=c("region"="mapname")) 

#nüüd on seal nimed eri kujul, kahe ja kolmetäheline iso-kuju
#(ainult et kogemus ütleb, et neid on ka mitmeid)
#kahetäheline iso on tunnuses "a2", selle järgi tuleb 
#järelikult meie andmed ühendada: 

kaart.andmetega<-left_join(kaart2, tqqpuudus, by=c("a2"="geo")) 

#NB! by-käsuga anname siis ette, milliste tunnuste järgi ühendad
# siin ütleme, et kaardiandmestiku a2 peab olema sama, mis 
#tööpuuduseandmestiku geo 

#ja andmed kaardile: 
#ainus, mida siin muuta vaja on geom_polygon()-sees olev 
#fill=values. Ma ütlen talle praegu, et sõltugu värv muutujast 
#, mille nimi on "values" 

graafik<-ggplot(data=kaart.andmetega) + 
  geom_polygon(aes(long,lat, group=group, fill=values)) +
  geom_path(aes(long,lat, group=group), color="white") +
  theme_minimal() +
  theme(axis.text = element_blank(), axis.title=element_blank(), axis.ticks=element_blank())+ 
  coord_map(projection="lagrange", ylim=c(30,75), xlim=c(-11,35)) 

graafik #näita 

#ja salvesta: 

ggsave(graafik, file="graafik1.png", height=4, width=4) 

graafik1

Värviskaalat ja legendi saaks muuta nagu ggplotis ikka. Ilmselt pole praegune pidevskaala siin nt kõige mõistlikum – ega ta silma järgi hästi eraldatav ole. Teeme ta nt 8-ks diskreetseks tükiks:

 

kaart.andmetega$tqqpuudus <- cut(kaart.andmetega$values, c(0,5,10,15,20,25))
levels(kaart.andmetega$tqqpuudus) <-c ("0%-5%", "5%-10%", "10%-15%", "15%-20%", "20%-25%")

#nüüd "fillime" muutuja tqqpuudus järgi,
#kuid olen enne lisanud veel eelneva kihi, kus
#kõik riigid tehakse esmalt halliks
graafik2<-ggplot(data=kaart.andmetega) +
 geom_polygon(aes(long,lat, group=group), fill="grey75") + 
 geom_polygon(aes(long,lat, group=group, fill=tqqpuudus)) + 
 geom_path(aes(long,lat, group=group), color="black") + 
 theme_minimal() + 
 theme(axis.text = element_blank(), axis.title=element_blank(), axis.ticks=element_blank())+ 
 coord_map(projection="lagrange", ylim=c(30,75), xlim=c(-11,35)) + 
 scale_fill_brewer("Tööpuudus", drop = FALSE, palette="Reds" )

ggsave(graafik2, file="graafik2.png", height=4, width=4, scale=1.5)

graafik2

Euroopa kaart on valmis. Selleks, et näidata kogu maailma, saab coord_map()-osa seest välja võtta ylim ja xlim-piirid, mis määravad praegu ära, et näidatagu üksnes Euroopat. Mängida saab ka erinevate projektsioonidega (täpsem info näiteks siit). Ggploti osa ise on lihtne, nagu näha, on raskem automaagiliselt kõik riikide nimed korrektselt jooksma saada – seal vaja ikka näpuga järge ajada, et kõik peale said.

Rubriigid: Näpunäide, Uncategorized | Lisa kommentaar

Millised erakonnad kuuluvad järgmisesse koalitsiooni?

EMORi viimase arvamusküsitluse tulemused ja erakondade lubadused näitavad, et Reformierakonnal on suurim tõenäosus kuuluda pärast valimisi koalitsiooni  ja väikseim võimalus on Keskerakonnal. Õieti on erakondade liidrite lubaduste paika pidades praktiliselt võimatu, et Reformierakond ei kuuluks järgmisesse koalitsiooni või Keskerakond kuuluks. Sotside, IRLi ja Vabaerakonna tõenäosused koalitsiooni kuuluda on sarnased.

Erinevate koalitsioonide tõenäosuse hindamiseks koostasin mudeli ja simuleerisin valimistulemusi toetudes EMORi värskeimale uuringule. Arvutuste tulemused on toodud järgmisel joonisel. Kuna suuremad parteid on koostöö Keskerakonnaga välistanud, siis pole Keskerakonnal võimalik valitsusse kuuluda. Reformierakonnast suuruselt teine võimalus valitsusse kuuluda on IRLil, ehkki sotsid saavad ootuste kohaselt rohkem hääli. Sotside võimalusi koalitsiooni pääseda piirab aga EKRE, mis on nendevahelise koostöö välistanud.

Joonis 1. Erakondade tõenäosus kuuluda koalitsiooni, kui Keskerakonnaga koostööd ei tehta.

kitsendatudNB! Jämedad kriipsud tähistavad hinnangute keskväärtuseid; lõigud näitavad aga vahemikku, kuhu 95% tõenäosusega jääb erakondade tõenäosus koalitsiooni kuuluda, võttes arvesse arvamusuuringu valimi suurust ning sellest tulenevat juhuslikkust.

Juhul, kui kõik erakonnad oleksid nõus omavahel koostööd tegema, oleksid Keskerakonna võimalused koalitsiooni kuuluda sarnased nagu sotsidel (vaata joonis 2). Koostöö tegemine suurendaks märkimisväärselt ka EKRE võimalusi koalitsiooni pääseda. Samas vähendaks koostöö tegemine Keskerakonnaga Reformierakonna, Sotside, IRLi ning Vabaerakonna tõenäosust ise koalitsiooni pääseda.

Joonis 2. Erakondade tõenäosus kuuluda koalitsiooni, kui kõik erakonnad teevad omavahel koostööd.

kitsendamata

Koalitsiooni kuulumise tõenäosust ei ole hea hinnata punkthinnanguna, sest andmed erakondade toetuse kohta põhinevad arvamusküsitlusel ning sisaldavad juhuslikku viga. Diskreetsed sündmused, nagu erakonna valimiskünnise ületamine, võivad tulemusi oluliselt mõjutada. Seda illustreerib alumine joonis, millel on esitatud erakondade võimaliku mandaatide arvu tõenäosused. Näiteks Reformierakonna puhul jääb võimalik mandaatide arv 22 ja 33 vahele. Simulatsiooni kohaselt on kõige tõenäolisem mandaatide arv siiski 27 mandaati. Aga näites EKRE puhul on ka võimalus, erakond jääb Riigikogust üldse välja ning saab 0 mandaati.

Joonis 3. Erakondade simuleeritud mandaatide arv Riigikogus

mandaadid

Kuidas ma need arvutused koostasin?

Võttes arvesse EMORi värskeima küsitluse tulemusi ja uuringu valimi suurust simuleerisin juhuslikud võimalikud valimistulemused ning tegin seda 5000 korda. Nende väärtuste pealt arvutasin, millised erakondadevahelised koalitsioonid on võimalikud ning leidsin nende koalitsioonide osakaalu kõigist võimalikest koalitsioonidest, kuhu üks või teine erakond saaks kuuluda.

Kui arvestada, et Riigikokku võib pääseda kuus erakonda, on võimalik erakondi kombineerides moodustada kokku 63 erinevat valitsust. Jättes kõrvale ühest erakonnast koosnevad valitsused ja valitsused, kus on koalitsioonis Keskerakond või on omavahel koalitsioonis EKRE ja sotsid, on võimalik moodustada 18 erinevat koalitsiooni. Arvutustes tegin järgnevad eeldused.

  • EMORi arvamusküsitluse põhjal leitud hinnangud erakondade toetuse kohta on nihketa;
  • Reformierakond, SDE, IRL, Vabaerakond ega EKRE ei tee koostööd Keskerakonnaga;
  • EKRE ei tee koostööd SDEga;
  • Võimalikud on ainult enamusvalitsused;
  • Võimalikud on ainult sellised koalitsioonid, mille liikmetest ühe väljaarvamisel ei saa moodustada enamusvalitsust;
    • Sisuliselt eeldan, et parteid ei soovi võtta koalitsiooni kedagi juurde, kui Riigikogu enamus on neil juba olemas. See on oluline eeldus, mis suurendab arvutustes väikeste parteide tõenäosust koalitsiooni kuuluda.
  • Kõigi võimalike koalitsioonide sõlmimise tõenäosus on võrdne.
    • See on oluline lihtsustus.  Ma eeldan sisuliselt, et erakondade programmilised kokkupuutepunktid või nende puudumine ei mängi koalitsiooni koostamisel olulist rolli.
Rubriigid: Uncategorized | Sildid: , , | Lisa kommentaar

Kelle hinnad langesid enam: deflatsioon ühiskondlike gruppide lõikes jaanuaris 2015

Hinnatõus on peamiseid muresid, mida elanike rahulolu uuringutes esile tõstetakse. Viimastel andmetel (2015. aasta jaanuaris) langesid aga tarbijahinnad aasta võrdluses 1,3%. Vaatasin lähemalt, milline oli hinnalangus erinevate ühiskondlike gruppide lõikes, võttes arvesse keskmise ostukorvi erinevust – igaüks võib end üles otsida. scat Lühidalt, odavnes kõigi vaadeldud ühiskondlike gruppide kesmine ostukorv. Suur osa hinnalangusest tuli nafta odavnemisest maailmaturul ja selle mõjust kütusehindadele. Nafta mõju illustreerib ka üleval olev joonis, mis näitab, et ostukorv odavnes enam gruppides, mis kulutavad transpordile suhteliselt rohkem. Postituse lõpus on esitatud joonised hinnalanguse kohta erinevate ühiskondlike gruppide lõikes. Nende põhjal võib öelda, et hinnad langesid enam:

  • Suurema tööintensiivsusega leibkondade jaoks

    • Tööintensiivsuse lõikes odavnes kõige enam kahe töötajaga leibkondade ostukorv ja kõige vähem pensionäride leibkondade ostukorv.
  • 20% kõrgeima sissetulekuga leibkondade jaoks

    • Sissetuleku gruppide lõikes odavnesid hinnad kõige enam 20% kõrgeima sissetulekuga leibkondade jaoks. Sissetuleku gruppidest kõige väiksem ostukorvi odavnemine toimus leibkondades, mille sissetulek on mediaani läheduses.
  • Maal
    • Maal kulutavad inimesed transpordile suhteliselt enam kui linnas,
  • Keskealiste jaoks

    • Leibkonnapea vanuse järgi odavnes ostukorv kõige enam 40-49 aastase leibkonnapeaga leibkondades. Vanuse alusel odavnes ostukorv kõige vähem 60-aastase ja vanema perepeaga leibkondades.
  • Ala- ja täisealist last kasvatavate leibkondade jaoks

    • Leibkonna tüübi järgi odavnes kõige enam ostukorv leibkondades, kus on nii alaealisi lapsi kui ka täisealisi kodust välja kolimata lapsi. Neile järgnesid lastetud paarid. Leibkonna tüübi järgi odavnes kõige vähem üksikute pensioniealiste ostukorv.
  • Jõgeva maakonnas
    • Maakondade lõikes odavnes kõige enam jõgevamaalaste ostukorv ja kõige vähem valgamaalaste oma. Teiste piirkondadega võrreldes väiksem oli ostukorvi odavnemine ka tallinlaste ja idavirumaalaste jaoks.
  • Eestlaste jaoks

    • Leibkonnapea rahvuse järgi odavnes ostukorv enam eestlate seas ja vähem teiste rahvuste seas.

aktiivsus sissetulek asula haridus leibkond maakond rahvus  sugu vanus Kõik andmed on pärit Eesti Statistikaameti kodulehelt ja arvutused olen teinud ise. Kaaludena kasutasin 2012. aasta leibkonna aasta kulutuste struktuuri andmeid. Gruppides, kus konfidentsiaalsusnõuete tõttu polnud avaldatud mõne tootegrupi osakaalu kulutustes, jagasin puuduolevate kulutuste andmed gruppidesse keskmise leibkonna kulutuste struktuuri alusel.

Rubriigid: Uncategorized | Sildid: , , , , | Lisa kommentaar

Millised noored elavad vanematega?

Noorte kodust väljakolimise edasilükkumine on trend, mis iseloomustab erinevaid arenenud riike.  Saamaks ülevaadet laste hilise väljakolimise kui probleemi teravusest Eestis, uurisin, mida rahvaloendusest vanematekodus elavate noorte kohta leida võib.

Lühidalt. Vanematega elavate täiskasvanute osakaal on kasvanud ka Eestis. Vanematega sama katuse all elamise tõenäosust tõstavad sotsiaalsed tegurid nagu tööpuudus ja madal majanduslik aktiivsus. Naised on meestest iseseisvamad ja paljude välismaal töötavate noorte kodumaine “maandumispaik” on vanematekodus.

Eestis elab 20-24-aastaste seas vanematega ligi pool noortest, 25- kuni 29-aastaste seas aga viiendik. Võrreldes USA suurlinnadega ei ole see näitaja suur, kuid võrreldes 2000. aasta rahvaloendusega on vanemate juures elavate noorte osakaal kasvanud kõigis vanusegruppides (vaata joonist).

vanematega koos elamine

Kuna 20- kuni 24-aastaste seas võib olla palju õppijaid, vaatlen lähemalt 25- kuni 29-aastaste vanusegruppi. Selles vanusegrupis on keskmisega võrreldes vanemate juures elamise tõenäosus suurem töötutel, meestel, tudengitel, majanduslikult mitte aktiivsetel ja välismaal töötajatel. Välismaal töötajate kodus elamine on ilmselt osalt tehniline fenomen ja peegeldab tõenäoliselt seda, et suurel osal välismaal töölkäijatest pole muretsetud Eestis eraldi elukohta, vaid kodumaine “maandusmiskoht” paikneb vanemate juures. See aga ei tähenda, et nad suuremal osal õhtutest vanemate diivanile magama läheksid.

vanematega elamine

Noored elavad vanemate juures suurema tõenäosusega maakondades, kus noorte võimalused tööturul on väiksemad

Tõenäosus, et noor elab vanemate juures, on suurem maakondades, kus on kõrgem noorte tööpuudus ja madalam majanduslik aktiivsus. See efekt ei tule pelgalt asjaolust, et majanduslikult mitteaktiivsed noored elavad suurema tõenäosusega kodus kui mitteaktiivsed. Maakondades, kus noorte majanduslik aktiivsus on kõrge, elavad ka majanduslikult mitteaktiivsed noored väiksema tõenäosusega vanemate juures kui maakondades, kus noorte majanduslik aktiivsus on madal. Täiskasvanud laste vanemate juures elamise sotsiaalsele mõõtele viitab ka seos noorte töövõimetuspensionäride osakaalu ja vanemate juures elavate noorte osakaalu vahel.

Õppijate ning kõrgharitute osakaal maakonnas annab vanematekodus elavate noorte osakaalu kohta vastuolulisi signaale. Harju- ja Tartumaal, kus paiknevad ka suuremad ülikoolid, on vanematekodus elavate noorte osakaal madal ja kõrgharituid ning õppureid on palju. Teiste maakondade lõikes elab aga vanemate juures suhteliselt enam noori maakondades, kus on enam õppureid ja enam kõrgharidusega noori.

See viitab võimalusele, et kodust välja kolivad kõrgharidusega noored loovad suurema tõenäosusega kodu Harju- või Tartumaale. Viimast järeldust võib aga mõjutada rahvaloenduse metoodika. Rahvaloenduse metoodika alusel loetakse kodus elavaks lapseks vaid need vanemate juures elavad noored, kellel ei ole abikaasat/elukaaslast ega last/lapsi. Kui kaks tudengit Tallinnas või Tartus kohtuvad ning ühe tudengitest vanematekoju kolivad, ei loeta neid kodus elavateks lasteks.

Maakondade lõikes näib noorte vanemate juures elamist kirjeldavat veel noorte abiellumise tõenäosus. Maakondades, kus on rohkem abielus noori, on vähem vanematega elavaid noori. Erandiks on Ida-Virumaa, kus on nii palju abielus noori, kui ka vanematega elavaid noori.

Samuti seostub noorte kodus elamisega eramute osakaal eluruumidest maakonnas. Mida suurem osa inimestest maakonnas elab ühepereelamutes, seda enam noori elab vanemate juures. Erandiks on taas Ida-Virumaa, kus on vähe ühepereelamuid, kuid palju vanemate juures elavaid noori. See näitaja võib viidata ka lihtsalt asjaolule, et maalistes asulates elavad noored suurema tõenäosusega vanematega sama katuse all kui linnalistes.

vanematega elamine_SCAT

Pilt | Posted on by | 2 kommentaari