Eelmise praktikumi teemad:
Tänased teemad:
1. Arvuliste andmete kirjeldamine ja visualiseerimine (2)
2. Kategoriaalsete andmete kirjeldamine ja visualiseerimine
Kasutame andmestikku kysimustik_2020.RData
, mis sisaldab ka mõnd 2020. aastal kursusel osaleja vastust.
Kõige populaarsema väärtuse sageduse saame leida funktsiooniga max()
, kõige ebapopulaarsema väärtuse sageduse funktsiooniga min()
.
Kõige populaarsema väärtuse enda ehk moodi indeksi saame leida funktsiooniga which.max()
ning kõige ebapopulaarsema väärtuse indeksi funktsiooniga which.min()
.
which.max(t.ope) # moodi indeks
which.min(t.ope)
names(t.ope[which.max(t.ope)]) # mood
names(t.ope[which.min(t.ope)])
Sellele kursusele tulijad on kõige tüüpilisemalt käinud ülikoolis 4 aastat (või käivad 4. aastat?) ehk on tõenäoliselt magistrandid.
Tunnusel võib olla ka mitu moodi või hoopis mitte ühtegi moodi.
Mediaan on variatsioonirea keskmine: kui kõik vaatlused panna kasvavasse järjekorda, siis mediaan on keskmiseks jääv vaatlus (paarisarvu vaatluste korral kahe keskmise arvu aritmeetiline keskmine).
Plussid:
Miinused:
Kui mediaan on see keskmine punkt andmete jaotusest, millest nii suuremaid kui ka väiksemaid väärtusi on sama palju, siis samamoodi võib andmestikku vaadelda ka muudest punktidest. Need punktid, mis andmestikku sel viisil võrdseteks osadeks jagavad, on kvantiilid.
25%, 50% ja 75% kvantiile nimetatakse kvartiilideks selle järgi, et need jagavad andmestiku neljaks võrdseks osaks. Kvartiile kokku on 3. Mediaan on 50% kvantiil ehk 2. kvartiil.
Andmestikku võib jagada aga ka vähemateks või enamateks osadeks.
# Jaga andmestik kaheks võrdseks osaks
quantile(kysimustik$synniaasta,
probs = c(0, 1/2, 2/2))
# Jaga andmestik kolmeks võrdseks osaks
quantile(kysimustik$synniaasta,
probs = c(0, 1/3, 2/3, 3/3))
# Jaga andmestik seitsmeks võrdseks osaks
quantile(kysimustik$synniaasta,
probs = c(0, 1/7, 2/7, 3/7,
4/7, 5/7, 6/7, 7/7))
# Jaga andmestik kümneks võrdseks osaks
quantile(kysimustik$synniaasta,
probs = c(0, 1/10, 2/10, 3/10,
4/10, 5/10, 6/10, 7/10,
8/10, 9/10, 10/10))
1. ja 3. kvartiili (ehk 25% ja 75% kvantiili) vahe saab leida funktsiooniga IQR()
.
Haare on arvulise tunnuse maksimaalse ja minimaalse väärtuse vahe (max() - min()). See on mõjutatav erinditest ehk üldiste andmete suhtes mingis mõttes erandlikest vaatlustest. R-is väljastab haarde funktsioon range()
vaid suurima ja vähima väärtuse, mitte nende vahe.
Standardhälve iseloomustab vaatluste mingi arvulise tunnuse hajuvust selle tunnuse keskmise väärtuse ümber. Väike standardhälve näitab, et tunnuse väärtused on keskmisele üldiselt üsna sarnased, suur standardhälve näitab, et väärtuste erinevus keskmisest on suur (nt haare on hästi suur). Standardhälbe funktsioon R-is on sd()
(standard deviation).
sd(kysimustik$synniaasta)
# Kuidas selleni jõutakse?
# Loeme kokku, kui palju vaatlusi on
(vaatlusi <- length(kysimustik$synniaasta))
# Vaatame kõiki sünniaasta väärtusi
kysimustik$synniaasta
# Leiame sünniaastate keskmise
(keskmine <- mean(kysimustik$synniaasta))
# Lahutame igast väärtusest keskmise
# (leiame iga üksiku vaatluse erinevuse
# keskmisest ehk hälbe)
(erinevused <- kysimustik$synniaasta - keskmine)
# Võtame need erinevused ruutu
(erinevuste_ruut <- erinevused^2)
# Leiame nende erinevuste ruutude summa
(ruutude_summa <- sum(erinevuste_ruut))
# Korrutame erinevuste ruutude summa
# läbi jagatisega, kus 1 on jagatud
# vaatluste arvust ühe võrra väiksema
# arvuga.
# See ongi tegelikult dispersioon ehk
# tunnuse hajuvus.
(dispersioon <- ruutude_summa/(vaatlusi-1))
# See on sama, mis
var(kysimustik$synniaasta) # dispersiooni funktsioon
# Standardhälve on ruutjuur dispersioonist
sqrt(dispersioon)
See, kas jagatises, millega ruutude summat korrutatakse, on nimetajas vaatluste arv või tuleb vaatluste arvust lahutada 1 (nagu meie näites), sõltub sellest, kas meil on tegu kõikse valimiga (st meie valim ammendab kõik võimalikud vaatlused) või mitte (meie valimis on juhuslik hulk kõikidest võimalikest). Kui meil oleks kõikide sellel kursusel osalenute vastused, siis võiksime öelda, et meil on kõikne valim (saame selle abil kirjeldada ära iga viimsegi kursusel osaleja), ent kuna meil kõikide vastuseid ei ole, siis peame eeldama, et meil on juhuslik väiksem valim üldisest populatsioonist.
Dispersioon ehk hajuvus on hälvete ruutude aritmeetiline keskmine ehk teisisõnu keskmine vaatluste erinevus keskmisest väärtusest. Mida suurem on dispersioon, seda suurem on hajuvus. Sagedamini raporteeritakse uurimustes standardhälvet, kuna ruutjuure võtmine võimaldab vaadelda hajuvust originaalühikutes (antud juhul nt aastates).
Karpdiagramm ehk kastdiagramm (boxplot) esitab arvulise tunnuse kvartiiljaotuse (vt Kvantiilid).
Paks joon on mediaan, kasti sisse jäävad vaatlused, mille väärtused langevad 25% ja 75% kvantiili (ehk vastavalt Q1 ja Q3) vahele, st kast sisaldab 50% kõikidest andmetest. Vurrud joonistatakse väärtuste juurde, mis jäävad kastist pooleteisekordse kvartiilivahe kaugusele. Kvartiilivahe on kasti ülemise ja alumise piiri väärtuste vahe. Ülemisel joonisel on kvartiilivahe 1994.5 (Q3 e 75% kvantiili) ja 1987.5 (Q1 e 25% kvantiili) vahe ehk 7 aastat, st kasti vasaku ja parema külje pikkus on 7. Pooleteisekordne kvartiilivahe on seega 7*1.5 ehk 10.5.
Ülemise vurru jaoks võetakse esimene andmestikus esinev väärtus, mis on väiksem kui Q3 + 1.5*IQR.
Alumise vurru jaoks võetakse esimene andmestikus esinev väärtus, mis on suurem kui Q1 - 1.5*IQR.
# Ülemine kvartiil e 75% kvantiil
Q3 <- quantile(kysimustik$synniaasta)[4]
# Alumine kvartiil e 25% kvantiil
Q1 <- quantile(kysimustik$synniaasta)[2]
# Ülemise vurru joonistamise alus
yl_vurr <- Q3 + 1.5*IQR(kysimustik$synniaasta)
# Alumise vurru joonistamise alus
al_vurr <- Q1 - 1.5*IQR(kysimustik$synniaasta)
sort(kysimustik$synniaasta)
# Ülemise vurru jaoks sobib seega 1996
# (sest see on vahetult esimene väärtus,
# mis on väiksem kui ülemise vurru alus).
sort(kysimustik$synniaasta[kysimustik$synniaasta < yl_vurr],
decreasing = TRUE)[1]
# Alumise vurru jaoks sobib 1978
# (sest see on vahetult esimene väärtus,
# mis on suurem kui alumise vurru alus).
sort(kysimustik$synniaasta[kysimustik$synniaasta > al_vurr],
decreasing = FALSE)[1]
Väärtused, mis vurrude vahele ei mahu, sest nad on teiste andmetega võrreldes erandlikult suured/väikesed, on erindid (outliers). Saame ka erindid kätte funktsioonist boxplot
.
# Salvestame kastdiagrammi eraldi objekti
b <- boxplot(kysimustik$synniaasta)
# Leiame erindid
b$out
Erindid võivad tekkida mõõtmis- või andmekogumisvigade tõttu, ent võivad olla ka osa andmestiku tõelisest varieeruvusest. Sellele, mida erinditega pihta hakata, on mitmesuguseid lähenemisi. Kuna väga suured erindid hakkavad oluliselt mõjutama mudelite hinnanguid parameetritele, mis on seotud aritmeetilise keskmisega, jäetakse need vahel lihtsalt analüüsist välja. Seda tehes võime aga eirata mingit erinditega seotud väärtuslikku informatsiooni. Teinekord kasutatakse hoopis tunnuse transformeerimist (nt logaritmimist), mis suuri erinevusi tasandaks. Mõnikord aga on mõistlik määrata erinditele hoopis mingi muu väärtus, nt aritmeetilise keskmise ja kahekordse standardhälbe summa või vahe.
Kast-vurrud diagramm sobib hästi rühmade võrdlemiseks. Näiteks vaatame vastajate sünniaastat vastavalt sellele, millise looma nad valisid.
Histogramm ehk astmikdiagramm sobib arvuliste andmete visualiseerimiseks ning esitab mingi tunnuse sageduste jaotumise teatud intervallide kaupa. R-is saab baasgraafika paketis kasutada funktsiooni hist()
.
Jooniselt näeme, et kõige enam (20) on neid tudengeid, kes on sündinud 90ndate esimesel poolel, ainult üks tudeng on sündinud vahemikus 1965-1970 ja üks 1970-1975. R arvestab piiripealsed väärtused enamasti sellele eelnenud klassi (nt aastal 1990 sündinud on klassis 1985-1990, mitte 1990-1995).
# Teeme 4 numbrivektorit
vec1 <- 1:10
vec2 <- 10:20
vec3 <- 10:21
vec4 <- 9:20
# Kuvame joonised 2 reas ja 2 tulbas
par(mfrow = c(2,2))
# Joonistame histogrammid
hist(vec1, main = "1:10 (11 elementi)")
hist(vec2, main = "10:20 (11 elementi)")
hist(vec3, main = "10:21 (12 elementi)")
hist(vec4, main = "9:20 (12 elementi)")
Funktsioonis saab erinevate argumentidega täpsustada mh ka seda, mitmes sagedusklassis andmed peaksid olema esitatud (R võtab seda siiski kui soovitust ning pakub selle põhjal enda lahenduse), klasside värvi jne.
Hajuvusdiagramm ehk X-Y diagramm (scatterplot) sobib paremini kahe arvulise tunnuse vaheliste seoste kujutamiseks. Kui plot()
funktsioonis anda argumendiks ainult üks vektor, joonistatakse väärtused y-teljele ning x-teljele vektori indeksid ehk järjekorranumbrid.
Rohkem kasutatakse hajuvusdiagramme kahe arvulise tunnuse seose kuvamiseks. Näiteks kas õppimisaeg ja sünniaeg on omavahel seotud?
plot(kaua_opid ~ synniaasta, # y ~ x
data = kysimustik,
col = "grey45",
pch = 15,
main = "Õpitud aastate seos sünniaastaga",
xlab = "Sünniaasta",
ylab = "Õpitud aastate arv")
# Tähistame nüüd veel eri värvidega
# need, kel on kvantitatiivsete
# meetoditega kogemust ja need,
# kellel ei ole.
plot(kaua_opid ~ synniaasta,
data = kysimustik,
pch = 15,
col = c("grey45", "orange")[kogemused_kvant],
main = "Õpitud aastate seos sünniaastaga",
xlab = "Sünniaasta",
ylab = "Õpitud aastate arv")
# Lisame ka legendi
legend("topright",
c("Ei", "Jah"),
fill = c("grey45", "orange"),
title = "Kogemusi kvantmeetoditega",
horiz = TRUE,
cex = 1)
Levshina 2015: 18
Meeldetuletuseks: kvalitatiivsed/kategoriaalsed tunnused on (sisuliselt) mittearvulised tunnused, mis jagunevad nominaalskaala ja ordinaal- ehk järjestusskaala tunnusteks. Sisuliselt mittearvulised tähendab siinjuures seda, et ehkki ka järjestusskaalat võib esitada arvuliste väärtuste abil (nt hinnanguskaala 1st 5ni), ei ole need enamasti käsitletavad päris arvuliste tunnustena. Näiteks ei arvutata üldiselt hinnanguskaalade keskmist, sest kuidas peaks täpselt tõlgendama keskmist 3.6, kui 3 tähistab skaalal “Nii ja naa” ja 4 “Pigem nõustun”? Samas on hinnangute arvuline käsitlemine võimalik juhul, kui vastajal näiteks lastakse vabalt määrata mingi sobiv väärtus skaalal, millel ainult algus- ja lõpp-punkti väärtused on määratletud. Samas peab ka sel juhul tulemuste tõlgendamisel alati arvestama sellega, kui laialt skaala on määratud (nt hakkab mängima rolli see, kas skaala on 1st 5ni või 1st 20ni).
Kategoriaalseid andmeid saab kirjeldada eelkõige sagedustabelite ja moodi abil, järjestusskaala tunnuste puhul saab teatavate mööndustega leida ka mediaani.
Vaatame korraks veel küsimustiku tunnuseid.
table()
_______________
Sagedustabeli saab teha funktsiooniga table()
. Kui kasutada funktsiooni table()
argumendina ainult üht tunnust, siis saame ühemõõtmelise sagedustabeli, milles esitatakse selle tunnuse tasemete esinemise sagedused.
Kui kasutame funktsioonis kaht argumenti, saame kahemõõtmelise sagedustabeli ehk risttabeli ehk jaotustabeli. See esitab kahe tunnuse ühisjaotuse.
prop.table()
_______________
Sagedustabeli põhjal võime leida ka suhtelised sagedused ehk osakaalud ehk proportsioonid, mida saab teisendada protsentideks. Suhtelisi sagedusi on vaja selleks, et võrrelda eri suuruses valimeid.
# Leia tee või kohvi
# valinute proportsioonid
# kõikidest vastustest
t.jook/sum(t.jook)
# Sama tulemuse saame, kasutades
# tabeli objektil
# funktsiooni prop.table()
prop.table(t.jook)
# ehk
prop.table(table(kysimustik$lemmikjook))
# Salvestame proportsioonidega tabeli
# eraldi objekti t.jook.prop
t.jook.prop <- prop.table(t.jook)
# Teisendame proportsioonid protsentideks
t.jook.prop*100
round(t.jook.prop*100, 2) # ümardame
Vaatame ka risttabeli suhtelisi sagedusi.
prop.table(t.jook.loom) # lahtrite summa = 1
# Milline on loomade valik kohvijoojate seas?
# Milline teejoojate seas?
prop.table(t.jook.loom,
margin = 1) # ridade summa = 1
# Milline on joogi valik molluskiarmastajate seas?
# Milline kaelkirjakuarmastajate seas?
# Milline koeraarmastajate seas?
prop.table(t.jook.loom,
margin = 2) # tulpade summa = 1
addmargins()
_______________
Nii absoluutsete kui ka suhteliste sagedustega tabelitele saab lisada marginaalsed sagedused (margins) ehk ridade ja tulpade summeeritud sagedused.
Samamoodi, nagu leidsime moodi arvuliste tunnuste puhul, võime leida selle ka kategoriaalsete tunnuste puhul.
Järjestustunnuste kirjeldamiseks saab kasutada kõiki neid samu meetodeid, mida ka nominaaltunnuste puhul.
summary(kysimustik)
t.labi <- table(kysimustik$kursuse_labimine)
t.labi.kokk <- table(kysimustik$kursuse_labimine,
kysimustik$soogitegemisoskus)
prop.table(t.labi)
addmargins(prop.table(t.labi.kokk, 2)*100, 1)
max(t.labi)
min(t.labi)
which.max(t.labi.kokk)
which.min(t.labi)
Lisaks võime järjestustunnuste puhul leida ka mediaani ehk kõige keskmise väärtuse, kui järjestada kõik vaatlused tunnuse alusel väiksemast suuremani.
sort(kysimustik$kursuse_labimine)
## [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5
## [39] 5
## Levels: 1 < 2 < 3 < 4 < 5
Mis juhtus?
Kuna tegemist on järjestatud faktoriga, ei suuda R ise selle mediaani kohe leida ja ütleb, et mediaani leidmiseks on vaja arvulisi andmeid.
Mäletatavasti oli mediaan paaritu arvu vaatluste korral variatsioonirea keskmine. Kui meil on aga paarisarv vaatlusi, on mediaan kahe keskmise vaatluse aritmeetiline keskmine. Kui meil oleks nüüd näiteks paarisarv vaatlusi, mille mediaan jääks täpselt 3 ja 4 vahele, siis kuidas tõlgendada mediaani 3.5, kui 3 tähistab vastust “Võin läbi saada, aga võin ka põruda” ja 4 tähistab vastust “Tõenäoliselt saan läbi”?
Aga aritmeetiline keskmine ise?
Kuidas seda tulemust tõlgendada?
Statistikud ei pea järjestustunnuste aritmeetilise keskmise arvutamist reeglina mõistlikuks, ent on ka teistsuguseid arvamusi, vt nt https://measuringu.com/mean-ordinal/.
Arvuliste tunnuste hajuvust ehk seda, kui palju väärtused üldiselt mingist keskmisest väärtusest erinevad, kirjeldavad suurused nagu dispersioon ja standardhälve.
Ka kategoriaalsete tunnuste hajuvust on võimalik erinevate suuruste abil kirjeldada. Vt nt
qualvar
: https://cran.r-project.org/web/packages/qualvar/qualvar.pdf
Käsitleme siin kaht hajuvusnäitajat:
Variatsioonisuhte leidmiseks lahutatakse 1st moodi sageduse ja kõikide vaatluste hulga jagatis. Variatsioonisuhe näitab, kui suure osa andmetest jätab kõige sagedasem väärtus kirjeldamata.
Mida lähemal v on 0-le, seda homogeensem on andmestik (kõige sagedasem väärtus kirjeldab üksi suurema osa andmestikust ära). Mida lähemal v on 1-le, seda heterogeensem/hajuvam on andmestik (palju erinevaid kategooriaid).
Selle näitaja puhul on tegu nominaaltunnuste analoogiga dispersioonile. Siinjuures kasutatakse ära ka variatsioonisuhet. Sisuliselt näitab hälve moodist kõikide klasside/kategooriate moodist hälbimiste summat, mis on korrigeeritud vaatluste ja klasside koguarvu suhtes nii, et statistiku väärtus jääb 0 ja 1 vahele.
# Klasside arv
K <- nlevels(kysimustik$lemmikloom)
# Kuna sellise klassi erinevust,
# mille kohta ei ole ühtegi vaatlust,
# ei ole mõtet vaadata,
# lahutame K-st tühja klassi
# "Mulle ei meeldi loomad" ehk "EiM",
# mida keegi pole valinud.
K <- K-1
v <- 1-max(t.loom)/sum(t.loom)
(DM <- K/(K-1)*v)
Mida suurem on DM, seda rohkem on andmetes varieerumist ja seda ühtlasema sagedusega kategooriad esinevad. Mida väiksem on DM, seda vähem on varieerumist ja seda suurema osa andmetest kirjeldab ära mood. Kui kõikides kategooriates on ühe palju vaatlusi, on DM 1. Kui kõik vaatlused on ühes kategoorias, on DM 0.
Ülesanne
Võrdle lemmiklooma ja lemmikjoogi hälbeid moodist. Mida järeldad?
Kategoriaalsete andmete visualiseerimiseks kasutatakse enamasti sektordiagramme (nn pirukaid) ja tulpdiagramme. Tegeleme selles aines põhiliselt tulpdiagrammidega, sest
https://www.businessinsider.com/pie-charts-are-the-worst-2013-6
Võrdle:
Kas A ajahetkel on 3. kandidaadi toetus suurem kui 5nda oma?
Kas võrreldes A-ga kasvas B ajahetkel rohkem 2. või 4. kandidaadi toetus?
Kes viimase küsitluse järgi võidab?
Sektordiagrammi funktsioon R-is on pie()
.
Tulpdiagramm (bar chart) kuvab tulpades kategoriaalse tunnuse tasemete sagedused. R-is on tulpdiagrammi funktsiooniks baasgraafika paketis barplot()
.
Mis juhtus?
Funktsioon barplot()
eeldab, et tal on võtta kohe kuskilt ka kategooriate sagedusandmed. Seepärast saab seda kasutada tabelobjektidega.
Tulpdiagramme võib ka teha kahe tunnuse alusel. Vaatame näiteks, kas osaleja hinnang oma kursuse läbimise tõenäosusele võiks olla kuidagi seotud sellega, kas tal on eelnevalt kvantitatiivsete meetoditega kogemusi või mitte.
Visualiseerime kategooriaid üksteise kõrval, näitame tulpasid horisontaalselt, lisame kategooriaid eristavad värvid, telgede pealkirjad ja legendi.
barplot(table(kysimustik$kogemused_kvant,
kysimustik$kursuse_labimine),
beside = TRUE,
horiz = TRUE,
col = c("grey35", "orange"),
ylab = "Kursuse läbimise tõenäosus",
xlab = "Vastanute arv",
legend = TRUE,
args.legend = list(x = "bottomright",
ncol = 2,
title = "Kogemused kvantmeetoditega"))
Vaatleme nüüd absoluutsageduste asemel proportsioone: kui suurel osal mingi hinnangu valinutest on eelnevaid kogemusi kvantitatiivsete meetoditega ja kui suurel osal mitte?
t <- prop.table(
table(
kysimustik$kogemused_kvant,
kysimustik$kursuse_labimine),
margin = 2)
barplot(t,
horiz = TRUE,
col = c("grey35", "orange"),
ylab = "Kursuse läbimise tõenäosus",
xlab = "Vastanute proportsioonid",
main = "Hinnang kursuse läbimise tõenäosusele\nvastavalt kogemusele kvantitatiivsete meetoditega",
legend = TRUE,
args.legend = list(x = "bottomright",
ncol = 2,
title = "Kogemused kvantmeetoditega"))