load("joonised.RData")

Joonised paketiga ggplot2

Jooniste tegemiseks on R’is eraldi pakett nimega ggplot2. See on populaarne R’i pakett, mis võimaldab vähese vaevaga teha ilusaid jooniseid. Selles paketis on kaks funktsiooni jooniste tegemiseks: ggplot() ja qplot(). Soovitan kasutada funktsiooni ggplot(), sest see on paindlikum ja võimaldab erinevaid andmestikke ühele joonisele lisada.

Ülevaade paketi võimalustest - http://docs.ggplot2.org/current/

Esmalt tutvustame funktsiooni ggplot() struktuuri. Nagu kõikide R’i funktsioonide puhul tuleb tutvuda funktsioonile antavate argumentide järjekorra ja sisuga.

library(ggplot2)# esmalt aktiveerime paketi. NB! pakett peab olema enne installeeritud
ggplot(andmed, aes(x = tunnus1, y = tunnus2)) #See on struktuur, mida saate alati joonise tegemisel kasutada.

Sellisel kujul me veel ei näe joonist. Joonise ehitamine ggplot() funktsiooniga toimub kihtide alusel. Me peame lisama kihi, mis loob x ja y elementidest vastava struktuuri (sõltub sellest kas tahame tunnuseid näha punktidena, tulpadena, ühendatud joontega jne.). Tulpade joonistamiseks peaksime lisama geom_bar():

ggplot(andmed, aes(x = tunnus1, y = tunnus2)) +
        geom_bar()

Histogramm

Numbriliste tunnuste puhul soovime sageli uurida, milline on tunnuse väärtuste jaotus. Näiteks et teada saada, kas tunnus on enam-vähem normaaljaotusega või kas esineb üksikuid, teistest äärmuslikult eristuvaid väärtusi. Sellisel juhul on abi tunnuse histogrammist, mille R-is saab funktsiooni hist abil. Ülalpool lugesime sisse faili PISA2009.sav ja paigutasime andmed tabelisse nimega pisa. Andmestikus sisaldab PISA uuringu andedmeid, milles uuritakse põhikooliealiste õpilaste sooritust kolmes valdkonnas: lugemine (skoor muutujas nimega PV1READ), matemaatika (PV1MATH) ja loodusteadused (PV1SCI ). Teeme histogrammi lugemise alatesti skooride jaotuse kohta.

ggplot(pisa, aes(x=PV1READ))+
        geom_histogram()

Histogrammi välimuse muutmiseks saab funktsioonile lisada erinevaid argumente. Sagedamini kasutatavad neist on:

  • labs() - võimaldab muuta joonise pealkirja, x-ja y-telje nimesid (labs(title= “jooniuse pealkiri”, x = “x-telje nimi”, y = “y-telje nimi”)).
  • xlim() - horisontaaltelje otspunktide väärtused. Otspunktide väärtused tuleb anda funktsiooni c() sees, nt nii: xlim(c(100, 800))
  • ylim() - vertikaaltelje otspunktide väärtused, samal kujul nagu argument xlim.
  • col - tulpade värv. See argument lisatakse tavaliselt joonise struktuuri täpsustava kihi juurde (näiteks geom_histogram(col = “blue”, fill = “green”)). Värvi väärtuse saab määrata mitut moodi. Lihtsama värvi saab kirjutada ingliskeele nimetusega, nt “grey”, “red”, “blue”. Peenemaid värvitoone saab muuhulgas värvi heksadetsimaal koodi abil (nt #FF0000 on punase värvi kood). Värvide koodide teada saamiseks guugeldage hexadecimal color codes.
  • vormide kasutamine - joonisele saab lisada juba eelnevalt seadistatud vormi, mis kujundab joonise välimust. Näiteks argument theme_bw() annab joonisele valge tausta. Mõned klassikalised vormid - https://www.r-bloggers.com/ggplot2-themes-examples/.

Kui sooviksime teha ülalolevat histogrammi natuke ilusamaks, võiks kood välja näha näiteks selline:

ggplot(pisa, aes(x=PV1READ))+
        geom_histogram(col = "blue", fill = "gray")+
        labs(title = "Lugemise alatesti skooride jaotus", x ="Alatesti skoor" , y = "Sagedus")

Koodilugemise lihtsuse huvides on ülalolevas koodijupis argumendid paigutatud eraldi ridadele, aga samahästi võib kõik argumendid ka ühele reale kirjutada. (Mitmerealise koodijupi konsoolile saatmiseks tuli read hiirega siniseks teha ja seejärel vajutada Run-nuppu või Ctrl+Enter klahvikombinatisooni) Joonist saab suuremal kujul vaadata vajutades RStudio Plots-paneelil nuppu Zoom ning pildifailina salvestada vajutades kõrvalasuvat nuppu Export ja valides avanevast menüüst Save as Image.

Tulpdiagramm (barplot)

Histogrammi analoog kategooriatest koosneva tunnuse jaoks on tulpdiagramm, mille saab R-is funktsiooni barplot abil. Funktsioonile barplot tuleks ette anda kategoriaalse tunnuse sagedustabel, mille sai funktsiooni table abil. Andmestiku pisa tulbas nimega GR (grade) on kirjas mitmendas klassis õpilane käib. Teeme selle tunnuse kohta tulpdiagrammi:

ggplot(pisa, aes(GR))+
        geom_bar()+
        labs(x ="klass" , y = "õpilasi valimis")+
        theme_bw()

Enamik antud valimis olevatest õpilastest käivad 8. või 9. klassis, aga üksikud ka seitsmendas. Väikese kategooriate arvu korral (nagu praegu) tulpdiagramm sagedustabelile midagi erilist juurde ei anna, aga suurema gruppide arvu korral on jooniselt kergem infot lugeda ja teistest eristuvaid gruppe kindlaks teha. Tulpdiagramm võib marjaks ära kuluda ka siis, kui soovime jagada mingi numbrilise tunnuse kategooriatest koosneva tunnuse abil gruppideks ja võrrelda neid gruppe näiteks keskmise, mediaani või standardhälbe osas. Gruppide kaupa kirjeldava statistika näitaja saame kätte funktsiooni tapply abil.
Funktsiooni tapply argumentideks on 1) numbriline tunnus, 2) grupeeriv tunnus, 3) kirjeldava statistika funktsiooni nimetus (nt mean, median, sd), 4) na.rm=TRUE juhul kui andmetes esineb puuduvaid väärtusi.

tapply(sõltuv tunnus, grupeeriv tunnus, kasutatav funktsioon)
tapply(pisa$PV1MATH, pisa$GR, mean, na.rm=TRUE)
##        7        8        9 
## 359.4100 485.1533 517.5558

Funktsiooniga ggplot() saame neid tulemusi suurema vaevata ka graafiliselt kujutada:

ggplot(pisa, aes(y=PV1MATH, x = GR))+
        geom_bar(aes(group = GR), stat = "summary", fun.y = "mean") +
        labs(x ="klass" , y = "matemaatika alatesti keskmine skoor")

Karpdiagramm (boxplot)

Gruppide võrdlemisel osutub kasulikuks ka karpdiagramm. Selle saame R-is funktsiooni boxplot abil, millele anname valemi kujul numbriline tunnus ~ grupeeriv tunnus. Võtame numbriliseks tunnuseks matemaatika alatesti skoori ja grupeerivaks tunnuseks klassi.

ggplot(pisa, aes(y = PV1MATH, x = as.factor(GR)))+
        geom_boxplot()+
        labs(x = "klass", y = "matemaatika alatesti skoor")

Mida karpdiagrmmi osad tähistavad? Karbi keskel olev joon on grupi mediaanväärtus (pooled väärtused on sellest suuremad ja pooled väiksemad). Karp ise tähistab kvartiilhaaret ehk keskmist 50% väärtustest. Juhul kui eraldi punktidena välja toodud äärmuslikke väärtusi ei esine, tähistavad vuntsid vastavalt grupi kõige suuremat ja kõige väiksemat väärtust. äärmuslike erindite erinemise korral tähistab vunts kõige suuremat/väiksemat “mõistlikku” väärtust (st viimane andmepunkt, mis jääb karbi servast mitte rohkem kui 1,5-kordse kvartiilhaarde võrra üles- või allapoole). Kuidas gruppidevahelisi erinevusi tõlgendada? Kui kahe grupi karbid omavahel ei kattu, võib üsna julgelt öelda, et need grupid erinevad vaadeldava tunnuse osas. Kui karbid kattuvad ja mõlema grupi puhul jääb mediaan teise grupi karbi sisse, võib öelda et grupid ei erine tunnuse osas. Kui karbid kattuvad, aga vähemalt ühe grupi mediaan jääb väljapoole teise grupi karpi, võib aga ei pruugi oluline seos esineda. Sellisel juhul tuleks erinevust täpsemalt uurida mõne muu meetodiga nt t-testi või ANOVA-ga. Lisaks gruppidevahelistele erinevustele aitab karpdiagramm gruppide siseselt aimu saada ka jaotuse sümmeetrilisuse kohta. Kui karbi mediaanist ülespoole jääv osa on suurem kui allapoole jääv osa või üks vunts suurem kui teine, ei ole tunnus päris sümmeetiriliselt jaotunud.

Hajuvusdiagramm (scatterplot)

Kahe pideva jaotusega numbrilise tunnuse vahelist seost kujutava hajuvusdiagrammi saame funktsiooni plot abil. Lisaks seose olemuse iseloomustamisele aitab hajuvusdiagramm kindlaks teha, kas nende kahe muutuja puhul esineb üksikjuhtumeid, mis teistest väga selgelt eristuvad ja seeläbi meie analüüside tulemusi tugevalt mõjutada võivad. Teeme hajuvusdiagrammi kasutades matemaatika ja loodusteaduste alatesti skoore.

ggplot(pisa, aes(x= PV1MATH, y = PV1SCIE))+
        geom_point()

Vaikimisi tähistavad hajuvusdiagrammil andmepunkte mustad punktid. Nende kuju saame muuta kui lisame kihile geom_smooth arugmendi shape = …. Selle argumendi väärtus määrab nende punktide kuju:

Joonis 2. Argumendis shape väärtused

Joonis 2. Argumendis shape väärtused

Vahel soovime hajuvusdiagrammile lisada muutujatevahelise seose tugevust ja suunda näitava regressioonisirge. Seda saab teha, kui lisada uus kiht nimega geom_smooth(), argumendiks anname method = lm:

ggplot(pisa, aes(x= PV1MATH, y = PV1SCIE))+
    geom_point(shape=1) +    # shape = 1 - tühjad ringid
    geom_smooth(method=lm,   # lisab regressioonisirge
                se=FALSE)    # SE = FALSE - ei lisa usalduspiire

Näited

  1. Histogramm matemaatika alatesti tulemuste kohta:
ggplot(pisa, aes(PV1MATH))+
        geom_histogram(col = "blue", fill = "gray")+
        labs(title = "Mamtemaatika tulemused")

  1. Karpdiagramm meeste ja naiste matemaatika alatestide skooride kohta:
ggplot(pisa, aes(x = as.factor(Gender), y = PV1MATH))+ #kui joonis ei tee eraldi tulpasi, siis tuleb lisada kategoriseerivale tunnusele funtksioon as.factor()
        geom_boxplot(fill = "grey80", colour = "#3366FF")+ #värvisin karpide sisu hallikaks ja karpide ääre siniseks
        scale_x_discrete(labels = c("tüdrukud", "poisid"))+
        labs(x = "sugu", y = "matemaatika tulemused")+
        theme_classic() #lisasin juba töödeldud vormi joonisele

  1. Matemaatika ja lugemise alatestide tulemuste seos (regressioonisirgega):
ggplot(pisa, aes(x= PV1MATH, y = PV1READ))+
    geom_point(shape=1) +    # shape = 1 - tühjad ringid
    geom_smooth(method=lm, se=TRUE)    # lisab regressioonisirge, se = TRUE - lisab usalduspiire

  1. Lugemise ja loodusteaduste alatestide tulemuste seos (regressioonisirgega):
ggplot(pisa, aes(x= PV1READ, y = PV1SCIE))+
        geom_point(shape=1) +    # shape = 1 - tühjad ringid
        geom_smooth(method=lm, se=TRUE) +   # lisab regressioonisirge, se = TRUE - lisab usalduspiire
        theme_classic() 

  1. Tulpdiagramm erinevate klasside lugemise alatesti skooride kohta:
ggplot(pisa, aes(y=PV1READ, x = GR))+
        geom_bar(aes(group = GR), stat = "summary", fun.y = "mean") +
        labs(x ="klass" , y = "lugemise alatesti keskmine skoor")

#kontrollime funktsiooniga tapply() kas saime joonisele õiged tulemused:
tapply(pisa$PV1READ, pisa$GR, mean, na.rm =TRUE)
##        7        8        9 
## 350.5693 466.1382 505.2515
  1. Histogramm naiste ja meeste matemaatika alatesti tulemuste kohta:
#Selle ülesande lahendamiseks on mitu võimalust. 
# Esiteks saate teha uued andmestikud funktsiooniga subset ja kasutada neid andmestikke jooniste koostamisel:
pisa_tydrukud <- subset(pisa, Gender == 1)
pisa_poisid <- subset(pisa, Gender == 2)

# Teiseks saate kasutada ka joonise koostamise ajal funktsiooni subset:
ggplot(subset(pisa, Gender == 1), aes(x=PV1MATH))+
        geom_histogram()+
        labs(tilte ="Tüdrukute tulemused")

ggplot(subset(pisa, Gender == 2), aes(x=PV1MATH))+
        geom_histogram()+
        labs(tilte ="Poiste tulemused")

#Kolmandaks saate kasutada ggplot'i kihti nimega facet_wrap()
ggplot(pisa, aes(x=PV1MATH))+
        geom_histogram()+
        facet_wrap(~Gender)#selle kihiga saab lisada kategoriseeriva tunnuse joonisele