#datan puhdistuskoodi# #Haetaan data# data <- read.csv("opintopisteet_tutkinnot_2010_aloittaneet_25v.csv", sep = ";", encoding = "UTF-8", stringsAsFactors = FALSE) #Haetaan koulutusluokitus-koodisto koulutusluokitus <- read.csv("d_koulutusluokitus.csv", sep = ";", encoding = "auto", stringsAsFactors = FALSE) #Asennetaan kirjastot install.packages(c("dplyr", "tidyr", "lubridate")) library(dplyr) library(tidyr) library(lubridate) #Valitaan koulutusluokitus-taulukosta halutut sarakkeet #Filtteroidaan pois rivit joista puuttuu tieto tutkintotyyppi-sarakkeesta koulutusluokitus <- koulutusluokitus %>% select(koulutusluokitus_koodi, koulutusalataso1_fi, koulutusluokitus_fi, tutkintotyyppi_fi) %>% filter(tutkintotyyppi_fi != "Tieto puuttuu") #filter(koulutusalataso1_fi != "Tieto puuttuu") #Luodaan uusi taulukko, johon otetaan datasta tietyt sarakkeet opiskelijat <- data[,c(1:11, 17:18, 25:36)] #Muokataan uutta taulukkoa lisaamalla 'uusiavain', johon yhdistetaan opiskelijaAvain, #organisaatio_koodi ja koulutuskoodi opiskelijat <- opiskelijat %>% mutate(uusiavain = paste0(opiskelijaAvain, "_", organisaatio_koodi, "_", koulutuskoodi)) #Luodaan uusi taulukko, jossa groupataan sarakkeita ja poistetaan sarakkeet, joissa #on useampi aloitus- ja lopetusvuosi opiskelijat2 <- opiskelijat %>% group_by_at(setdiff(names(opiskelijat), c("aloitusvuosi", "tutkintovuosi", "ika_valmistuessa", "hyvaksiluettu_opsyys","hyvaksiluettu_opkevat", "avoimessa_opsyys", "avoimessa_opkevat", "ulkomaa_opsyys","ulkomaa_opkevat"))) %>% summarise(aloitusvuosi_min = min(aloitusvuosi), tutkintovuosi_max = max(tutkintovuosi), hyvaksiluettu_opkevat_max = max(hyvaksiluettu_opkevat), hyvaksiluettu_opsyys_max = max(hyvaksiluettu_opsyys), avoimessa_opkevat_max = max(avoimessa_opkevat), avoimessa_opsyys_max = max(avoimessa_opsyys), ulkomaa_opkevat_max = max(ulkomaa_opkevat), ulkomaa_opsyys_max = max(ulkomaa_opsyys), ika_valmistuessa_max = max(ika_valmistuessa)) #Luodaan uusi taulukko jossa liitetaan aikaisemmin karsitut sarakkeet takaisin data2 <- data %>% mutate(uusiavain = paste0(opiskelijaAvain, "_", organisaatio_koodi, "_", koulutuskoodi)) %>% mutate(opintopisteet = opsyys + opkevat) %>% mutate(hyvaksiluetut = hyvaksiluettu_opsyys + hyvaksiluettu_opkevat) %>% mutate(avoimessa_opinnot = avoimessa_opsyys + avoimessa_opkevat) %>% mutate(opinnot_ulkomailla = ulkomaa_opsyys + ulkomaa_opkevat) %>% select(uusiavain, lukuvuosi, opintopisteet, hyvaksiluetut, avoimessa_opinnot, opinnot_ulkomailla) %>% distinct() %>% left_join(opiskelijat2, by = "uusiavain") %>% mutate(lukuvuosi_vuosi = as.numeric(substr(lukuvuosi, 2, 5))) %>% mutate(jarjestysvuosi = lukuvuosi_vuosi - aloitusvuosi_min + 1) %>% select(-lukuvuosi, -lukuvuosi_vuosi) #lisätään koulutuskooditiedot data2 <- inner_join(x = data2, y = koulutusluokitus, by = c("koulutuskoodi" = "koulutusluokitus_koodi")) #Luodaan uusi taulukko, jossa pivotoidaan jarjestysvuoden mukaan opintopisteet data3 <- data2 %>% group_by_at(setdiff(names(data2), c("opintopisteet", "hyvaksiluetut", "avoimessa_opinnot", "opinnot_ulkomailla"))) %>% summarise(opintopisteet_max = max(opintopisteet)) %>% pivot_wider(names_from = jarjestysvuosi, values_from = opintopisteet_max) %>% distinct() #yhdistetään syys ja kevät data5 <- data3 %>% mutate(hyvaksiluettu = hyvaksiluettu_opkevat_max + hyvaksiluettu_opsyys_max, avoimessa_opinnot = avoimessa_opkevat_max + avoimessa_opsyys_max, ulkomailla_opinnot = ulkomaa_opkevat_max + ulkomaa_opsyys_max) names(data5)[30] <- "ensimmaisen_vuoden_op" #names(data5)[28] <- "toisen_vuoden_op" #names(data5)[29] <- "kolmannen_vuoden_op" #################################################################################################### #Päätöspuu ja randomforest #Luodaan uusi taulukko päätöspuuta varten# #kommentoiduilla riveilla voi muuttaa filtterointeja clean <- data5 %>% ungroup() %>% filter(sukupuoli != 9) %>% #filter(sektori == "AMK") %>% filter(ensimmaisen_vuoden_op < 100) %>% #filter(ensimmaisen_vuoden_op >= 1) %>% #filter(koulutusalataso1_fi == "Kauppa, hallinto ja oikeustieteet") select(sukupuoli, ika_aloittaessa, tavoiteajassa_valmistunut, on_aiempi_tutkinto, ensimmaisen_vuoden_op, hyvaksiluettu, avoimessa_opinnot, ulkomailla_opinnot) %>% na.omit() #kategorisoidaan jatkuvat muuttujat kategorisiksi clean <- clean %>% select(sukupuoli, ika_aloittaessa, tavoiteajassa_valmistunut, on_aiempi_tutkinto, ensimmaisen_vuoden_op, hyvaksiluettu, avoimessa_opinnot, ulkomailla_opinnot) %>% mutate(ensimmaisen_vuoden_op = cut(ensimmaisen_vuoden_op, breaks = c(-1, 20, 60, 100), labels = c("0-20op", "20-60op", "60-100op"))) %>% #mutate(toisen_vuoden_op = cut(toisen_vuoden_op, breaks = c(-1, 50, 999), labels = c("alle50", "yli50"))) %>% #mutate(kolmannen_vuoden_op = cut(kolmannen_vuoden_op, breaks = c(-1, 0, 20, 60, 100), labels = c("0", "0-20", "20-60", "60-100"))) %>% mutate(hyvaksiluettu = cut(hyvaksiluettu, breaks = c(-1, 0, 999), labels = c("Ei_hyvaksilukuja", "Hyvaksilukuja"))) %>% mutate(avoimessa_opinnot = cut(avoimessa_opinnot, breaks = c(-1, 0, 999), labels = c("Ei_suorituksia_avoimessa", "Suorituksia_avoimessa"))) %>% mutate(ulkomailla_opinnot = cut(ulkomailla_opinnot, breaks = c(-1, 0, 999), labels = c("Ei_opintoja_ulkomailla", "Opintoja_ulkomailla"))) %>% na.omit() #muutetaan binääriset faktoreiksi, saattaa sisaltaa ylimaaraisia komentoja clean <- clean %>% mutate(sukupuoli = factor(sukupuoli, levels = c(1, 2), labels = c('Mies', 'Nainen')), on_aiempi_tutkinto = factor(on_aiempi_tutkinto, levels = c(0, 1), labels = c('Ei_aiempaa_tutkintoa', 'On_aiempi_tutkinto')), #ensimmaisen_vuoden_op = factor(ensimmaisen_vuoden_op), #toisen_vuoden_op = factor(toisen_vuoden_op), hyvaksiluettu = factor(hyvaksiluettu), avoimessa_opinnot = factor(avoimessa_opinnot), ulkomailla_opinnot = factor(ulkomailla_opinnot), tavoiteajassa_valmistunut = factor(tavoiteajassa_valmistunut, levels = c(0, 1), labels = c('Ei_t_ajassa', 'Valm_t_ajassa'))) #päätöspuu ja randomforest # Ladataan tarvittavat kirjastot install.packages(c("rpart", "rpart.plot")) library(rpart) # kirjasto päätöspuita varten library(rpart.plot) # kirjasto päätöspuukuvia varten # Asetetaan satunnaislukugeneraattori vakiotilaan set.seed(101) # Jaetaan datasetti opetussettiin ja testisettiin train <- sample(nrow(clean), 0.7*nrow(clean), replace = FALSE) TrainSet <- clean[train,] ValidSet <- clean[-train,] # Rakennetaan päätöspuu (opetetaan opetussetillä), control sisaltaa hyperparametrit joita muuttamalla paatospuun rakenne muuttuu tree1 <- rpart(tavoiteajassa_valmistunut ~ ., data = TrainSet, method = "class", control = rpart.control(cp=0.001, minsplit = 10, minbucket = 10, maxdepth = 4)) # Piirretään päätöspuu, extra parametria muuttamalla saa puuhun lisatietoja rpart.plot(tree1, cex = 0.6, type = 2, extra = 101) #tai rpart.plot(tree1, cex = 0.6, type = 5, extra = 106) #tai rpart.plot(tree1, box.palette="RdBu", shadow.col="gray", nn=TRUE, cex = 0.6, roundint = FALSE, extra = 106) # Ennustus testisetillä pred.tree <- predict(tree1, ValidSet) predict_unseen <-predict(tree1, ValidSet, type = 'class') table_mat <- table(ValidSet$tavoiteajassa_valmistunut, predict_unseen) table_mat accuracy_Test <- sum(diag(table_mat)) / sum(table_mat) print(paste('Accuracy for test', accuracy_Test)) # Ennustus treenisetillä test.tree <- predict(tree1, TrainSet) predict_test_unseen <-predict(tree1, TrainSet, type = 'class') table_mat <- table(TrainSet$tavoiteajassa_valmistunut, predict_test_unseen) table_mat accuracy_Test <- sum(diag(table_mat)) / sum(table_mat) print(paste('Accuracy for test', accuracy_Test)) ##################### # Random Forest # Ladataan kirjasto satunnaismetsämenetelmää varten install.packages("randomForest") library(randomForest) # Asetetaan satunnaislukugeneraattori vakiotilaan set.seed(100) # Jaetaan datasetti opetussettiin ja testisettiin trainrandom <- sample(nrow(clean), 0.7*nrow(clean), replace = FALSE) TrainSetRandom <- clean[train,] ValidSetRandom <- clean[-train,] # ajetaan satunnaismetsa algoritmi tavoiteajassavalmistunut <- randomForest(tavoiteajassa_valmistunut ~ ., data = TrainSetRandom, importance = TRUE, mtry = 2, ntree = 500) tavoiteajassavalmistunut # Piirretaan muuttujien tärkeys, muuttamalle type "2" saadaan MeandecreaseGini importance(tavoiteajassavalmistunut) varImpPlot(tavoiteajassavalmistunut, type = 1)