Carregando bibliotecas necessárias

Carregando, separando em treino e teste e pre processando os dados

dados <- read.csv("./train.csv", encoding = "latin1")
dados <- dados %>% select(-nome,  -estado_civil, -grau, -uf, -ocupacao, -sequencial_candidato, -cargo)
particao <- createDataPartition(dados$situacao, p=0.75, list=FALSE)
treino <- dados[particao, ]
teste <- dados[-particao, ]

1. Há desbalanceamento das classes (isto é, uma classe tem muito mais instâncias que outra)? Em que proporção? Quais efeitos colaterais o desbalanceamento de classes pode causar no classificador?

Para verificar se existe um desbalanceamento, podemos simplesmente contabilizar as instâncias das classes de situacao

cont_nao_eleito <- dados %>% select(situacao) %>% filter(situacao == 'nao_eleito') %>% nrow()
cont_eleito <- dados %>% select(situacao) %>% filter(situacao == 'eleito') %>% nrow()
df = data.frame(Eleito = c("Sim", "Não"), count = c(cont_eleito, cont_nao_eleito)) 
ggplot(df, aes(x="", y=count, fill=Eleito))+ geom_bar(width = 1, stat = "identity") + coord_polar("y", start=0) +
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))

Verificamos então que existe sim um grande desbalanceamento das classes (a classe nao_eleito é quase 7 vezes mais numerosa que a classe eleito). Como esse desbalanceamento pode diminuir drasticamente a acurácia dos nossos modelos, tendo em vista que o classificador vai tender para a classe com mais instâncias, temos que encontrar uma forma de contornar esse problema.

Existe algumas formas para resolver isto. Criar instâncias para a classe menor e/ou remover instâncias da classe maior (oversampling e udersampling)

Existe a função ROSE, que já faz todo o trabalho de oversampling e udersampling. Por isso iremos utilizá-la.

treino <- treino %>% select(-recursos_de_outros_candidatos.comites, -recursos_de_partido_politico, -recursos_de_pessoas_fisicas, -recursos_de_pessoas_juridicas, -recursos_proprios)
rtreino <- ROSE(situacao ~ ., data  = treino)$data

2. Treine: um modelo de KNN, regressão logística, uma árvore de decisão e um modelo de adaboost. Tune esses modelos usando validação cruzada e controle overfitting se necessário, considerando as particularidades de cada modelo.

fitControl <- trainControl(method = "repeatedcv",
                           number = 5,
                           repeats = 5,
                           classProbs = TRUE)

KNN

preProcValues <- c("center", "scale", "nzv")

model.knn <- train(situacao ~ .,
                   data = treino,
                   method = "knn",
                   trControl = fitControl,
                   preProcess = preProcValues,
                   tuneLength = 15)
model.knn
## k-Nearest Neighbors 
## 
## 5717 samples
##   11 predictor
##    2 classes: 'eleito', 'nao_eleito' 
## 
## Pre-processing: centered (17), scaled (17), remove (23) 
## Resampling: Cross-Validated (5 fold, repeated 5 times) 
## Summary of sample sizes: 4573, 4573, 4574, 4574, 4574, 4573, ... 
## Resampling results across tuning parameters:
## 
##   k   Accuracy   Kappa    
##    5  0.8998789  0.5469794
##    7  0.9022925  0.5524077
##    9  0.9027470  0.5522698
##   11  0.9037618  0.5550221
##   13  0.9043916  0.5577289
##   15  0.9051260  0.5587843
##   17  0.9048460  0.5563809
##   19  0.9049508  0.5543298
##   21  0.9046008  0.5505018
##   23  0.9041112  0.5470733
##   25  0.9044965  0.5463667
##   27  0.9037619  0.5397223
##   29  0.9034825  0.5351211
##   31  0.9036924  0.5340942
##   33  0.9025380  0.5254783
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 15.

Regressão Logística

logistica <- glm(formula=situacao~., data =rtreino, family=binomial)
logistica
## 
## Call:  glm(formula = situacao ~ ., family = binomial, data = rtreino)
## 
## Coefficients:
##             (Intercept)                      ano               partidoPAN  
##               2.841e+02               -1.423e-01               -1.581e+01  
##          partidoPC do B               partidoPCB               partidoPCO  
##              -2.512e-02               -1.497e+01               -1.499e+01  
##              partidoPDT               partidoPFL               partidoPHS  
##              -5.174e-01                7.885e-01               -1.149e+00  
##               partidoPL              partidoPMDB               partidoPMN  
##              -1.575e-01                4.345e-01               -1.592e+00  
##               partidoPP               partidoPPS                partidoPR  
##               3.982e-01               -5.261e-01                6.577e-01  
##              partidoPRB             partidoPRONA               partidoPRP  
##               1.202e-01               -1.560e+01               -1.719e+00  
##             partidoPRTB               partidoPSB               partidoPSC  
##              -1.585e+00               -7.367e-02               -4.159e-01  
##             partidoPSDB              partidoPSDC               partidoPSL  
##              -8.776e-02               -1.549e+01               -5.824e+00  
##             partidoPSOL              partidoPSTU                partidoPT  
##              -1.021e+00               -1.524e+01                5.456e-01  
##          partidoPT do B               partidoPTB               partidoPTC  
##              -1.197e+00               -9.300e-01               -1.089e+00  
##              partidoPTN                partidoPV       quantidade_doacoes  
##              -1.585e+01               -7.580e-01                1.576e-03  
##     quantidade_doadores            total_receita            media_receita  
##               2.663e-03                1.477e-06                2.897e-05  
##     quantidade_despesas  quantidade_fornecedores            total_despesa  
##               3.433e-04                3.089e-04                1.808e-06  
##           media_despesa            sexoMASCULINO  
##               8.619e-05                1.027e-01  
## 
## Degrees of Freedom: 5716 Total (i.e. Null);  5676 Residual
## Null Deviance:       7924 
## Residual Deviance: 4328  AIC: 4410

Árvore de decisão

arvore <- train(
    x = rtreino[, names(rtreino) != "situacao"],
    y = rtreino$situacao,
    method = "rpart",
    trControl = fitControl,
    control = rpart.control(cp = 0.4))
arvore
## CART 
## 
## 5717 samples
##   11 predictor
##    2 classes: 'nao_eleito', 'eleito' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 5 times) 
## Summary of sample sizes: 4574, 4573, 4574, 4574, 4573, 4574, ... 
## Resampling results across tuning parameters:
## 
##   cp          Accuracy   Kappa    
##   0.04787234  0.8909933  0.7819191
##   0.11134752  0.8526823  0.7048385
##   0.64929078  0.6695014  0.3319922
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.04787234.

Adaboost

adaboost <- train(x = rtreino[, names(rtreino) != "situacao"],
                y = rtreino$situacao,
                method = "adaboost",
                trControl = fitControl)

adaboost
## AdaBoost Classification Trees 
## 
## 5717 samples
##   11 predictor
##    2 classes: 'nao_eleito', 'eleito' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 5 times) 
## Summary of sample sizes: 4573, 4574, 4573, 4574, 4574, 4573, ... 
## Resampling results across tuning parameters:
## 
##   nIter  method         Accuracy   Kappa    
##    50    Adaboost.M1    0.9799900  0.9599826
##    50    Real adaboost  0.9769461  0.9539039
##   100    Adaboost.M1    0.9808993  0.9618011
##   100    Real adaboost  0.9777157  0.9554421
##   150    Adaboost.M1    0.9812493  0.9625007
##   150    Real adaboost  0.9781705  0.9563517
## 
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were nIter = 150 and method
##  = Adaboost.M1.

3. Reporte acurácia, precision, recall e f-measure no treino e validação. Como você avalia os resultados? Justifique sua resposta.

A análise será feita no modelo adaboost.

teste$predictions <- predict(adaboost, teste)


verdadeiroPositivo <- teste %>% filter(situacao == "eleito", predictions == "eleito") %>% nrow()
verdadeiroNegativo <- teste %>% filter(situacao == "nao_eleito" , predictions == "nao_eleito" ) %>% nrow()
falsoPositivo <- teste %>% filter(situacao == "nao_eleito" , predictions == "eleito") %>% nrow() 
falsoNegativo <- teste %>% filter(situacao == "eleito", predictions == "nao_eleito" ) %>% nrow()
acuracia <- (verdadeiroPositivo + verdadeiroNegativo)/(verdadeiroPositivo + verdadeiroNegativo + falsoPositivo + falsoNegativo) 
precision <- verdadeiroPositivo / (verdadeiroPositivo + falsoPositivo)
recall <- verdadeiroPositivo / (verdadeiroPositivo + falsoNegativo)
f_measure <- 2 * (precision * recall) / (precision + recall)
f_measure
## [1] 0.5609756
acuracia
## [1] 0.9055118
precision
## [1] 0.7467532
recall
## [1] 0.4492188

No treino, o modelo teve acurácia igual a 0.9812493; na validação, esse valor diminuiu para 0.9055118 Mas nossa principal medida é a precisão (0.7467532), pois ela considera verdadeiros positivos, falsos positivos, verdadeiros negativos e falsos negativos. Neste sentido o preditor se mostra razoavelmente bom, mas não tão confiável. O f-measure também nos mostra isso, pois não está tão próximo de 1 assim - o que poderia indicar um bom preditor.

4. Interprete as saídas dos modelos. Quais atributos parecem ser mais importantes de acordo com cada modelo?.

KNN

ggplot(varImp(model.knn))

No modelo KNN, as variáveis tota_despesa, total_receita, quantidade_fornecedores, quantidade_despesas,quantidade_doacoes, quantidade_doadores, media_receita se mostram bem importantes, enquanto sexo, partido e ano nem tanto.

Árvore de Decisão

ggplot(varImp(arvore))

No modelo de Árvore de Decisão, apenas os atributos total_despesa, quantidade despesas, total_receita, quantidade_fornecedores, quantidade_doadores e quantidade_doacoes parecem ser importantes.

Adaboost

ggplot(varImp(adaboost))

No modelo Adaboost, total_despesa, total_receita, media_receita, quantidade_fornecedores, quantidade_doacoes e quantidade_despesas, parecem ser as mais importantes.