Teegid
library(dplyr)
library(magrittr)
library(reshape2)
library(ggplot2)
Andmed sisse
setwd("c:/jaagup/16/analyytika")
andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=".")
set.seed(1234)
andmed <- as.data.frame(lapply(andmed, function(x) x[sample(c(TRUE, NA), prob = c(0.9, 0.1), size = length(x), replace = TRUE)]))
Andmete klassi muutus suurandmetega ohutumaks ümber käimiseks
andmed=tbl_df(andmed)
andmed
## Source: local data frame [395 x 33]
##
## school sex age address famsize Pstatus Medu Fedu Mjob
## (fctr) (fctr) (int) (fctr) (fctr) (fctr) (int) (int) (fctr)
## 1 GP NA 18 U GT3 A 4 4 at_home
## 2 GP F 17 U GT3 T 1 1 at_home
## 3 GP F 15 U LE3 T 1 1 at_home
## 4 GP F 15 U GT3 T 4 2 health
## 5 GP F 16 U GT3 NA 3 3 other
## 6 GP M 16 U LE3 T 4 3 services
## 7 GP M 16 U LE3 T 2 2 other
## 8 GP F 17 U GT3 A 4 4 other
## 9 GP M 15 U LE3 A 3 2 services
## 10 GP M 15 U GT3 NA NA NA other
## .. ... ... ... ... ... ... ... ... ...
## Variables not shown: Fjob (fctr), reason (fctr), guardian (fctr),
## traveltime (int), studytime (int), failures (int), schoolsup (fctr),
## famsup (fctr), paid (fctr), activities (fctr), nursery (fctr), higher
## (fctr), internet (fctr), romantic (fctr), famrel (int), freetime (int),
## goout (int), Dalc (int), Walc (int), health (int), absences (int), G1
## (int), G2 (int), G3 (int)
class(andmed)
## [1] "tbl_df" "tbl" "data.frame"
Lisatulp tulemuste vahe jaoks
andmed=mutate(andmed, diff=G2-G1)
Puuduvate väärtuste arv algul
length(which(is.na(andmed$G2)))
## [1] 38
Nullid NAdeks
andmed=mutate(andmed, G2=ifelse(G2>0, G2, NA))
andmed$G2
## [1] 6 5 8 14 NA 15 12 5 18 15 8 NA 14 10 16 14 14 10 5 10 14 15 15
## [24] 13 NA NA 12 16 11 12 11 16 NA 10 14 7 16 16 12 13 10 12 18 8 10 8
## [47] 12 19 15 7 13 NA 11 10 13 9 15 15 NA 16 11 8 NA 9 10 15 13 7 9
## [70] NA 15 10 6 12 12 9 11 11 8 NA NA NA 6 15 10 9 7 14 10 6 7 17
## [93] 6 10 13 10 15 9 14 9 7 NA 13 6 18 11 NA 18 13 15 19 10 13 19 9
## [116] 15 13 14 7 13 15 14 13 11 7 NA 10 8 4 18 NA NA 13 11 NA NA NA NA
## [139] NA NA 9 9 11 14 NA 11 7 11 6 9 5 13 10 NA NA 8 12 8 15 NA 6
## [162] 9 NA 10 8 11 10 15 7 14 5 15 11 7 11 9 13 5 NA 10 8 13 17 9
## [185] 13 12 12 15 7 9 12 8 8 NA 14 15 15 9 18 9 16 10 9 6 10 9 7
## [208] 12 9 7 8 12 13 7 10 15 6 6 7 10 6 5 16 13 NA 8 NA 11 8 10
## [231] 13 11 9 13 7 9 13 12 11 NA 12 NA NA NA NA 18 12 8 5 15 8 10 9
## [254] 9 12 9 12 11 14 9 18 8 12 9 10 17 9 10 9 NA NA 14 NA 14 10 12
## [277] NA 9 8 11 8 9 NA 9 9 10 18 12 14 13 11 15 12 18 13 12 9 8 13
## [300] 15 10 11 12 17 14 12 18 9 12 10 9 12 11 10 13 11 8 10 11 NA 13 9
## [323] 11 14 15 12 15 10 9 NA NA 14 NA 8 9 15 13 8 15 10 NA 10 15 8 10
## [346] 13 15 10 NA 13 7 13 7 8 NA 9 13 12 10 16 13 12 11 15 11 10 13 6
## [369] 10 12 7 12 11 5 NA 8 14 9 15 10 14 6 11 5 5 9 5 5 9 5 9
## [392] 16 8 12 9
Puuduvate väärtuste arv pärast asendust
length(which(is.na(andmed$G2)))
## [1] 50
Suurim puudumiste arv poiste seas
kogus=max(select(filter(andmed, sex=="M"), absences), na.rm=TRUE)
kogus
## [1] 38
Tüdrukute arv, kelle puudumiste arv ületab suurimat puudumiste arvu poiste hulgas
nrow(filter(andmed, sex=="F", absences>kogus))
## [1] 3
Sama arvutus aga ühe käsuna korraga ei taha toimida
Error: Each argument must yield either positive or negative integers
#ei toimi
#nrow(filter(andmed, sex=="F", absences>max(select(filter(andmed, sex=="M"), absences), na.rm=TRUE)))
Iga reason ja sex kombinatsiooni kohta keskmine aastalõpu hinne (G3), laste arv igas kombinatsioonigrupis
summarise(group_by(andmed, reason, sex), keskmine=mean(G3, na.rm=TRUE), lastearv=n()) %>% na.omit
## Source: local data frame [8 x 4]
## Groups: reason [4]
##
## reason sex keskmine lastearv
## (fctr) (fctr) (dbl) (int)
## 1 course F 8.957447 54
## 2 course M 10.454545 63
## 3 home F 10.050000 44
## 4 home M 11.977273 44
## 5 other F 12.769231 13
## 6 other M 10.000000 12
## 7 reputation F 10.717391 51
## 8 reputation M 12.482759 30
Kolme tulba keskmine
summarise(group_by(andmed, reason), keskmine=mean(G1+G2+G3, na.rm=TRUE))
## Source: local data frame [5 x 2]
##
## reason keskmine
## (fctr) (dbl)
## 1 course 31.27957
## 2 home 32.97183
## 3 other 30.95000
## 4 reputation 34.23611
## 5 NA 35.06452
Sama toru abil
group_by(andmed, reason) %>% summarise(keskmine=mean(G1+G2+G3, na.rm=TRUE))
## Source: local data frame [5 x 2]
##
## reason keskmine
## (fctr) (dbl)
## 1 course 31.27957
## 2 home 32.97183
## 3 other 30.95000
## 4 reputation 34.23611
## 5 NA 35.06452
Lisatulp ja lisaarvutused
mutate(andmed, kolmesumma=G1+G2+G3) %>% group_by(reason) %>% summarise(keskmine=mean(kolmesumma, na.rm=TRUE), standardhalve=sd(kolmesumma, na.rm=TRUE), grupisuurus=n())
## Source: local data frame [5 x 4]
##
## reason keskmine standardhalve grupisuurus
## (fctr) (dbl) (dbl) (int)
## 1 course 31.27957 10.680504 136
## 2 home 32.97183 10.962236 97
## 3 other 30.95000 10.634972 29
## 4 reputation 34.23611 10.215279 89
## 5 NA 35.06452 8.354382 44
summarise_each ei taha vedu võtta
# summarise(group_by(andmed, reason, sex), keskmine=mean(G1+G2+G3, na.rm=TRUE)) %>% summarise_each(fun=c(sd))
Keskmine ja standardhälve sex ja guardian paari järgi, keskmise järgi kahanevalt järestatud. Mingil salapärasel põhjusel tarvilik ungroup.
andmed %>% group_by(sex, guardian) %>% summarise(keskmine=mean(G1+G2+G3, na.rm=TRUE), standardhalve=sd(G1+G2+G3, na.rm=TRUE), grupisuurus=n()) %>% ungroup() %>% arrange(desc(keskmine))
## Source: local data frame [12 x 5]
##
## sex guardian keskmine standardhalve grupisuurus
## (fctr) (fctr) (dbl) (dbl) (int)
## 1 M mother 35.61333 11.571042 100
## 2 M NA 35.38462 7.654394 16
## 3 NA father 34.66667 13.490738 12
## 4 F father 32.70000 10.795223 35
## 5 F mother 32.56962 9.776586 110
## 6 M other 32.44444 11.337009 11
## 7 M father 32.19355 9.586168 36
## 8 F other 31.18182 10.293864 18
## 9 F NA 28.52941 8.522893 22
## 10 NA mother 27.75000 9.329495 28
## 11 NA NA 27.50000 4.949747 6
## 12 NA other 23.00000 NA 1
Sobival kujul soo ja semestri järgi tabelisse saamiseks sättisin andmeid mitmel moel, kuid lõpuks tööle hakkas ikkagi traditsiooniliste sapply ja tapply funktsioonide abil kokku tõstetud tulemus. Kindlasti on sellele olemas ka lihtsam lahendus.
tulemused=sapply(list(andmed$G1, andmed$G2, andmed$G3), function(tulp) tapply(tulp, andmed$sex, mean, na.rm=TRUE))
tulemused
## [,1] [,2] [,3]
## F 10.58282 10.68987 10.22156
## M 11.45033 11.60811 11.30000
Kontrolliks kõrvale traditsiooniline tulpdiagramm
barplot(tulemused, beside=TRUE, legend=TRUE, ylim=c(8, 12))
ning joontega diagramm. Ka siin ei leidnud head lahendust kõikide joonte korraga kuvamiseks. Toimis aga nõnda, et esimese joone sain plot-i abil ning teise (ja vajadusel järgnevad) lines käsust (rohkematena tõenäoliselt tsüklisse panduna).
plot(tulemused[1, ], type="l", ylim=c(10, 12))
lines(tulemused[2, ])
ggplot polnud siiani vedu võtnud, püüdsin edasi juhiste järgi käia. Andmed pikale kujule
pikk=melt(tulemused)
pikk
## Var1 Var2 value
## 1 F 1 10.58282
## 2 M 1 11.45033
## 3 F 2 10.68987
## 4 M 2 11.60811
## 5 F 3 10.22156
## 6 M 3 11.30000
tulpadele uued nimed. Saadud maatriksiga võiks nagu rahule jääda.
names(pikk)=c("sugu", "semester", "tulemus")
pikk
## sugu semester tulemus
## 1 F 1 10.58282
## 2 M 1 11.45033
## 3 F 2 10.68987
## 4 M 2 11.60811
## 5 F 3 10.22156
## 6 M 3 11.30000
Õpetuses soovitatud käsk tööle, kuid esimese katse peale tuli hoopis veateade
Error in aes(x = semester, y = tulemus, group = sugu, color = sugu) + : non-numeric argument to binary operator
#ggplot(pikk, aes(x=semester, y=tulemus, group=sugu, color=sugu)+geom_line()+geom_point()+theme_bw())
Piilusin veidi õpetusi ning siis õnnestus joonis kokku saada juhul, kui aes-käsk läks mitte ggploti, vaid seal järel oleva geom_line käsu sisse.
ggplot(pikk)+geom_line(aes(x=semester, y=tulemus, group=sugu, color=sugu))