Sissejuhatuseks

Käesolev juhend on koostatud õppeaine Statistiline andmetöötlus läbimiseks. R on vabavaraline avatud lähtekoodiga statistiliste arvutuste ja graafika keskkond. Avatuse põhimõte laseb kõigil panustada tarkvara arendusse. R-i saab paigaldada oma arvutisse siit: http://www.r-project.org/

R-i installeerimise järel on meil kasutada baastarkvara, mida saab aga hõlpsasti laiendada. Nimelt on võimalik paigaldada tarkvara laiendusi nn analüüsipakette (package), millega saab tõsta soovitud funktsionaalsust. Need on alla laetavad samalt kodulehelt, kus ka R- installifail ise asub.

RStudio on integreeritud tööriistade kogum, mis aitab R-iga töötamise produktiivsust veelgi tõsta. See sisaldab nii konsooli kui ka graafikute, ajaloo, koodiparanduse ja töökeskkonna haldamist hõlbustavaid vahendeid. RStudio on kättesaadav siit: http://www.rstudio.com/products/RStudio/#Desk. Selle käivitamise järel on meil kasutada nii kogu R-i enese funktsionaalsus kui ka RStudio töövahendid.

Käesolev juhend on koostatud lootuses, et pärast selle läbi töötamist saab inimene aru R’i kasutamise loogikast, ta oskab töödelda seal oma andmeid sobivale kujule, ta kasutab lihtsamaid graafikuid ja valdab levinumaid statistilise andmetöötluse meetodeid. Arvestades fakti, et loengukursuse eest antavate ainepunktide maht on piiratud, on autor püüdnud olla võimalikult lakooniline. See tähendab, et paljud käskude elemendid on jäänud lahti seletamata ning et lõpuni aru saada, mis ühe või teise käsu parameetreid muutes juhtuma hakkab, on väga kasulik lugeda lisa Help kataloogist ning kui sellest ei piisa siis otsida Internetist lisa.

Kasulikke linke:

Üsna põhjalik kasutamisõpetus: http://www.statmethods.net/

Veel üks: http://www.cookbook-r.com/

Mõtteid ja uudiseid: http://www.r-bloggers.com/

R-i kasutamine

R kasutab käskusid (command), mida sisestatakse konsooliakna kaudu. Käsud koosnevad R-is tavaliselt kahest poolest: objektid ja funktsioonid. Neid eraldab ‘<-’ ja nii on käsu üldkuju selline:

Objekt <- funktsioon

See tähendab ‘objekt on loodud funktsioonist’. Objektideks on kõik R-is loodu. Objekt võib olla tunnus, tunnuste kogum, statistiline mudel jne. Objektiks võib olla nii üksikväärtus kui ka informatsiooni kogum. Esmapilgul väga keeruline ja suurt õppimist nõudev lähenemine tasub aga kiiresti ära ja kiirendab analüüside - graafikute (aga näiteks ka kaartide) koostamist hüppeliselt.

Kuigi käske on võimalik kirjutada otse konsoolis, on seda siiski mõistlikum teha R-i toimetaja aknas (RStudio’s ‘source’ aken). Sinna loodud käskude kogum on salvestatav skriptideks. Sellel lähenemisel on mitmeid eeliseid: sessiooni lõpetades saab skripti salvestades seda hiljem kiiresti taasavada ja analüüsi korrata, mis lühendab ikoonidele klikkimisele ja klaviatuuril tippimisele kuluvat tööaega kordades. Ka täiesti uued analüüsid on sageli varasematega sarnased, nii et varem salvestatud skriptis muutuseid tehes saab ka uut analüüsi kiiresti sooritada. Kui tahame käskude kohta talletada metainfot või mis iganes muid kommentaare, on selleks kasutada “trellid” (#), millest alates kuni rea lõpuni ei loeta teksti käsuna vaid kommentaarina.

Kui praktikumide läbimiseks kasutatakse arvutiklassi arvuteid, siis on kõik vajalikud laiendused juba paigaldatud (ja tavakasutajana ei saagi midagi muuta), siis oma arvutit kasutades tuleb kõik laiendused esmalt paigaldada.

R-i töökeskkond (workspace)

R-iga töötades tekib pidevalt hulk tabeleid, mudeleid, jooniseid ja igasuguseid muid objekte, mida on võimalik salvestada ühte nn töökeskkonna faili (.RData). Selle faili avades saab tööd jätkata sealt, kus eelmine kord pooleli jäi.

Analüüside esimese sammuna tuleks määrata, millises kataloogis seda tehakse:

setwd("C:\\Users\\Mikk\\Desktop\\") # loomulikult erineb see arvutite / kasutajate lõikes. Hiirega klikates võib kasutada ka: "Session -> Set Working Diectory -> Choose Directory"

Töökataloogi kontrollimine:

getwd()
## [1] "C:/Users/Mikk/Desktop/PhD/Ained/2021 sügis - Statistiline andmetöötlus - praktiline pool (LOOM.02.153)/stat_prax_failid"

Töökeskkonna salvestamine:

save.image() # soovi korral saab defineerida ka nime: save.image(file="nimi.RData"), aga saab ka ilma.

Töökeskkonna liikmed:

ls() # kuvatakse töökeskkonna liikmed

rm(objektinimi) # eemaldatakse nimetatud objekt

str(objektinimi) # vaatame andmetabeli struktuuri

Analüüsipaketid

Eespool mainitud R-i laiendused andmeanalüüsi pakettide näol tuleb esmalt paigalda ja käivitada:

install.packages(“analüüsipaketi.nimi”)

library(analüüsipaketi.nimi)

Kui paigaldusfailide asukoht on varem määramata, siis küsitakse ka seda. Mõistlik on valida enda lähedalt.

Abi

Internetis on R-i kasutamist õpetavat informatsiooni tohutus koguses. Samas tasub alati esmalt pöörduda R-i enda abifailide poole, sisestades konsoolis:

?(funktsiooni.nimi)

Kui käivitatud pakettide käskude hulgas otsitavat ei leidu, siis saab kasutada laiemat otsingut:

??(funktsiooni.nimi)

Andmete toomine R-i

Tunnuste loomine

Andmeid sisaldavate objektide loomiseks võib kasutada c() funktsiooni, mis loob andmevektoreid. Loome kolm objekti. Esimeses on TÜ rektorite nimed (alates 1989), teises sünniaasta ja kolmandas ametiaja algus. Hiljem ühendamine need objektid ühte andmetabelisse (dataframe)

rektorinimed <- c("Jüri Kärner", "Peeter Tulviste", "Jaak Aaviksoo", "Alar Karis", "Volli Kalm", "Toomas Asser")
synd <- c(1940, 1945, 1954, 1958, 1953, 1954)
ametialgus <- c(1988, 1993, 1998, 2007, 2012, 2018)
rektorid <- data.frame(Nimi = rektorinimed, Synniaeg = synd, Ametialgus = ametialgus)

Tulemuse vaatamiseks on (nagu R-is enamasti) mitmeid võimalusi. Kirjutades lihtsalt objekti nime, kuvatakse objekti sisu otse konsoolis (pole enamasti mõistlik tegu).

View(rektorid)
head(rektorid)
##              Nimi Synniaeg Ametialgus
## 1     Jüri Kärner     1940       1988
## 2 Peeter Tulviste     1945       1993
## 3   Jaak Aaviksoo     1954       1998
## 4      Alar Karis     1958       2007
## 5      Volli Kalm     1953       2012
## 6    Toomas Asser     1954       2018

Esimesel juhul avaneb kogu tabel eraldi aknas, teisel juhul esimesed read konsoolis.

Uute tunnuste arvutamine olemasolevate põhjal

Selleks võib kasutada nii aritmeetilisi kui ka loogilisi funktsioone (tunnustega opereerides tuleb ära näidata nii andmetabeli kui ka tunnuse nimi: andmetabeli.nimi$tunnusenimi). Uue tunnuse arvutamisel tuleb näidata ka selle nimi (olemasolevat nime kasutades kirjutatakse see lihtsalt üle) Näiteks:

rektorid$vanus_ameti_algul <- rektorid$Ametialgus - rektorid$Synniaeg # arvutab  vanuse ametisse astumise ajal
rektorid$vana_vs_noor <- ifelse(rektorid$vanus_ameti_algul > 50, "vana", "noor") # kui rektor oli ametisse astudes vanem kui 50 aastat, ütleme, et ta oli vana...
head(rektorid) # kuvame tulemuse
##              Nimi Synniaeg Ametialgus vanus_ameti_algul vana_vs_noor
## 1     Jüri Kärner     1940       1988                48         noor
## 2 Peeter Tulviste     1945       1993                48         noor
## 3   Jaak Aaviksoo     1954       1998                44         noor
## 4      Alar Karis     1958       2007                49         noor
## 5      Volli Kalm     1953       2012                59         vana
## 6    Toomas Asser     1954       2018                64         vana

Andmete import & eksport

Tihti ei pea analüüsija andmeid ise sisestama ja need on juba mingil kujul olemas. Kuigi R saab hakkama paljude formaatidega, jääme hektel pidama CSV-failide juurde, mida ka Exceli kasutajad lihtsasti Save As-käsuga toota saavad. Eelduseks on, et kümnendkohti eristatakse punktiga ja väljaeraldajaks on ‘;’. rektorid <- read.csv(“C:/Users/Mikk/Desktop/PhD/Ained/2021 sügis - Statistika aine praktiline pool/stat_prax_failid”)

RStudio’s võib andmete import File => Import Dataset => From Text File käskude abil isegi kõige mugavam olla…

Samas tuleb ette ka olukordi, kui andmed on Internetis ja nende formaat teadaolevalt sobilik. Siis saab tabeli R-i tõmmata otse Internetist:

Factor_data <- read.csv("http://aasa.ut.ee/statistika/Factor_data.csv", sep=";", dec=",")
head(Factor_data) # vaatame päist
##      WORK_1    WORK_2    WORK_3   HOBBY_1   HOBBY_2    HOME_1    HOME_2
## 1 105.12588 101.65870 115.06034 100.99814  95.18444 100.28127 101.66690
## 2  77.04902  72.93342  77.48509  72.74369  61.56300  93.85405  95.39173
## 3  86.01670  82.20648  78.88889  77.95118  91.70513  86.77338 108.07003
## 4  91.42470 106.10654  95.63982  90.90057 111.46616 100.24840  86.08050
## 5 113.71431  92.02872  99.07894  79.27742  98.41610 104.01265  83.27109
## 6  86.60614  87.81714  67.66254  93.66221  77.99670  99.82158  97.27523
##      HOME_3  MISCEL_1  MISCEL_2
## 1  85.55301 104.03460 110.27806
## 2  88.60931  70.11529  72.00030
## 3  93.34780  86.02111  70.68790
## 4  93.82205 101.22391  82.66547
## 5  69.62148  82.82023  70.02229
## 6 108.62157  91.39957  79.77569
rm(Factor_data) # kuna me seda tabelit praegu ei kasuta, siis eemaldame selle.

Andmete R-ist välja viimine toimub nii:

write.csv(rektorid, file="rektorid.csv", row.names = F) #viimane parameeter ütleb, et me ei taha salvestada ridade nimesid.

Andmete filtreerimine tunnuste alusel

Sageli soovitakse mingeid analüüsisamme astuda valimiga, mis vastab teatud tingimustele. Selleks saab R-is kasutada subset() funktsiooni. Oletame, et tahame edasi töötada ainult “noorte” rektoritega:

rektoridNoored <- subset(rektorid, vana_vs_noor == "noor")
ncol(rektoridNoored) # veergude arv (ridade arvu annab nrow())
## [1] 5
head(rektoridNoored)
##              Nimi Synniaeg Ametialgus vanus_ameti_algul vana_vs_noor
## 1     Jüri Kärner     1940       1988                48         noor
## 2 Peeter Tulviste     1945       1993                48         noor
## 3   Jaak Aaviksoo     1954       1998                44         noor
## 4      Alar Karis     1958       2007                49         noor

Kustutamine ja kopeerimine

Aeg-ajalt võib juhtuda, et anname käsu, mis kirjutab üle kogu varasema töö või on tulemuseks vigane tunnus. Skriptifailide kasutajad saavad sellest probleemist kiiresti üle, lastes skriptil kõik operatsioonid kuni vigase kohani uuesti teha. Siiski on vaja teinekord objektist või tunnusest duplikaati luua:

rektoridKoopia <- rektorid #loome rektorite tabelist koopia
head(rektoridKoopia)
##              Nimi Synniaeg Ametialgus vanus_ameti_algul vana_vs_noor
## 1     Jüri Kärner     1940       1988                48         noor
## 2 Peeter Tulviste     1945       1993                48         noor
## 3   Jaak Aaviksoo     1954       1998                44         noor
## 4      Alar Karis     1958       2007                49         noor
## 5      Volli Kalm     1953       2012                59         vana
## 6    Toomas Asser     1954       2018                64         vana
rektorid$Nimi2 <- rektorid$Nimi # loome tunnusest koopia
head(rektorid)
##              Nimi Synniaeg Ametialgus vanus_ameti_algul vana_vs_noor
## 1     Jüri Kärner     1940       1988                48         noor
## 2 Peeter Tulviste     1945       1993                48         noor
## 3   Jaak Aaviksoo     1954       1998                44         noor
## 4      Alar Karis     1958       2007                49         noor
## 5      Volli Kalm     1953       2012                59         vana
## 6    Toomas Asser     1954       2018                64         vana
##             Nimi2
## 1     Jüri Kärner
## 2 Peeter Tulviste
## 3   Jaak Aaviksoo
## 4      Alar Karis
## 5      Volli Kalm
## 6    Toomas Asser

Kustutamine tähendab seda, et omistame objektile või selle liikmele väärtuse NULL:

rektoridKoopia <- NULL # kustutab objekti, tegelikult jääb objekt küll alles, aga see on tühi (väärtus on 0)
rektorid$Nimi2 <- NULL # kustutab tunnuse

Andmete struktuuri muutmine

Nii mõnigi kord tuleb ette vajadus tabeli pööramise järele. Selleks tuleks enne tunnuste (tulbad) nimede kõrval ka vaatluste (read) nimed defineerida:

row.names(rektorid) <- rektorid$Nimi
rektorid_t <- as.data.frame(t(rektorid))
head(rektorid_t) # kui tabel "ilusasti" ära ei mahu, siis "murtakse" seda, et ikka kõik ära mahuks. Tundub, et nimed on topelt? See tuleneb asjaolust, et määratakse nimede veeru rida nimedeks, aga ei kustutatud seda veergu ära.
##                   Jüri Kärner Peeter Tulviste Jaak Aaviksoo Alar Karis
## Nimi              Jüri Kärner Peeter Tulviste Jaak Aaviksoo Alar Karis
## Synniaeg                 1940            1945          1954       1958
## Ametialgus               1988            1993          1998       2007
## vanus_ameti_algul          48              48            44         49
## vana_vs_noor             noor            noor          noor       noor
##                   Volli Kalm Toomas Asser
## Nimi              Volli Kalm Toomas Asser
## Synniaeg                1953         1954
## Ametialgus              2012         2018
## vanus_ameti_algul         59           64
## vana_vs_noor            vana         vana

reshape ja reshape2 on analüüsipaketid, mis võimaldavad andmetabeleid sobivale kujule viia (Analüüsipaketi käivitamise eelduseks on, et see on ikka paigaldatud!). Enamasti läheb sealt vaja kahte käsku:

melt() # teisendab andmed laiast formaadist pikka

cast() # teisendab andmed pikast formaadist laia, eelduseks on tabelis tunnuse value olemasolu, mida hakatakse ümber paigutama.

Selle näite paremaks demonstreerimiseks tõmbame endale Tartu kuu keskmiste õhutemperatuuride andmetabeli:
(http://aasa.ut.ee/statistika/tartu_temp2.csv)

tartu_temp2  <- read.csv("http://aasa.ut.ee/statistika/tartu_temp2.csv", sep=";")
tartu_temp2[1:3, 1:5] # vaatame tabeli esimest 3 rida ja 5 veergu
##   aasta    X1   X2   X3  X4
## 1  1866  -1.1 -8.1 -4.1 3.4
## 2  1867 -11.3 -5.5 -7.3 0.5
## 3  1868 -11.1 -6.6 -1.1 3.7

Näeme, et tunnuste nimi ei saa alata numbriga (‘X’ pannakse automaatselt tunnuse nime alguseks).

library(reshape2) #käivitame analüüsipaki "reshape2"
tartu_temp2_m <- melt(tartu_temp2, id=c("aasta")) # muudame tabeli "laiast" formaadist "pikaks"
head(tartu_temp2_m) # Vaatame taas tulemust
##   aasta variable value
## 1  1866       X1  -1.1
## 2  1867       X1 -11.3
## 3  1868       X1 -11.1
## 4  1869       X1  -8.6
## 5  1870       X1  -5.2
## 6  1871       X1  -8.4

Kuna tahame luua kuupäevaveergu, siis tuleks ‘X’-idest vabaneda:

tartu_temp2_m$kuu <- gsub("X", "", tartu_temp2_m$variable) # asendame 'X'-i mitte millegagi, st eemaldame ta lihtsalt stringist. Vt käsu 'gsub' parameetreid: '?gsub'
tartu_temp2_m$kuu <- as.numeric(tartu_temp2_m$kuu) # muudame andmetüübi numbriks, vaikimisi tekkis faktor (tekst)
tartu_temp2_m$date <- paste(tartu_temp2_m$aasta, tartu_temp2_m$kuu, "1", sep="-") # tekitame tunnuse kuupäev. Selleks ühendame tunnused 'aasta' ja 'kuu', päevaks on 1. NB formaat peab olema 'yyyy-mm-dd'!
tartu_temp2_m$date <- as.Date(tartu_temp2_m$date) # muudame tunnusetüübi kuupäevaks
library(ggplot2) #käivitame jooniste paketi 
#Kasutan siin nn "ridade murdmist"", et loetavust parandada, tegelikult on tegemist ühe käsuga

ggplot() +
  theme_bw() + 
  geom_line(data=tartu_temp2_m, aes(x=date, y=value, colour=value))+ 
  geom_smooth(data=tartu_temp2_m, aes(x=(date), y=value), method="lm", se=F, colour="black") + 
  scale_colour_gradient2(high="orange", low="dodgerblue", mid="grey95") # teeme graafiku
## `geom_smooth()` using formula 'y ~ x'

Graafikute loomisegaga tutvume hiljem, aga siin näeme, et tulemuseks on lihtne graafik, kus temperatuuri joon on värvitud vastavalt väärtusele. Lineaarne trend näitab kerget temperatuuri tõusu. Et väita, kas see trend ka kindlale soojenemisele viitab, tuleb asja uurida statistiliste meetoditega.

Skriptid

Ei ole harvad juhused, kui peame tegema korduvalt samu operatsioone erinevatel objektidel, teinekord jälle tahame jagada kolleegiga, kuidas täpselt konkreetne analüüüs läbi viidi. Ilmselt aga kõige sagedamini tahame säilitada analüüsi käiku (ja seda hiljem vajadusel korrigeerida) meie ise. Klassikalise graafilise kasutajaliidesega tarkvara puhul on see tihti tüütu ja ajamahukas tegevus. R-i puhul saame aga kasutusele võtta skriptid. Kõige lihtsamas tähenduses on R-i skriptid lihtsalt tekstifailid, mis sisaldavad (peaaegu) täpselt samu käske, mida sisestati käsureale. Vaatame ühte skripti näidet. Internetis on näidis, salvestage (Save As) ja avage see RStudio keskkonnas: (http://aasa.ut.ee/statistika/skript.R)
Käituge vastavalt seal antud juhistele.
Varem antud käsud on näha “History” aknas. Ka sealt on võimalik käske skriptifaili saata, valides soovitud rea(d) ja lüües SHIFT+ENTER.


Juhendi koostanud Anto Aasa (tuginetud on Krista Lõhmuse varasematele analoogsetele juhenditele)
Juhendit on täiendanud Mikk Espenberg
Juhend Internetis: http://aasa.ut.ee/statistika/
Õppeaine: LOOM.02.153 / Statistilise andmetöötluse praktikum
Viimati täiendatud: 2021-10-15