O objetivo desse código é generalizar a predição feita por Collaborative Filtering (https://rpubs.com/liviaCavalcanti/337528) para predizer a nota de alunos do curso de Ciência da Computação da Universidade Federal de Campina Grande(UFCG) para o quarto período e compará-la com as notas que os alunos realmente obtiveram. A melhoria em relação ao programa já existente é que a predição pode ser mais automatizada, ela é feita para um conjunto arbitrário de disciplinas a ser escolhido de acordo com o período e o curso em questão. Com isso, basta que seja especificado quais as disciplinas do curso até o período que se deseja predizer e as análises serão feitas até o ponto-alvo. O resultado que obtem-se é a evolução do RMSE ao passo que se aumenta a quantidade de dados analisada, esperando-se com isso uma queda no valor do erro das predições.

Bibliotecas utilizadas

Utilizou-se as mesmas bibliotecas do programa anterior. Sendo elas:

library(dplyr)
library(corrplot)
library(GGally)
library(ggplot2)
library(reshape2)
library(caret)
library(hydroGOF)

Os dados

Estão sendo utilizados os dados dos estudantes de Computação da UFCG, assim como anteriormente, e está sendo feito o mesmo tratamento dos dados. Em resumo, são considerados os estudantes que concluíram o curso, ou seja, tem-se todas as notas de cada um, sendo considerada apenas a nota que o estudante passou em cada cadeira, tratada no código como a maior nota do aluno naquela disciplina.

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

# 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, Nome_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) %>% na.omit()
## Adding missing grouping variables: `Matricula`
# Alunos que possuem todas as notas
alunos_graduados <- alunos_max_media[complete.cases(alunos_max_media), ]
head(alunos_graduados)
##    Matricula ALGEBRA.LINEAR.I ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA
## 4     B10092              6.1                                    6.4
## 21    B10504              5.0                                    6.3
## 41    B11044              9.3                                    8.6
## 60    B11671              5.9                                    6.5
## 66    B11776              7.0                                    9.4
## 92    B12263              9.0                                   10.0
##    ANÁLISE.E.TÉCNICA.DE.ALGORITMOS
## 4                              7.0
## 21                             8.0
## 41                             8.7
## 60                             7.7
## 66                             8.1
## 92                             9.5
##    AVAL.DE.DESEMPENHO.DE.SISTEMAS.DISCRETOS BANCO.DE.DADOS.I
## 4                                       8.1              7.6
## 21                                      5.0              8.7
## 41                                      8.7              6.0
## 60                                      8.9              9.1
## 66                                      7.1              7.8
## 92                                      9.5              8.8
##    BANCO.DE.DADOS.II CALCULO.DIFERENCIAL.E.INTEGRAL.I
## 4                5.4                              9.5
## 21               7.0                              7.0
## 41               7.7                              8.7
## 60               7.7                              7.1
## 66               5.3                              6.1
## 92               8.9                              8.6
##    CALCULO.DIFERENCIAL.E.INTEGRAL.II COMPILADORES DIREITO.E.CIDADANIA
## 4                                5.4          8.2                10.0
## 21                               5.0          6.3                10.0
## 41                               8.4          7.9                 8.0
## 60                               7.0          5.0                 8.5
## 66                               5.6          7.0                 9.8
## 92                               8.7          9.6                 7.3
##    ENGENHARIA.DE.SOFTWARE.I ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 4                       6.6                             6.6
## 21                      8.1                             6.7
## 41                      8.5                             8.4
## 60                      5.0                             7.7
## 66                      7.1                             7.1
## 92                     10.0                             8.3
##    FUNDAMENTOS.DE.FÍSICA.CLÁSSICA FUNDAMENTOS.DE.FÍSICA.MODERNA
## 4                             5.0                           8.3
## 21                            7.8                           8.3
## 41                            7.9                           9.4
## 60                            7.0                           7.1
## 66                            7.3                           5.3
## 92                            8.6                           9.4
##    GERÊNCIA.DA.INFORMAÇÃO INFORMÁTICA.E.SOCIEDADE
## 4                     7.7                     9.0
## 21                    7.1                     8.3
## 41                    7.8                     9.4
## 60                    8.0                     7.2
## 66                    8.0                     9.5
## 92                    8.8                     8.3
##    INTELIGENCIA.ARTIFICIAL.I INTERCONEXÃO.DE.REDES.DE.COMPUTADORES
## 4                        9.1                                   7.0
## 21                       8.7                                   7.1
## 41                       8.3                                   8.9
## 60                       7.2                                   7.0
## 66                       8.1                                   8.5
## 92                       9.3                                   8.6
##    INTRODUÇÃO.A.COMPUTAÇÃO LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 4                      7.5                                    7.9
## 21                     7.6                                    8.2
## 41                     9.1                                    9.4
## 60                     7.9                                    7.6
## 66                     9.3                                    8.9
## 92                     9.6                                    9.7
##    LAB.DE.INTERCON.DE.REDES.DE.COMPUTADORES
## 4                                       7.0
## 21                                      7.1
## 41                                      8.9
## 60                                      7.0
## 66                                      8.5
## 92                                      8.6
##    LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES
## 4                                       7.1
## 21                                      9.6
## 41                                      8.8
## 60                                      9.2
## 66                                      8.6
## 92                                      9.3
##    LABORATÓRIO.DE.ENGENHARIA.DE.SOFTWARE LABORATÓRIO.DE.PROGRAMAÇÃO.I
## 4                                    8.2                          7.0
## 21                                   7.6                          7.9
## 41                                   8.7                          8.6
## 60                                   7.8                          9.7
## 66                                   8.3                          9.3
## 92                                   9.2                          8.3
##    LABORATÓRIO.DE.PROGRAMAÇÃO.II LEITURA.E.PRODUCAO.DE.TEXTOS
## 4                            8.2                          8.5
## 21                           5.0                          7.2
## 41                           9.4                         10.0
## 60                           9.2                          9.1
## 66                           9.6                          9.2
## 92                           9.7                          9.8
##    LÓGICA.MATEMÁTICA MATEMÁTICA.DISCRETA METODOLOGIA.CIENTÍFICA
## 4                7.0                 5.0                    8.7
## 21               8.3                 6.3                    8.1
## 41              10.0                 8.3                    9.5
## 60               5.6                 6.2                    7.5
## 66               7.3                 8.2                    7.5
## 92              10.0                 8.8                    9.5
##    MÉTODOS.E.SOFTWARE.NUMÉRICOS METODOS.ESTATISTICOS
## 4                           7.9                  5.0
## 21                          7.4                  6.0
## 41                          7.8                  9.0
## 60                          5.0                  8.2
## 66                          7.1                  7.7
## 92                          8.2                 10.0
##    ORG.E.ARQUITETURA.DE.COMPUTADORES.I PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO
## 4                                  7.6                                7.0
## 21                                 7.2                                9.3
## 41                                 8.2                                6.8
## 60                                 7.8                                6.1
## 66                                 7.1                                9.0
## 92                                 9.0                                8.2
##    PROBABILIDADE.E.ESTATISTICA PROGRAMAÇÃO.I PROGRAMAÇÃO.II
## 4                          6.0           5.0            6.7
## 21                         6.7           5.3            7.7
## 41                         7.2           9.0            8.8
## 60                         5.0           9.5            8.4
## 66                         5.8           9.1            9.0
## 92                         8.2           7.9            9.5
##    PROJETO.EM.COMPUTAÇÃO.I PROJETO.EM.COMPUTAÇÃO.II REDES.DE.COMPUTADORES
## 4                      9.4                      8.0                   6.0
## 21                     7.1                      8.0                   7.2
## 41                     8.5                      8.4                   8.5
## 60                     8.5                      8.4                   7.3
## 66                     7.9                      8.3                   7.5
## 92                    10.0                     10.0                   9.4
##    SEMINÁRIOS.(EDUCAÇÃO.AMBIENTAL) SISTEMAS.DE.INFORMAÇÃO.I
## 4                              9.0                      9.3
## 21                             7.0                      9.7
## 41                             7.5                      8.4
## 60                             8.0                      8.9
## 66                             9.0                      9.7
## 92                             9.0                      9.4
##    SISTEMAS.DE.INFORMAÇÃO.II SISTEMAS.OPERACIONAIS TEORIA.DA.COMPUTAÇÃO
## 4                        5.8                   7.3                  7.2
## 21                       6.1                   7.4                  7.0
## 41                       7.8                   8.0                  7.8
## 60                       5.9                   7.0                  6.3
## 66                       6.5                   7.0                  6.1
## 92                       9.0                   9.7                  7.6
##    TEORIA.DOS.GRAFOS  cra Periodo_Ingresso
## 4                5.1 7.10           2009.1
## 21               6.3 7.12           2009.1
## 41               8.2 8.47           2008.1
## 60               6.0 6.78           2006.2
## 66               8.5 7.70           2008.1
## 92               9.2 9.07           2008.1

É preciso listar todas as cadeiras de interesse, aqui, todas as cadeiras do curso separadas por período.

PRIMEIRO_PER <- list("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")
SEGUNDO_PER <- list("METODOLOGIA.CIENTÍFICA", "FUNDAMENTOS.DE.FÍSICA.CLÁSSICA", "CALCULO.DIFERENCIAL.E.INTEGRAL.II",
                    "MATEMÁTICA.DISCRETA", "PROGRAMAÇÃO.II", "TEORIA.DOS.GRAFOS","LABORATÓRIO.DE.PROGRAMAÇÃO.II")
TERCEIRO_PER <- list("ALGEBRA.LINEAR.I", "FUNDAMENTOS.DE.FÍSICA.MODERNA", "TEORIA.DA.COMPUTAÇÃO", "ESTRUTURA.DE.DADOS.E.ALGORITMOS",
                     "GERÊNCIA.DA.INFORMAÇÃO", "LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS", "PROBABILIDADE.E.ESTATISTICA")
QUARTO_PER <- list("METODOS.ESTATISTICOS","PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO", "LÓGICA.MATEMÁTICA", "ORG.E.ARQUITETURA.DE.COMPUTADORES.I", 
                   "ENGENHARIA.DE.SOFTWARE.I","SISTEMAS.DE.INFORMAÇÃO.I","LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES")
QUINTO_PER <- list("INFORMÁTICA.E.SOCIEDADE", "LABORATÓRIO.DE.ENGENHARIA.DE.SOFTWARE", "ANÁLISE.E.TÉCNICA.DE.ALGORITMOS",
                   "COMPILADORES", "REDES.DE.COMPUTADORES", "BANCO.DE.DADOS.I", "SISTEMAS.DE.INFORMAÇÃO.II")
SEXTO_PER <- list("DIREITO.E.CIDADANIA", "LAB.DE.INTERCON.DE.REDES.DE.COMPUTADORES", "INTERCONEXÃO.DE.REDES.DE.COMPUTADORES",
                  "SISTEMAS.OPERACIONAIS", "BANCO.DE.DADOS.II","INTELIGENCIA.ARTIFICIAL.I")
SETIMO_PER <- list("PROJETO.EM.COMPUTAÇÃO.I", "MÉTODOS.E.SOFTWARE.NUMÉRICOS", "AVAL.DE.DESEMPENHO.DE.SISTEMAS.DISCRETOS")
OITAVO_PER <- list("PROJETO.EM.COMPUTAÇÃO.II")

Elas são agrupadas em uma lista de listas para que o cálculo possa ser realizado sobre cada uma delas e considerando suas anteriores de forma mais automatizada.

lista_periodos <- list(PRIMEIRO_PER, SEGUNDO_PER, TERCEIRO_PER, QUARTO_PER, QUINTO_PER,SEXTO_PER, SETIMO_PER, OITAVO_PER)
lista_periodos
## [[1]]
## [[1]][[1]]
## [1] "CALCULO.DIFERENCIAL.E.INTEGRAL.I"
## 
## [[1]][[2]]
## [1] "ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA"
## 
## [[1]][[3]]
## [1] "PROGRAMAÇÃO.I"
## 
## [[1]][[4]]
## [1] "LABORATÓRIO.DE.PROGRAMAÇÃO.I"
## 
## [[1]][[5]]
## [1] "INTRODUÇÃO.A.COMPUTAÇÃO"
## 
## [[1]][[6]]
## [1] "LEITURA.E.PRODUCAO.DE.TEXTOS"
## 
## 
## [[2]]
## [[2]][[1]]
## [1] "METODOLOGIA.CIENTÍFICA"
## 
## [[2]][[2]]
## [1] "FUNDAMENTOS.DE.FÍSICA.CLÁSSICA"
## 
## [[2]][[3]]
## [1] "CALCULO.DIFERENCIAL.E.INTEGRAL.II"
## 
## [[2]][[4]]
## [1] "MATEMÁTICA.DISCRETA"
## 
## [[2]][[5]]
## [1] "PROGRAMAÇÃO.II"
## 
## [[2]][[6]]
## [1] "TEORIA.DOS.GRAFOS"
## 
## [[2]][[7]]
## [1] "LABORATÓRIO.DE.PROGRAMAÇÃO.II"
## 
## 
## [[3]]
## [[3]][[1]]
## [1] "ALGEBRA.LINEAR.I"
## 
## [[3]][[2]]
## [1] "FUNDAMENTOS.DE.FÍSICA.MODERNA"
## 
## [[3]][[3]]
## [1] "TEORIA.DA.COMPUTAÇÃO"
## 
## [[3]][[4]]
## [1] "ESTRUTURA.DE.DADOS.E.ALGORITMOS"
## 
## [[3]][[5]]
## [1] "GERÊNCIA.DA.INFORMAÇÃO"
## 
## [[3]][[6]]
## [1] "LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS"
## 
## [[3]][[7]]
## [1] "PROBABILIDADE.E.ESTATISTICA"
## 
## 
## [[4]]
## [[4]][[1]]
## [1] "METODOS.ESTATISTICOS"
## 
## [[4]][[2]]
## [1] "PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO"
## 
## [[4]][[3]]
## [1] "LÓGICA.MATEMÁTICA"
## 
## [[4]][[4]]
## [1] "ORG.E.ARQUITETURA.DE.COMPUTADORES.I"
## 
## [[4]][[5]]
## [1] "ENGENHARIA.DE.SOFTWARE.I"
## 
## [[4]][[6]]
## [1] "SISTEMAS.DE.INFORMAÇÃO.I"
## 
## [[4]][[7]]
## [1] "LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES"
## 
## 
## [[5]]
## [[5]][[1]]
## [1] "INFORMÁTICA.E.SOCIEDADE"
## 
## [[5]][[2]]
## [1] "LABORATÓRIO.DE.ENGENHARIA.DE.SOFTWARE"
## 
## [[5]][[3]]
## [1] "ANÁLISE.E.TÉCNICA.DE.ALGORITMOS"
## 
## [[5]][[4]]
## [1] "COMPILADORES"
## 
## [[5]][[5]]
## [1] "REDES.DE.COMPUTADORES"
## 
## [[5]][[6]]
## [1] "BANCO.DE.DADOS.I"
## 
## [[5]][[7]]
## [1] "SISTEMAS.DE.INFORMAÇÃO.II"
## 
## 
## [[6]]
## [[6]][[1]]
## [1] "DIREITO.E.CIDADANIA"
## 
## [[6]][[2]]
## [1] "LAB.DE.INTERCON.DE.REDES.DE.COMPUTADORES"
## 
## [[6]][[3]]
## [1] "INTERCONEXÃO.DE.REDES.DE.COMPUTADORES"
## 
## [[6]][[4]]
## [1] "SISTEMAS.OPERACIONAIS"
## 
## [[6]][[5]]
## [1] "BANCO.DE.DADOS.II"
## 
## [[6]][[6]]
## [1] "INTELIGENCIA.ARTIFICIAL.I"
## 
## 
## [[7]]
## [[7]][[1]]
## [1] "PROJETO.EM.COMPUTAÇÃO.I"
## 
## [[7]][[2]]
## [1] "MÉTODOS.E.SOFTWARE.NUMÉRICOS"
## 
## [[7]][[3]]
## [1] "AVAL.DE.DESEMPENHO.DE.SISTEMAS.DISCRETOS"
## 
## 
## [[8]]
## [[8]][[1]]
## [1] "PROJETO.EM.COMPUTAÇÃO.II"

Funções e constantes

As constantes utilizadas nesse código são relativas a quantidade de vizinhos a serem utilizados no cálculo do score(‘K’) que foi calculado em outro código; a similaridade necessária para que dois indivíduos sejam considerados como vizinhos(‘NEIGH’), a quantidade de alunos utilizada para o teste(‘N_ALUNOS’), esta dependerá da porcentagem da amostra definida para teste e da quantidade de dados, nesse caso ela tem valor 4; e o número máximo de disciplinas cursadas num período(N_DISC), para que os dados sejam armazenados corretamente.

K = 3
NEIGH = 0.7
N_ALUNOS = 4
N_DISC = 7

As funções também já são conhecidas: ‘get_sim’ retorna a similaridade entre todos os aluno; ‘get_neigh’, os ‘K’ alunos mais semelhantes de acordo com ‘NEIGH’; e ‘get_score’ que calcula as notas preditas.

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

# 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);
}

# 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 são separados em dados de treino(90%) e teste. É criado um data frame para que sejam guardadas as médias de RMSE por período. Um data frame para guardar o RMSE de cada estudante da amostra de teste para cada respectiva discplina e a média geral desse RMSE por aluno. Para que o cálculo de similaridade seja bem sucedido foi preferido reenumerar as matrículas, a fim de que elas representem mais facilmente a posição do aluno no data frame. Foram retirados o CRA e o Período de Ingresso, pois não eram dados que fazia sentido usar na predição. São guardados as notas reais dos alunos para que posteriormente seja feita a comparação e o cálculo do erro.

# separando em teste e treino
temp <- createDataPartition(alunos_graduados$Periodo_Ingresso, p = 0.90, list = F)
temp
##       Resample1
##  [1,]         1
##  [2,]         2
##  [3,]         3
##  [4,]         4
##  [5,]         5
##  [6,]         6
##  [7,]         7
##  [8,]         8
##  [9,]         9
## [10,]        10
## [11,]        11
## [12,]        12
## [13,]        13
## [14,]        14
## [15,]        15
## [16,]        16
## [17,]        18
## [18,]        19
## [19,]        20
## [20,]        21
## [21,]        22
## [22,]        23
## [23,]        24
## [24,]        25
## [25,]        26
## [26,]        27
## [27,]        28
## [28,]        29
## [29,]        30
## [30,]        31
## [31,]        32
## [32,]        33
## [33,]        34
## [34,]        35
## [35,]        36
## [36,]        37
## [37,]        38
## [38,]        39
## [39,]        40
## [40,]        41
## [41,]        43
## [42,]        44
## [43,]        45
## [44,]        46
## [45,]        48
## [46,]        49
## [47,]        50
## [48,]        52
## [49,]        53
## [50,]        54
## [51,]        55
## [52,]        56
## [53,]        57
## [54,]        58
## [55,]        59
rmse_periodo <- as.data.frame(matrix(NA, nrow = 7))

#data frame onde serão guardadas as predições
predicao_geral <- as.data.frame(matrix(ncol = 7))
media_rmse <- c(NA)
predicao_geral <- cbind(predicao_geral, as.data.frame(media_rmse))

#notas de todas as cadeiras de todos os alunos
dados_treino2 <- alunos_graduados %>% mutate(Matricula = 1:59) %>% select(-cra, - Periodo_Ingresso)
head(dados_treino2)
##   Matricula ALGEBRA.LINEAR.I ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA
## 1         1              6.1                                    6.4
## 2         2              5.0                                    6.3
## 3         3              9.3                                    8.6
## 4         4              5.9                                    6.5
## 5         5              7.0                                    9.4
## 6         6              9.0                                   10.0
##   ANÁLISE.E.TÉCNICA.DE.ALGORITMOS AVAL.DE.DESEMPENHO.DE.SISTEMAS.DISCRETOS
## 1                             7.0                                      8.1
## 2                             8.0                                      5.0
## 3                             8.7                                      8.7
## 4                             7.7                                      8.9
## 5                             8.1                                      7.1
## 6                             9.5                                      9.5
##   BANCO.DE.DADOS.I BANCO.DE.DADOS.II CALCULO.DIFERENCIAL.E.INTEGRAL.I
## 1              7.6               5.4                              9.5
## 2              8.7               7.0                              7.0
## 3              6.0               7.7                              8.7
## 4              9.1               7.7                              7.1
## 5              7.8               5.3                              6.1
## 6              8.8               8.9                              8.6
##   CALCULO.DIFERENCIAL.E.INTEGRAL.II COMPILADORES DIREITO.E.CIDADANIA
## 1                               5.4          8.2                10.0
## 2                               5.0          6.3                10.0
## 3                               8.4          7.9                 8.0
## 4                               7.0          5.0                 8.5
## 5                               5.6          7.0                 9.8
## 6                               8.7          9.6                 7.3
##   ENGENHARIA.DE.SOFTWARE.I ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 1                      6.6                             6.6
## 2                      8.1                             6.7
## 3                      8.5                             8.4
## 4                      5.0                             7.7
## 5                      7.1                             7.1
## 6                     10.0                             8.3
##   FUNDAMENTOS.DE.FÍSICA.CLÁSSICA FUNDAMENTOS.DE.FÍSICA.MODERNA
## 1                            5.0                           8.3
## 2                            7.8                           8.3
## 3                            7.9                           9.4
## 4                            7.0                           7.1
## 5                            7.3                           5.3
## 6                            8.6                           9.4
##   GERÊNCIA.DA.INFORMAÇÃO INFORMÁTICA.E.SOCIEDADE INTELIGENCIA.ARTIFICIAL.I
## 1                    7.7                     9.0                       9.1
## 2                    7.1                     8.3                       8.7
## 3                    7.8                     9.4                       8.3
## 4                    8.0                     7.2                       7.2
## 5                    8.0                     9.5                       8.1
## 6                    8.8                     8.3                       9.3
##   INTERCONEXÃO.DE.REDES.DE.COMPUTADORES INTRODUÇÃO.A.COMPUTAÇÃO
## 1                                   7.0                     7.5
## 2                                   7.1                     7.6
## 3                                   8.9                     9.1
## 4                                   7.0                     7.9
## 5                                   8.5                     9.3
## 6                                   8.6                     9.6
##   LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 1                                    7.9
## 2                                    8.2
## 3                                    9.4
## 4                                    7.6
## 5                                    8.9
## 6                                    9.7
##   LAB.DE.INTERCON.DE.REDES.DE.COMPUTADORES
## 1                                      7.0
## 2                                      7.1
## 3                                      8.9
## 4                                      7.0
## 5                                      8.5
## 6                                      8.6
##   LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES
## 1                                      7.1
## 2                                      9.6
## 3                                      8.8
## 4                                      9.2
## 5                                      8.6
## 6                                      9.3
##   LABORATÓRIO.DE.ENGENHARIA.DE.SOFTWARE LABORATÓRIO.DE.PROGRAMAÇÃO.I
## 1                                   8.2                          7.0
## 2                                   7.6                          7.9
## 3                                   8.7                          8.6
## 4                                   7.8                          9.7
## 5                                   8.3                          9.3
## 6                                   9.2                          8.3
##   LABORATÓRIO.DE.PROGRAMAÇÃO.II LEITURA.E.PRODUCAO.DE.TEXTOS
## 1                           8.2                          8.5
## 2                           5.0                          7.2
## 3                           9.4                         10.0
## 4                           9.2                          9.1
## 5                           9.6                          9.2
## 6                           9.7                          9.8
##   LÓGICA.MATEMÁTICA MATEMÁTICA.DISCRETA METODOLOGIA.CIENTÍFICA
## 1               7.0                 5.0                    8.7
## 2               8.3                 6.3                    8.1
## 3              10.0                 8.3                    9.5
## 4               5.6                 6.2                    7.5
## 5               7.3                 8.2                    7.5
## 6              10.0                 8.8                    9.5
##   MÉTODOS.E.SOFTWARE.NUMÉRICOS METODOS.ESTATISTICOS
## 1                          7.9                  5.0
## 2                          7.4                  6.0
## 3                          7.8                  9.0
## 4                          5.0                  8.2
## 5                          7.1                  7.7
## 6                          8.2                 10.0
##   ORG.E.ARQUITETURA.DE.COMPUTADORES.I PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO
## 1                                 7.6                                7.0
## 2                                 7.2                                9.3
## 3                                 8.2                                6.8
## 4                                 7.8                                6.1
## 5                                 7.1                                9.0
## 6                                 9.0                                8.2
##   PROBABILIDADE.E.ESTATISTICA PROGRAMAÇÃO.I PROGRAMAÇÃO.II
## 1                         6.0           5.0            6.7
## 2                         6.7           5.3            7.7
## 3                         7.2           9.0            8.8
## 4                         5.0           9.5            8.4
## 5                         5.8           9.1            9.0
## 6                         8.2           7.9            9.5
##   PROJETO.EM.COMPUTAÇÃO.I PROJETO.EM.COMPUTAÇÃO.II REDES.DE.COMPUTADORES
## 1                     9.4                      8.0                   6.0
## 2                     7.1                      8.0                   7.2
## 3                     8.5                      8.4                   8.5
## 4                     8.5                      8.4                   7.3
## 5                     7.9                      8.3                   7.5
## 6                    10.0                     10.0                   9.4
##   SEMINÁRIOS.(EDUCAÇÃO.AMBIENTAL) SISTEMAS.DE.INFORMAÇÃO.I
## 1                             9.0                      9.3
## 2                             7.0                      9.7
## 3                             7.5                      8.4
## 4                             8.0                      8.9
## 5                             9.0                      9.7
## 6                             9.0                      9.4
##   SISTEMAS.DE.INFORMAÇÃO.II SISTEMAS.OPERACIONAIS TEORIA.DA.COMPUTAÇÃO
## 1                       5.8                   7.3                  7.2
## 2                       6.1                   7.4                  7.0
## 3                       7.8                   8.0                  7.8
## 4                       5.9                   7.0                  6.3
## 5                       6.5                   7.0                  6.1
## 6                       9.0                   9.7                  7.6
##   TEORIA.DOS.GRAFOS
## 1               5.1
## 2               6.3
## 3               8.2
## 4               6.0
## 5               8.5
## 6               9.2
resultados2 <- dados_treino2[-temp,]
resultados2
##    Matricula ALGEBRA.LINEAR.I ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA
## 17        17              6.8                                    8.8
## 42        42              8.0                                    8.8
## 47        47              6.2                                    5.6
## 51        51              8.2                                    8.5
##    ANÁLISE.E.TÉCNICA.DE.ALGORITMOS
## 17                             5.4
## 42                             7.2
## 47                             8.1
## 51                             8.1
##    AVAL.DE.DESEMPENHO.DE.SISTEMAS.DISCRETOS BANCO.DE.DADOS.I
## 17                                      8.9              7.4
## 42                                      8.5              6.4
## 47                                      8.7              9.0
## 51                                      8.4              9.0
##    BANCO.DE.DADOS.II CALCULO.DIFERENCIAL.E.INTEGRAL.I
## 17               6.0                              5.2
## 42               6.7                              7.3
## 47               7.2                              7.0
## 51               7.8                              8.2
##    CALCULO.DIFERENCIAL.E.INTEGRAL.II COMPILADORES DIREITO.E.CIDADANIA
## 17                               5.0          6.8                10.0
## 42                               5.7          7.4                 7.0
## 47                               5.0          7.2                 9.8
## 51                               7.0          7.3                 8.0
##    ENGENHARIA.DE.SOFTWARE.I ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 17                      8.6                             6.8
## 42                      8.8                             7.1
## 47                      8.3                             6.9
## 51                      9.3                             7.2
##    FUNDAMENTOS.DE.FÍSICA.CLÁSSICA FUNDAMENTOS.DE.FÍSICA.MODERNA
## 17                            8.7                           9.5
## 42                            7.0                           9.2
## 47                            7.0                           7.8
## 51                            8.4                           9.4
##    GERÊNCIA.DA.INFORMAÇÃO INFORMÁTICA.E.SOCIEDADE
## 17                    8.5                     8.7
## 42                    7.9                     9.4
## 47                    7.8                     9.4
## 51                    8.4                     8.4
##    INTELIGENCIA.ARTIFICIAL.I INTERCONEXÃO.DE.REDES.DE.COMPUTADORES
## 17                       8.2                                   5.0
## 42                       8.2                                   7.5
## 47                       8.5                                   8.6
## 51                       7.5                                   7.2
##    INTRODUÇÃO.A.COMPUTAÇÃO LAB.DE.ESTRUTURA.DE.DADOS.E.ALGORITMOS
## 17                     8.5                                    7.5
## 42                     9.0                                    5.5
## 47                     8.8                                    9.2
## 51                     8.4                                    9.3
##    LAB.DE.INTERCON.DE.REDES.DE.COMPUTADORES
## 17                                      5.0
## 42                                      7.5
## 47                                      8.6
## 51                                      7.2
##    LAB.DE.ORG.E.ARQUITETURA.DE.COMPUTADORES
## 17                                      7.7
## 42                                      8.3
## 47                                      7.1
## 51                                      9.6
##    LABORATÓRIO.DE.ENGENHARIA.DE.SOFTWARE LABORATÓRIO.DE.PROGRAMAÇÃO.I
## 17                                   7.9                          5.1
## 42                                   8.7                          7.0
## 47                                   8.7                          9.1
## 51                                   8.7                          8.5
##    LABORATÓRIO.DE.PROGRAMAÇÃO.II LEITURA.E.PRODUCAO.DE.TEXTOS
## 17                           8.2                          9.3
## 42                           9.2                          9.6
## 47                           9.5                          9.1
## 51                           9.3                          9.6
##    LÓGICA.MATEMÁTICA MATEMÁTICA.DISCRETA METODOLOGIA.CIENTÍFICA
## 17               5.9                 5.8                    8.0
## 42               8.2                 5.4                    8.5
## 47               9.7                 7.3                    7.5
## 51               8.7                 9.3                    8.7
##    MÉTODOS.E.SOFTWARE.NUMÉRICOS METODOS.ESTATISTICOS
## 17                          9.2                  7.4
## 42                          7.8                  8.1
## 47                          7.8                  7.3
## 51                          8.8                  7.0
##    ORG.E.ARQUITETURA.DE.COMPUTADORES.I PARADIGMAS.DE.LING..DE.PROGRAMAÇÃO
## 17                                 7.7                                7.3
## 42                                 8.0                                5.0
## 47                                 9.3                                6.2
## 51                                 7.4                                6.1
##    PROBABILIDADE.E.ESTATISTICA PROGRAMAÇÃO.I PROGRAMAÇÃO.II
## 17                         5.8           5.0            7.1
## 42                         6.3           7.7            7.4
## 47                         5.8           8.5            8.4
## 51                         7.0           8.8            8.9
##    PROJETO.EM.COMPUTAÇÃO.I PROJETO.EM.COMPUTAÇÃO.II REDES.DE.COMPUTADORES
## 17                     9.4                      8.3                   5.1
## 42                     8.5                      8.4                   6.9
## 47                     8.9                      8.3                   8.3
## 51                     9.0                      8.7                   7.2
##    SEMINÁRIOS.(EDUCAÇÃO.AMBIENTAL) SISTEMAS.DE.INFORMAÇÃO.I
## 17                             9.0                      8.8
## 42                             7.5                      8.1
## 47                             7.5                      7.9
## 51                             7.5                      9.1
##    SISTEMAS.DE.INFORMAÇÃO.II SISTEMAS.OPERACIONAIS TEORIA.DA.COMPUTAÇÃO
## 17                       6.7                   7.0                  6.2
## 42                       7.1                   6.3                  7.2
## 47                       6.9                   8.0                  7.0
## 51                       7.0                   7.1                  7.8
##    TEORIA.DOS.GRAFOS
## 17               5.4
## 42               7.0
## 47               9.3
## 51               9.6

Predição

O algoritmo desenvolvido é, claramente, pouco eficiente devido a sua estrutura, mas dada a quantidade de dados considerada ele não, por exemplo, demora na execução, sendo, portanto, viável. Ele calcula a predição para as disciplinas de cada período a partir do segundo, já que no primeiro não há dados para fazê-lo. São guardadas as disciplinas para as quais se quer que as notas sejam preditas e as disciplinas que ajudarão na predição. As que se deseja calcular são transformadas em NA a fim de que não influenciem, por exemplo, no cálculo de correlação(‘get_sim’). São guardados os dados de teste que possuem as notas dos alunos nos períodos anteriores ao que analisado e a nota das cadeiras no período atual como NA. Outra variável contém os valores das linhas dos alunos de teste. Feito isso, para cada aluno ao qual se deseja fazer uma predição são calculados os vizinhos mais próximos e, com base nestes, é calculada sua nota para cada cadeira do período atual. Por fim, acontece o cálculo do RMSE, de sua média para cada aluno e da amostra, sendo o último considerado o RMSE do período. Todos os dados são guardados em data frames.

for(disciplinas_periodo in 2:length(lista_periodos)){
  # cadeiras que serao usadas no calculo
  indices_da_vez <- unlist(lista_periodos[1:disciplinas_periodo])
  treino_valores2 <-  dados_treino2 %>% select(Matricula,indices_da_vez) %>% na.omit()
  cadeiras_atuais <- unlist(lista_periodos[disciplinas_periodo])

  for(l in 1:lengths(lista_periodos[disciplinas_periodo])) {
    treino_valores2[-temp,][cadeiras_atuais[l]] <- NA
  }
  

  teste_valores2 <- treino_valores2[-temp,]
  teste_indices2 <- rownames(teste_valores2)
  # calculando a correlacao entre os alunos que jah pagaram a cadeira e os que nós queremos calcular
  corr <- treino_valores2 %>% get_sim()

  for(m in 1:length(teste_indices2)) {
    index <- teste_indices2[m]
    k_proximos <- get_neigh(teste_valores2, index, corr)
    for(j in 1:length(cadeiras_atuais)) {
      pred <- get_score(treino_valores2[, c("Matricula", cadeiras_atuais[j])],
                        k_proximos, cadeiras_atuais[j])
      teste_valores2[index, cadeiras_atuais[j]] <- pred
    }
  }

  # simplificando os dados
  dados_reais2 <- alunos_graduados[-temp,cadeiras_atuais]
  predicao2 <- teste_valores2[, cadeiras_atuais]

  # conversão para quando dados_reais e predicao foram vetores e nao data.frames, a fim de se evitar erro no for seguinte
  if(class(predicao2) == "numeric"){
    predicao2 <- as.data.frame(predicao2)
  }
  
  if(class(dados_reais2) == "numeric"){
    dados_reais2 <- as.data.frame(dados_reais2)
  }

  erro_rmse <- as.data.frame(matrix(0, nrow = N_ALUNOS, ncol = N_DISC))
  for(aluno in 1:(N_ALUNOS)){
    for(cadeira in 1:length(cadeiras_atuais)) {
      erro_rmse[aluno,cadeira] <- (rmse(sim=predicao2[aluno,cadeira], obs=dados_reais2[aluno,cadeira]))
    }
  }

  erro_rmse <- as.data.frame(erro_rmse) %>% 
    mutate(media_rmse = rowMeans(as.data.frame(erro_rmse)[,1:7])) 
  rmse_periodo[disciplinas_periodo,] <- mean(as.data.frame(erro_rmse %>% select(media_rmse) %>% na.omit())$media_rmse)
  predicao_geral <- rbind(predicao_geral, erro_rmse)

}

Olhando os resultados

Como esperado, o erro tende a cair à medida que são acumulados mais dados dos alunos, mas com alguma exceção dependendo da amostra utilizada, como pode ser visto no gráfico das médias de RMSE (eixo x) e do período.

rmse_periodo
##        media periodo
## 2 1.00291368       2
## 3 0.80927314       3
## 4 0.80738887       4
## 5 0.71291994       5
## 6 0.97204069       6
## 7 0.28695471       7
## 8 0.05736579       8
rmse_periodo %>% ggplot(aes(periodo, media)) + geom_line()