--- title: "Ülesanne 2" author: "Jaagup Kippar" date: "13 aprill 2016" output: word_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` # Perioodide õpitulemuste erinevuse uuring ## Ülesande kirjeldus 1. Loe jälle sisse ka 1. ülesandes kasutatud andmefail "student-mat.csv" 2. Kasuta funktsiooni str(), et näha andmefaili struktuuri. Kogu väljund peaks nüüd olema arusaadav... 3. Lisa andmefailile tulp "diff", mis on teise perioodi ja esimese perioodi hinde vahe. 4. Kas see on nii? Milline situatsioon andmetes valitseb? (Kasuta funktsioone summary() ja hist()) 5. Milles on asi? Selle mõistmiseks võrdle muutujaid G1 ja G2. Seda on hea teha nt kõrvutades kaks histogrammi. Ühele joonisele kohakuti histogrammide saamiseks jooksuta kõigepealt kood par(mfrow = c(2, 1)) ja seejärel kummagi histogrammi kood. Et x-teljed oleksid võrreldavad, kasuta parameetrit xlim. Lisaks võib olla hea mõte muuta parameetrit breaks. 6. Muuda muutuja G2 0-väärused R-i puuduvaks väärtuseks (NA). 7. Kontrolli, et asi õnnestus: leia mitu puuduvat väärtust on nüüd antud tulbas. Vihje: hea viis seda saavutada on kasutada ära fakti, et sisemiselt on R-i jaoks FALSE 0 ja TRUE 1 (proovi konsoolis TRUE + 1 + FALSE). Seega saab vastuse lihtalt luues vektori, kus puuduv väärtus on TRUE ja mittepuuduv väärtus on FALSE ning leida nende väärtuste summa. (Loetavam alternatiiv on kasutada funktsiooni which(), et luua vektor ainult puuduvate väärtustega ja siis funktsiooni length(), et leida, kui pikk see vektor on ehk mitu neid on. Soovituslik harjutus on ka seda varianti proovida!) Ära unusta, et R-is on puuduvate väärtuste tuvastamiseks eraldi funktsioon! 8. Arvuta tulp "diff"" (teise ja esimese perioodi hinde vahe) uuesti ning tee uus histogram. (Selleks, et saada jälle kogu ala hõlmav joonis nagu tavaliselt, jooksuta kõigepealt käsk par(mfrow = c(1,1)) ; vastasel korral kehtib eelmine par() funktsiooni toime, mis jaotas "joonistusala" kaheks osaks.) Kas pole kenam? 9. Leia ka erinevuse keskmine. 10. Lisa andmetele tulp, kus erinevuse suuruse põhjal on loodud 4 gruppi. Kasuta selleks funktsiooni cut() ja gruppide loomise aluseks kvantiile. (Kasuta ainult funktsiooni cut() kaht esimest parameetrit.) 11. Mitu puuduvat väärust on loodud gruppide muutujas? Mõtle tagasi puuduvate väärtuste arvule muutujas G2 - kas tulemus on ootuspärane? 12. Leia muutuja diff väärtus, mille korral grupitunnus on puuduv väärtus. (Vali andmetest tulp diff ja rida, kus grupitunnus on puuduv ja diff ei ole puuduv) 13. Leia cut() funktsiooni help file-st parameeter, mis võiks selle olukorra põhjuseks olla, muuda selle väärtust ja arvuta grupitunnus uuesti; anna gruppidele ka nimed. Kontrolli, et grupitunnuse ja G2 (või diff) puuduvate väärtuste arv on võrdne. 14. Tee histogram madalama grupi tüdrukute puudumiste kohta 15. Leia kahe madalama grupi puudumiste keskmine. 16. Leia kahe madalama grupi puudumiste keskmine ainult poistel. 17. Leia mitme tüdruku puudumiste arv ületab poiste maksimum puudumiste arvu (Vihje: kasuta sama trikki nagu puuduvate väärtuste leidmisel või leia tingimusele vastav andmete alaosa ja siis selle suurus; võite proovida teha seda ühe reaga.) ## Andmed sisse ```{r} andmed=read.table("student-mat.csv", header=TRUE, sep=";", dec=",") ``` ## str-käsu abil andmete struktuuri ülevaade ```{r} str(andmed) ``` ## Tulemuste vahemikud kummalgi perioodil ```{r} summary(andmed$G1) summary(andmed$G2) ``` ## Tulpade väärtuste vahe ```{r} andmed$diff=andmed$G2-andmed$G1 ``` ## Vahe väljatrükk ```{r} andmed$diff ``` ## Jaotuse ülevaade Arvudest paistab, et järgneval semestril läksid tulemused kuni 4 punkti tugevamaks või kuni 12 punkti nõrgemaks ```{r} summary(andmed$diff) hist(andmed$diff, main="Tulemuste erinevuse histogramm", ylab="Esinemissagedus", xlab="Erinevus punktides") ``` ## Tulemuste erinevuse väljatrükk Ülemisel real on esinev väärtus, selle all väärtuse esinemissagedus Enim (117) jäi tulemusi samaks. ```{r} table(andmed$diff) ``` Keskmiselt tulemused halvenesid 0,19 punkti ```{r} mean(andmed$diff) ``` standardhälbega 1.97 punkti. ```{r} sd(andmed$diff) ``` Mediaantulemus ei muutunud. ```{r} median(andmed$diff) ``` Negatiivne assümmeetriakordaja (skewness) näitab, et jaotus on kallutatud vasakule, keskmisest tugevalt väiksemad väärtused nihutavad aritmeetilise keskmise mediaanist väiksemaks. Funktsiooni *skewness* käivitamiseks tuleb laadida teek nimega e1091. Kui seda pole installeeritud, siis saab seda teha käsuga install.packages("e1091") ```{r} library(e1071) skewness(andmed$diff) ``` # Tulemuste jaotus periooditi Ühele joonistusalale üksteise alla kaks joonist (mfrow 2 rida, 1 veerg) ```{r} #knitr::opts_chunk$set(fig.asp = 2) #ei taha muutuda #plot.window(c(0, 5), c(0, 10)) #ikka ei mõju par(mfrow=c(2, 1)) hist(andmed$G1, xlim=c(0, 20), breaks=0:20, main="Esimese perioodi punktid", ylab="esinemissagedus", xlab="punktide arv õpilasel") hist(andmed$G2, xlim=c(0, 20), breaks=0:20, main="Teise perioodi punktid", ylab="esinemissagedus", xlab="") ``` Joonistusrežiim tagasi ühele joonisele joonistusala kohta ```{r} par(mfrow=c(1,1)) ``` # Kahtlused lähteandmete tähenduses ## Tulemuste esinemissagedused periooditi ```{r} table(andmed$G1) table(andmed$G2) ``` Esimesel perioodil nullpunktilisi tulemusi polnud, teisel oli neid kogunisti kolmteist tükki. Võib kahtlustada, et nullid tähendavad hoopiski väärtuste puudumist. Teisel perioodil puuduva tulemusega õpilaste esimese perioodi keskmine tulemus on kõikide õpilaste esimese perioodi keskmisest tulemusest rohkem kui kolme punkti jagu madalam. ```{r} mean( andmed$G1[andmed$G2==0]) mean(andmed$G1) ``` Võtame vastu otsuse asendada nullpunktilised tulemused puuduvate väärtustega (NA). ```{r} andmed$G2[andmed$G2==0]=NA andmed$G2 ``` Tabelist võib näha, et neid on 13 tükki. ```{r} table(andmed$G2, useNA="always") ``` Nüüd histogrammi joonistades paistab, et pole enam teise perioodi nullilisi tulemusi. ```{r} par(mfrow=c(2, 1)) hist(andmed$G1, xlim=c(0, 20), breaks=0:20, main="Esimese perioodi punktid", ylab="esinemissagedus", xlab="punktide arv õpilasel") hist(andmed$G2, xlim=c(0, 20), breaks=0:20, main="Teise perioodi punktid", ylab="esinemissagedus", xlab="") par(mfrow=c(1,1)) ``` Igaks juhuks puuduvate väärtuste arvu kontroll. Tulbas G2 oli endisi nulle ja nüüdseid NA-sid 13. ```{r} sum(is.na(andmed$G2)) which(is.na(andmed$G2)) length(which(is.na(andmed$G2))) ``` Leiame õpilaste teise ja esimese perioodi punktide vahe uuesti. Kus üks väärtus puudub (NA), seal ka ```{r} andmed$diff=andmed$G2-andmed$G1 ``` Kus üks väärtus puudub (NA), seal ka tulemuse juures NA ```{r} andmed$diff ``` Väärtuste nüüdsed sagedused. Endiselt on enim õpilasi, kelle punktide arv jäi mõlemas perioodis samaks. Ühel õpilasel langes nelja võrra, neljal õpilasel tõusis nelja võrra, teistel muutus vähem. ```{r} table(andmed$diff) ``` Soovides näha ka puuduvaid väärtusi, tuleb see eraldi märkida ```{r} table(andmed$diff, useNA = "always") ``` Erinevuste jaotus. Pikk miinustega "saba" on kadunud. Erinevuste nõrgalt positiivne aritmeetiline keskmine näitab, et punktide arv teisel perioodil on pigem veidi suurem. ```{r} summary(andmed$diff) ``` ning histogramm ```{r} hist(andmed$diff, main="Tulemuste erinevuse histogramm", ylab="Esinemissagedus", xlab="Erinevus punktides") ``` Keskmise ```{r} mean(andmed$diff, na.rm=TRUE) ``` standardhälbe ```{r} sd(andmed$diff, na.rm=TRUE) ``` ja vahemiku leidmiseks peab eraldi ütlema, et puuduvad (NA) väärtused eemaldatakse arvutamisel. ```{r} range(andmed$diff, na.rm=TRUE) ``` # Rühmitamine Jagame vahed gruppidesse vastavalt kvantiilile ```{r} grupid=cut(andmed$diff, quantile(andmed$diff, na.rm=TRUE)) ``` Igale algsele väärtusele vastab nüüd vahemik, millese ta kuulub. ```{r} grupid ``` Gruppidesse jaotumise sagedus ```{r} table(grupid) ``` Puuduvad väärtused tuleb eraldi välja küsida. Neid on aga üllatuslikult endisest ühe võrra rohkem. ```{r} table(grupid, useNA="always") ``` Kontrollime igaks juhuks üle. Käsk is.na annab tõeväärtusmassiivi, kas loetelus vastav väärtus puudub või mitte. Käsk which näitab tõeste väärtuste järjekorranumbrid ning length loeb lihtsalt kokku, et mitu neid on. ```{r} length(which(is.na(grupid))) ``` Tasub uurima hakata, et milline väärtus siis veel lisaks kaduma läks peale algsete NA-de. Puuduva grupitunnusega elementide numbrid ```{r} which(is.na(grupid)) ``` Puuduvad elemendid periooditulemuste vahedes. ```{r} which(is.na(andmed$diff)) ``` Kuna nad on järjestatud, siis õnnestub ka näpuga järge ajades erinev koht üles leida. Et aga valmis olla suuremate andmete puhul sarnase erinevuse leidmiseks, siis selleks leiab hulkadevahelise erinevuse leidmise käskluse nimega setdiff ```{r} setdiff(which(is.na(grupid)), which(is.na(andmed$diff))) ``` Uurime, et mis väärtus see erinevana leitud 157ndal kohal siis on ```{r} andmed$diff[157] ``` Selgub, et alumises servas asuv väärtus. Hulgatunnustes pole ilmaasjata üks sulg kandiline ja teine ümar. Kandiline tähendab kaasavõetavat osa, ümarsulg välja jäetavat osa. Kõik vahemikud praegusel korral sarnaselt nõnda, et parempoolne väärtus võetakse sisse, vasakpoolne jäetakse välja. Nii jäi ka vähim väärtus gruppi määramata. ```{r} table(andmed$diff, useNA="always") ``` Üksiku õnnetu väärtuse kaasa võtmiseks on cut-funktsioonil eraldi parameeter. ```{r} grupid=cut(andmed$diff, quantile(andmed$diff, na.rm=TRUE), include.lowest = TRUE) ``` Nüüd piirduvad puuduvad grupiväärtused vaid nendega, mis juba vahede tulbas puudu olid. ```{r} table(grupid, useNA = "always") ``` ## Väike kõrvalepõige Omaette mõtisklemise koht neljaks jaotamise juures on, et suur ühesuguste nullide vägi ühendatakse nullist väiksemate grupiga, ehkki ei saa väita, et vastavate õpilaste tulemused kindla peale langenud oleksid. Mõned küll väidavad, et paigaltammumine tähendab tagasiminekut, kuid tõenäoliselt olid uue perioodi ülesanded ka eelmise omast raskemad. Üheks võimaluseks ühesuguste väärtuste korraga ühte gruppi kukkumist tasandada on väärtustele lisada väike juhuslik komponent. Et juhuarvudega tehtud tulemused järgmisel näitamiskorral samasugused tuleksid, aitab käsklus set.seed miski numbriga. ```{r} set.seed(1500) ``` Nüüd paras luua väikese värina abil nihutatud tulemused ```{r} nihutatud=jitter(andmed$diff) ``` neid tulemusi endid vaadata ```{r} nihutatud ``` Ning jälgida, et jaotus iseenesest pole märgatavalt muutunud ```{r} hist(andmed$diff, main="Tulemuste erinevuse histogramm", ylab="Esinemissagedus", xlab="Erinevus punktides") ``` Kvantiilide järgi gruppidesse paigutamine tuleb nüüd aga ühtlasem. ```{r} nihkegrupid=cut(nihutatud, quantile(nihutatud, na.rm=TRUE), include.lowest = TRUE) ``` Saab vaadata, kui palju kusagile gruppi läks ning suur nullide osa enam ei tekita anomaaliat ühes suunas. ```{r} table(nihkegrupid, useNA="always") ``` ## Tagasi algsete gruppide juurde Gruppidele selgituseks nimed ```{r} grupid=cut(andmed$diff, quantile(andmed$diff, na.rm=TRUE), include.lowest = TRUE, labels=c("palju langev", "kuni veidi langev", "tõusev", "palju tõusev")) ``` Kontrolliks väärtuste väljatrükk ```{r} grupid ``` Puuduvate arvu lugemine - salamisi pole enam juurde tulnud ```{r} length(which(is.na(grupid))) ``` Edasise analüüsi huvides lisame grupimuutuja olemasoleva andmetabeli külge. ```{r} andmed$grupid=grupid ``` ## Statistika õpilaste kohta Senine töö oli pelgalt ettevalmistus. Nüüd võimalik vaatama hakata, et kas ja mida võimalik neist andmetest välja lugeda. ```{r} hist(andmed[andmed$sex=="F" & andmed$grupid=="palju langev","absences"], main="Palju langenud tulemustega tüdrukute puudumiste jaotus", xlab="puudumiste arv", ylab="sagedus") ``` Kahe madalama, langenud tulemustega grupi keskmine puudumiste arv ```{r} mean(andmed[andmed$grupid=="kuni veidi langev" | andmed$grupid=="palju langev","absences"], na.rm=TRUE) ``` Madalamate gruppide poiste tulemuste keskmine ```{r} mean(andmed[andmed$sex=="M" & (andmed$grupid=="kuni veidi langev" | andmed$grupid=="palju langev"),"absences"], na.rm=TRUE) ``` Kaks alumist gruppi numbriloetelu abil välja võetuna ```{r} mean(andmed[andmed$sex=="M" & (as.numeric(andmed$grupid) %in% 1:2),"absences"], na.rm=TRUE) ``` Poiste suurim puudumiste arv ```{r} max(subset(andmed, sex=="M")$absences) ``` Tüdrukute puudumised, mis ületavad poiste puudumiste maksimumarvu ```{r} subset(andmed, sex=="F" & absences>max(subset(andmed, sex=="M")$absences))$absences ``` Nende arv ```{r} length(subset(andmed, sex=="F" & absences>max(subset(andmed, sex=="M")$absences))$absences) ``` Sama mitme lühema käskluse abil ```{r} pp=subset(andmed, sex=="M")$absences # poiste puudumised tp=subset(andmed, sex=="F")$absences # tüdrukute puudumised tp[tp>max(pp)] #tüdrukute puudumised, mis ületavad poiste suurimat puudumiste arvu ``` ```{r} ```