# EfolioB-RRC
O e-fólio B consiste essencialmente na realização da atividade de aprendizagem: usando bibliotecas em R, usando dados e um indicador objetivo à sua escolha.
Sugere-se que considere como observações dados de países e anos, e procure aprender o que influencia um dos indicadores de um dos objetivos de desenvolvimento sustentável (dados no pordata).
-
Refira no fórum do espaço central o indicador que está a procurar aprender, de modo a evitar colisões de trabalhos entre estudantes. Utilize o tópico "[E-fólio B] Escolha de indicador"
-
Selecione entre 3 e 6 variáveis independentes que representem observações que possam influenciar o indicador escolhido.
-
Aplique os 3 métodos de aprendizagem (árvores de decisão, k vizinhos mais próximos e redes neuronais), calculando a performance de cada método, e indicando as variáveis observáveis mais úteis.
-
Apresente um relatório (máx. 2 páginas, excluindo folha de rosto e anexos) com a seguinte estrutura:
indicador escolhido, descrição das variáveis independentes, e porque pensa que influenciam o indicador, nº de exemplos/observações utilizados para treino e para teste descrição da implementação de cada método, com foco nas decisões tomadas (ex. tratamento, categorização ou normalização dos dados, necessários para aplicar cada algoritmo) conclusões sobre os resultados obtidos, a performance de cada método e variáveis mais úteis anexo onde deverá colocar o código usado e tabelas de resultados
Critérios de avaliação:
Implementação de árvore de decisão: 1 valor Implementação de K vizinhos mais próximos: 1 valor Implementação de Redes neuronais: 1 valor Relatório (organização, clareza, fundamentação): 1 valor
- R: the R Project for Statistical Computing - https://www.r-project.org
- https://www.pordata.pt/ods/goal/trabalho+digno+e+crescimento+economico-8
- Excell
Importamos todos os ficheiros do indicador e as variaveis.
Converter os dados para CSV com Excell.
Certifique-se de que Rstudio está instalado.
Executamos o comando para testar a interpretação do programa
source("efolioBfinal.R", echo=TRUE)
Resultado:
#============================================================================
.... [TRUNCATED]
if (!require('randomForest')) install.packages('randomForest', dependencies=TRUE)
if (!require('caret')) install.packages('caret', dependencies=TRUE)
if (!require('nnet')) install.packages('nnet', dependencies=TRUE)
if (!require('ggplot2')) install.packages('ggplot2', dependencies=TRUE)
library(randomForest)
library(caret)
library(nnet)
library(ggplot2)
dados <- read.csv("dados_jovens.csv", header = TRUE, sep = ";", stringsAsFactors = FALSE, fill = TRUE)
head(dados) Paises Anos X1 X2 X3 X4 1 DE - Alemanha 2009 12,9 11,1 3,4 -5,7 2 DE - Alemanha 2011 11 11,6 3,4 3,9 3 DE - Alemanha 2013 9,9 9,8 3,2 0,4 4 DE - Alemanha 2015 9,6 10,1 3,1 1,5 5 DE - Alemanha 2017 9,6 10,1 3 2,7 6 DE - Alemanha 2019 8,6 10,3 2,9 1,1
str(dados) 'data.frame': 651 obs. of 6 variables: $ Paises: chr "DE - Alemanha" "DE - Alemanha" "DE - Alemanha" "DE - Alemanha" ... $ Anos : int 2009 2011 2013 2015 2017 2019 2021 2023 2009 2011 ... $ X1 : chr "12,9" "11" "9,9" "9,6" ... $ X2 : chr "11,1" "11,6" "9,8" "10,1" ... $ X3 : chr "3,4" "3,4" "3,2" "3,1" ... $ X4 : chr "-5,7" "3,9" "0,4" "1,5" ...
dados$X1 <- as.numeric(sub(",", ".", dados$X1))
dados$X2 <- as.numeric(sub(",", ".", dados$X2))
dados$X3 <- as.numeric(sub(",", ".", dados$X3))
dados$X4 <- as.numeric(sub(",", ".", dados$X4))
dados <- na.omit(dados)
dados$Meta_Atingida <- ifelse(dados$X1 <= 9, 1, 2)
head(dados) Paises Anos X1 X2 X3 X4 Meta_Atingida 1 DE - Alemanha 2009 12.9 11.1 3.4 -5.7 2 2 DE - Alemanha 2011 11.0 11.6 3.4 3.9 2 3 DE - Alemanha 2013 9.9 9.8 3.2 0.4 2 4 DE - Alemanha 2015 9.6 10.1 3.1 1.5 2 5 DE - Alemanha 2017 9.6 10.1 3.0 2.7 2 6 DE - Alemanha 2019 8.6 10.3 2.9 1.1 1
variaveis_independentes <- dados[, c("X2", "X3", "X4")]
variavel_dependente <- dados$Meta_Atingida
variavel_dependente <- as.factor(variavel_dependente)
dados_completo <- cbind(variaveis_independent .... [TRUNCATED]
set.seed(123)
indices <- sample(1:nrow(dados_completo), size = 0.7 * nrow(dados_completo))
treino <- dados_completo[indices, ]
teste <- dados_completo[-indices, ]
arvore_modelo <- randomForest(x = treino[, 1:3], y = treino[, .... [TRUNCATED]
print(arvore_modelo)
Call: randomForest(x = treino[, 1:3], y = treino[, 4], ntree = 100, importance = TRUE) Type of random forest: classification Number of trees: 100 No. of variables tried at each split: 1
OOB estimate of error rate: 21.85%
Confusion matrix: 1 2 class.error 1 10 24 0.70588235 2 9 108 0.07692308
print(arvore_modelo$type) [1] "classification"
pred_arvore <- predict(arvore_modelo, teste[, 1:3])
cat("Árvore de Decisão - Matriz de Confusão:\n") Árvore de Decisão - Matriz de Confusão:
conf_mat_arvore <- confusionMatrix(pred_arvore, teste[, 4])
print(conf_mat_arvore) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 3 6 2 10 47
Accuracy : 0.7576
95% CI : (0.6364, 0.8546)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.8599
Kappa : 0.133
Mcnemar's Test P-Value : 0.4533
Sensitivity : 0.23077
Specificity : 0.88679
Pos Pred Value : 0.33333
Neg Pred Value : 0.82456
Prevalence : 0.19697
Detection Rate : 0.04545
Detection Prevalence : 0.13636
Balanced Accuracy : 0.55878
'Positive' Class : 1
cat("Importância das Variáveis:\n") Importância das Variáveis:
print(importance(arvore_modelo)) 1 2 MeanDecreaseAccuracy MeanDecreaseGini X2 6.828680 7.9633314 9.190741 21.54032 X3 2.895261 -0.7445043 1.022850 12.60203 X4 2.272132 3.0900849 3.872191 16.29301
varImpPlot(arvore_modelo)
knn_modelo <- knn3(x = treino[, 1:3], y = treino[, 4], k = 3)
print(knn_modelo) 3-nearest neighbor model Training set outcome distribution:
1 2 34 117
pred_knn <- predict(knn_modelo, teste[, 1:3])
pred_knn <- factor(max.col(pred_knn), levels = levels(teste$Meta_Atingida))
cat("K Vizinhos Mais Próximos - Matriz de Confusão:\n") K Vizinhos Mais Próximos - Matriz de Confusão:
conf_mat_knn <- confusionMatrix(pred_knn, teste$Meta_Atingida)
print(conf_mat_knn) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 3 11 2 10 42
Accuracy : 0.6818
95% CI : (0.5556, 0.7911)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.9936
Kappa : 0.0226
Mcnemar's Test P-Value : 1.0000
Sensitivity : 0.23077
Specificity : 0.79245
Pos Pred Value : 0.21429
Neg Pred Value : 0.80769
Prevalence : 0.19697
Detection Rate : 0.04545
Detection Prevalence : 0.21212
Balanced Accuracy : 0.51161
'Positive' Class : 1
rede_modelo <- nnet(Meta_Atingida ~ ., data = treino, size = 5, linout .... [TRUNCATED]
print(rede_modelo) a 3-5-1 network with 26 weights inputs: X2 X3 X4 output(s): Meta_Atingida options were - entropy fitting
cat("Pesos da Rede Neuronal:\n") Pesos da Rede Neuronal:
print(rede_modelo$wts) [1] -9454.571838 1028.218793 400.613691 -411.659311 -9008.186211 -7025.462864 7202.303440 3142.600517 111.510864 -12.820578 [11] -366.655103 92.255667 -63.675527 57.783893 35.198519 -44.141759 8426.473816 -369.620252 -1012.305431 -1044.660635 [21] -62.009386 2.750503 2700.415784 -156.953272 62.405023 -1.669902
pred_rede <- predict(rede_modelo, teste[, 1:3], type = "class")
pred_rede <- factor(pred_rede, levels = levels(teste$Meta_Atingida))
cat("Redes Neurais - Matriz de Confusão:\n") Redes Neurais - Matriz de Confusão:
conf_mat_rede <- confusionMatrix(pred_rede, teste$Meta_Atingida)
print(conf_mat_rede) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 1 5 2 12 48
Accuracy : 0.7424
95% CI : (0.6199, 0.8422)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.9145
Kappa : -0.0219
Mcnemar's Test P-Value : 0.1456
Sensitivity : 0.07692
Specificity : 0.90566
Pos Pred Value : 0.16667
Neg Pred Value : 0.80000
Prevalence : 0.19697
Detection Rate : 0.01515
Detection Prevalence : 0.09091
Balanced Accuracy : 0.49129
'Positive' Class : 1
cat("\nResultados - Árvore de Decisão:\n")
Resultados - Árvore de Decisão:
cat("Erro Médio Estimado: ", mean(arvore_modelo$err.rate[,1]), "\n") Erro Médio Estimado: 0.2340981
cat("Importância das Variáveis:\n") Importância das Variáveis:
print(importance(arvore_modelo)) 1 2 MeanDecreaseAccuracy MeanDecreaseGini X2 6.828680 7.9633314 9.190741 21.54032 X3 2.895261 -0.7445043 1.022850 12.60203 X4 2.272132 3.0900849 3.872191 16.29301
print(conf_mat_arvore) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 3 6 2 10 47
Accuracy : 0.7576
95% CI : (0.6364, 0.8546)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.8599
Kappa : 0.133
Mcnemar's Test P-Value : 0.4533
Sensitivity : 0.23077
Specificity : 0.88679
Pos Pred Value : 0.33333
Neg Pred Value : 0.82456
Prevalence : 0.19697
Detection Rate : 0.04545
Detection Prevalence : 0.13636
Balanced Accuracy : 0.55878
'Positive' Class : 1
cat("\nResultados - K Vizinhos Mais Próximos:\n")
Resultados - K Vizinhos Mais Próximos:
print(conf_mat_knn) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 3 11 2 10 42
Accuracy : 0.6818
95% CI : (0.5556, 0.7911)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.9936
Kappa : 0.0226
Mcnemar's Test P-Value : 1.0000
Sensitivity : 0.23077
Specificity : 0.79245
Pos Pred Value : 0.21429
Neg Pred Value : 0.80769
Prevalence : 0.19697
Detection Rate : 0.04545
Detection Prevalence : 0.21212
Balanced Accuracy : 0.51161
'Positive' Class : 1
cat("\nResultados - Redes Neurais:\n")
Resultados - Redes Neurais:
print(conf_mat_rede) Confusion Matrix and Statistics
Reference
Prediction 1 2 1 1 5 2 12 48
Accuracy : 0.7424
95% CI : (0.6199, 0.8422)
No Information Rate : 0.803
P-Value [Acc > NIR] : 0.9145
Kappa : -0.0219
Mcnemar's Test P-Value : 0.1456
Sensitivity : 0.07692
Specificity : 0.90566
Pos Pred Value : 0.16667
Neg Pred Value : 0.80000
Prevalence : 0.19697
Detection Rate : 0.01515
Detection Prevalence : 0.09091
Balanced Accuracy : 0.49129
'Positive' Class : 1
cat("\nConclusão:\n")
Conclusão:
cat("Após aplicar os três métodos de aprendizagem supervisionada, foram observados os seguintes resultados:\n") Após aplicar os três métodos de aprendizagem supervisionada, foram observados os seguintes resultados:
cat("Árvore de Decisão apresentou um erro médio estimado de ", mean(arvore_modelo$err.rate[,1]), " e mostrou que a variável mais importante foi X2.\ ..." ... [TRUNCATED] Árvore de Decisão apresentou um erro médio estimado de 0.2340981 e mostrou que a variável mais importante foi X2.
cat("O método K Vizinhos Mais Próximos teve uma precisão de ", conf_mat_knn$overall['Accuracy'], ".\n") O método K Vizinhos Mais Próximos teve uma precisão de 0.6818182 .
cat("O método de Redes Neurais teve uma precisão de ", conf_mat_rede$overall['Accuracy'], ".\n") O método de Redes Neurais teve uma precisão de 0.7424242 .
cat("Analisando os resultados, podemos concluir que o modelo de Árvores de Decisão apresentou melhor performance em termos de erro médio, enquanto o ..." ... [TRUNCATED] Analisando os resultados, podemos concluir que o modelo de Árvores de Decisão apresentou melhor performance em termos de erro médio, enquanto o modelo de Redes Neurais teve uma precisão ligeiramente inferior. O K Vizinhos Mais Próximos teve a menor precisão entre os três métodos.
O projeto foi feito em Rstudio
The project was done with Rstudio
- Rstudio
- Excell