Kataloog ja teek
setwd("c:/jaagup/16/analyytika")
library(stringr)
Esimesed viis rida
readLines("first_test.csv", n=5)
## [1] "\"code\";\"aeifl\";\"tvil\";\"myktin\";\"test_start_time\""
## [2] "\"23000\";\"a l i v\";\"z v \";\"k i y\";\"2014-12-08 09:05:43\""
## [3] "\"23001\";\"a,l,\";\"l,\";\"i,k,\";\"2014-12-08 09:05:21\""
## [4] "\"23002\";\"ae\";\"l\";\"mi\";\"2014-12-08 09:06:27\""
## [5] "\"23003\";\"ea\";\"lvt\";\"mkt\";\"2014-12-08 09:05:17\""
Andmed massiivi
m=readLines("first_test.csv", n=5)
Esimene rida
cat(m[1])
## "code";"aeifl";"tvil";"myktin";"test_start_time"
Kogu massiiv
cat(m)
## "code";"aeifl";"tvil";"myktin";"test_start_time" "23000";"a l i v";"z v ";"k i y";"2014-12-08 09:05:43" "23001";"a,l,";"l,";"i,k,";"2014-12-08 09:05:21" "23002";"ae";"l";"mi";"2014-12-08 09:06:27" "23003";"ea";"lvt";"mkt";"2014-12-08 09:05:17"
Koos reavahetusega
cat(m,sep="\n")
## "code";"aeifl";"tvil";"myktin";"test_start_time"
## "23000";"a l i v";"z v ";"k i y";"2014-12-08 09:05:43"
## "23001";"a,l,";"l,";"i,k,";"2014-12-08 09:05:21"
## "23002";"ae";"l";"mi";"2014-12-08 09:06:27"
## "23003";"ea";"lvt";"mkt";"2014-12-08 09:05:17"
Paste võtab iga elemendi eraldi
paste(m)
## [1] "\"code\";\"aeifl\";\"tvil\";\"myktin\";\"test_start_time\""
## [2] "\"23000\";\"a l i v\";\"z v \";\"k i y\";\"2014-12-08 09:05:43\""
## [3] "\"23001\";\"a,l,\";\"l,\";\"i,k,\";\"2014-12-08 09:05:21\""
## [4] "\"23002\";\"ae\";\"l\";\"mi\";\"2014-12-08 09:06:27\""
## [5] "\"23003\";\"ea\";\"lvt\";\"mkt\";\"2014-12-08 09:05:17\""
m=readLines("first_test.csv")
for(i in 1:length(m)){
c=str_count(m[i], '"')
if(c %% 2 !=0){ #real olevate paaritu arvu jutumärkide korral
#semikoolonile mitte vastu puutuv jutumärk kõrvaldatakse
cat(m[i])
m[i]=gsub('([^;])"([^;])', '\\1\\2', m[i])
cat(m[i])
}
}
## "62048";"a e f d i u v l ";"l i t v u qwergthyjukoash\"ddo ";"k i t v u d m n p";"2015-03-30 13:32:09""62048";"a e f d i u v l ";"l i t v u qwergthyjukoash\ddo ";"k i t v u d m n p";"2015-03-30 13:32:09"
Püüan tsüklist loobuda ning teha nõnda, nagu juhendis õpetati
m=readLines("first_test.csv")
Jutumärkide arv ridade kaupa
arvud=str_count(m, '"')
head(arvud)
## [1] 10 10 10 10 10 10
Read, kus jutumärke paaritu arv. Hetkel paistab olema vaid üks selline rida, kuid neid võib ka rohkem tulla.
reanr=which(arvud %% 2 != 0)
reanr
## [1] 4950
Vastava rea sisu
m[reanr]
## [1] "\"62048\";\"a e f d i u v l \";\"l i t v u qwergthyjukoash\\\"ddo \";\"k i t v u d m n p\";\"2015-03-30 13:32:09\""
Otsitud jutumärgi asukoht. Kuna muud jutumärgid peavad alles jääma, siis konkreetse rea pealt otsin kohta, kus on jutumärk koos temale järgneva d-tähega. Koha juures näidatakse algus ja ots.
koht=str_locate(m[reanr], '"d')
koht
## start end
## [1,] 55 56
Paistab olema maatriksi klassist ning meeldetuletuseks pärast vahepealset otsimist panen kirja, et maatriksi lahtrite poole võib pöörduda nii numbrite kui pealkirjade kaudu.
class(koht)
## [1] "matrix"
koht[1, "start"]
## start
## 55
Asendan jutumärgi koos järgneva d-tähega stringiga “xd”. Katsete tulemusena selgus, et asendatav koht peab olema sama pikk (nagu C puhul tähemassiividega tegutsedes)
substr(m[reanr], koht[1, "start"], koht[1, "end"])="xd"
Rida pärast asendamist, segava jutumärgi asemel on x-täht
m[reanr]
## [1] "\"62048\";\"a e f d i u v l \";\"l i t v u qwergthyjukoash\\xddo \";\"k i t v u d m n p\";\"2015-03-30 13:32:09\""
m=readLines("first_test.csv")
arvud=str_count(m, '"')
reanr=which(arvud %% 2 != 0)
koht=str_locate(m[reanr], '"d')
substr(m[reanr], koht[1, "start"], koht[1, "end"])="xd"
Muudetud tekstist andmed sisse
andmed=read.table(file=textConnection(paste(m, sep="\n")), sep=";", header=TRUE, stringsAsFactors = FALSE)
head(andmed)
## code aeifl tvil myktin test_start_time
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21
## 3 23002 ae l mi 2014-12-08 09:06:27
## 4 23003 ea lvt mkt 2014-12-08 09:05:17
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40
## 6 23005 e,a il m 2014-12-08 09:05:39
Jäetakse alles need andmed, kus kolm vastusetulpa + ajatulp kokku sisaldavad midagi
andmed=andmed[paste(andmed$aeifl,andmed$tvil,andmed$myktin, andmed$test_start_time, sep="")!="", ]
Esimeses vastusetulbas puuduvate andmete leidumine
andmed$aiefl==""
## logical(0)
Teises andmetulbas puuduvate väärtuste esinemise kohad
which(andmed$tvil=="")
## [1] 206 290 684 883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839
Kolmandas andmetulbas puuduvate väärtuste leidmise kohad
which(andmed$myktin=="")
## [1] 206 290 684 883 1253 1263 1433 1464 1869 2174 2461 2462 2463 2464
## [15] 2465 2467 2468 2471 2472 2473 2475 2733 2837 2863 3093 4372 4508 4738
## [29] 4796 5025 5792 5794 6017 6032 6614 6617 6620 6738 6743 6744 6822 6825
## [43] 6826 6827 6839
Püüan mõlemite ühiseid puuduvaid kohti saada, kuid kahe &-märgiga saan tühjuse. Manuaali lugedes leian, et üldjah oleks siis, kui mõlemil tingimusel kõik tunnused jahid on. Kuna aga esimene on FALSE siis edasi ei vaadata ja kokku ongi FALSE
which(andmed$myktin=="" && andmed$tvil=="") # ei toimi
## integer(0)
&-märgi katsetused
c(TRUE, TRUE, TRUE) & c(TRUE, TRUE, TRUE)
## [1] TRUE TRUE TRUE
c(TRUE, TRUE, TRUE) && c(TRUE, TRUE, TRUE)
## [1] TRUE
c(TRUE, FALSE, TRUE) & c(TRUE, TRUE, TRUE)
## [1] TRUE FALSE TRUE
c(TRUE, TRUE, TRUE) && c(TRUE, TRUE, TRUE)
## [1] TRUE
Ühe &-märgiga jaatus paistab toimima
which(andmed$myktin=="" & andmed$tvil=="")
## [1] 206 290 684 883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839
Aja puudumise kohad
which(andmed$test_start_time=="")
## integer(0)
Kas konkreetses lahtris väärtus puudub
andmed[206, "tvil"]==""
## [1] TRUE
Sama arvuna
as.numeric(andmed[206, "tvil"]=="")
## [1] 1
Iga rea kohta käivitatakse funktsioon, kus käiakse läbi selle rea kõik veerud, kontrollitakse väärtuse puudumist (võrdumine tühja sõnega) ning summeeritakse puuduvad väärtused (nende arv) kokku. Nii saab iga rea kohta arvu, et mitu väärtust selles puudub.
Kõhutunne ütleb, et seda peaks saama ka kuidagi lihtsamalt/elegantsemalt teha. Apply-le ridade kaupa miski funktsioon ette anda - aga mõned erisugused katsed igatahes selles suunas sihile ei viinud.
puuduvaid=sapply(1:nrow(andmed), function(reanumber){sum(
sapply(1:ncol(andmed), function(veerunumber){as.numeric(andmed[reanumber, veerunumber]=="")})
)})
head(puuduvaid)
## [1] 0 0 0 0 0 0
Ridade arvu jaotus puuduvate väärtuste arvu kaupa
table(puuduvaid)
## puuduvaid
## 0 1 3
## 7583 6 42
Millistel reanumbritel on kolm puuduvat väärtust
which(puuduvaid==3)
## [1] 206 290 684 883 1253 1263 1433 1464 1869 2174 2461 2463 2464 2465
## [15] 2467 2468 2471 2472 2473 2475 2733 2837 2863 4372 4508 4738 4796 5025
## [29] 5792 5794 6017 6614 6617 6620 6738 6743 6744 6822 6825 6826 6827 6839
Need read ise (päis)
head(andmed[puuduvaid==3, ])
## code aeifl tvil myktin test_start_time
## 226 23225 2015-01-07 09:55:58
## 332 23331 2015-03-06 10:36:45
## 784 23783 2015-01-19 11:13:18
## 1019 24018 2015-03-06 09:08:40
## 1565 32364 2015-02-13 11:46:42
## 1575 32374 2015-02-13 11:45:40
Ja read, kus on muu arv (vähem) puuduvaid
head(andmed[puuduvaid!=3, ])
## code aeifl tvil myktin test_start_time
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21
## 3 23002 ae l mi 2014-12-08 09:06:27
## 4 23003 ea lvt mkt 2014-12-08 09:05:17
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40
## 6 23005 e,a il m 2014-12-08 09:05:39
Ja read, kus on muu nullist suurem arv puudujaid
head(andmed[puuduvaid!=3 & puuduvaid>0, ])
## code aeifl tvil myktin test_start_time
## 433 23432 v l k n 2015-03-13 10:30:18
## 486 23485 123 12345 2015-03-11 09:08:54
## 1400 32199 LTV TVL 2015-02-05 10:38:14
## 3069 42668 a,l l, 2015-02-05 08:52:26
## 3943 52242 e,a,l,i l,t,i 2015-03-30 10:55:50
## 7532 82331 A L E V L V I 2015-03-03 10:31:30
Jätame alles vaid read, kus on vähem kui kolm puuduvat väärtust
andmed=andmed[puuduvaid<3, ]
Andmete ettevalmistamise lõpp
Vastuse õigsuse hindamise tarbeks
Kas a sisaldub kalas - jah (1)
grep("a", "kala")
## [1] 1
b ei sisaldu
grep("b", "kala")
## integer(0)
Uuritavad tähed
tahed="abc"
Üksiku tähe kättesaamiseks peavad algus ja lõpp kattuma
substr(tahed, 2, 2)
## [1] "b"
Tähtede arvu kätte saamiseks sobib nchar (mitte length)
nchar(tahed)
## [1] 3
Kas konkreetne täht sisaldub sõnas “kaba”
a on, b on, c ei ole
sapply(1:nchar(tahed), function(nr){grep(substr(tahed, nr, nr), "kaba")})
## [[1]]
## [1] 1
##
## [[2]]
## [1] 1
##
## [[3]]
## integer(0)
Summana kokku loetu, et mitu tähtede stringis olevat sümbolit leidub sõnas “kaba”. Sarnaselt siis võimalik vaadata, et kui palju lapse pakutud tähti on pihta läinud.
sum(unlist(sapply(1:nchar(tahed), function(nr){grep(substr(tahed, nr, nr), "kaba")})))
## [1] 2
Sama tulemus hulgatehete abil. Teksti muutmiseks vektoriks eraldi väike funktsioon, kuna lühemat lahendust ei leidnud.
vektoriks <- function(tekst){
sapply(1:nchar(tekst), function(x) substring(tekst, x, x))
}
pakutud=vektoriks(tahed)
uuritav=vektoriks("bcd")
oiged=intersect(pakutud, uuritav)
oiged
## [1] "b" "c"
valed=setdiff(pakutud, uuritav)
valed
## [1] "a"
length(oiged)
## [1] 2
length(valed)
## [1] 1
Skoori arvutus
length(oiged)-length(valed)
## [1] 1
head(andmed)
## code aeifl tvil myktin test_start_time
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21
## 3 23002 ae l mi 2014-12-08 09:06:27
## 4 23003 ea lvt mkt 2014-12-08 09:05:17
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40
## 6 23005 e,a il m 2014-12-08 09:05:39
veerunr=2
Veeru pealkiri paistab klappima õigete vastustähtedega
names(andmed)[veerunr]
## [1] "aeifl"
Konkreetse veeru kohta pihtaläinud tähtede arv
sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
Sama valemi abil lisatulp ning sealt nähtavale esimesed read
head(cbind(andmed, oigeid1=sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))))
## code aeifl tvil myktin test_start_time oigeid1
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 3
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2
## 3 23002 ae l mi 2014-12-08 09:06:27 2
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3
## 6 23005 e,a il m 2014-12-08 09:05:39 2
Vastuseveergude 2-4 pihtaläinud tähtede arvu summa
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
})
Samast esimesed read nähtavale
head(cbind(andmed, sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
})))
## code aeifl tvil myktin test_start_time 1 2 3
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 3 1 3
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002 ae l mi 2014-12-08 09:06:27 2 1 2
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2 3 3
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3 3 3
## 6 23005 e,a il m 2014-12-08 09:05:39 2 2 1
Katse õigete vastuste summa apply abil välja arvutada
apply(sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
}), 1, sum)
Samast esimesed read nähtavale
head(cbind(andmed, summa=apply(sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) sum(unlist(sapply(1:nchar(names(andmed)[veerunr]), function(veerutahenr){grep(substr(names(andmed)[veerunr], veerutahenr, veerutahenr), andmed[reanr, veerunr])}))))
}), 1, sum)))
## code aeifl tvil myktin test_start_time summa
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 7
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 5
## 3 23002 ae l mi 2014-12-08 09:06:27 5
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 8
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 9
## 6 23005 e,a il m 2014-12-08 09:05:39 5
Valemid ja arvutused kippusid üksteise otsa lisades korraga tabamiseks liialt suureks kasvama. Kui nüüd sinna lisada veel valede pakkumiste leidmine ja maha lahutamine, siis keerukus kasvaks veelgi. Jagan tegevused osadeks. Funktsioon leidmaks, mitu õiget oli pakutute hulgas
oigeidlahtris <- function(pakutud, oiged){
pakutud=tolower(pakutud)
sum(unlist(sapply(1:nchar(oiged), function(veerutahenr){
grep(substr(oiged, veerutahenr, veerutahenr), pakutud)
})))
}
Funktsiooni katsetus
oigeidlahtris("abc", "bcd")
## [1] 2
Valede leidmiseks arvestan kõigepealt ainult tähti a-z, et eraldajaks pandud komad, tühikud ja muud sümbolid ei segaks.
#sum vaid vastuse arvuliseks muutmiseks
valesidlahtris <- function(pakutud, oiged){
pakutud=tolower(pakutud)
pakutud=str_replace_all(pakutud, "[^a-z]", "")
sum(unlist(sapply(1:nchar(pakutud), function(veerutahenr){
1-sum(grep(substr(pakutud, veerutahenr, veerutahenr), oiged))
})))
}
Vale oleks siis a, aga mitte tühik
valesidlahtris("ab c", "bcd")
## [1] 1
Lahtri üldskoori leidmiseks tuleb õigetest valed maha lahutada
lahtriskoor <- function(pakutud, oiged){
oigeidlahtris(pakutud, oiged)-valesidlahtris(pakutud, oiged)
}
Õiged on b ja c
oigeidlahtris("ab c", "bcd")
## [1] 2
Valena maha a
lahtriskoor("ab c", "bcd")
## [1] 1
Käsk grep annab vaste mitteleidmisel tulemuseks integer-tüüpi nulli.
grep("a","b")
## integer(0)
Tehet aga ei taheta vastu võtta
1-grep("a","b")
## numeric(0)
Selle sai küll numbriks muuta
as.numeric(grep("a","b"))
## numeric(0)
Aga sellegipoolest polnud võimalik tehtes kasutada. Kiusatus on mitteleidumisele panna vastuseks 1 ja leidumisele null ehk siis tehe 1-grep(“a”, “b”)
1-as.numeric(grep("a","b"))
## numeric(0)
Toimiv lahendus õnnestus tekitada sum-funktsiooni abil - ehkki arvatavasti leidub kusagil ka mõni loogilisem moodus.
1-sum(grep("a","b"))
## [1] 1
Õigete arv tulpade kaupa.
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) {oigeidlahtris(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
Valede arv tulpade kaupa
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) {valesidlahtris(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
Lahtriskoor tulpade kaupa
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
Esimeste ridade lahtriskoor
head(
cbind(andmed,
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
))
## code aeifl tvil myktin test_start_time 1 2 3
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 2 0 3
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002 ae l mi 2014-12-08 09:06:27 2 1 2
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2 3 3
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3 3 3
## 6 23005 e,a il m 2014-12-08 09:05:39 2 2 1
Skoor andmestiku külge tulpadena. Jällegi mõte, et äkki annaks sellise funktsiooni rakendamist andmestiku ridadele mõne andekama käsuga teha, kui sapplyga veerud ja read eraldi läbi käies?
andmed=cbind(andmed,
sapply(2:4, function(veerunr){
sapply(1:nrow(andmed), function(reanr) {lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
})
)
Lisatulpadega andmete esimesed read.
head(andmed)
## code aeifl tvil myktin test_start_time 1 2 3
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 2 0 3
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2 1 2
## 3 23002 ae l mi 2014-12-08 09:06:27 2 1 2
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2 3 3
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3 3 3
## 6 23005 e,a il m 2014-12-08 09:05:39 2 2 1
Koondskoori arvutamine. Saaks arvatavasti ka eelnevate tulpade kaudu (tekkinud tulbad salapäraste nimedega 1, 2 ja 3, aga sum-funktsioon teeb praegu sama töö ära)
andmed$koondskoor=sapply(1:nrow(andmed), function(reanr) {
sum(
sapply(2:4, function(veerunr){lahtriskoor(andmed[reanr, veerunr], names(andmed)[veerunr] )})
)
})
Algusots koos koondskooriga
head(andmed)
## code aeifl tvil myktin test_start_time 1 2 3 koondskoor
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 2 0 3 5
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2 1 2 5
## 3 23002 ae l mi 2014-12-08 09:06:27 2 1 2 5
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2 3 3 8
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3 3 3 9
## 6 23005 e,a il m 2014-12-08 09:05:39 2 2 1 5
Tulemuste jaotus kolme ülesande peale kokku
hist(andmed$koondskoor, main="Tulemuste jaotus", xlab="Punktide arv", ylab="Sagedus")
Arvuline väljund nendest
table(andmed$koondskoor)
##
## -46 -38 -35 -34 -30 -29 -28 -26 -24 -22 -21 -20 -19 -18 -17
## 1 2 2 4 1 1 2 1 1 2 4 5 6 4 2
## -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2
## 8 3 22 22 10 6 15 13 12 16 18 18 24 21 26
## -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 52 86 102 208 596 596 709 1069 975 960 752 504 360 190 92
## 14 15
## 58 8
Suvaliste pakkumiste pealt tulnud suured ja harvad negatiivsed skoorid eemaldatud, jaotus histogrammina.
hist(andmed$koondskoor, xlim=c(-5, 15), main="Tulemuste jaotus", xlab="Punktide arv", ylab="Sagedus")
Nädalapäev
weekdays(as.POSIXct("2014-12-08 09:05:43"))
## [1] "esmaspäev"
Kuupäev ajast
as.Date(as.POSIXct("2014-12-08 09:05:43"))
## [1] "2014-12-08"
Tulba test_start_time muutmine POSIXct tüüpi
andmed$test_start_time=as.POSIXct(andmed$test_start_time)
Päevade kaupa soorituste arvude kätte saamine. Table-funktsioonist väljund värskelt leitud funktsiooniga as.data.frame.table
paevakogused=as.data.frame.table(table(as.Date(andmed$test_start_time)))
colnames(paevakogused)=c("soorituskuupaev", "kogus")
head(paevakogused, 10)
## soorituskuupaev kogus
## 1 2014-12-08 48
## 2 2014-12-09 39
## 3 2014-12-12 5
## 4 2014-12-15 36
## 5 2014-12-16 71
## 6 2014-12-17 16
## 7 2014-12-18 41
## 8 2015-01-06 8
## 9 2015-01-07 54
## 10 2015-01-08 15
head(paevakogused[rev(order(paevakogused$kogus)), ], 10)
## soorituskuupaev kogus
## 53 2015-03-11 318
## 54 2015-03-12 314
## 59 2015-03-25 298
## 52 2015-03-10 257
## 44 2015-02-26 234
## 50 2015-03-06 226
## 57 2015-03-23 202
## 48 2015-03-04 192
## 60 2015-03-26 191
## 37 2015-02-16 183
Vahemiku algus ja ots
ajavahemik=range(as.Date(andmed$test_start_time))
Selle sees kõik olemasolevad päevad
koikpaevad=data.frame(seq(from=ajavahemik[1], to = ajavahemik[2], by=1))
Ja näide, et hakati õigesti lugema
head(koikpaevad)
## seq.from...ajavahemik.1...to...ajavahemik.2...by...1.
## 1 2014-12-08
## 2 2014-12-09
## 3 2014-12-10
## 4 2014-12-11
## 5 2014-12-12
## 6 2014-12-13
Tulbale arusaadav nimi
names(koikpaevad)=c("kuupaev")
Kõikide päevade külge eraldi tulbana testitud päevadel saadud tulemused
kogused=merge(koikpaevad, paevakogused, by.x="kuupaev", by.y="soorituskuupaev", all=TRUE)
Väljund ekraanile
head(kogused)
## kuupaev kogus
## 1 2014-12-08 NA
## 2 2014-12-08 48
## 3 2014-12-09 NA
## 4 2014-12-09 39
## 5 2014-12-10 NA
## 6 2014-12-11 NA
Kui tol päeval teste ei tehtud, siis selle päeva testide arv on null
kogused[is.na(kogused$kogus), "kogus"]=0
Tulemuse kontroll
head(kogused)
## kuupaev kogus
## 1 2014-12-08 0
## 2 2014-12-08 48
## 3 2014-12-09 0
## 4 2014-12-09 39
## 5 2014-12-10 0
## 6 2014-12-11 0
Summeeritud kogused päevade kaupa
kumulatiivnekogus=cumsum(kogused$kogus)
Algusots kontrolliks
head(kumulatiivnekogus)
## [1] 0 48 48 87 87 87
Kasvukõver nähtavale
plot(kumulatiivnekogus, xlab="Päeva number")
Tulemus koos ajateljega
plot(kogused$kuupaev, kumulatiivnekogus)
Testide arvud nädalapäevade kaupa
table(weekdays(andmed$test_start_time))
##
## esmaspäev kolmapäev neljapäev reede teisipäev
## 1309 1918 1597 1191 1574
Nädalapäev omaette tulbaks
andmed$nadalapaev=weekdays(andmed$test_start_time)
Nädalapäevade nimed sisulisse järjestusse
andmed$nadalapaev=factor(andmed$nadalapaev, levels=c("esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev"), ordered=TRUE)
Andmete algusotsa kontroll
head(andmed)
## code aeifl tvil myktin test_start_time 1 2 3 koondskoor
## 1 23000 a l i v z v k i y 2014-12-08 09:05:43 2 0 3 5
## 2 23001 a,l, l, i,k, 2014-12-08 09:05:21 2 1 2 5
## 3 23002 ae l mi 2014-12-08 09:06:27 2 1 2 5
## 4 23003 ea lvt mkt 2014-12-08 09:05:17 2 3 3 8
## 5 23004 a l f v l i k i n 2014-12-08 09:05:40 3 3 3 9
## 6 23005 e,a il m 2014-12-08 09:05:39 2 2 1 5
## nadalapaev
## 1 esmaspäev
## 2 esmaspäev
## 3 esmaspäev
## 4 esmaspäev
## 5 esmaspäev
## 6 esmaspäev
Tüübi kontroll
class(andmed$nadalapaev)
## [1] "ordered" "factor"
Jaotus nädalapäevade kaupa - sedakorda sisuliselt järjestatult
table(andmed$nadalapaev)
##
## esmaspäev teisipäev kolmapäev neljapäev reede laupäev pühapäev
## 1309 1574 1918 1597 1191 0 0
Koondskoorid nädalapäevade kaupa - keskmised ja standardhälbed
aggregate(andmed$koondskoor, by=list(andmed$nadalapaev), FUN=function(x)c(keskmine=mean(x), standardhalve=sd(x)))
## Group.1 x.keskmine x.standardhalve
## 1 esmaspäev 6.255921 4.585517
## 2 teisipäev 5.801779 4.881049
## 3 kolmapäev 6.282065 4.038831
## 4 neljapäev 6.016907 4.541134
## 5 reede 6.314861 4.308573
Koondskoori väärtused nädalapäeviti - karp ja vurrud. Boxplot-käsklusega nõnda kergelt ei tulnud
plot(koondskoor ~ nadalapaev, andmed, las=2)
#boxplot(andmed$nadalapaev, andmed$koondskoor)
Testide sooritamise arv tundide kaupa
table(format(andmed$test_start_time, "%H"))
##
## 07 08 09 10 11 12 13 14 15 16
## 22 1271 1511 1597 1369 1104 551 145 18 1
Jällegi table-tulemuse lugemisraskused. Kahekordne transponeerimine nagu mõjus hästi. Aga tagantjärele asendasin funktsiooniga as.data.frame.table().
#tunnikaupa=t(t(table(format(andmed$test_start_time, "%H"))))
tunnikaupa=as.data.frame.table(table(format(andmed$test_start_time, "%H")))
colnames(tunnikaupa)=c("tund", "testidearv")
Tunnid, kus tehti vähemasti 30 testi
tunnikaupa[tunnikaupa$testidearv>=30, ]
## tund testidearv
## 2 08 1271
## 3 09 1511
## 4 10 1597
## 5 11 1369
## 6 12 1104
## 7 13 551
## 8 14 145
Koondskoori jaotus tundide kaupa
koond=aggregate(andmed$koondskoor, by=list(format(andmed$test_start_time, "%H")), FUN=function(x)c(keskmine=mean(x), standardhalve=sd(x), kogus=length(x)))
#subset(koond, x.kogus>=30)
Tulpasid paistab rohkem, aga kergesti kätte ei saa.
head(koond)
## Group.1 x.keskmine x.standardhalve x.kogus
## 1 07 6.590909 9.414574 22.000000
## 2 08 6.056648 3.958239 1271.000000
## 3 09 6.017869 4.508896 1511.000000
## 4 10 5.900438 4.815465 1597.000000
## 5 11 6.100804 4.177887 1369.000000
## 6 12 6.437500 4.622630 1104.000000
Kui arvestada, et x on omaette maatriks ning sealt vaadata, millise rea kogus ületab kolmekümmet, siis võimalik ka üldtabeliset sobivad read koos tundidega kuvada.
koond[koond$x[,"kogus"]>30, ]
## Group.1 x.keskmine x.standardhalve x.kogus
## 2 08 6.056648 3.958239 1271.000000
## 3 09 6.017869 4.508896 1511.000000
## 4 10 5.900438 4.815465 1597.000000
## 5 11 6.100804 4.177887 1369.000000
## 6 12 6.437500 4.622630 1104.000000
## 7 13 6.662432 4.337409 551.000000
## 8 14 6.620690 4.084301 145.000000
class(koond)
## [1] "data.frame"
Otsesed üldtabeli tulbad aga vaid grupeerimistunnus ja vaste
names(koond)
## [1] "Group.1" "x"
Vaste on omaette maatriks, mis data.frame ühte tulpa pressitud
class(koond$x)
## [1] "matrix"
Trikid andmete kätte saamiseks - et oleksid omaette tulpadena kasutatavad. Äkki on ka mõni parem moodus olemas kokkupressitud tulpade kätte saamiseks?
koond3=cbind(koond$x, tund=as.numeric(koond$Group.1))
koond3
## keskmine standardhalve kogus tund
## [1,] 6.590909 9.414574 22 7
## [2,] 6.056648 3.958239 1271 8
## [3,] 6.017869 4.508896 1511 9
## [4,] 5.900438 4.815465 1597 10
## [5,] 6.100804 4.177887 1369 11
## [6,] 6.437500 4.622630 1104 12
## [7,] 6.662432 4.337409 551 13
## [8,] 6.620690 4.084301 145 14
## [9,] 2.500000 8.528499 18 15
## [10,] 6.000000 NA 1 16
Tulbad nüüd õnneks eraldi olemas
colnames(koond3)
## [1] "keskmine" "standardhalve" "kogus" "tund"
Ja saab sobivad read ka välja kuvada - tundide andmed, kus rohkem teste tehtud.
koond3[koond3[, "kogus"]>=30,]
## keskmine standardhalve kogus tund
## [1,] 6.056648 3.958239 1271 8
## [2,] 6.017869 4.508896 1511 9
## [3,] 5.900438 4.815465 1597 10
## [4,] 6.100804 4.177887 1369 11
## [5,] 6.437500 4.622630 1104 12
## [6,] 6.662432 4.337409 551 13
## [7,] 6.620690 4.084301 145 14