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.
Ü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 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-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
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.
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)
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.
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
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.
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
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
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.
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