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

Jooniste katsetused

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))