--- title: '9' author: "Jaagup Kippar" output: html_document --- # Faktorid Kataloog paika ```{r} setwd("c:/jaagup/16/analyytika/9") ``` Andmed loetakse sisse komadega eraldatud failist ```{r} head(read.csv("Pisa1.csv")) ``` või semikoolonitega eraldatud failist ```{r} head(read.csv2("Pisa2.csv")) ``` Komasid eraldajatena eeldades kui tegelikult on semikoolonid, saadakse kõik pealkirjad kokku üheks tulbanimeks. Kui andmete seas on aga mõni koma, siis see tekitab eraldi tulba mille peale pahandatakse. ```{r} #read.csv("Pisa2.csv") #Error in read.table(file = file, header = header, sep = sep, quote = quote, : # more columns than column names ``` Vastupidisel juhul aga tulevad tulbanimed taas kokku üheks tulbaks ning üheks tulbaks (faktori tüüpi) lähevad ka andmed - kuna neil eraldavat semikoolonit sisse ei satu. ```{r} head(read.csv2("Pisa1.csv")) ncol(head(read.csv2("Pisa1.csv"))) colnames(head(read.csv2("Pisa1.csv"))) class(head(read.csv2("Pisa1.csv"))[, 1]) ``` Ridade ja veergude arv tabelis ```{r} Pisa=read.csv("Pisa1.csv") nrow(Pisa) ncol(Pisa) ``` Tulpade lühitutvustus ```{r} str(Pisa) ``` #Suurem andmekogum ```{r} load("Pisa.rda") #str(Pisa) class(Pisa) colnames(Pisa) nrow(Pisa) ncol(Pisa) ``` Keelte loetelu algus ```{r} head(Pisa$LANGN) ``` Keeled ja nende sagedused (algus) ```{r} head(table(Pisa$LANGN)) ``` Sagedused data.frame-na (jääb selgusetuks, mis oludes tavaline table-tüüpi klass hea on) ```{r} sagedused=as.data.frame(table(Pisa$LANGN)) #sagedused ``` Keeled, mida on vähemalt ühel korral mainitud ```{r} sagedused[sagedused$Freq>0, ] ``` Keelte nimed, mida on mainitud rohkem kui 50 korda ```{r} levinumad=sagedused[sagedused$Freq>50, "Var1"] levinumad ``` Reanumbrid, kus vastava kirje keele sagedus ei ületa viitkümmet. ```{r} which(!(Pisa$LANGN %in% sagedused[sagedused$Freq>50, "Var1"])) ``` Need võtan analüüsist välja ja määran keele NA-ks ```{r} Pisa$LANGN[!(Pisa$LANGN %in% levinumad)]=NA ``` Vaatan, mis tüübina hoitakse keeleandmeid ```{r} class(Pisa$LANGN) ``` Jätan alles faktori lubatud väärtusteks vaid levinumad keeled - ennem olid muud väärtused tühjaks muudetud. ```{r} Pisa$LANGN=factor(Pisa$LANGN, levels=levinumad) ``` Tulemuse kontroll ```{r} head(Pisa$LANGN) ``` Sageduse jaotus, omaette rühma moodustavad NA-d ```{r} table(Pisa$LANGN, useNA = "always") ``` #Tulpade info ```{r} head(attributes(Pisa)$variable.labels) ``` ## Isaga seotud tulbad Isa haridustase ```{r} head(Pisa$FISCED) ``` Kas on rakenduskõrgharidus (5B) ```{r} head(Pisa$ST10Q02) ``` Kas kutseharidus keskhariduse baasil (4B) ```{r} head(Pisa$ST03Q03) #haridus=Pisa[, c("MISCED", "FISCED")] ``` Millistel ridadel puuduvad väärtused ema haridustaseme kohta ```{r} which(is.na(Pisa$MISCED)) ``` Millistel puuduvad isa haridustaseme kohta ```{r} which(is.na(Pisa$FISCED)) ``` Mõlema haridus teadmata ```{r} which(is.na(Pisa$MISCED)) %in% which(is.na(Pisa$FISCED)) ``` #Katsetused seoste leidmisel isa ja ema haridustaseme teadmatuse suhtes Osakaal, kel ema haridus teadmata ```{r} (t1=sum(is.na(Pisa$MISCED)) / length(Pisa$MISCED)) ``` Osakaal, kel ema haridus teadmata neist kel ka isa haridus teadmata ```{r} (t2=sum(which(is.na(Pisa$MISCED)) %in% which(is.na(Pisa$FISCED))) / sum(is.na(Pisa$FISCED)) ) ``` Kui isa haridustase on teadmata, siis on tõenäosus, et ka ema oma on teadmata `r round(t2/t1, 1)` korda suurem. Püüan kindlaks teha, et kas see erinevus on tingitud lihtsalt sellest, et mõne lapse puhul on vähem andmeid kirjas, või mõjutab ühe vanema detailsete (haridustase) andmete puudumine eraldi ka teise vanema kohta samade andmete olemasolu - rohkem kui mõne muu tunnuse oma. Katsun leida vanematest võimalikult sõltumatu tunnuse, millel oleks sobiv kogus puuduvaid väärtusi - mitte otse ühe ega teise äärmuse juures. ```{r} puuduvad=unlist(lapply(colnames(Pisa), function(cname){sum(is.na(Pisa[, cname]))})) puuduvad ``` Lisan andmestiku elementidele ka nimed. "Tavalisele" programmeerijale ehk tundubki R-i ühe omapärasema omadusena, et igasugustele väärtustele saab nimetuse juurde panna, et millega parasjagu tegemist on. ```{r} names(puuduvad)=colnames(Pisa) puuduvad ``` Valin tulba, mis näitab, kas füüsikas on sel aastal lisakursus võetud. Loen kokku, mitmel korral on väärtus teadmata. ```{r} sum(is.na(Pisa$ST33Q62)) ``` Tulba väärtuste puudumise sageduse jaotus võrrelduna ema haridustaseme teadaoleku puudumise sageduste jaotusega. ```{r} table(is.na(Pisa$ST33Q62), is.na(Pisa$MISCED)) ``` Sama isa puhul. ```{r} table(is.na(Pisa$ST33Q62), is.na(Pisa$FISCED)) ``` Mõningad erinevused olemas, aga püüan välja selgitada, kas erineb vaid väärtuste arv või on ka suhte erinevus vastavalt vanema soole. Mugavamaks töötlemiseks andmed data.frame kujule ```{r} sagedused=as.data.frame.matrix(table(is.na(Pisa$ST33Q62), is.na(Pisa$MISCED))) ``` Ridadeks teadmine füüsika lisakursuse kohta, veergudeks teadmine ema haridustaseme kohta Ühtlasi siin mõtisklen, et kuidas seda saaks selgemalt väljendada. Ning kas R-il on mõni enamvähem standardne ja mugav vahend ka tabelite esitamiseks - nii et sinna saab peal/allkirju panna ning rea ja veeru kohta sobivat seletavat teksti. Ning et see pärast HTMLis või mujal mugavalt nähtav oleks. Kui on kindla suurusega tabel, siis saab selle vastavate käskudega valmis ehitada. Kui aga suurus teadmata, siis kuluks mõni kavalam moodus ära. ```{r} sagedused ``` Lisatulp arvutamaks kokku, kui palju oli lisakursusest teadlikke ja kui palju mitte. Sama tulemuse võiks anda ka ```{r} sagedused$kokku=cbind(rowSums(sagedused)) sagedused ``` Millegipärast aga cbind-i abil lisatud tulba puhul ei suudeta pärast rbind-i juures ühte rida juurde panna. Veateade: Error in rbind(deparse.level, ...) : replacement has length zero Samas kui uue tulba lisamisel esimese kahe tulba väärtused lihtsalt kokku liita, siis kannatab ka pärast ridu kokku liita ja sama muutuja alla salvestada. ```{r} sagedused$kokku=sagedused[, 1]+sagedused[, 2] sagedused ``` Tulemused samuti ridade kaupa kokku ```{r} sagedused=rbind(sagedused, sagedused[1, ]+sagedused[2, ]) sagedused ``` Loodud kolmandale reale ka nimi ```{r} rownames(sagedused)[3]="kokku" sagedused ``` Neljandaks reaks kahe esimese rea suhe. Siis näha, kuivõrd vanema haridustaseme teadmine mõjutab teadmist füüsika lisakursuse kohta. ```{r} sagedused=rbind(sagedused, sagedused[1, ]/sagedused[2, ]) rownames(sagedused)[4]="suhe" sagedused ``` Keskmiselt pole iga 17nda kohta teada, kas laps võttis sel aastal lisakursust füüsikas. Kus lapse ema haridustase pole teada, sellisel juhul pole iga 11nda lapse kohta teada, kas ta võttis sel aastal lisakursust füüsikas. Ema hariduse mitteteadmine on vähendab konkreetse muu tulba kohta teadmist `r round(sagedused["suhe", 1]/sagedused["suhe", 2], 2)` korda. Sama arvutuskäik isa haridustaseme puudumise puhul ```{r} sagedusedisa=as.data.frame.matrix(table(is.na(Pisa$ST33Q62), is.na(Pisa$FISCED))) sagedusedisa["suhe", ]=sagedusedisa[1, ]/sagedusedisa[2, ] sagedusedisa ``` Isa haridusandmete mitteteadmise puhul teatakse füüsika lisakursuse olemasolu `r sagedusedisa["suhe", 1]/sagedusedisa["suhe", 2]` korda vähem kui teadmise puhul. Võrrelduna ema haridusandmete puudumisega on isa haridustaseme teadmise puudumise korral veel `r round((sagedusedisa["suhe", 1]/sagedusedisa["suhe", 2]) / (sagedused["suhe", 1]/sagedused["suhe", 2]), 1) ` korda vähem tõenäoline, et õppur teaks, kas tal on parajasti lisakursus füüsikas. ## Vanemate õpiaastate arvu ja kontrolltööpunktide seos Seos matemaatikaga ```{r} cor(Pisa$PARED, Pisa$PVMATH, use="complete.obs") ``` Matemaatika ja lugemisoskuse tulemuste seos ```{r} cor(Pisa$PVREAD, Pisa$PVMATH, use="complete.obs") ``` Lugemisoskusel paistab vanemate haridustee pikkusega olema väiksem seos kui matemaatikatulemustel. ```{r} cor(Pisa$PARED, Pisa$PVREAD, use="complete.obs") ``` #Haridustasemete järgi eristamine Kõige selgemaks tundus ikkagi olema FISCED - tulp. Seal aga mitu väärtust vahel korraga sees - vist oludes, kus mitu haridust omandatud. Otsustasin võtta kõrgeima ning selle järgi väärtuse sisse panna. Kõigepealt määrasin haridusandmed puuduvaks. ```{r} Pisa$isaharidus=NA ``` Kel oli kirjas tase ISCED 0 - sellele panin kirja alghariduse. ```{r} Pisa$isaharidus[grepl(pattern="ISCED 0", x=Pisa$FISCED)]="alg" ``` ISCED 1 või 2 annab põhihariduse - sõltumata sellest, kas alghariduse märge eraldi kirjas või mitte ```{r} Pisa$isaharidus[grepl(pattern="ISCED 1", x=Pisa$FISCED)]="põhi" Pisa$isaharidus[grepl(pattern="ISCED 2", x=Pisa$FISCED)]="põhi" ``` Muude kõrgemate tasemetega sama lugu. ```{r} Pisa$isaharidus[grepl(pattern="ISCED 3", x=Pisa$FISCED)]="kesk" Pisa$isaharidus[grepl(pattern="ISCED 4", x=Pisa$FISCED)]="kesk" Pisa$isaharidus[grepl(pattern="ISCED 5", x=Pisa$FISCED)]="kõrg" Pisa$isaharidus[grepl(pattern="ISCED 6", x=Pisa$FISCED)]="kõrg" ``` Haridustasemete jaotus isadel ```{r} table(Pisa$isaharidus) ``` Kontrolliks esimese kümne isa hariduse väljund. Ehkki tulp oli faktorina, suutis grepl sealt seest teksti otsida. ```{r} Pisa[1:10, c("isaharidus", "FISCED")] ``` Sama operatsioon emadega. Tõenäoliselt saaks seda tsükli või mõne kavalama käsu abil ka lühemalt vormistada. ```{r} Pisa$emaharidus=NA Pisa$emaharidus[grepl(pattern="ISCED 0", x=Pisa$MISCED)]="alg" Pisa$emaharidus[grepl(pattern="ISCED 1", x=Pisa$MISCED)]="põhi" Pisa$emaharidus[grepl(pattern="ISCED 2", x=Pisa$MISCED)]="põhi" Pisa$emaharidus[grepl(pattern="ISCED 3", x=Pisa$MISCED)]="kesk" Pisa$emaharidus[grepl(pattern="ISCED 4", x=Pisa$MISCED)]="kesk" Pisa$emaharidus[grepl(pattern="ISCED 5", x=Pisa$MISCED)]="kõrg" Pisa$emaharidus[grepl(pattern="ISCED 6", x=Pisa$MISCED)]="kõrg" ``` Emade hariduse jaotus ```{r} table(Pisa$emaharidus) ``` Kontroll ```{r} Pisa[1:10, c("emaharidus", "MISCED")] ``` Ümberjärjestus, nii et põhiharidust loetakse vähimaks - algharidust eraldi ei paistnud selles andmestikus leiduma. ```{r} Pisa$isaharidus=factor(Pisa$isaharidus, levels=c("põhi", "kesk", "kõrg")) ``` Sama emade juures ```{r} Pisa$emaharidus=factor(Pisa$emaharidus, levels=c("põhi", "kesk", "kõrg")) ``` Haridustasemete kooseksisteerimine ```{r} table(Pisa$isaharidus, Pisa$emaharidus) ``` Juurde ka puuduvad väärtused. Eraldi rea/veeruprotsente leides võiks näha, kas mõne haridustaseme puhul on puuduvate väärtuste osakaal suurem. Silma järgi paistab, et kui üks on puudu, siis ka teine suurema tõenäosusega - ju selle õpilase puhul lihtsalt andmete sisestamisega probleemid olnud. ```{r} table(Pisa$isaharidus, Pisa$emaharidus, useNA="always") ``` Kontroll, et kuidas haridustasemed numbrilisena välja paistavad ```{r} head(Pisa$isaharidus) head(as.numeric(Pisa$isaharidus)) ``` Mudelid teemade kaupa. Lugemisoskus sõltuvana ühe või teise vanema haridustasemest. Paistab, et ema mõju on suurem. ```{r} lm(PVREAD ~ isaharidus, data=Pisa) lm(PVREAD ~ emaharidus, data=Pisa) ``` Ka matemaatika puhul paistab ema mõju suurem olema - vahe pole aga nõnda suur. ```{r} lm(PVMATH ~ isaharidus, data=Pisa) lm(PVMATH ~ emaharidus, data=Pisa) ``` Kui mõlemad kokku võtta, siis tundub, et lugemise puhul on isa haridus eraldi suhteliselt vähese tähtsusega. Pigem on seose põhjustajaks see, et kõrgema haridusega isa juures on sageli ka kõrgema haridusega ema, kes omakorda aitab lapse paremini lugema. ```{r} lm(PVMATH ~ isaharidus+emaharidus, data=Pisa) lm(PVREAD ~ isaharidus+emaharidus, data=Pisa) ``` #Tulbaandmete esitamine Nimed muutuja nimedest ja seletused väärtustest ```{r} tulbad=data.frame(tulbanimi=names(attributes(Pisa)$variable.labels), seletus=unname(attributes(Pisa)$variable.labels)) head(tulbad) ``` Andmed faili. Kui eraldajat ei määranud, siis jäi tühjaks. Ridadele taheti vaikimisi numbrid ette kirjutada, kuid pealkirjareale mitte ning seal tulnuks nõnda üks tulp vähem. ```{r} write.table(tulbad, file="tulbad.csv", sep=",", row.names = FALSE) ``` Failist tagasi loetuna ```{r} cat(paste(readLines("tulbad.csv")[1:8], collapse='\n')) ``` ```{r} ``` ```{r} ``` ```{r} ``` ```{r} ```