R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

RStudio, shiny ja VeRotosite-palvelu

RStudio on R:lle räätälöity kehitysympäristö. Shiny puolestaan on R:n laajennuspaketti, jolla voi helposti tuottaa verkkosovelluksia. Shinyn tuottamien sovellusten siirtäminen tuotantoon edellyttäisi Linux-palvelinta, jolla pyörii Shiny server, mutta RStudio-yritys tarjoaa myös hosting-palvelua, jolloin omaa palvelinta ei tarvita. Pienten sovellusten hosting on tällä hetkellä ilmaista.

Verokuitti-palvelu tuottaa Valtion talousarvion pahjalta laskelman, mihin maksamasi veovarat on käytetty. Palvelusta kuitenkin puuttuvat mm. kunnallisverojen ja kirkollisverojen käyttökohteet, ja Verokuitin kehittäjät kertovat sivulla, ettei heillä ole tällä hetkellä mahdollisuuksia laajentaa palvelua. Tällainen yhteiskunnallisesti mielenkiintoinen sovellus vaikuttaa erinomaiselta kandidaatilta toteutettavaksi Shinylla!

Valtion talousarvio on nykyisin saatavilla Avoindata.fi-palvelusta, tarkemmin sanottuna tiedosto on Valtion taloushallinnon raportointisivustolla Netra.fi:ssä. Kuntien raportoimat taloustiedot puolestaan löytyvät Tilastokeskuksen Kuntien ja Kuntayhtymien talous ja toiminta -tilastosta. Evankelis-luterilaisen kirkon talousarvio puolestaan löytyy koko kirkkokunnan tasolla Sakastin sivuilta. Jos oletetaan, että verotulot eivät ole mitenkään korvamerkittyjä, vaan kunkin kansalaisen maksamat verot jakautuvat menojen suhteessa eri momenteille, on laskenta noiden aineistojen pohjalta suoraviivaista toteuttaa. Käytänössä datan haalimiseen, muokkaamiseen ja laskennan toteuttamiseen meni pari tuntia aikaa

Itse sovelluksen toteuttaminen koostui kolmesta vaiheesta:

  • Luodaan yllä mainitut verotulolaskennan hoitava R-kielinen funktio.
  • Luodaan Shinyn vaatima käyttöliittymäskripti, ui.R
  • Luodaan Shinen vaatima server side -skripti, server.R


  • Käyttöliittymän ja laskennan kanssa tuli ongelmia lähinnä ainoastaan merkkien koodausten kanssa. Shiny käyttää nähtävästi UTF-8 merkistöä ainakin ui.R- ja server.R-skripteissä, mikä on hyvin dokumentoitukin, mutta yllätyksenä tuli se, että vaikka skriptit ovat oikeassa koodistomuodossa, ei funktioissa voinut käyttää skandeja. Esimerkiksi skandit aineiston otsikoissa rikkoivat laskennan, jos sarakkeisiin vittattiin niiden nimillä. Toinen ongelma tuli vastaan, kun havaitsin että ainakin osa käyttäjäkunnasta, jolle halusin palvelua esitellä, joutui käyttämään IE 8- ja IE 9-verkkoselaimia. Esimerkiksi käyttöliittymän asettelussa oli lieviä ongelmia IE 8:n kanssa, ja siksi päätin tehdä siitä karun ja funktionaalisen.

    Tuotantoon siirto oli yksinkertaista: Kun käytin ohjelmointiin RStudiota, ja tallensin skriptit UTF-8 -muodossa, oli koko palvelu käytännössä siirrettävissä tuotantoon yhdellä napinpainalluksella (”Publish”) RStudiosta. Shinyapps-palveluun piti tietysti luoda erikseen tunnukset, mutta se oli suoraviivaista ja toimivaa. RStudio ohjasi jokaisessa vaiheessa, eikä tässä suhteessa ongelmia juuri ilmennyt.

    Nykyinen tuotannossa oleva versio koostuu seuraavista kolmesta R-kielisestä koodista sekä niiden taustalla olevasta aineistosta, joka on koottuu yllä mainituista lähteistä.

    ui.R:

    shinyUI(fluidPage(
     
    titlePanel("veRotosite"),
     
      sidebarLayout(
        sidebarPanel(
          h3("Asetukset"),
          p("Kirjoita alla olevaan laatikoon kotikuntasi (huomaa oikeinkirjoitus ja iso alkukirjain), ja tarkista saamaltasi verotuspäätökseltä, paljonko olet maksanut valtion veroa, kunnallisveroa kirkollisveroa. Siirrä sitten summat vastaaviin laatikoihin. Kun olet valmis, paina Tulosta veRotosite -nappia"),
          textInput("kotikunta", label = "Kotikunta", value = "Helsinki"),  
          numericInput("valtionverot", label = "Valtion verot", value = 1749),  
          numericInput("kunnallisverot", label = "Kunnallisverot", value = 7515),  
          numericInput("kirkollisverot", label = "Kirkollisverot", value = 600),  
          submitButton("Tulosta veRotosite"),
          br(),
          p("Tämä palvelu käyttää Tilastokeskuksen tietoja Kuntien taloudesta ja toiminnasta, valtion talousarviotietoja Netrasta, ja Sakastin tietoja evankelis-luterilaisen kirkon taloudesta.")
        ),
        mainPanel(
          h3("veRotosite"),
          tabsetPanel(
            tabPanel("Kunnallisvero", dataTableOutput("text1")),
            tabPanel("Valtion vero", dataTableOutput("text2")),
            tabPanel("Kirkollisvero", dataTableOutput("text3"))
          )
        )
    )))

    server.R:

    #load("data/veRokuitti_2012_V2.RData")
    source("verokuitti.R")
     
    shinyServer(function(input, output) {
      output$text1 <- renderDataTable({ 
        verokuitti(input$kotikunta, input$valtionverot, input$kunnallisverot, input$kirkollisverot)$ko
      }, options = list(lengthMenu = c(10, 25, 50, 100, 500, 1000), pageLength=10))
      output$text2 <- renderDataTable({ 
        verokuitti(input$kotikunta, input$valtionverot, input$kunnallisverot, input$kirkollisverot)$vo
      }, options = list(lengthMenu = c(10, 25, 50, 100, 500, 1000), pageLength=10))
      output$text3 <- renderDataTable({ 
        verokuitti(input$kotikunta, input$valtionverot, input$kunnallisverot, input$kirkollisverot)$eo
      }, options = list(lengthMenu = c(10, 25, 50, 100, 500, 1000), pageLength=10))
     
    })

    ja verokuitti.R:

    verokuitti<-function(kotikunta, valtionverot, kunnallisverot, kirkollisverot) {
     
      load("data/veRokuitti_2012_V4.RData")
      require(descr)
     
      # Vain oma asuinkunta
      kt<-kunnat.tulot.2012[grep(kotikunta, kunnat.tulot.2012$Alue),]
      km<-kunnat.menot.2012[grep(kotikunta, kunnat.menot.2012$Alue),]
     
      # Tulot
      kunnan.verotulot<-sum(kt$value[substr(kt$Tuotto...kuluera, 1, 7) %in% c("0013100", "0013200", "0013300", "0013400", "0013600")])
      valtio.verotulot<-abs(sum(valtio$Nettokertyma.ko.vuodelta[valtio$Paaluokka.Osasto %in% c("11. Verot ja veronluonteiset tulot", "12. Sekalaiset tulot", "13. Korkotulot, osakkeiden myyntitulot ja voiton tuloutukset", "15. Lainat")]))
     
      # Menot, valtion
      valtio.menot<-valtio[as.numeric(substr(valtio$Paaluokka.Osasto, 1, 2))>=21,] # sum(valtio.menot$Nettokertyma.ko.vuodelta)
      valtio.menot$oma.osuus<-round(valtionverot/sum(valtio.menot$Nettokertyma.ko.vuodelta)*valtio.menot$Nettokertyma.ko.vuodelta, 2)
      vo<-valtio.menot[,c(2,3,4,ncol(valtio.menot))]
     
      # Menot, kunta
      km2<-km[as.numeric(substr(km$Kustannus...tuottoera, 1, 4))<5000,]
      kunnan.menot<-aggregate(km2$value, list(km2$Tehtavaluokka), function(x) sum(x, na.rm=T))
      kunnan.menot$oma.osuus<-round((kunnallisverot/sum(kunnan.menot$x))*kunnan.menot$x, 2)
      ko<-kunnan.menot[,c(1,3)]
     
      # Menot, kirkko
      evlut$oma.osuus<-round((kirkollisverot/sum(evlut$Kulu))*evlut$Kulu, 2)
      eo<-evlut[,c(1, 3)]
     
      # Kaunistelu
      colnames(ko)<-c("Tehtavaluokka", "oma.osuus")
     
      kuitti<-list(vo=toUTF8(vo), ko=toUTF8(ko), eo=toUTF8(eo))
     
    }

    Mainittakoon, että tarkoituksena ei ole kilpailla Verokuitin kanssa. VeRotositteen toimintatapa on erilainen: Siinä missä Verokuitti pyrkii arvioimaan, kuinka suuri osa tuloista maksamistasi välittömistä ja välillisistä veroista jakaantuu Valtion budjetin eri momenteille, veRotosite puolestaan toimii vain tosiasiallisesti maksamiesi välittömien verojen euromäärillä (näet ne verotuspäätökseltäsi), eikä esimerkiksi ALV:n osuutta (se on välillinen vero) huomioida laskelmissa millään lailla.

    Palvelua käytettäessä on tietysti tarpeen osata laskea valtiolle ja kunnalle lasketut verot yhteen; Pääsääntöisesti valtiolle maksetaan ansiotulon tuloveroa, pääomatuloveroa, lahja- ja perintöveroa sekä varainsiirtoveroa. Kunnalle puolestaan maksetaan kunnallisveroa (ansiotuloista, esim. palkasta ja eläkkeestä), kiinteistöveroa ja koiraveroa. Kirkollisvero maksetaan luonnollisesti kirkkokunnalle. Palvelu on lisäksi suunnattu vain luonnollisille henkilöille, ja siitä puuttuvat edelleen esimerkiksi eri sosiaaliturvarahastoille maksamasi veronluonteiset maksut. Tällä hetkellä pohjalla ovat vuoden 2012 tiedot, ja asetusten oletusarvot vastaavat keskimääräisen palkansaajan maksamien välittömien verojen määriä.

    Käykääpä testaamassa veRotositetta! Se löytyy linkista https://jtuimala.shinyapps.io/veRotosite/.


    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

    Category