Aihearkisto: R-KORNERI

Kristiina Huttusen vinkit ekonometrian intuitiiviseen sisäistämiseen

Teksti: Eino Haajanen

Huttunen innostuu, kun kysyn kirjavinkkiä.

“Siis tämä on ihan älyttömän silmiä avaava kirja. Tämä tekee ekonometriasta kivaa ja intuitiivista.”

Kirja on MIT:n professori Joshua Angristin ja LSE:n professori Jörn-Steffen Pischken teos Mostly Harmless Econometrics

Se lähtee Huttusen mukaan käytännön empiirisistä kysymyksistä liikkeelle. On monia asioita, jotka saattavat vaikuttaa ilmiöihin. On hyvä nähdä ikään kuin lukujen taakse. 

“On hyvä yrittää nähdä lukujen taakse ja alkaa miettiä, miksi tehdään näin”

“Yksinkertaisilla tavoilla voi lähteä tutkimaan kausaalikysymyksiä.”

Hän lisäksi mainitsee YouTube-videosarjan, joka on myös Angristin käsialaa.

Kyseessä on videosarja, joka opettaa ja havainnollistaa ekonometrian käsitteitä animaatiovideoiden kautta.

“Jos haluaa tehdä aineistolla töitä, empiiriset menetelmät on hyvä ymmärtää. Yleensä on esimerkiksi dataa maailmasta, joka on valikoitunut.”

“On hyvä yrittää nähdä lukujen taakse ja alkaa miettiä, miksi tehdään näin”

Usein kirjoitetaan ja ymmärretään asioita kuin olisi syy-seuraussuhde, vaikka ei olisi kyse siitä. 

Jatka keskustelua:

Kuvioiden muokkaaminen ärrässä – case ggplot2

Mainio työväline kuvioiden piirtämiseen on R-ohjelmiston ggplot2 -paketti. Paketilla tehtyjen kuvioiden etu on erityisesti monipuolisuus ja muokattavuus.

Vuoden viimeisessä ärräkornerissa tutustutaan kuvioiden piirtämiseen ggplot2-paketin avulla. Kyseinen paketti on jälleen Haldey Wickhamin kehittämä ja osa Tidyverseä, ja sillä voi käytännössä korvata R:n omat kuvaajien piirtämiseen tarkoitetut funktiot. ggplot2:n sisäinen logiikka, “grammar of graphics”, perustuu Leiland Wilkinsonin samannimiseen kirjaan. Ajatus on luoda ensin graafille pohja, jonka jälkeen pohjan päälle lisätään erilaisia kerroksia. Ne sisältävät tiedon siitä millaisen kuvan ohjelmoija haluaa luoda.

ggplot2:n ensimmäinen rakennuspalikka on funktio ggplot(), jolle yleensä annetaan argumenteiksi vähintään kuvattava data. Käytän esimerkeissä ggplot2-pakettiin kuuluvaa mpg-dataa, joka sisältää kiinnostavia tietoja erilaisten autojen bensankulutuksesta. Yksinään ggplot(data = mpg) printtaa tyhjän kuvan, sillä ggplotille pitää kertoa vielä miten käyttäjä haluaa aineistoa kuvata. Tämä tehdään erilaisilla geom_x() funktioilla, jossa x:n tilalle laitetaan kuvaajan tyyppi, esimerkiksi geom_point() tai geom_histogram(). Vielä tarvitaan ns. aesthetic mapping eli data, joita haluamme kuvata erilaisilla geomeilla.

Seuraava koodi piirtää scatterplotin, jossa displ on auton moottorin koko ja hwy on polttoainetehokkuus moottoritiellä.

ggplot(data = mpg) + # plus-merkin pitää olla rivin lopussa
  geom_point(aes(x = displ, y = hwy))

aes() funktio kertoo että haluamme piirtää pisteet niin että x-akselilla on displ ja y-akselilla hwy. Tämän funktion voi määritellä myös ggplot():n sisällä, jolloin kaikki kuvaan lisätyt geomit piirretään käyttäen näitä x:lle ja y:lle annettuja arvoja.

Mielestäni yksi kätevimmistä ggplot:n ominaisuuksista on mahdollisuus määrittää joku kolmas datan sarake, jonka mukaan piirretyt havainnot ryhmitellään. Tämä onnistuu tosin vain, jos data on siistissä muodossa. Ryhmittelyn voi tehdä käyttämällä esimerkiksi värejä tai erilaisia muotoja. Värejä käyttäessä tulee huomioida värisokeat ja olla käyttämättä erityisesti punaista ja vihreää samassa kuvassa. Erilaisia väripaletteja on tarjolla lukuisia ja niiden käyttö on helppoa.

Alla aes():n sisällä määritellyt color ja shape käskevät ggplotia luokittelemaan pisteet värein ja muodoin, sen mukaan ovatko autot etu-, taka- vai nelivetoisia.

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy, color = drv, shape = drv)) +
  scale_color_viridis_d()   # viridis paketti muuttaa väriskaalan

ggplotin selkein etu perus R:ään verrattuna on kuvioiden helppo ja lähes rajaton muokattavuus. Muokkaaminen tapahtuu seuraavasti. Ensin määritellään perusosa eli jo tuttu ggplot(data = mpg) ja talletetaan sen muuttujaan, tässä tapauksessa gg_base-nimiseen. Toisessa vaiheessa kuvioita muokataan lisäämällä geomeita ja muita härpäkkeitä gg_base-objektin päälle. Härpäkkeet vastaavat käytännössä jutun alussa mainittuja kerroksia ja niitä käytetään seuraavaan tapaan.

require(ggthemes) # sisältää teeman economist

gg_base <- ggplot(data = mpg) # talletetaan muuttujaan gg_base

gg_base +
  geom_boxplot(aes(x = drv, y = displ)) +      # piirtää boxplotin
  geom_jitter(width = 0.2, aes(x = drv,
                              y = displ,
                              color = drv)) + # piirtää pisteet
  scale_color_economist() +                    # muuttaa väriskaalan
  ggtitle(”Etu-, taka- vai nelivetoinen ja moottorin koko”) + # otsikko
  labs(x = ”Etu-, taka- vai nelivetoinen”,
      y = ”Moottorin koko”,
      color = ”vetotapa”) +                   # nimeää akselit ja legendin
  theme_economist(10)               # theme_x muuttaa kuvion oletusasetuksia

Myös tämän härpäkkeillä varustetun ggplot-objetin voi tallentaa erilliseen muuttujaan. Tämä on kätevää tehtäessä useita hiukan erilaisia kuvia. Se myös vähentää koodin toisteisuutta. Härpäkkeitä lisäämällä kuviota on siis helppo muokata. Ohjeita erilaisten kuvioiden tekoon löytyy joko googlaamalla tai ggplotin Cheat Sheetistä.

ggplotin toinen vahvuus verrattuna R:n omiin funktioihin on, että se tarjoaa yhdenmukaisen syntaksin mitä erilaisimpien kuvien luomiseen. R:n omia funktioita käyttäessä jokaiselle kuviotyypille kuten historgrammille tai boxplotille on omat funktionsa. Eli kun toteat: ”äh, eihän tätä kannata histogrammilla kuvata vaan boxplotilla”, joudut koodaamaan koko syntaksin uudestaan. ggplotin tapauksessa kuviotyypin vaihto onnistuu helposti valitsemalla erilaisen geomin. Härpäkkeitä ei välttämättä tarvitse muokata laisinkaan. Lisäksi ggplotin tuottamat kuvioit ovat oletusasetuksilla, jonkin verran hienompia kuin perus R:n graafit. Kummankin peruskuvioiden kanssa joutuu kuitenkin tekemään melkoisesti töitä ennen kuin kuviot ovat julkaisukelpoisia.Tässä artikkelissa mainittujen ominaisuuksien lisäksi ggplotilla voi tehdä lähes mitä vain kartoista interaktiivisiin graafeihin. Hyviä lähteitä kiinnostuneelle ovat edellä vinkatun Cheat Sheetin lisäksi edellisissäkin kornereissa mainittu Garrett Grolemundin ja Hadley Wickhamin kirjoittama R for Data Science -kirja. Lisäksi internetistä löytyy lähes rajaton määrä ggplottiin liittyvää materiaalia.

TEKSTI: Tuomas Markkula


Jatka keskustelua:

Siistiä jälkeä

Tässä numerossa luodaan yleiskatsaus valikoimaan R-paketteja, joihin viitataan nimityksellä tidyverse. Nämä paketit on luotu helpottamaan data-analyysiä, ja ne jakavat yhteisen filosofian ja kieliopin. Tidyversen perusteiden omaksuminen käy nopeasti, ja helpottaa ärräilijän arkea huomattavasti. 

Nimitys tidyverse viittaa siistin datarakenteen periaatteeseen. Idea on yksinkertainen: jokaisen muuttujan tulisi olla omassa sarakkeessaan ja jokaisen havainnon omalla rivillään. Näin aineiston muokkaaminen ja analysointi on selkeää ja suoraviivaista.  Esimerkki havainnollistaa asiaa. Alla on kaksi taulukkoa, jotka kuvaavat ärräkornerin kirjoittajien kuvitteellista hedelmätilannetta. Molemmat sisältävät saman informaation, mutta vain oikeanpuoleinen on “siistissä” muodossa. Miksi välittää siisteydestä? Mietitään tilannetta, jossa halutaan jättää tarkastelun ulkopuolelle Juhon päärynöiden lukumäärä. Oikeanpuoleisessa taulukossa tämä onnistuu helposti poistamalla rivin, jolla nimi saa arvon “Juho” ja muuttuja hedelmä arvon “päärynä”. Vasemmanpuoleisessa taulukossa vastaava käsky poistaisi kuitenkin myös tiedon Juholla olevien omenoiden lukumäärästä. Havaintojen suodattaminen ei siis toimi toivotulla tavalla, jos aineisto on koottu väärin.

Tidyversen kieliopin ehkä merkittävin etu on se, että sen ansiosta aineiston muuttujiin viittaaminen on hyvin yksinkertaista. Perus R:n kieliopissa sarakkeisiin viitataan laittamalla pilkku ennen sarakkeen numeroa. Vastaavasti riveihin viitataan laittamalla pilkku rivinumeron jälkeen. Tämä ainainen pilkkujen kanssa venkslaaminen aiheuttaa monelle turhaa päänvaivaa ja virheilmoituksia. Tidyversen ihmeellisessä maailmassa ei tarvitse muistaa moisia pilkkusääntöjä. Voit myös unohtaa aineiston muuttujien valintaan käytetyn $-merkin. Tidyversessä muuttujiin viittaaminen tapahtuu aina käyttämällä niiden nimiä. Voit joko kutsua muuttujia suoraan nimillä, valita niitä alku- tai loppu kirjainten mukaan tai niiden sisältämien merkkiyhdistelmien mukaan.

Näin koodista katoaa turha toisteisuus ja sen luettavuus paranee, kun aineiston nimeä ei tarvitse toistaa joka kerta, kun viittaa johonkin aineiston sisältämään muuttujaan. Alla vielä vertailun vuoksi esimerkki aineiston rajaamisesta perus R:llä ja tidyversen kieliopilla.

 Dplyr

Tidyversen paketeista merkittävin lienee R-studion tutkimusjohtajan Hadley Wickhamin kehittelemä paketti dplyr. Se on luotu aineistojen muokkaamisen ja analysoinnin helpottamiseksi. Dplyr:n kätevien funktioiden avulla voi valita ja luoda uusia muuttujia, suodattaa havaintoja sekä muodostaa nopeita yhteenvetoja käsiteltävästä aineistosta. Dplyr:n parhaat ominaisuudet ovat sen yksinkertaisuus ja funktioiden selkeät nimet, jotka tekevät koodista helppolukuista. Seuraava esimerkki hyödyntää muutamia paketin keskeisimpiä funktioita. Koodi poistaa havainnon Juhon päärynöistä ja laskee jokaisen kirjoittajan hedelmien lukumäärän keskiarvon.

Kätevää eikö? Mutta eräs yksityiskohta pistää kokeneemman koodaajan silmään yllä olevassa esimerkissä. Se sisältää turhaa välivaiheiden tallentamista. Koodia voi yksinkertaistaa vielä lisää käyttämällä putkioperaattoria.

Putkioperaattori

Tämä toiminto on tuttu jo muutaman vuoden takaisesta ärräkornerista (Kapitaali 1/17), mutta koska se on keskeinen pala tidyversen kielioppia, ja nykyään myös kiinteä osa dplyr -pakettia, niin se esitellään nyt pikaisesti uudelleen.

Putkioperaattori (engl. pipe) eli hämmentävä merkkijono %>% ottaa vasemman puoleisen termin ja syöttää sen oikealla puolella olevalle funktiolle. Se on osa magrittr-pakettia, joka on saanut nimensä belgialaisen surrealistin René Magritten mukaan. Taiteilijan yksi tunnetuimmista teoksista on maalaus piipusta, jonka alla lukee “ceci n’est pas une pipe” (tämä ei ole piippu). Toinen luonteva suomennos voisi siis olla putken sijasta piippu.

Mutta mihin tätä hassua merkkiyhdistelmää voi käyttää?  Sen tarkoitus on tehdä koodista yksinkertaisempaa. Perinteistä R-koodia kirjoittaessa funktioita kirjoitetaan sisäkkäin. Tällöin koodia luetaan rivin keskeltä ulospäin. Mitä useampia funktioita samalla rivillä on, sitä vaikeammaksi koodin lukemin muuttuu. Aikaisemman esimerkin voisi kirjoittaa halutessaan yhdelle riville, mutta lopputulos on hyvin ikävän näköinen.

Otetaan seuraavaksi avuksi putkioperaattori.

Nyt koodia on helppo lukea vasemmalta oikealle ja ylhäältä alas, eikä se sisällä turhaa välivaiheiden tallentamista. Karlijn Willems kirjoittaa hyvin artikkelissaan “Pipes in R Tutorial For Beginners” (2016), että putkioperaattorin voi ajatella vastaavan puhutussa kielessä sanaparia “ja sitten”. Viimeisimmän koodinpätkän voisi lukea ääneen esimerkiksi seuraavasti: “otetaan tarkasteluun aineisto, ja sitten poistetaan havainto, ja sitten ryhmitellään nimen mukaan, ja sitten lasketaan keskiarvo”.

Tidyverseen kuuluu tässä kolumnissa esiteltyjen pakettien lisäksi monia muita, jotka noudattavat tässä kolumnissa esiteltyä siistin datan periaatetta. Joitakin maininnan arvoisia paketteja ovat esimerkiksi listojen kanssa työskentelyyn tarkoitettu purrr, grafiikoiden luomisen ehdoton ykkönen ggplot2, aineistojen tuontia helpottava readr ja dataframesta päivitetyn version esittelevä tibble. 

TEKSTI: Meeri Seppä

Jatka keskustelua:

R-vaikeudet

Terveisiä taas Ärräkornerista! Edellisellä kerralla perustelimme, miksi jokaisen ekonomistiksi pyrkivän opiskelijan tulisi laajentaa osaamistaan Excelistä muihin analytiikkatyökaluihin, erityisesti R:än. Valtaosa taloustieteen opiskelijoista varmasti tiedostaa R:n olevan hyödyllinen työväline, mutta kuitenkin monen into R:n opetteluun lopahtaa aivan ensimetreillä. Tähän suurin yksittäinen syy lienee oppimiskäyrän jyrkkyys; yliopiston järjestämällä R:n peruskurssilla ehditään keskittymään ohjelmoinnin perusteiden opetteluun harmillisen pintapuolisesti. Ärräkornerin kirjoitustiimi suositteleekin taloustieteen opintojen täydentämistä Ohjelmoinnin perusteet -kurssilla, joka antaa hyvät perusvalmiudet kaikkeen ohjelmointiin. Ensihätään tarjoamme lukijoille lyhyen listan perusnikseistä, joita jokaisen R:ää käyttävän tulisi noudattaa. Tämänkertaisen Ärräkornerin teemana on aloittelevan koodarin muistilista


1. Ajattele kirjoittamaasi koodia ”to do” -listana tietokoneelle

Ohjelmoinnin syvin olemus on selkeiden ohjeiden kirjoittaminen tietokoneelle kielellä, jota kone ymmärtää. Tietokone käsittelee sille annettua ohjelistaa absoluuttisen orjallisesti: aloittaen ohjelmakoodin ylhäältä ja jatkaen listan lukemista rivi riviltä alaspäin siirtyen, ellei se saa käskyä toimia toisin. Ohjelmoijan tulisi aina olla selvillä siitä, mitä hän koneelta haluaa. Jokainen koodirivi on tehtävä, jossa koneelle ohjeistetaan tarvittavalla tarkkuudella, mitä sen halutaan tekevän. Mikäli käskyissä on virheitä, ohjelma ei toimi.

2.  Kirjoita siistiä koodia

Niin kuin mihin tahansa kieleen, myös koodin kirjoittamiseen pätee omat ”kielioppisääntönsä”. Näistä ihan ensimmäinen on koodin jäsentäminen eli kommenttien kirjoittaminen. R:ssä kommentin voi kirjoittaa laittamalla #-merkin lauseen eteen. Hyvässä koodissa kommentoidaan jokaista erillistä vaihetta, mutta tarkoitus ei kuitenkaan ole kommentoida jokaista riviä erikseen. Kommentointia voi verrata kappalejaon käyttöön kirjoitetussa tekstissä. Tarkoituksena on selventää, mitä alla olevassa kappaleessa tehdään.

Kommentit voi kirjoittaa ikään kuin työn vaiheita jollekin ulkopuoliselle selostaen, vaikka kirjoittaiskin koodia vain omaan käyttöön. Itsestään selvien asioiden selittäminen voi tuntua turhauttavalta, mutta on välttämätöntä ymmärrettävän koodin kirjoittamiseksi. Koodin jäsentäminen auttaa myös ymmärtämään, mitä on oikeastaan tekemässä.

Toinen keskeinen tekijä ymmärrettävän koodin kirjoittamisessa on muuttujien nimeäminen. Muuttujat tulee nimetä järkevästi. Hyvä nimi kertoo lukijalleen, mitä kyseinen muuttuja sisältää. Koodi saattaa näyttää toki ytimekkäältä, jos muuttujan nimeksi antaa vain yksittäisen kirjaimen, mutta siihen tämän menetelmän hyvät puolet jäävätkin. Vähänkään pidempää koodia kirjoittaessa on tärkeä muistaa, mitä mihinkin muuttujaan on tallennettu. Hyvin nimetyt muuttujat helpottavat huomattavasti keskeneräisen tai vanhan työn pariin palaamista, ja ovat lähes välttämättömiä, jos ulkopuolisen tulisi ymmärtää kirjoittamasi koodia.  Toisaalta sopivan nimen ei myöskään tulisi olla liian pitkä. Turhan pitkät nimet tuottavat helposti varsin pitkiä koodirivejä ja hankaloittavat koodin luettavuutta.

Muuttujan nimi ei saa sisältää välilyöntejä. Miten sitten useampisanaisen nimen voisi kirjoittaa niin, että siitäsaisijotainselvää? Tähän on kehitetty kaksi eri ratkaisua. Ensimmäinen ja suositellumpi tapa on ns. ”käärmemenetelmä” (engl. snake_case). Siinä sanat erotetaan toisistaan alaviivalla. Toinen tapa on ”kamelimenetelmä” (engl. CamelCase), jossa sanat erotetaan toisistaan isolla alkukirjaimella.

Siistin koodin kirjoittamiseen liittyy monia muitakin pikku niksejä, jotka lisäävät koodin luettavuutta huomattavasti. On esimerkiksi erittäin suositeltavaa lisätä välilyöntejä merkkien väliin, jokaisen rivin tulisi sisältää alle 80 merkkiä, funktioiden ja looppien sisällä olevat argumentit tulisi sisentää jne. Lisää siitin koodin kirjoittamisesta voi lukea tidyversen tyylioppaasta The tidyverse style guide

Lisävinkki: Siistin koodin kirjoittamiseen on kehitetty monia apuvälineitä. Eräs katsastamisen arvoinen paketti on lintr, joka sisältää komennon lint(”tiedoston nimi”). Tämä koodinpätkä ilmoittaa komentorivillä, onko koodissasi jotain korjattavaa ja ehdottaa parannuksia.  

3. Vähennä toisteisuutta

Toinen ja hieman edistyneempi askel ymmärrettävän koodin kirjoittamiseen on toisteisuuden eli copy-paste -koodin välttäminen. Kirjassaan R for Data Science R-gurut Hadley Wickham ja Garrett Grolemund määrittelevät copy-paste -koodin niin että se sisältää saman koodirivin ainakin kolme kertaa. Mikäli huomaa kirjoittavansa toisteista koodia, on syytä havahtua. Vaikka toimintojen kierrättäminen leikkaa-liimaa -menetelmällä on helppoa, se johtaa vaikeasti ymmärrettävään ja virheille alttiiseen ohjelmaan. Jonosta lähes identtisiä rivejä on vaikea havaita koodin punaista lankaa ja koodia korjatessa joka rivin argumentit täytyy muuttaa erikseen, jolloin virheitä syntyy helposti. Hyvä ja siisti koodi sisältää siis mahdollisimman vähän toistoa, ja paras keino sen vähentämiseen ovat funktiot ja loopit. 

Funktiot ovat olennainen osa R:ää. Tyypillisesti funktio on pieni ohjelma, joka suorittaa jonkin operaation käsiteltävälle aineistolle annettujen argumenttien mukaisesti. Esimerkiksi keskiarvon laskeva funktio mean() ottaa argumentiksi vektorin sekä miten vektorissa mahdollisesti olevat puuttuvat arvot otetaan huomioon. Tällaisia funktioita on R:ssä tarjolla laaja valikoima, ja näiden lisäksi on vielä lukematon määrä käyttäjien tekemien pakettien funktioita.

Toisteisuuden vähentämisen näkökulmasta tärkeämpiä ovat kuitenkin itse tehdyt funktiot, joiden luonti on R:ssä yksinkertaista. Koodari antaa funktiolle nimen, argumentit (yleensä aineisto ja operaation suorituksen yksityiskohdat) sekä toiminnallisuuden, eli sen mitä annetulle aineistolle tehdään. Esimerkistä käy funktio, joka laskee vektorin varianssin. Funktion nimeksi määritellään var, argumentiksi vektori ja toiminnallisuudeksi varianssin laskeminen sopivalla kaavalla sekä lasketun arvon palautus. Tuloksena on funktio, jota on helppo käyttää uudelleen.

Kierrätettävyyden lisäksi useasti toistuvien operaatioiden kirjoittaminen funktioiksi vähentää virheitä ja tekee koodista luettavampaa, varsinkin jos kyseessä on pidempi ja monimutkaisempi ongelma. Mikäli funktiota täytyy muokata, se onnistuu muuttamalla koodia ainoastaan yhdestä kohdasta. Lisäksi Wickhamin ja Grolemundin  mukaan käyttämällä havainnollistavasti nimettyjä funktioita koodin luettavuus paranee. Esimerkiksi var-funktion tarkoitus on helpompi hahmottaa kuin vastaavan koodinpätkän. Teoksen R for Data Science mukaan hyvä nyrkkisääntö funktioiden käytölle on, että kopioidessasi koodia kolmannen kerran kirjoita mieluummin funktio.

Lukuvinkki: Erinomainen aloittelijalle sopiva johdatus funktioiden luomiseen on edellä mainitun kirjan R for Data Science luku 19 tai Grolemundin Hands-On Programming with R. Edistyneemmälle ärräilijälle mainio lähde funktioiden saloihin on Wickhamin Advanced R. R for Data Science:stä ja Advanced R:stä löytyy ilmainen internet-versio.

4. Hyödynnä toistorakenteita

Taloustieteilijä joutuu usein empiiristä tutkimusta tehdessään estimoimaan useita erilaisia regressiomalleja eri spesifikaatioilla. Suoraviivaisin tapa on kirjoittaa jokainen lineaarinen malli erikseen ja tallentaa jokainen malli omaan muuttujaansa. Mikäli malleja on vähän, tämä toimii hyvin, mutta jos malleja on enemmän, näpyttely käy ankeaksi ja koodista tulee toisteista. Juuri tällaisia tilanteita varten loopit ovat olemassa. Looppi toistaa saman koodiblokin komennot usealle eri syötteelle, esimerkiksi jokaiselle vektorin alkiolle. Näin on mahdollista toistaa sama operaatio useita kertoja ilman toisteisuuden kiroja. Estimointiesimerkissä loopin avulla voi antaa lineaariselle mallille syötteeksi vuorotellen kuhunkin spesifikaatioon kuuluvat muuttujat ja tallentaa estimoidut mallit listaan. Toisteisuus vähenee ja urakasta selviää vähemmällä koodilla.

Kirjassa R for Data Science Wickhamin ja Grolemundin mukaan tavat, joilla looppaaminen voidaan R:ssä suorittaa, on mahdollista jakaa kahteen eri ryhmään. Ensimmäiseen kuuluvat esimerkiksi R-ohjelmoinnin peruskurssilta tutut for ja while -loopit. Näistä on hyvä aloittaa, sillä ne ovat melko yksinkertaisia ja niistä käy selkeästi ilmi, mitä looppauksen aikana tapahtuu. Toisaalta nämä loopit voivat joskus vaatia paljonkin koodia suhteellisen yksinkertaisen ongelman ratkaisemiseksi. 

Toinen ryhmä, joka kuuluu funktionaalisen ohjelmoinnin alle, yhdistää loopit ja funktiot. Tällöin ajatuksena on, että toisteisuutta loopin sisällä pyritään vähentämään luomalla toisteisesta koodista funktioita. Tähän ryhmään kuuluvat erilaiset applyt ja ja Purrr -paketin funktiot. Erona esimerkiksi for-looppiin on, että näille loop-funktioille annetaan toistettavaksi jokin funktio toiminnallisuuden eksplisiittisen koodaamisen sijaan. Esimerkiksi apply-funktioperheen jäsenille annetaan argumentiksi funktio ja jokin syöte: esimerkiksi vektori, jonka jokaiselle arvolle funktio ajetaan erikseen. Funktionaalinen lähestymistapa mahdollistaa ongelmien ratkaisemisen one-linereilla ja vähemmillä virheillä, joten sen hallitsemisesta on ehdottomasti hyötyä.

Vinkki: Looppien opettelu kannattaa aloittaa helpommista for ja while -loopeista ja siirtyä funktionaaliseen lähestymistapaan, kun edelliset ovat hyvin hallussa. Wickhamin ja Gormundin R for Data Sciencen 21. kappale on erinomainen johdatus looppaamiseen R:ssä.

5. Älä panikoidu virheilmoituksista ja käytä tarvittaessa internettiä apuna

Virhe ohjelmakoodissa, riippumatta siitä johtaako se virheilmoitukseen vai vääränlaiseen toimintaan, johtuu lähes poikkeuksetta käyttäjän tekemästä virheestä. Kun ohjelma toimii epätoivotulla tavalla, on koneelle annettu “to do” -lista sisältänyt osia, jotka ovat olleet koneelle epäselviä. Usein ongelma johtuu väärin käytetyistä tai vajavaisesti määritetyistä funktioista, väärässä muodossa olevista muuttujista, puuttuvista paketeista tai puhtaista kirjoitusvirheistä. 

Ongelmakohdan löytäminen on yleensä yksinkertaista, vaikkakin pidempää ja monimutkaisempaa koodia käsiteltäessä se voi viedä aikaa. Takuuvarma menetelmä ongelman paikantamiseksi on aloittaa ohjelmakoodin alusta ja ajaa sitä rivi riviltä siinä järjestyksessä, missä kone koodia lukee, kunnes koodi ei enää toimi halutulla tavalla. Yleensä ongelmat ovat verrattain selkeitä ja korjattavissa lyhyen pohdinnan jälkeen, mutta erittäin usein ohjelmoija pääsee hyödyntämään maailmanlaajuisen verkon lähes rajatonta kirjastoa ongelman ratkaisemiseksi. Googlaamalla R:n antaman virheilmoituksen tai sen osan ohjelmoija löytää itsensä yleensä Stack Overflow -sivustolta, jossa vastaavaa ongelmaa on jo aiemmin puitu, ja johon etevämmät koodaajat ovat antaneet omat ratkaisuehdotuksensa. Learning by googling!

TEKSTI: Meeri Seppä, Juho Lähteenmaa ja Tuomas Markkula

Jatka keskustelua:

Ja minähän en R:ää käytä!

Aikaisemmilta vuosilta tuttu Ärräkorneri tekee nyt paluun Kapitaaliin. Ensimmäisessä kirjoituksessa käsitellään R-ohjelmointikielen opettelemisen merkitystä tulevalle ekonomistille.

Tervetuloa Ärräkornerin pariin! 

Ärräkorneri on moniosainen juttusarja, jossa osa Kapitaalin palstatilasta uhrataan nörttiagendan edistämiseen. Tarkoituksenamme on herätellä motivaatiota R:n opiskeluun ja tarjota apua niille, joille R tuntuu vieraalta tai pelottavalta. Lisäksi toivomme, että palstamme tarjoaa elämää helpottavia vinkkejä myös hieman tottuneemmille koodareille. Ensimmäisessä osassa aloitamme aivan perusasioista: minkä takia jokaisen itseään ekonomistiksi tulevaisuudessa kutsuvan tulisi laajentaa osaamistaan Excelistä maagiseen R:n maailmaan?

Excel on varmasti kaikille taloustieteen opiskelijoille tuttu jo ajalta ennen yliopisto-opintojen aloittamista. Harva kuitenkaan törmää R:än ennen fuksivuottaan. Ensireaktio opiskelijalle saattaa olla syvä hämmennys, eikä täysin syyttä. R ja tilastotiede tutuksi -kurssista huolimatta kosketus R:än ja sen käyttömahdollisuuksiin saattaa jäädä varsin pinnalliseksi. Alkuhämmennys saattaa pian muuttua lieväksi ärtymykseksi, joka puolestaan hoitamattomana voi äityä pahanlaatuiseksi turhautumiseksi sekä vihaksi R:ää kohtaan. Lopputuloksena turhautunut opiskelija heittää hanskat tiskiin ja yrittää tehdä ”data-analyysinsä” Excelillä. Toivomme voivamme vaikuttaa siihen, että mahdollisimman harva KTTO:lainen joutuisi tähän pisteeseen.

No eikö se Excel sitten riitä? Mitä mukamas R:llä voi tehdä, jota Excelillä ei voi?

Vertailuasetelma Excelin kanssa on jopa hieman keinotekoinen, sillä nämä kaksi työvälinettä ovat kehitetty täysin erilaiseen käyttöön. Excel on taulukkolaskentaohjelma, joka soveltuu moniin liiketalouden sovelluksiin ja pienempien aineistojen tarkasteluun. R on puolestaan tilastolliseen analyysiin suunniteltu ohjelmointikieli, joka mahdollistaa suurien aineistojen käsittelyn, (hienojen!) grafiikoiden luomisen ja valmiit funktiot lähes kaikkiin tilastotieteellisiin ongelmiin, joihin taloustieteilijä voi törmätä. Varmastikin R:n tärkein ominaisuus onkin sen sisältämät paketit. Paketteja on tälläkin hetkellä yli 10 000 pelkästään CRAN -nimisessä verkostokannassa, josta niiden lataaminen on lapsellisen helppoa, varsinkin R-Studiota käytettäessä.

Monelle ohjelmointiin tottumattomalle opiskelijalle saattaa aineiston ja toiminnallisuuksien erillisyys tuntua vieraalta. Excelissä aineisto on jatkuvasti näkyvissä, ja halutut laskut sekä toiminnot suoritetaan samaan tiedostoon aineiston kanssa. R:ssä kirjoitetaan sen sijaan ohjelmakoodi, joka ajettaessa tekee halutut temput valitulle aineistolle. Excelissä suurempien aineistojen käsittely hidastaa koko ohjelman toimintaa, ja riittävän suuri aineisto lopulta estää ohjelman toiminnan kokonaan. Näin käy, koska aineisto on jatkuvasti aktiivisena, eikä aineiston muutoksia ja analyysia erikseen ajeta kuten R:ssä ja muissa ohjelmointikielissä. Excel soveltuukin huonosti jo vain joitakin tuhansia rivejä sisältävien aineistojen käsittelyyn.

Hyvä syy opetella koodaamaan on samankaltaisten tehtävien toistettavuus. Tekemällä analyysiprosessin R:llä (tai millä tahansa ohjelmointikielellä) kaikki työvaiheet aineiston muovaamisesta analyyseihin tallentuvat ohjelmakoodiin, jolloin pätkiä aiemmin tehdystä ohjelmakoodista voi käyttää uudestaan pienillä muokkauksilla. Tässä vaiheessa on toki hyvä huomauttaa, että myös Excelissä prosesseja voi suorittaa kirjoittamalla ohjelmakoodia Excelin omalla kielellä Visual Basicilla. Se ei kuitenkaan valmiiden toiminnallisuuksiensa puolesta ole lainkaan vertailukelpoinen R:n kanssa.

Monista hyvistä ominaisuuksistaan huolimatta edes R ei ole kaikkivoipa. Sitä ei ole optimoitu esimerkiksi monimutkaisten ohjelmien suunnitteluun tai valtavien tietomäärien käsittelyyn. Jos siis haluat kehittyä data-analytiikan mestariksi, täytyy R:n lisäksi hallita muitakin data-analytiikan työvälineitä. Osaava tilastonikkari pystyy hyödyntämään monia tietoteknisiä menetelmiä ja tarpeen tullen osaa käyttää niitä myös yhdessä. Tilastonikkarin työkalupakkiin kuuluvat kiinteästi SQL-kyselyt ja vähintäänkin perustason osaaminen tietokannoista. R:n lisäksi hyödyllisiä ohjelmointikieliä data-analyytikolle ovat esimerkiksi Python, Mathlab ja Scala

Ja ei sitä Exceliäkään kannata unohtaa, koska kyllähän sitä voi käyttää vaikka sitten, no, muistiinpanojen tekemiseen.

TEKSTI: Meeri Seppänen ja Juho Lähteenmaa

Jatka keskustelua: