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