Enne kui asuda keerukate statistiliste analüüside kallale, tasub tutvuda andmestikuga graafikute abil. Alati on kasulik andmetest pilt luua ning alles siis hakata keerukamate vahenditega neid analüüsima ja interpreteerima.
Tänapäeva tarkvara ja arvutid annavad võimaluse luua väga keerulisi ja kirevaid jooniseid. Siiski tuleks meeles pidada, et graafikud pole enda välja elamise koht, vaid informatsiooni esitamise moodus. Nii et unustagem 3-D efektid ja efektsed värvimustrid!
Kuigi statistikaga valetatakse palju, ei tohi seda teha teadustöödes. Andmete auditooriumile esitamise viis võib luua väga erineva sõnumi. Näiteks:
Kuigi loodud graafikud põhinevad samadel andmetel ja näitavad justkui sama asja, võib vaatajal jääda vasakpoolse graafiku põhjal mulje, et praeguse rektori ametisse astumise vanus oli väga suur ja varasematel jällegi väga väike. Parempoolne (korrektsem!) joonis seevastu nii suurte erinevuste muljet ei jäta.
Nii nagu tegevustega igapäevaelus, nii on ka R-is võimalik graafikuid koostada mitmel erineval viisil. Suur osa kasutajatest on rahul R-i baaspaketis sisalduva graafika võimalusega. Paljud tahavad siiski rohkemat. Käesoleva aine raames kasutame graafikute loomiseks paketi ggplot2 abi.
Geograaf teab väga hästi andmekihtide kasutamise loogikat GIS-i kaudu. Samal põhimõttel toimib ka ggplot2: erinevad joonise elemendid asuvad erinevatel kihtidel, neil on kindel järjekord ja neid saab kõiki eraldi kontrollida. Järgnevalt on esitatud näide, kus vasakult paremale vaadates muudetakse joonisel järjest uusi kihte nähtavaks:
Nii on vasakpoolsel joonisel näidatud ainult telgi ja abijooni, keskmisele on lisatud andmepunktid ja vasakule tekstid. Kõiki neid erinevaid visuaalseid elemente nimetatakse geom-ideks. Nii tuleb uut kihti luues defineerida, mis tüüpi geom-iga on tegemist. Neil geom’idel on ka esteetilised omadused, mida defineeritakse käsuga aes() (värv, kuju, stiil, asukoht jne). Esteetikat on võimalik määrata kogu graafiku kohta ühetaoliselt ja korraga või iga kihi kohta eraldi.
On suur hulk erinevaid geom-funktsioone, mis määravad, milliseid geomeetrilisi objekte kihile kantakse. Järgnevalt on toodud ära mõned tavalisemad:
Põhjaliku õpetuse ggplot2 kasutamiseks leiab siit
Kompaktne funktsionaalsuse ülevaade on siin
Jooniste koostamise üldine loogika:
ggplot() + geom_nimi(data=tabelinimi, aes(x=x-telje.tunnus, y=y-telje.tunnus)) # kui värv määratakse tunnuse alusel, siis defineeritakse seda aes() sees colour=tunnusenimi, kui värv defineeritakse üldisena kogu kihi jaoks, siis väljaspool aes() sulgusid colour=“red”
Tuletame meelde, et meil on olemas Tartu kuu keskmiste õhutemperatuuride fail (vt eelmine praktikum, vajadusel avage uuesti):
tartu_temp <- read.csv("http://aasa.ut.ee/statistika/tartu_temp.csv", sep=";", dec=".")
str(tartu_temp)
## 'data.frame': 142 obs. of 13 variables:
## $ aasta: int 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 ...
## $ I : num -1.1 -11.3 -11.1 -8.6 -5.2 -8.4 -3.8 -3.3 -1.7 -12.5 ...
## $ II : num -8.1 -5.5 -6.6 -1.9 -12.3 -17.6 -7.6 -8 -4.9 -7.5 ...
## $ III : num -4.1 -7.3 -1.1 -0.3 -4 0.4 -2.2 -2.2 -3.1 -6.2 ...
## $ IV : num 3.4 0.5 3.7 5.4 4.9 1.1 5.8 1.3 2.6 -0.3 ...
## $ V : num 8.3 3.8 10.4 10.3 8.4 6.6 13.6 9.4 6.8 10.4 ...
## $ VI : num 16.3 14.1 15.1 13.7 14.7 14.3 17.7 17.2 14.1 16.1 ...
## $ VII : num 15.8 16.6 19.4 16.7 17.7 18.4 17.1 18.7 16.8 18.4 ...
## $ VIII : num 16.1 15.1 19.5 16 14.8 15.6 16 15.6 14.3 15 ...
## $ IX : num 14.1 9.1 11 11.2 10 8.2 10.1 11.9 11.6 9.1 ...
## $ X : num 3.8 6.5 6.5 4.9 3.7 3 7.4 6.9 8.3 1.4 ...
## $ XI : num -1.9 -2.8 -3.3 -1.5 1.3 2.2 1.9 -0.1 -0.2 -3.8 ...
## $ XII : num -4.7 -9.7 -2.4 -2.5 -13.2 -4.4 -4.7 -1.6 -5.7 -11.2 ...
Iga kuu keskmine õhtutemperatuur vastaval aastal on tabelis eraldi tunnusena ja tähistatud rooma numbritega. Teeme lihtsa graafiku, kus on jaanuari temperatuur punktidena:
library(ggplot2)
ggplot() +
geom_point(data=tartu_temp, aes(x=aasta, y=I))
või punase joonega:
ggplot() +
geom_line(data=tartu_temp, aes(x=aasta, y=I), colour="red") # punaseks värvimise käsk kehtib kogu kihi kohta üldiselt!
või mitme kuu kohta:
ggplot() +
geom_line(data=tartu_temp, aes(x=aasta, y=I), colour="red") +
geom_line(data=tartu_temp, aes(x=aasta, y=II), colour="blue")
Kui tahame näidata kõiki kuid ühel joonisel, on lihtsam kasutada eelmises praktikumis loodud tabelit tartu_temp2_m, mis sisaldab samu andmeid nö pikal kujul:
tartu_temp2_m <- read.csv("http://aasa.ut.ee/statistika/tartu_temp2_m.csv", sep=",", dec=".") # kui on "kadunud" tõmbame uuesti R-i"
str(tartu_temp2_m)
## 'data.frame': 1704 obs. of 6 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ aasta : int 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 ...
## $ variable: chr "X1" "X1" "X1" "X1" ...
## $ value : num -1.1 -11.3 -11.1 -8.6 -5.2 -8.4 -3.8 -3.3 -1.7 -12.5 ...
## $ kuu : int 1 1 1 1 1 1 1 1 1 1 ...
## $ date : chr "1866-01-01" "1867-01-01" "1868-01-01" "1869-01-01" ...
Teeme joongraafiku ja asetame sinna peale lineaarsete trendide kihi. Aga seekord defineerime selle joonise objektiks:
joonis <- ggplot() + geom_line(data=tartu_temp2_m, aes(x=aasta, y=value, colour=variable))+ geom_smooth(data=tartu_temp2_m, aes(x=aasta, y=value, colour=variable), method="lm", se=FALSE) # meetodiks on lineaarne trend ja standardvea (se) kuvamine on keelatud.
Midagi ei juhtunud?! Kui graafik on defineeritud objektina, tuleb selle kuvamiseks eraldi käsk anda (ehk siis kirjutada graafiku nimi):
joonis
## `geom_smooth()` using formula 'y ~ x'
Kindlasti tasuks mõtiskleda (ja aru saada), miks oli mõistlikum just seda tabelit (nö pikas formaadis) kasutada. Terav silm peaks kohe märkama, et kuude numbrid legendis pole korrektses formaadis ja järjekorras…
Karp-vurrud diagramm: näitame Tartu õhutemperatuuri aastast varieeruvust karp-vurrud diagrammiga:
ggplot() +
geom_boxplot(data=tartu_temp2_m, aes(y=value, x=as.factor(kuu)))+
labs(x="kuu") # siin on kasutatud koodi esitamisel nö murdmist, st kood on mitmel real, igal real omaette element. Selline kirjaviis lihtsustab oluliselt koodi lugemist.
Loodud karpdiagrammi tuleb lugeda järgmiselt: “karbi” keskjoon näitab mediaani, karbi ülemine ja alumine serv märgib 75% ja 25% protsentiile (1. ja 3. kvartiili), püstjoonte äärmusotsad (vuntsid) markeerivad väljaspoole kvartiilihaaret x 1,5 jäävaid vaatlusi, mida nimetatakse erinditeks (outlier). (Kvartiilihaare on inglise keeles Interquartile range, IQR)
Histogramm: Oletame, et tahame näha kõikide kuu keskmiste õhutemperatuuride jaotust histogrammil:
ggplot() + geom_histogram(data=tartu_temp2_m, aes(x=value), fill="green", alpha=0.5) # pangem tähele, et 'alpha' võimaldab defineerida läibipaistvust!
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Density plot (tihedusfunktsioon tuumameetodil): teeme temperatuuride jaotuse võrdluse kuude lõikes:
ggplot() + geom_density(data=tartu_temp2_m, aes(x=value, fill=as.factor(kuu)), alpha=0.25) + geom_density(data=tartu_temp2_m, aes(x=value, colour=as.factor(kuu)), alpha=0.5) + labs(colour="Kuu", x="Õhutemperatuur") + guides(fill=FALSE) + guides(col = guide_legend(nrow = 6))# värvide läbipaistvusega mängimiseks tegime kaks peaaegu identset kihti! Lisaks ütlesime, et värvi legendi peakiri on "Kuu", x-telje pealkiri on "Õhutemperatuur" ja tihedusjaotuse pinna legendi ei näidata, kuid legendis pannakse kuud kahte tulpa)
Tekst’i kasutamine: Mõnikord tekib tahtmine kasutada andmepunktide asemel tekstina välja kirjutatud väärtuseid:
tartu_temp$mean <- rowMeans(tartu_temp[2:13]) # arvutame käsuga 'rowMeans' uue tunnuse 'mean', kasutame selleks veerge 2-13
ggplot() + geom_text(data=tartu_temp, aes(x=aasta, y=mean, size=mean, colour=mean, label=round(mean, 1))) # teksti suurust ja värve määratakse tunnuse 'mean' alusel, kuvamiseks ümardatakse väärtus 1 komakohani 'round(tunnus, komakohti)'
Keskväärtuste graafik: Loome graafiku, kuhu arvutatakse kuu keskmised õhutemperatuurid. Graafikule saab kanda ka andmetest arvutatavaid väärtuseid. Selleks võib ühe variandina kasutada käsku stat_summary (https://ggplot2.tidyverse.org/reference/stat_summary.html).
ggplot() + stat_summary(data=tartu_temp2_m, aes(x=kuu, y=value), fun.data = "mean_cl_boot", colour = "red") + scale_x_continuous(breaks=c(1:12)) # käsu lõppu kirjutame, et x-teljel tuleks näidata ikka kõiki numbreid (kuid).
Ilmselt on jooniste vaatamisest ainult R-i aknas vähe rõõmu ning tegelikult peaks need sealt kuidagi presentatsioonidesse - tekstidokumentidesse viima. Selleks on RStudio’s võimalik kasutada Export nuppu. Loomulikult saab seda teha ka konsooli aknast:
jpeg("joonis.jpg", height=4, width=6, res=400, unit='in') # defineerime joonise väljundparameetrid
ggplot() + stat_summary(data=tartu_temp2_m, aes(x=kuu, y=value), fun.data = "mean_cl_boot", colour = "red") # defineerime joonise sisu
dev.off() # lõpetame joonise pildifaili kirjutamise
## png
## 2
Joonis kirjutatakse töökeskkonna kataloogi. Aktiivse kataloogi asukohta sai meelde tuletada käsuga:
getwd()
Mac’i kasutajatel tasub meeles pidada, et neil jpeg ei toimi ja selle asemel võiks kasutada png faile. Loomulikult saab selliselt eksportida jooniseid ka pdf või tiff-formaati.
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: 2020-10-18