O objetivo dessa análise é a predição do CRA de alunos da Universidade Federal de CAmpina Grande a partir de regressão linear. ## Bibliotecas Usadas

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

Tratando os dados

Foram usados os dados dos alunos graduados da UFCG de Ciência da Computação. Foi calculado o CRA e separado as notas dos alunos por período.

## preparando os dados
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 <- alunos_max_media %>% subset(select = -`SEMINÁRIOS.(EDUCAÇÃO.AMBIENTAL)`)
alunos_graduados <- alunos_max_media[complete.cases(alunos_max_media), ]
 
##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) %>%
  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
## 1    B10079 6.37     5.75     5.00 5.0 5.75 7.10 9.5
## 2    B10087 1.05     0.00     0.00 0.0 0.00 1.95 7.6
## 3    B10088 2.10     0.00     0.15 0.7 0.00 5.20 7.7
## 4    B10092 7.10     6.90     4.25 5.0 7.00 7.50 8.5
## 5    B10172 4.68     2.70     5.35 6.9 7.10 7.30 8.2
## 6    B10192 6.55     5.85     5.00 8.4 8.40 7.80 8.8
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 calculo2 classica
## 1    B10079 6.37 5.750000     5.00 5.0 5.75 7.1 9.5 4.200000      5.7
## 2    B10092 7.10 6.900000     4.25 5.0 7.00 7.5 8.5 5.400000      5.0
## 3    B10172 4.68 2.700000     5.35 6.9 7.10 7.3 8.2 2.033333      5.5
## 4    B10192 6.55 5.850000     5.00 8.4 8.40 7.8 8.8 5.400000      6.4
## 5    B10199 5.86 3.666667     6.20 6.1 5.60 7.8 7.0 5.100000      7.8
## 6     B1024 5.91 0.000000     5.45 7.5 8.40 7.7 7.0 5.000000      5.3
##   grafos   p2 lp2 discreta
## 1    7.8 8.90 8.3 4.050000
## 2    5.1 6.70 8.2 5.000000
## 3    5.5 4.15 3.0 4.666667
## 4    5.0 6.00 8.2 5.000000
## 5    5.0 6.30 8.7 5.100000
## 6    7.6 8.30 8.7 7.000000
# Primeiro, segundo e terceiro periodo
periodos_dados <- merge(primeiro_segundo_periodos, terceiro_periodo)
periodos_dados <- merge(periodos_dados, quarto_periodo) %>% select(matricula, everything())
head(periodos_dados)
##   matricula  cra calculo1 vetorial  p1 lp1  ic  lpt calculo2 classica
## 1    B10092 7.10     6.90     4.25 5.0 7.0 7.5  8.5 5.400000 5.000000
## 2    B10504 7.12     4.65     6.30 5.3 7.9 7.6  7.2 5.000000 5.750000
## 3    B10644 6.07     3.70     5.80 7.0 7.2 8.3  7.2 4.033333 3.266667
## 4    B10973 6.73     5.60     5.60 7.0 7.7 8.4  6.7 5.900000 7.400000
## 5    B11044 8.47     8.70     8.60 9.0 8.6 9.1 10.0 8.400000 7.900000
## 6    B11365 8.35     6.20     8.20 7.9 7.9 9.2  9.3 6.900000 6.900000
##   grafos  p2 lp2 discreta eda leda moderna linear prob  tc  gi plp metodos
## 1    5.1 6.7 8.2      5.0 6.6  7.9     8.3    6.1  6.0 7.2 7.7 7.0     5.0
## 2    6.3 7.7 5.0      6.3 6.7  8.2     8.3    5.0  6.7 7.0 7.1 9.3     6.0
## 3    7.9 7.6 7.0      6.5 5.1  5.2     5.0    5.1  5.0 5.3 4.7 5.5     6.4
## 4    5.9 7.4 7.0      6.8 7.0  5.0     7.7    6.7  5.2 7.6 7.7 7.0     8.6
## 5    8.2 8.8 9.4      8.3 8.4  9.4     9.4    9.3  7.2 7.8 7.8 6.8     9.0
## 6    9.2 9.1 9.3      7.6 7.1  8.6     8.2    8.3  7.0 7.9 7.7 9.4     8.1
##   oac loac logica   es si1
## 1 7.6  7.1    7.0 6.60 9.3
## 2 7.2  9.6    8.3 8.10 9.7
## 3 7.3  8.7    7.0 8.30 8.4
## 4 6.6  5.0    5.8 4.75 8.4
## 5 8.2  8.8   10.0 8.50 8.4
## 6 8.2 10.0    8.4 9.10 9.4

Ajustado os dados

Foram usados os dados do primeiro e segundo período separadamente e, depois, simultaneamente para uma regressão linear. E foi constatado que para uma matriz completa o resultado foi menos eficiente.

## 
## Call:
## lm(formula = cra ~ ., data = primeiro_periodo %>% select(-matricula))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.3017 -0.3588  0.1345  0.4868  1.7000 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.020613   0.137457   0.150    0.881    
## calculo1    0.204269   0.017973  11.365  < 2e-16 ***
## vetorial    0.139678   0.018533   7.537 1.42e-13 ***
## p1          0.009062   0.043261   0.209    0.834    
## lp1         0.242987   0.041377   5.872 6.49e-09 ***
## ic          0.186051   0.024056   7.734 3.42e-14 ***
## lpt         0.152902   0.018793   8.136 1.73e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6979 on 738 degrees of freedom
## Multiple R-squared:  0.8651, Adjusted R-squared:  0.864 
## F-statistic: 788.8 on 6 and 738 DF,  p-value: < 2.2e-16
## 
## Call:
## lm(formula = cra ~ ., data = primeiro_periodo %>% select(-matricula))
## 
## Coefficients:
## (Intercept)     calculo1     vetorial           p1          lp1  
##    0.020613     0.204269     0.139678     0.009062     0.242987  
##          ic          lpt  
##    0.186051     0.152902

## 
## Call:
## lm(formula = cra ~ ., data = segundo_periodo %>% select(-matricula))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.19639 -0.33270  0.04221  0.38716  2.11293 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.41463    0.15849   8.926  < 2e-16 ***
## calculo2     0.18501    0.01851   9.994  < 2e-16 ***
## classica     0.10542    0.01854   5.685 2.68e-08 ***
## grafos       0.10981    0.02415   4.546 7.45e-06 ***
## p2           0.18398    0.03680   4.999 8.98e-07 ***
## lp2          0.07216    0.03164   2.281   0.0232 *  
## discreta     0.15735    0.02472   6.365 5.88e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5808 on 364 degrees of freedom
## Multiple R-squared:  0.8265, Adjusted R-squared:  0.8237 
## F-statistic:   289 on 6 and 364 DF,  p-value: < 2.2e-16

## 
## Call:
## lm(formula = cra ~ ., data = primeiro_segundo_periodos %>% select(-matricula))
## 
## Coefficients:
## (Intercept)     calculo1     vetorial           p1          lp1  
##    -0.23673      0.08564      0.05309     -0.06257      0.17623  
##          ic          lpt     calculo2     classica       grafos  
##     0.06506      0.11453      0.15271      0.07666      0.09574  
##          p2          lp2     discreta  
##     0.08454      0.06901      0.11208
## 
## Call:
## lm(formula = cra ~ ., data = primeiro_segundo_periodos %>% select(-matricula))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.68662 -0.20674  0.04182  0.25824  1.17785 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.23673    0.21395  -1.106 0.269390    
## calculo1     0.08564    0.02334   3.670 0.000286 ***
## vetorial     0.05309    0.02261   2.348 0.019517 *  
## p1          -0.06257    0.04509  -1.388 0.166264    
## lp1          0.17623    0.04425   3.982 8.53e-05 ***
## ic           0.06506    0.03051   2.132 0.033771 *  
## lpt          0.11453    0.02371   4.830 2.16e-06 ***
## calculo2     0.15271    0.01783   8.563 5.39e-16 ***
## classica     0.07666    0.01682   4.557 7.49e-06 ***
## grafos       0.09574    0.02216   4.320 2.11e-05 ***
## p2           0.08454    0.03233   2.615 0.009368 ** 
## lp2          0.06901    0.02638   2.616 0.009332 ** 
## discreta     0.11208    0.02216   5.057 7.33e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4506 on 307 degrees of freedom
## Multiple R-squared:  0.8921, Adjusted R-squared:  0.8879 
## F-statistic: 211.6 on 12 and 307 DF,  p-value: < 2.2e-16

# comparando as regressoes

resultado_p1 <- data.frame(pred = predict(lm.p1, primeiro_periodo %>% select(-matricula) %>% select(-cra)), obs = primeiro_periodo$cra)
resultado_p2 <- data.frame(pred = predict(lm.p2, segundo_periodo %>% select(-matricula) %>% select(-cra)), obs = segundo_periodo$cra)
resultado_p1_p2 <- data.frame(pred = predict(lm.p1.p2, primeiro_segundo_periodos %>% select(-matricula) %>% select(-cra)), obs = primeiro_segundo_periodos$cra)

resultado_p1$modelo <- "P1"
resultado_p2$modelo <- "P2"
resultado_p1_p2$modelo <- "P1+P2"

head(resultado_p1)
##       pred  obs modelo
## 1 6.109570 6.37     P1
## 2 1.545470 1.05     P1
## 3 2.192722 2.10     P1
## 4 6.464972 7.10     P1
## 5 5.719122 4.68     P1
## 6 6.827926 6.55     P1
head(resultado_p2)
##       pred  obs modelo
## 1 6.522612 6.37     P2
## 2 6.111860 7.10     P2
## 3 4.688815 4.68     P2
## 4 6.119676 6.55     P2
## 5 6.318764 5.86     P2
## 6 6.989141 5.91     P2
head(resultado_p1_p2)
##       pred  obs modelo
## 1 6.375855 6.37  P1+P2
## 2 6.350968 7.10  P1+P2
## 3 4.851760 4.68  P1+P2
## 4 6.427307 6.55  P1+P2
## 5 5.880950 5.86  P1+P2
## 6 6.350480 5.91  P1+P2
comparacao <- rbind(resultado_p1, resultado_p2, resultado_p1_p2)

ggplot(comparacao, aes(x = pred, y = obs)) + geom_point(alpha = 0.5, position = position_jitter(width = 0.2)) + facet_grid(. ~modelo) + geom_abline(color = "red")

round(defaultSummary(resultado_p1), digits = 3)
##     RMSE Rsquared      MAE 
##    0.695    0.865    0.527
round(defaultSummary(resultado_p2), digits = 3)
##     RMSE Rsquared      MAE 
##    0.575    0.827    0.442
round(defaultSummary(resultado_p1_p2), digits = 3)
##     RMSE Rsquared      MAE 
##    0.441    0.892    0.328

Buscou-se verificar as relações entre os atributos para que um dos mais relacionados seja utilizado de modo que a quantidade de atributos diminua e o cálculo seja simplificado. Para auxiliar nessas tarefas foram usados gráficos de correlação. Os dois gráficos estão sendo exibidos a nível de informação, no entanto, o primeiro, por sua maior clareza, será utilizado nas análises. É visto que todas as cadeiras são, consideravelmente relacionadas, mas as que possuem relação mais forte são as cadeiras de programação com seus respectivos laboratórios.

## Analise das Variaveis
ggcorr(primeiro_segundo_periodos %>% select(-matricula), palette = "RdBu", label = TRUE, label_round =3)

ggpairs(primeiro_segundo_periodos %>% select(-matricula))

Por exemplo, retirar a cadeira de Fundamentos de Física Clássica não diminui tanto a probabilidade de que o resultado tenha sido obtido de forma aleatória quanto retirar Laboratório de Programação II, pois esta última está mais relacionada com outra cadeira do que Física.

df_tentativa1 <- alunos_graduados %>%
  select("CALCULO.DIFERENCIAL.E.INTEGRAL.I", "CALCULO.DIFERENCIAL.E.INTEGRAL.II", "ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA", "PROGRAMAÇÃO.I", "PROGRAMAÇÃO.II", "TEORIA.DOS.GRAFOS", "LEITURA.E.PRODUCAO.DE.TEXTOS", "MATEMÁTICA.DISCRETA", "FUNDAMENTOS.DE.FÍSICA.CLÁSSICA", "LABORATÓRIO.DE.PROGRAMAÇÃO.I",  Matricula, cra) %>%
  na.omit()
head(df_tentativa1)
##    CALCULO.DIFERENCIAL.E.INTEGRAL.I CALCULO.DIFERENCIAL.E.INTEGRAL.II
## 4                          6.900000                              5.40
## 21                         4.650000                              5.00
## 41                         8.700000                              8.40
## 60                         3.933333                              5.15
## 66                         6.100000                              5.60
## 92                         8.600000                              8.70
##    ÁLGEBRA.VETORIAL.E.GEOMETRIA.ANALÍTICA PROGRAMAÇÃO.I PROGRAMAÇÃO.II
## 4                                    4.25           5.0            6.7
## 21                                   6.30           5.3            7.7
## 41                                   8.60           9.0            8.8
## 60                                   4.85           9.5            8.4
## 66                                   9.40           9.1            9.0
## 92                                  10.00           7.9            9.5
##    TEORIA.DOS.GRAFOS LEITURA.E.PRODUCAO.DE.TEXTOS MATEMÁTICA.DISCRETA
## 4                5.1                          8.5                 5.0
## 21               6.3                          7.2                 6.3
## 41               8.2                         10.0                 8.3
## 60               6.0                          9.1                 4.9
## 66               8.5                          9.2                 8.2
## 92               9.2                          9.8                 8.8
##    FUNDAMENTOS.DE.FÍSICA.CLÁSSICA LABORATÓRIO.DE.PROGRAMAÇÃO.I Matricula
## 4                            5.00                          7.0    B10092
## 21                           5.75                          7.9    B10504
## 41                           7.90                          8.6    B11044
## 60                           7.00                          9.7    B11671
## 66                           7.30                          9.3    B11776
## 92                           8.60                          8.3    B12263
##     cra
## 4  7.10
## 21 7.12
## 41 8.47
## 60 6.78
## 66 7.70
## 92 9.07
colnames(df_tentativa1) <- c("calculo1","calculo2", "vetorial", "p1", "p2", "grafos", "lpt", "discreta", "classica", "lp1", "matricula", "cra")
head(df_tentativa1)
##    calculo1 calculo2 vetorial  p1  p2 grafos  lpt discreta classica lp1
## 4  6.900000     5.40     4.25 5.0 6.7    5.1  8.5      5.0     5.00 7.0
## 21 4.650000     5.00     6.30 5.3 7.7    6.3  7.2      6.3     5.75 7.9
## 41 8.700000     8.40     8.60 9.0 8.8    8.2 10.0      8.3     7.90 8.6
## 60 3.933333     5.15     4.85 9.5 8.4    6.0  9.1      4.9     7.00 9.7
## 66 6.100000     5.60     9.40 9.1 9.0    8.5  9.2      8.2     7.30 9.3
## 92 8.600000     8.70    10.00 7.9 9.5    9.2  9.8      8.8     8.60 8.3
##    matricula  cra
## 4     B10092 7.10
## 21    B10504 7.12
## 41    B11044 8.47
## 60    B11671 6.78
## 66    B11776 7.70
## 92    B12263 9.07
# tirar classica aumenta muito o p-value
lm_tentativa_sem_lp2 <- lm(cra~., data = df_tentativa1 %>% select(-matricula))
lm_tentativa_sem_lp2_sem_lp1 <- lm(cra~., data = df_tentativa1 %>% select(-matricula, -lp1))
lm_tentativa_sem_classica_sem_lp2 <- lm(cra~., data = df_tentativa1 %>% select(-matricula, -classica))
summary(lm_tentativa_sem_lp2)
## 
## Call:
## lm(formula = cra ~ ., data = df_tentativa1 %>% select(-matricula))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.45087 -0.19954  0.08289  0.28142  0.93752 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  1.994787   0.695912   2.866  0.00615 **
## calculo1     0.117642   0.053082   2.216  0.03145 * 
## calculo2     0.064820   0.062224   1.042  0.30276   
## vetorial     0.097158   0.054361   1.787  0.08021 . 
## p1          -0.024455   0.101213  -0.242  0.81011   
## p2           0.168983   0.109321   1.546  0.12873   
## grafos       0.045675   0.077654   0.588  0.55917   
## lpt          0.127481   0.064838   1.966  0.05508 . 
## discreta     0.199378   0.057476   3.469  0.00111 **
## classica    -0.040394   0.077279  -0.523  0.60359   
## lp1         -0.005764   0.085037  -0.068  0.94624   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.444 on 48 degrees of freedom
## Multiple R-squared:  0.7886, Adjusted R-squared:  0.7446 
## F-statistic: 17.91 on 10 and 48 DF,  p-value: 5.228e-13
summary(lm_tentativa_sem_lp2_sem_lp1)
## 
## Call:
## lm(formula = cra ~ ., data = df_tentativa1 %>% select(-matricula, 
##     -lp1))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.45642 -0.20437  0.08206  0.27550  0.93768 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.97895    0.64882   3.050 0.003686 ** 
## calculo1     0.11723    0.05219   2.246 0.029242 *  
## calculo2     0.06492    0.06157   1.054 0.296867    
## vetorial     0.09727    0.05378   1.809 0.076662 .  
## p1          -0.02935    0.07014  -0.418 0.677425    
## p2           0.16743    0.10581   1.582 0.120000    
## grafos       0.04645    0.07603   0.611 0.544085    
## lpt          0.12890    0.06075   2.122 0.038953 *  
## discreta     0.19872    0.05607   3.544 0.000877 ***
## classica    -0.03926    0.07466  -0.526 0.601417    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4395 on 49 degrees of freedom
## Multiple R-squared:  0.7886, Adjusted R-squared:  0.7498 
## F-statistic: 20.31 on 9 and 49 DF,  p-value: 1.118e-13
summary(lm_tentativa_sem_classica_sem_lp2)
## 
## Call:
## lm(formula = cra ~ ., data = df_tentativa1 %>% select(-matricula, 
##     -classica))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.45127 -0.19972  0.07681  0.28093  0.93514 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  1.826611   0.612475   2.982  0.00445 **
## calculo1     0.117257   0.052682   2.226  0.03066 * 
## calculo2     0.061033   0.061341   0.995  0.32463   
## vetorial     0.089526   0.051974   1.723  0.09128 . 
## p1          -0.027401   0.100304  -0.273  0.78587   
## p2           0.153601   0.104502   1.470  0.14800   
## grafos       0.045232   0.077072   0.587  0.55998   
## lpt          0.132125   0.063748   2.073  0.04349 * 
## discreta     0.198394   0.057018   3.480  0.00106 **
## lp1          0.003896   0.082386   0.047  0.96247   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4407 on 49 degrees of freedom
## Multiple R-squared:  0.7874, Adjusted R-squared:  0.7484 
## F-statistic: 20.17 on 9 and 49 DF,  p-value: 1.275e-13
resultado_tentativa1 <- data.frame(pred = predict(lm_tentativa_sem_lp2_sem_lp1, df_tentativa1 %>% select(-matricula, -lp1) %>% select(-cra)), obs = df_tentativa1$cra)
resultado_tentativa1$modelo <- "Tentativa1"
head(resultado_tentativa1)
##        pred  obs     modelo
## 4  6.656654 7.10 Tentativa1
## 21 6.842010 7.12 Tentativa1
## 41 8.599005 8.47 Tentativa1
## 60 6.524312 6.78 Tentativa1
## 66 8.135293 7.70 Tentativa1
## 92 8.984973 9.07 Tentativa1
ggplot(resultado_tentativa1, aes(x = pred, y = obs)) + geom_point(alpha = 0.5, position = position_jitter(width = 0.2)) +
  facet_grid(. ~modelo) +
  geom_abline(color = "red")

round(defaultSummary(resultado_tentativa1))
##     RMSE Rsquared      MAE 
##        0        1        0
par(mfrow = c(2, 1))
plot(lm_tentativa_sem_lp2_sem_lp1, which = 1:2)

Verificando o modelo para dados reais:

notas.p1.p2 = data.frame(calculo1 = 8.3, vetorial = 10, lpt = 9.2, p1 = 10, ic=9.9, lp1 =10, calculo2 = 9.8, discreta = 10, p2 = 9.8, grafos = 10, classica = 9.7, lp2 = 9.7)

notas.tentativa3 = data.frame(calculo1 = 8.3, vetorial = 10, lpt = 9.2, lp1 = 10, discreta = 10, grafos = 10, p2 = 9.8)

predict(lm.p1.p2, notas.p1.p2)
##        1 
## 9.655644
lm.p1.p2
## 
## Call:
## lm(formula = cra ~ ., data = primeiro_segundo_periodos %>% select(-matricula))
## 
## Coefficients:
## (Intercept)     calculo1     vetorial           p1          lp1  
##    -0.23673      0.08564      0.05309     -0.06257      0.17623  
##          ic          lpt     calculo2     classica       grafos  
##     0.06506      0.11453      0.15271      0.07666      0.09574  
##          p2          lp2     discreta  
##     0.08454      0.06901      0.11208

Usando caret

O mesmo cálculo pode ser feito através da biblioteca ‘caret’. Para tal, retira-se o identificador de usuários, a Matrícula, separa-se a variável alvo, e configura-se o fator randômico do algoritmo.

#usar alunos_max_media ao inves de alunos_graduados causa uma diferença de 0.3 na predição do cra, sendo max_media mais preciso

# calculando as features mais importantes
cadeiras_pri_seg_periodos <- primeiro_segundo_periodos%>% select(-matricula)
cra_notas <- cadeiras_pri_seg_periodos %>% select(cra)
set.seed(7)

Assim como anteriormente, podemos encontrar as cadeiras mais correlacionadas definindo o valor mínimo. Nesse caso, duas cadeiras serão consideradas com alta correção se seu valor correspondente for maior que ‘0.5’. E então são listadas, numericamente, os grupos correlacionados.

## Calculando as cadeiras mais importantes 
# calculando as features mais importantes
matriz_correlacao <- periodos_dados %>% select(-matricula) %>% cor()
head(matriz_correlacao)
##                cra  calculo1  vetorial        p1       lp1        ic
## cra      1.0000000 0.6417008 0.6145428 0.5801568 0.5439263 0.7086893
## calculo1 0.6417008 1.0000000 0.6184494 0.3427402 0.3256883 0.5743004
## vetorial 0.6145428 0.6184494 1.0000000 0.4348035 0.3934842 0.6085524
## p1       0.5801568 0.3427402 0.4348035 1.0000000 0.8778204 0.5483577
## lp1      0.5439263 0.3256883 0.3934842 0.8778204 1.0000000 0.5279130
## ic       0.7086893 0.5743004 0.6085524 0.5483577 0.5279130 1.0000000
##                lpt  calculo2  classica    grafos        p2       lp2
## cra      0.5105411 0.6304148 0.4996300 0.5803303 0.7216762 0.5153834
## calculo1 0.3032313 0.6263728 0.4779985 0.4745375 0.5084278 0.3282771
## vetorial 0.4170320 0.4410139 0.3787501 0.4756732 0.5090717 0.3263949
## p1       0.4032239 0.4178491 0.1347077 0.6641400 0.6341156 0.3403186
## lp1      0.2512333 0.4066473 0.1440484 0.5600728 0.6146964 0.2650237
## ic       0.4452940 0.5218097 0.5222443 0.5167186 0.6095626 0.4706963
##           discreta       eda      leda    moderna    linear      prob
## cra      0.6350337 0.6507241 0.6973358 0.46359028 0.7176596 0.7242512
## calculo1 0.5125482 0.4800490 0.5205910 0.43701097 0.4350148 0.5668370
## vetorial 0.4403512 0.3519787 0.3636909 0.30008128 0.5385088 0.4667373
## p1       0.5267350 0.5128732 0.4096076 0.06579375 0.2711839 0.2994749
## lp1      0.5344340 0.5489541 0.4587600 0.10421163 0.2988717 0.3379328
## ic       0.5348213 0.4365781 0.3600223 0.32852762 0.4321527 0.4371323
##                 tc         gi       plp   metodos       oac      loac
## cra      0.6639612 0.47054869 0.5054833 0.6950008 0.6958072 0.5862041
## calculo1 0.5310661 0.31474316 0.2623207 0.3477284 0.3297711 0.2594442
## vetorial 0.4342182 0.30689597 0.2869990 0.3675845 0.3268810 0.2992253
## p1       0.4931148 0.12120487 0.3305748 0.3349295 0.3445592 0.3214319
## lp1      0.4858812 0.08567282 0.3328025 0.2435620 0.2812191 0.3089948
## ic       0.4972216 0.30197632 0.3382325 0.4001666 0.4582620 0.3960812
##             logica        es       si1
## cra      0.8113374 0.5892020 0.6520789
## calculo1 0.4197915 0.1232275 0.3007266
## vetorial 0.4892482 0.3006373 0.3437560
## p1       0.4532833 0.3238293 0.3238568
## lp1      0.4086991 0.2256940 0.3511935
## ic       0.5217490 0.2783902 0.4122859
cadeiras_correlatas <- matriz_correlacao %>% findCorrelation(cutoff=0.5)
# indices de atributos autamente correatos
cadeiras_correlatas
##  [1]  1 25 11  6 18 17 15  8 13 19 14  2 10 23  4 27 22 24 12
nome_cadeiras <- colnames(periodos_dados)
cat("relacionados: \n", "grupo 1:", nome_cadeiras[1],nome_cadeiras[25], nome_cadeiras[11], "\n", "grupo 2:", nome_cadeiras[6], nome_cadeiras[18],nome_cadeiras[17], nome_cadeiras[15], "\n grupo 3:", nome_cadeiras[8], nome_cadeiras[13],nome_cadeiras[19], nome_cadeiras[14],"\n grupo 4:", nome_cadeiras[2], nome_cadeiras[10], nome_cadeiras[23], "\n",  "grupo 5:", nome_cadeiras[4], nome_cadeiras[27],nome_cadeiras[22], nome_cadeiras[12], nome_cadeiras[12] )
## relacionados: 
##  grupo 1: matricula loac grafos 
##  grupo 2: lp1 linear moderna eda 
##  grupo 3: lpt lp2 prob discreta 
##  grupo 4: cra classica metodos 
##  grupo 5: vetorial es plp p2 p2

Ao invés da matrix de correlação, faz-se, nesse caso, um ranking dos itens mais importantes.

# descobrir as features mais importantes
controle <- trainControl(method = "repeatedcv", number = 50, repeats = 3)
modelo_cra <- train(cra~., data = cadeiras_pri_seg_periodos, method ="knn", preProcess = "scale", trControl = controle, tuneLength = 20)
modelo_cra
## k-Nearest Neighbors 
## 
## 320 samples
##  12 predictors
## 
## Pre-processing: scaled (12) 
## Resampling: Cross-Validated (50 fold, repeated 3 times) 
## Summary of sample sizes: 313, 313, 315, 314, 314, 314, ... 
## Resampling results across tuning parameters:
## 
##   k   RMSE       Rsquared   MAE      
##    5  0.4959714  0.8869394  0.3934213
##    7  0.4966998  0.8904098  0.3900542
##    9  0.4888302  0.8967550  0.3857966
##   11  0.4910525  0.8960811  0.3875473
##   13  0.4884728  0.8977292  0.3851081
##   15  0.4909932  0.8989221  0.3861499
##   17  0.4993223  0.8987021  0.3942853
##   19  0.5040999  0.8988345  0.3979957
##   21  0.5095553  0.8974317  0.4019659
##   23  0.5127158  0.8967899  0.4042616
##   25  0.5172775  0.8952861  0.4073912
##   27  0.5199603  0.8971607  0.4083228
##   29  0.5242842  0.8972769  0.4135793
##   31  0.5256520  0.8984667  0.4162566
##   33  0.5320859  0.8967221  0.4222302
##   35  0.5393462  0.8958673  0.4281362
##   37  0.5420459  0.8956257  0.4319266
##   39  0.5460585  0.8946053  0.4355351
##   41  0.5508915  0.8941037  0.4394540
##   43  0.5554234  0.8937140  0.4432062
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was k = 13.
importancia <- varImp(modelo_cra, scale = F)
plot(importancia)

Por fim, podemos ver que o número ideal de atributos para que haja o menor é erro na predição do cra é o uso de todas as cadeiras, já que assim, ele é facilmente calculado.

#confirma a necessidade de todas as cadeiras para ter um baixo RMSE
controle1 <- rfeControl(functions=rfFuncs, method = "cv", number = 10)
resultados <- rfe(cadeiras_pri_seg_periodos %>% select(-cra), as.vector(unlist(cra_notas)), sizes = c(1:10), rfeControl = controle1)
print(resultados)
## 
## Recursive feature selection
## 
## Outer resampling method: Cross-Validated (10 fold) 
## 
## Resampling performance over subset size:
## 
##  Variables   RMSE Rsquared    MAE  RMSESD RsquaredSD   MAESD Selected
##          1 0.9478   0.5432 0.7616 0.14538    0.09492 0.10062         
##          2 0.7523   0.6900 0.5966 0.14539    0.11722 0.10935         
##          3 0.6360   0.7945 0.5007 0.09222    0.05493 0.05708         
##          4 0.5536   0.8457 0.4283 0.10163    0.06123 0.06293         
##          5 0.5548   0.8462 0.4340 0.11915    0.07429 0.07964         
##          6 0.5310   0.8577 0.4125 0.11599    0.05628 0.07226         
##          7 0.5223   0.8641 0.4047 0.11930    0.05702 0.07514         
##          8 0.5001   0.8777 0.3882 0.11675    0.05047 0.07749         
##          9 0.4932   0.8792 0.3789 0.11540    0.05283 0.07568         
##         10 0.4891   0.8830 0.3762 0.11721    0.05044 0.07640         
##         12 0.4812   0.8861 0.3692 0.12083    0.05335 0.07855        *
## 
## The top 5 variables (out of 12):
##    calculo2, p2, discreta, calculo1, ic
predictors(resultados)
##  [1] "calculo2" "p2"       "discreta" "calculo1" "ic"       "lp2"     
##  [7] "grafos"   "vetorial" "lp1"      "p1"       "classica" "lpt"
#com seis cadeiras jah eh suficiente
plot(resultados, type=c("g", "o"))

resultados$fit
## 
## Call:
##  randomForest(x = x, y = y, importance = (first | last)) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 4
## 
##           Mean of squared residuals: 0.2462346
##                     % Var explained: 86.37
resultados$resample
##     Variables      RMSE  Rsquared       MAE Resample
## 11         12 0.4353046 0.9060199 0.3335374   Fold01
## 22         12 0.6809779 0.8700634 0.4853970   Fold02
## 33         12 0.6160698 0.7879617 0.4462548   Fold03
## 44         12 0.5322817 0.8105885 0.4382027   Fold04
## 55         12 0.4272062 0.8972126 0.3548774   Fold05
## 66         12 0.2854383 0.9496890 0.2248535   Fold06
## 77         12 0.4908045 0.8904200 0.3926016   Fold07
## 88         12 0.3564146 0.9552403 0.2800964   Fold08
## 99         12 0.4185212 0.9116035 0.3518088   Fold09
## 110        12 0.5692801 0.8824116 0.3843479   Fold10
resultados$summary
## NULL
#FONTE: https://machinelearningmastery.com/feature-selection-with-the-caret-r-package/