library(dplyr)
library(corrplot)
library(GGally)
library(ggplot2)
library(reshape2)
library(caret)
library(mlbench)
library(hydroGOF)
Para essa análise, foram utilizados os dados de cadeiras obrigatórias dos alunos do Curso de Ciência da Computação da Universidade Federal de Campina Grande, UFCG, que concluíram sua graduação. Foram consideradas as médias com as quais as cadeiras foram pagas por cada um.
dados_alunos <- read.csv("alunosUFCGAnon.csv")
dados_aluno_cc <- dados_alunos %>% filter(Cod_Curso == 14102100 & Cod_Evasao == 0 & Tipo == "Obrigatória")
dados_aluno_cc <- dados_aluno_cc %>% mutate(Matricula = factor(Matricula)) %>% arrange(Matricula) %>%
select(Matricula, Cod_Disciplina, Nome_Disciplina, Periodo, Creditos, Media_Disciplina, Situacao, Periodo_Ingresso, Periodo_Relativo)
dados_aluno_cc <- dados_aluno_cc %>% group_by(Matricula) %>% mutate(Media = round(mean(Media_Disciplina), digits = 2)) %>% filter(!is.na(Media))
# storing data as factors insures that the modeling functions will treat such data correctly.
# Factors in R are stored as a vector of integer values with a corresponding set of character values to use when the factor is displayed
# Calulo do CRA
alunos_cra <- dados_aluno_cc %>% mutate(Cra.Crontibute = Media*Creditos) %>% summarise(cra = sum(Cra.Crontibute)/sum(Creditos))
alunos_max_media <- dados_aluno_cc %>% group_by(Matricula, Media_Disciplina) %>% filter(Media_Disciplina == max(Media_Disciplina)) %>% ungroup() %>%
select(Nome_Disciplina, Matricula, Media_Disciplina) %>% mutate(Nome_Disciplina = as.factor(gsub(" ", ".", Nome_Disciplina))) %>%
dcast(Matricula ~ Nome_Disciplina, mean) %>% merge(alunos_cra)
## Using Media_Disciplina as value column: use value.var to override.
alunos_max_media <- bind_cols(alunos_max_media,distinct(dados_aluno_cc %>% select(Matricula, Periodo_Ingresso))%>% select(Periodo_Ingresso)) %>% select(-Matricula1)
## Adding missing grouping variables: `Matricula`
alunos_graduados <- alunos_max_media[complete.cases(alunos_max_media), ]
Como resultado, temos uma matriz completa de alunos por disciplinas.
head(alunos_graduados)
Feito isso, houve a seleção das cadeiras que serão utilizadas para a análise. Dessa forma, os dados do primeiro ao quarto período foram separados dos demais. Os dados do primeiro ao terceiro período, serão utilizados como base para a definir a vizinhança para a filtragem colaborativa e a predição será feita para as cadeiras do quarto período da graduação.
##Organizando os data frames principais
# separando alunos por periodo
primeiro_periodo <- alunos_max_media %>% select(Matricula, cra, CALCULO.DIFERENCIAL.E.INTEGRAL.I, ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA, PROGRAMAÇÃO.I,
LABORATÓRIO.DE.PROGRAMAÇÃO.I, INTRODUÇÃO.A.COMPUTAÇÃO, LEITURA.E.PRODUCAO.DE.TEXTOS, Periodo_Ingresso) %>%
na.omit(primeiro_periodo) %>% arrange(Matricula) %>%
rename(matricula = Matricula, cra = cra,calculo1 = CALCULO.DIFERENCIAL.E.INTEGRAL.I, vetorial = ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA, p1 = PROGRAMAÇÃO.I,
lp1 = LABORATÓRIO.DE.PROGRAMAÇÃO.I, ic = INTRODUÇÃO.A.COMPUTAÇÃO, lpt = LEITURA.E.PRODUCAO.DE.TEXTOS)
head(primeiro_periodo)
## matricula cra calculo1 vetorial p1 lp1 ic lpt Periodo_Ingresso
## 1 B10079 6.37 5.75 5.00 5.0 5.75 7.10 9.5 2007.1
## 2 B10087 1.05 0.00 0.00 0.0 0.00 1.95 7.6 2008.2
## 3 B10088 2.10 0.00 0.15 0.7 0.00 5.20 7.7 2009.2
## 4 B10092 7.10 6.90 4.25 5.0 7.00 7.50 8.5 2009.1
## 5 B10172 4.68 2.70 5.35 6.9 7.10 7.30 8.2 2011.2
## 6 B10192 6.55 5.85 5.00 8.4 8.40 7.80 8.8 2006.1
segundo_periodo <- alunos_max_media %>%
select(Matricula,cra, CALCULO.DIFERENCIAL.E.INTEGRAL.II, FUNDAMENTOS.DE.FÍSICA.CLÁSSICA, TEORIA.DOS.GRAFOS, PROGRAMAÇÃO.II,
LABORATÓRIO.DE.PROGRAMAÇÃO.II, MATEMÁTICA.DISCRETA) %>% na.omit() %>%
arrange(Matricula) %>%
rename(matricula = Matricula, cra = cra,calculo2 = CALCULO.DIFERENCIAL.E.INTEGRAL.II, classica = FUNDAMENTOS.DE.FÍSICA.CLÁSSICA,
grafos = TEORIA.DOS.GRAFOS, p2 = PROGRAMAÇÃO.II, lp2 = LABORATÓRIO.DE.PROGRAMAÇÃO.II, discreta = MATEMÁTICA.DISCRETA)
head(segundo_periodo)
## matricula cra calculo2 classica grafos p2 lp2 discreta
## 1 B10079 6.37 4.200000 5.7 7.8 8.90 8.3 4.050000
## 2 B10092 7.10 5.400000 5.0 5.1 6.70 8.2 5.000000
## 3 B10172 4.68 2.033333 5.5 5.5 4.15 3.0 4.666667
## 4 B10192 6.55 5.400000 6.4 5.0 6.00 8.2 5.000000
## 5 B10199 5.86 5.100000 7.8 5.0 6.30 8.7 5.100000
## 6 B1024 5.91 5.000000 5.3 7.6 8.30 8.7 7.000000
terceiro_periodo <- alunos_max_media %>%
select(Matricula,cra, ESTRUTURA.DE.DADOS.E.ALGORITMOS, LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS, FUNDAMENTOS.DE.FÍSICA.MODERNA,
ALGEBRA.LINEAR.I,PROBABILIDADE.E.ESTATISTICA, TEORIA.DA.COMPUTAÇÃO, GERÊNCIA.DA.INFORMAÇÃO) %>%
na.omit() %>%
arrange(Matricula) %>%
rename(matricula = Matricula, eda = ESTRUTURA.DE.DADOS.E.ALGORITMOS, leda = LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS, moderna = FUNDAMENTOS.DE.FÍSICA.MODERNA,
linear = ALGEBRA.LINEAR.I, prob = PROBABILIDADE.E.ESTATISTICA, tc = TEORIA.DA.COMPUTAÇÃO, gi = GERÊNCIA.DA.INFORMAÇÃO)
head(terceiro_periodo)
## matricula cra eda leda moderna linear prob tc gi
## 1 B10092 7.10 6.60 7.9 8.3 6.1 6.0 7.2 7.7
## 2 B10284 7.14 7.00 7.2 8.3 6.1 5.5 6.9 7.0
## 3 B10304 6.17 5.15 7.0 8.5 6.2 1.2 6.9 8.6
## 4 B10443 7.15 7.00 7.7 8.7 7.2 6.8 7.3 7.9
## 5 B10504 7.12 6.70 8.2 8.3 5.0 6.7 7.0 7.1
## 6 B10644 6.07 5.10 5.2 5.0 5.1 5.0 5.3 4.7
quarto_periodo <- alunos_max_media %>% select(Matricula, cra, PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO, METODOS.ESTATISTICOS, ORG.E.ARQUITETURA.DE.COMPUTADORES.I,
LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES, LÓGICA.MATEMÁTICA, ENGENHARIA.DE.SOFTWARE.I, SISTEMAS.DE.INFORMAÇÃO.I) %>%
na.omit() %>%
arrange(Matricula)%>%
rename(matricula = Matricula, plp = PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO, metodos = METODOS.ESTATISTICOS, oac = ORG.E.ARQUITETURA.DE.COMPUTADORES.I,
loac = LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES, logica = LÓGICA.MATEMÁTICA, es = ENGENHARIA.DE.SOFTWARE.I, si1 = SISTEMAS.DE.INFORMAÇÃO.I)
head(quarto_periodo)
## matricula cra plp metodos oac loac logica es si1
## 1 B10092 7.10 7.0 5.0 7.6 7.1 7.0 6.6 9.3
## 2 B10192 6.55 7.3 5.1 5.8 7.3 6.6 6.3 9.6
## 3 B10199 5.86 5.6 6.5 5.2 8.6 6.2 7.0 5.7
## 4 B10447 8.66 8.1 8.7 8.3 9.2 10.0 9.2 9.6
## 5 B10504 7.12 9.3 6.0 7.2 9.6 8.3 8.1 9.7
## 6 B10644 6.07 5.5 6.4 7.3 8.7 7.0 8.3 8.4
# Unindo os periodos
primeiro_segundo_periodos <- merge(primeiro_periodo, segundo_periodo)
head(primeiro_segundo_periodos)
## matricula cra calculo1 vetorial p1 lp1 ic lpt Periodo_Ingresso
## 1 B10079 6.37 5.750000 5.00 5.0 5.75 7.1 9.5 2007.1
## 2 B10092 7.10 6.900000 4.25 5.0 7.00 7.5 8.5 2009.1
## 3 B10172 4.68 2.700000 5.35 6.9 7.10 7.3 8.2 2011.2
## 4 B10192 6.55 5.850000 5.00 8.4 8.40 7.8 8.8 2006.1
## 5 B10199 5.86 3.666667 6.20 6.1 5.60 7.8 7.0 2005.2
## 6 B1024 5.91 0.000000 5.45 7.5 8.40 7.7 7.0 2010.1
## calculo2 classica grafos p2 lp2 discreta
## 1 4.200000 5.7 7.8 8.90 8.3 4.050000
## 2 5.400000 5.0 5.1 6.70 8.2 5.000000
## 3 2.033333 5.5 5.5 4.15 3.0 4.666667
## 4 5.400000 6.4 5.0 6.00 8.2 5.000000
## 5 5.100000 7.8 5.0 6.30 8.7 5.100000
## 6 5.000000 5.3 7.6 8.30 8.7 7.000000
# Primeiro, segundo e terceiro periodo
primeiro_a_terceiro_periodo <- merge(primeiro_segundo_periodos, terceiro_periodo)
periodos_dados <- merge(primeiro_a_terceiro_periodo, quarto_periodo) %>% select(matricula, everything())
head(periodos_dados)
## matricula cra calculo1 vetorial p1 lp1 ic lpt Periodo_Ingresso
## 1 B10092 7.10 6.90 4.25 5.0 7.0 7.5 8.5 2009.1
## 2 B10504 7.12 4.65 6.30 5.3 7.9 7.6 7.2 2009.1
## 3 B10644 6.07 3.70 5.80 7.0 7.2 8.3 7.2 2010.2
## 4 B10973 6.73 5.60 5.60 7.0 7.7 8.4 6.7 2010.1
## 5 B11044 8.47 8.70 8.60 9.0 8.6 9.1 10.0 2008.1
## 6 B11365 8.35 6.20 8.20 7.9 7.9 9.2 9.3 2010.2
## calculo2 classica grafos p2 lp2 discreta eda leda moderna linear prob
## 1 5.400000 5.000000 5.1 6.7 8.2 5.0 6.6 7.9 8.3 6.1 6.0
## 2 5.000000 5.750000 6.3 7.7 5.0 6.3 6.7 8.2 8.3 5.0 6.7
## 3 4.033333 3.266667 7.9 7.6 7.0 6.5 5.1 5.2 5.0 5.1 5.0
## 4 5.900000 7.400000 5.9 7.4 7.0 6.8 7.0 5.0 7.7 6.7 5.2
## 5 8.400000 7.900000 8.2 8.8 9.4 8.3 8.4 9.4 9.4 9.3 7.2
## 6 6.900000 6.900000 9.2 9.1 9.3 7.6 7.1 8.6 8.2 8.3 7.0
## tc gi plp metodos oac loac logica es si1
## 1 7.2 7.7 7.0 5.0 7.6 7.1 7.0 6.60 9.3
## 2 7.0 7.1 9.3 6.0 7.2 9.6 8.3 8.10 9.7
## 3 5.3 4.7 5.5 6.4 7.3 8.7 7.0 8.30 8.4
## 4 7.6 7.7 7.0 8.6 6.6 5.0 5.8 4.75 8.4
## 5 7.8 7.8 6.8 9.0 8.2 8.8 10.0 8.50 8.4
## 6 7.9 7.7 9.4 8.1 8.2 10.0 8.4 9.10 9.4
COL_QUARTO_PER <- colnames(quarto_periodo %>% select(-cra, -matricula))
COL_QUARTO_PER
## [1] "plp" "metodos" "oac" "loac" "logica" "es" "si1"
Foram usadas algumas funções construídas nessa atividade, na qual essa análise foi baseada. As constantes ‘K’ e ‘NEIGH’ definem valores considerados razoáveis, pelo menos, para a quantidade de vizinhos e o nível mínimo de similaridade entre os alunos.
K= 10
NEIGH = 0.7
A função ‘get_sim’ calcula a similaridade entre os alunos do um data frame ignorando a similaridade do elemento com ele mesmo.
get_sim <- function(df) {
row.names(df) <- df$matricula
df <- df %>% subset(select=-c(matricula))
inv_df <- as.data.frame(t(df))
res <- cor(inv_df[sapply(inv_df, is.numeric)], use="p", method='pearson')
return(res);
}
‘get_sim’ lista os K vizinhos mais próximos, nesse caso K=10, em relação a uma linha da matrix, zerando, inicialmente, o valor de correlação dessa linha com ela mesma.
# retorna um vector de Named num, cujo nome é a matrícula e o valor a similaridade
get_neigh <- function(df, index, corr) {
matr <- (df[index, 1])
# todos os vizinhos, porém temos que "invalidar" ele mesmo
corr[as.double(matr), as.double(matr)] = 0
all_neigh <- corr[matr, ]
k_neigh <- sort(all_neigh, decreasing = T)[1:K]
return(k_neigh);
}
Para calcular a nota de uma cadeira cadeira para determinado aluno, são considerados os vizinhos mais próximos, já calculados. São desconsiderados nesse cálculo os vizinhos que possuem notas NA, ou com similaridade menor que ‘NEIGH’(0.7). Tendo os vizinhos que atendam a todas as exigências, é feita uma média ponderada a qual será atribuída a nota do aluno em questão.
# calcula score ignorando vizinhos com NAs
get_score <- function(df, k_neigh, item) {
notas <- subset(df, matricula %in% names(k_neigh))
# removendo vizinhos que não possuem notas
notas <- na.omit(notas)
# se todas as notas dos vizinhos forem NAs ou nenhum vizinho com
# nota tenha similaridade > NEIGH consideramos que esse aluno
# não tem vizinhos
if(nrow(notas) == 0) {
return(NA)
}
# atualizando similaridade
notas$sim <- 0
for(i in 1:length(notas$matricula)) {
notas$sim[i] <- k_neigh[as.character(notas$matricula[i])]
}
# se todas as notas dos vizinhos forem NAs ou nenhum vizinho com
# nota tenha similaridade > NEIGH consideramos que esse aluno
# não tem vizinhos
eh_valido <- notas[notas$sim > NEIGH,]
if(nrow(eh_valido) == 0) {
return(NA)
}
# print(item)
# print(notas[, item])
# print(sum(notas[, item] * notas$sim) / sum(notas$sim))
res <- sum(notas[, item] * notas$sim) / sum(notas$sim)
return(res)
}
Os dados dos alunos foram separados em dados de treino e teste baseado no período de ingresso. Os dados de teste foram escondidos para que não interferissem na predição.
## // CONSTURINDO OS DATA FRAMES E COLLABORATIVE FILTERING \\##
# separando em teste e treino
temp <- createDataPartition(periodos_dados$Periodo_Ingresso, p = 0.95, list = F)
# os dados de teste são zerados, copiados para uma nova tabela
# zerando
teste <- periodos_dados
for(i in 1:length(COL_QUARTO_PER)) {
teste[-temp,][COL_QUARTO_PER[i]] <- NA
}
# atribuindo valores numeros as matriculas
teste <- teste %>% bind_cols(matricula_2 = c(1:121)) %>% select(-matricula) %>% select(matricula_2, everything()) %>% rename(matricula = matricula_2)
head(teste)
## matricula cra calculo1 vetorial p1 lp1 ic lpt Periodo_Ingresso
## 1 1 7.10 6.90 4.25 5.0 7.0 7.5 8.5 2009.1
## 2 2 7.12 4.65 6.30 5.3 7.9 7.6 7.2 2009.1
## 3 3 6.07 3.70 5.80 7.0 7.2 8.3 7.2 2010.2
## 4 4 6.73 5.60 5.60 7.0 7.7 8.4 6.7 2010.1
## 5 5 8.47 8.70 8.60 9.0 8.6 9.1 10.0 2008.1
## 6 6 8.35 6.20 8.20 7.9 7.9 9.2 9.3 2010.2
## calculo2 classica grafos p2 lp2 discreta eda leda moderna linear prob
## 1 5.400000 5.000000 5.1 6.7 8.2 5.0 6.6 7.9 8.3 6.1 6.0
## 2 5.000000 5.750000 6.3 7.7 5.0 6.3 6.7 8.2 8.3 5.0 6.7
## 3 4.033333 3.266667 7.9 7.6 7.0 6.5 5.1 5.2 5.0 5.1 5.0
## 4 5.900000 7.400000 5.9 7.4 7.0 6.8 7.0 5.0 7.7 6.7 5.2
## 5 8.400000 7.900000 8.2 8.8 9.4 8.3 8.4 9.4 9.4 9.3 7.2
## 6 6.900000 6.900000 9.2 9.1 9.3 7.6 7.1 8.6 8.2 8.3 7.0
## tc gi plp metodos oac loac logica es si1
## 1 7.2 7.7 7.0 5.0 7.6 7.1 7.0 6.60 9.3
## 2 7.0 7.1 9.3 6.0 7.2 9.6 8.3 8.10 9.7
## 3 5.3 4.7 5.5 6.4 7.3 8.7 7.0 8.30 8.4
## 4 7.6 7.7 7.0 8.6 6.6 5.0 5.8 4.75 8.4
## 5 7.8 7.8 6.8 9.0 8.2 8.8 10.0 8.50 8.4
## 6 7.9 7.7 9.4 8.1 8.2 10.0 8.4 9.10 9.4
# copiando
teste_valores <- teste[-temp, ]
teste_indices <- rownames(teste_valores)
teste_indices
## [1] "15" "59" "64" "65" "78"
## Realizando predição
# calcula a similaridade entre todos os alunos (de todos para todos)
corr <- teste %>% get_sim()
Tendo os alunos com quem será feita a predição e a similaridade entre todos os estudantes considerados, itera-se no data frame para preencher as linhas nas quais NA’s foram atribuição, a fim de completar novamente os dados, mas agora, com a predição. Para cada aluno que deve ser feita a predição, calcula-se os vizinhos mais próximos e para cada disciplina do quarto período, objeto da análise, é feito o cálculo da nota e, então, atribuído valores ao data frame que está sendo recompletado.
# calcula predição: média ponderada dos K vizinhos mais próximos
for(i in 1:length(teste_indices)) {
index <- teste_indices[i]
k_proximos <- get_neigh(teste, index, corr)
for(j in 1:length(COL_QUARTO_PER)) {
pred <- get_score(teste[, c("matricula", COL_QUARTO_PER[j])],
k_proximos, COL_QUARTO_PER[j])
teste_valores[index, COL_QUARTO_PER[j]] <- pred
}
}
Com os dados considerados nessa análise, todos os cinco alunos em questão encontraram vizinhos próximos. Logo não há porcentagem de aluno sempredição.
# simplificando os dados
dados_reais <- periodos_dados[-temp, COL_QUARTO_PER]
predicao <- teste_valores[, COL_QUARTO_PER]
# número de elementos em cada coluna de teste = 5
total_alunos <- sapply(predicao, function(x) length(x))
#foi prossivel predizer para todos os alunos
# número de NA em cada coluna, ou seja número de alunos sem predição por disciplina
sem_predicao <- sapply(predicao, function(x) sum(is.na(x)))
# porcentagem de alunos sem predição por disciplina
(sem_predicao/total_alunos) * 100
## plp metodos oac loac logica es si1
## 0 0 0 0 0 0 0
# porcentagem total de variáveis sem predição
(sum(sem_predicao)/sum(total_alunos)) * 100
## [1] 0
# os 5 alunos que aparecem nas cadeiras do quarto periodo com NA são os ultilizados no teste
sapply(teste, function(x) sum(is.na(x)))
## matricula cra calculo1 vetorial
## 0 0 0 0
## p1 lp1 ic lpt
## 0 0 0 0
## Periodo_Ingresso calculo2 classica grafos
## 0 0 0 0
## p2 lp2 discreta eda
## 0 0 0 0
## leda moderna linear prob
## 0 0 0 0
## tc gi plp metodos
## 0 0 5 5
## oac loac logica es
## 5 5 5 5
## si1
## 5
A predição dos alunos teve uma média de erro para cada disciplina aceitável, considerando as quantidade de dados análisados.
rmse(sim=predicao, obs=dados_reais)
## plp metodos oac loac logica es si1
## 1.5478410 1.6982016 0.8149713 1.0855413 1.2098514 1.0780908 0.6443594
Tendo o algoritmo construído, foi feita uma generalização e as notas de todos os alunos foram calculadas para as disciplinas do quarto período de Ciência da Computação da UFCG.
## // PREDIZENDO NOTA PARA TODOS OS ALUNOS \\
teste2 <- periodos_dados %>% bind_cols(matricula_2 = c(1:121)) %>% select(-matricula) %>% select(matricula_2, everything()) %>% rename(matricula = matricula_2)
teste_valores2 <- periodos_dados %>% mutate(plp = NA, si1 = NA, logica = NA, oac = NA, loac = NA, es = NA, metodos = NA)
# teste para todos os alunos
teste_indices2 <- rownames(teste2)
## Realizando predição
# calcula predição: média ponderada dos K vizinhos mais próximos
for(i in 1:length(teste_indices2)) {
index <- teste_indices2[i]
k_proximos <- get_neigh(teste2, index, corr)
for(j in 1:length(COL_QUARTO_PER)) {
pred <- get_score(teste2[, c("matricula", COL_QUARTO_PER[j])],
k_proximos, COL_QUARTO_PER[j])
teste_valores2[index, COL_QUARTO_PER[j]] <- pred
}
}
Por fim, foi calculado o RMSE para cada disciplina, e para cada aluno e cada disciplina individualmente, bem como sua média.
# simplificando os dados
dados_reais2 <- periodos_dados[, COL_QUARTO_PER]
predicao2 <- teste_valores2[, COL_QUARTO_PER]
head(dados_reais2)
## plp metodos oac loac logica es si1
## 1 7.0 5.0 7.6 7.1 7.0 6.60 9.3
## 2 9.3 6.0 7.2 9.6 8.3 8.10 9.7
## 3 5.5 6.4 7.3 8.7 7.0 8.30 8.4
## 4 7.0 8.6 6.6 5.0 5.8 4.75 8.4
## 5 6.8 9.0 8.2 8.8 10.0 8.50 8.4
## 6 9.4 8.1 8.2 10.0 8.4 9.10 9.4
head(predicao2)
## plp metodos oac loac logica es si1
## 1 8.11 7.690 8.68 8.80 8.28 8.36 9.41
## 2 8.52 7.190 7.75 8.86 7.90 8.28 8.89
## 3 7.44 7.555 8.27 8.82 7.71 8.68 8.94
## 4 8.52 8.140 8.34 8.83 8.29 7.89 9.09
## 5 7.17 8.510 8.43 8.88 8.43 8.31 9.10
## 6 8.15 8.540 8.55 9.29 8.99 8.92 9.42
erro_rmse <- matrix(nrow = nrow(periodos_dados), ncol = length(COL_QUARTO_PER))
colnames(erro_rmse) <- COL_QUARTO_PER
rownames(erro_rmse) <-(periodos_dados$matricula)
for(i in 1:length(teste_indices2)){
for(j in 1:7) {
erro_rmse[i,j] <- (rmse(sim=predicao2[i,j], obs=dados_reais2[i,j]))
}
}
matriculas <- periodos_dados %>% select(matricula)
erro_rmse <- as.data.frame(erro_rmse) %>% mutate(media_rmse = rowMeans(as.data.frame(erro_rmse)[,1:7]))
erro_rmse <-bind_cols(as.data.frame(erro_rmse),matriculas) %>% select(matricula, everything())
head(erro_rmse)
## matricula plp metodos oac loac logica es
## 1 B10092 1.1099999 2.6899999 1.0800000 1.70000001 1.2800000 1.7600001
## 2 B10504 0.7800001 1.1899997 0.5500000 0.73999996 0.4000002 0.1799999
## 3 B10644 1.9400001 1.1549999 0.9699999 0.11999991 0.7099997 0.3800000
## 4 B10973 1.5199999 0.4600002 1.7400000 3.83000016 2.4899999 3.1400001
## 5 B11044 0.3699999 0.4899998 0.2300001 0.08000009 1.5699998 0.1899998
## 6 B11365 1.2499999 0.4400000 0.3500001 0.70999996 0.5900000 0.1800000
## si1 media_rmse
## 1 0.10999994 1.3900000
## 2 0.81000003 0.6642857
## 3 0.53999989 0.8307142
## 4 0.68999998 1.9814286
## 5 0.70000010 0.5185714
## 6 0.02000004 0.5057143
O aluno com matrícula de identificação B818 teve o menor RMSE, 0.2428572.
periodos_dados %>% filter(matricula == "B818") %>% select(plp:si1)
## plp metodos oac loac logica es si1
## 1 9.1 8.8 8.4 9.6 9 8.5 9.7
predicao2[110, ]%>% select(plp:si1)
## plp metodos oac loac logica es si1
## 110 9 8.69 8.3 9.21 8.93 8.08 9.19