Descrição do problema:

O objetivo desse checkpoint é construir modelos preditivos de regressão para a predição de votação de candidatos à Câmara Federal de Deputados.

Iniciando

Importando dados

Antes de tudo, iremos importar os dados de treino e teste:

train = importa_eleicao("train.csv")
test = importa_eleicao("test.csv")

Preparando dataframe:

Nessa parte inicial, optei por retirar algumas variáveis contidas na base de dados afim de faciltar a criação dos modelos posteriormente.

train <- train %>% 
  select(-cargo,
         -sequencial_candidato,
         -ocupacao,
         -uf,
         -nome)

Criação dos modelos

  • Modelo de regressão Ridge
  • Modelo de regressão Lasso
  • Modelo KNN
modelo_ridge <- train(votos ~ .,
                     data = train,
                     method = "ridge")


modelo_lasso <- train(votos ~ .,
                     data = train,
                     method = "lasso")


modelo_knn <- train(votos ~ .,
                     data = train,
                     method = "knn")
modelo_ridge
## Ridge Regression 
## 
## 7476 samples
##   18 predictors
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ... 
## Resampling results across tuning parameters:
## 
##   lambda  RMSE          Rsquared   MAE         
##   0e+00   8.844462e+12  0.2984072  1.723877e+11
##   1e-04   3.964234e+04  0.3777695  1.640843e+04
##   1e-01   4.021715e+04  0.3724965  1.638444e+04
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was lambda = 1e-04.
modelo_lasso
## The lasso 
## 
## 7476 samples
##   18 predictors
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ... 
## Resampling results across tuning parameters:
## 
##   fraction  RMSE      Rsquared   MAE     
##   0.1       40011.60  0.3658536  17281.49
##   0.5       47866.01  0.3462689  16733.67
##   0.9       56690.42  0.3412130  16931.11
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was fraction = 0.1.
modelo_knn
## k-Nearest Neighbors 
## 
## 7476 samples
##   18 predictors
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ... 
## Resampling results across tuning parameters:
## 
##   k  RMSE      Rsquared   MAE     
##   5  36188.35  0.4388912  13769.85
##   7  34905.95  0.4637648  13295.12
##   9  34086.40  0.4814088  13024.89
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.

Comparação dos modelos em termos do erro RMSE

Para ficar mais fácil a observação dos valores mínimos, é mais intuitivo observar da seguinte forma:

min(modelo_ridge$results$RMSE)
## [1] 39642.34
min(modelo_lasso$results$RMSE)
## [1] 40011.6
min(modelo_knn$results$RMSE)
## [1] 34086.4

Dessa forma, podemos observar o modelo feito com o knn teve o menor resultado para o RMSE e o mais alto foi o método feito pelo lasso.

Importância das variáveis em modelos de regressão Ridge e Lasso

ggplot(varImp(modelo_ridge)) +
geom_col(fill = "#F08080") +
labs(title = "Importância das variáveis do modelo Ridge",
     y = "Importância",
     x = "Variável(is)")

ggplot(varImp(modelo_lasso)) +
geom_col(fill = "#FFA07A") +
labs(title = "Importância das variáveis do modelo Lasso",
     y = "Importância",
     x = "Variável(is)")

ggplot(varImp(modelo_knn)) +
geom_col(fill = "#F4A460") +
labs(title = "Importância das variáveis do modelo Knn",
     y = "Importância",
     x = "Variável(is)")

A partir das visualizações acima, podemos observar que as seguintes variáveis tem um menor nível de importância para o modelo:

  • media_despesa
  • recursos_de_outros_candidatos.comites
  • recursos_proprios

Obs.: o critério de seleção das variáveis menos importantes se deu pelo nível de importância zero.

Dessa forma, utilizei total_receita, total_despesa, recursos_de_pessoas_juridicas, recursos_de_pessoas_fisicas, quantidade_fornecedores, quantidade_despesas, media_receita, recursos_de_partido_politico, quantidade_doadores, quantidade_doacoes, grau, estado_civil, partido, sexo e ano, deixando o modelo mais enxuto e possibilitando a construção de um novo modelo com menos variáveis e mais representativo.

Formando novo modelo

Para formar um novo modelo, selecionei as variáveis com maior nível de importância de acordo com os resultados vistos acima e criei um novo dataframe.

modelo_select <- train %>% 
  select(-media_despesa,
         -recursos_de_outros_candidatos.comites,
         -recursos_proprios)

Retreinando o melhor modelo

modelo_select_knn <- train(votos ~ .,
                     data = modelo_select,
                     method = "knn")
modelo_select_knn
## k-Nearest Neighbors 
## 
## 7476 samples
##   15 predictors
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ... 
## Resampling results across tuning parameters:
## 
##   k  RMSE      Rsquared   MAE     
##   5  38957.94  0.3936298  14217.56
##   7  37015.82  0.4328611  13649.16
##   9  36363.75  0.4466227  13390.30
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.

Da mesma forma do modelo anterior, é mais intuitivo observar o valor mínimo do RMSE abaixo:

min(modelo_select_knn$results$RMSE)
## [1] 36363.75

Podemos observar dessa vez que o valor do RMSE aumentou em comparação ao modelo com todas as variáveis.

Use esse último modelo treinado para prever os dados de teste disponíveis no challenge que criamos na plataforma Kaggle

submissao <- test %>% 
  select(sequencial_candidato)

test <- test %>% 
  select(-cargo,
         -sequencial_candidato,
         -ocupacao,
         -uf,
         -nome)
predicao <- predict(modelo_select_knn, test)
submissao$votos <- predicao

submissao <- submissao %>% 
  select(ID = sequencial_candidato,
         votos = votos)
write.csv(x = submissao,
          file = "../data/sample_submission.csv",
          row.names = FALSE)