library(readr)
library(knitr)
library(tidyverse)
Esta análise utilizará conceitos de regressão linear para tentar explicar as votações que os deputados receberam em 2014. Os dados foram extraídos do TSE e contemplam aproximadamente 5000 candidatos. As perguntas se encontram abaixo.
Antes, vamos importar os dados referentes às eleições de 2014. Antes de utilizar os dados, é necessário fazer alguns ajustes, tais quais tratamento de NAs e alterar os tipos de algumas variáveis de factor para character.
O tratamento de NAs escolhido para essa análise foi substituir todos os NAs pela mediana de valores daquela coluna para evitar a perda de dados.
eleicoes2014 <- read.csv("../database/eleicoes2014.csv", encoding = "latin1") %>%
mutate(nome = as.character(nome),
UF = as.character(UF),
partido = as.character(partido),
setor_economico_receita = as.character(setor_economico_receita),
setor_economico_despesa = as.character(setor_economico_despesa),
cargo = as.character(cargo),
sexo = as.character(sexo),
grau = as.character(grau),
estado_civil = as.character(estado_civil)
)
eleicoes2014$recursos_de_outros_candidatos.comites <- replace(eleicoes2014$recursos_de_outros_candidatos.comites, is.na(eleicoes2014$recursos_de_outros_candidatos.comites), median(eleicoes2014$recursos_de_outros_candidatos.comites, na.rm = TRUE))
eleicoes2014$recursos_de_partidos <- replace(eleicoes2014$recursos_de_partidos, is.na(eleicoes2014$recursos_de_partidos), median(eleicoes2014$recursos_de_partidos, na.rm = TRUE))
eleicoes2014$recursos_de_pessoas_físicas <- replace(eleicoes2014$recursos_de_pessoas_físicas, is.na(eleicoes2014$recursos_de_pessoas_físicas), median(eleicoes2014$recursos_de_pessoas_físicas, na.rm = TRUE))
eleicoes2014$recursos_de_pessoas_juridicas <- replace(eleicoes2014$recursos_de_pessoas_juridicas, is.na(eleicoes2014$recursos_de_pessoas_juridicas), median(eleicoes2014$recursos_de_pessoas_juridicas, na.rm = TRUE))
eleicoes2014$recursos_proprios <- replace(eleicoes2014$recursos_proprios, is.na(eleicoes2014$recursos_proprios), median(eleicoes2014$recursos_proprios, na.rm = TRUE))
Nesse primeiro momento, a análise terá caráter exploratório. Vamos verificar a influência das variáveis na variável de saída votos, além de analisar outros pontos referentes aos resíduos e a geração de um modelo usando regressão linear múltipla.
Primeiro, vejamos o panorama geral dos dados, ou seja, quais colunas o data frame contém e o que significam.
eleicoes2014 %>%
glimpse()
## Observations: 4,152
## Variables: 26
## $ sequencial_candidato <dbl> 1.0e+11, 5.0e+10, 2.5e+1...
## $ nome <chr> "LOURIVAL MENDES DA FONS...
## $ numero_cadidato <int> 7070, 1540, 3333, 1522, ...
## $ UF <chr> "MA", "BA", "SP", "MS", ...
## $ partido <chr> "PT do B", "PMDB", "PMN"...
## $ setor_economico_receita <chr> "#NULO", "#NULO", "Ativi...
## $ quantidade_doacoes <int> 23, 5, 8, 48, 11, 9, 20,...
## $ quantidade_doadores <int> 14, 5, 3, 25, 6, 7, 11, ...
## $ total_receita <dbl> 151566.39, 161770.58, 27...
## $ media_receita <dbl> 6589.8430, 32354.1160, 3...
## $ recursos_de_outros_candidatos.comites <dbl> 4217.50, 50000.00, 4217....
## $ recursos_de_partidos <dbl> 6325.485, 103670.580, 24...
## $ recursos_de_pessoas_físicas <dbl> 92350.00, 8100.00, 4550....
## $ recursos_de_pessoas_juridicas <dbl> 20000.00, 28086.00, 2808...
## $ recursos_proprios <dbl> 39216.39, 5019.35, 250.0...
## $ votos <int> 27277, 9477, 2943, 4421,...
## $ quantidade_despesas <int> 72, 13, 8, 245, 18, 23, ...
## $ quantidade_fornecedores <int> 26, 7, 3, 139, 13, 9, 23...
## $ total_despesa <dbl> 151566.39, 161770.58, 27...
## $ media_despesa <dbl> 2105.0887, 12443.8908, 3...
## $ setor_economico_despesa <chr> "#NULO", "Impressão de m...
## $ cargo <chr> "DEPUTADO FEDERAL", "DEP...
## $ idade <int> 59, 58, 61, 36, 26, 40, ...
## $ sexo <chr> "MASCULINO", "MASCULINO"...
## $ grau <chr> "SUPERIOR COMPLETO", "EN...
## $ estado_civil <chr> "CASADO(A)", "DIVORCIADO...
Existem 26 variáveis no nosso data frame e o seus significados são:
De cara percebemos que algumas variáveis não influenciam na variável de saída, pois são apenas para identificação do deputado, tal como nome, sequencial_candidato e numero_candidato. Cargo também não influencia no modelo, haja visto que todos os cargos são os mesmos (deputado federal). Algumas variáveis são lidas e tratadas como fatores de muitos níveis no modelo de regressão linear, o que atrapalha a leitura e interpretação deste. Por esse motivo, essas variáveis também serão desconsideradas: setor_economico_despesa e setor_economico_receita.
Podemos criar um modelo de regressão linear sem essas variáveis e ver o que acontece.
eleicoes_filtradas <- eleicoes2014 %>%
select(-nome, -sequencial_candidato, -numero_cadidato, -cargo, -setor_economico_despesa, -setor_economico_receita)
modelo <- lm(data = eleicoes_filtradas, votos ~ .)
modelo %>%
summary()
##
## Call:
## lm(formula = votos ~ ., data = eleicoes_filtradas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -300288 -7949 -1395 4009 1228948
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) -2.875e+03 6.888e+03 -0.417
## UFAL 1.589e+04 6.429e+03 2.471
## UFAM 1.485e+04 6.755e+03 2.198
## UFAP 8.568e+03 6.281e+03 1.364
## UFBA 1.950e+04 5.568e+03 3.502
## UFCE 2.254e+04 5.720e+03 3.941
## UFDF 9.792e+03 6.030e+03 1.624
## UFES 1.392e+04 5.940e+03 2.344
## UFGO 1.343e+04 6.535e+03 2.056
## UFMA 2.206e+04 5.795e+03 3.806
## UFMG 1.525e+04 5.254e+03 2.903
## UFMS 2.673e+03 6.021e+03 0.444
## UFMT 9.148e+03 6.579e+03 1.391
## UFPA 2.037e+04 5.800e+03 3.512
## UFPB 2.534e+04 6.468e+03 3.917
## UFPE 2.228e+04 6.016e+03 3.704
## UFPI 1.609e+04 6.541e+03 2.461
## UFPR 1.749e+04 5.504e+03 3.177
## UFRJ 1.381e+04 5.166e+03 2.674
## UFRN 2.221e+04 6.487e+03 3.424
## UFRO 6.938e+03 6.512e+03 1.065
## UFRR 8.562e+03 6.422e+03 1.333
## UFRS 1.769e+04 5.479e+03 3.228
## UFSC 2.166e+04 6.161e+03 3.516
## UFSE 2.057e+04 6.788e+03 3.031
## UFSP 1.514e+04 5.120e+03 2.957
## UFTO 4.493e+03 7.110e+03 0.632
## partidoPCB -6.112e+03 7.476e+03 -0.818
## partidoPC do B -1.181e+04 5.388e+03 -2.192
## partidoPCO -4.536e+03 1.197e+04 -0.379
## partidoPDT -1.094e+04 4.073e+03 -2.686
## partidoPEN -9.609e+03 4.461e+03 -2.154
## partidoPHS -7.393e+03 4.301e+03 -1.719
## partidoPMDB -4.245e+03 3.956e+03 -1.073
## partidoPMN -9.522e+03 4.671e+03 -2.039
## partidoPP -3.679e+03 4.474e+03 -0.822
## partidoPPL -1.197e+04 6.110e+03 -1.959
## partidoPPS -8.826e+03 4.981e+03 -1.772
## partidoPR -1.730e+03 4.470e+03 -0.387
## partidoPRB 6.765e+02 4.255e+03 0.159
## partidoPROS -8.354e+03 5.499e+03 -1.519
## partidoPRP -6.752e+03 4.554e+03 -1.483
## partidoPRTB -8.333e+03 4.564e+03 -1.826
## partidoPSB -8.920e+03 3.957e+03 -2.254
## partidoPSC -3.216e+03 4.644e+03 -0.692
## partidoPSD -4.751e+03 4.549e+03 -1.044
## partidoPSDB -1.315e+03 4.041e+03 -0.325
## partidoPSDC -6.880e+03 4.538e+03 -1.516
## partidoPSL -1.000e+04 4.634e+03 -2.159
## partidoPSOL -5.046e+03 3.989e+03 -1.265
## partidoPSTU -6.064e+03 5.378e+03 -1.128
## partidoPT -9.498e+03 3.987e+03 -2.382
## partidoPTB -4.892e+03 4.247e+03 -1.152
## partidoPTC -1.011e+04 4.670e+03 -2.164
## partidoPT do B -8.973e+03 4.542e+03 -1.976
## partidoPTN -4.206e+03 5.069e+03 -0.830
## partidoPV -8.566e+03 4.138e+03 -2.070
## partidoSD -6.682e+03 4.601e+03 -1.452
## quantidade_doacoes -1.042e+01 2.680e+01 -0.389
## quantidade_doadores 2.453e+02 3.930e+01 6.240
## total_receita 3.489e-01 4.084e-02 8.544
## media_receita 3.672e-01 5.249e-02 6.995
## recursos_de_outros_candidatos.comites -2.156e-01 4.090e-02 -5.271
## recursos_de_partidos -3.158e-01 4.015e-02 -7.866
## recursos_de_pessoas_físicas -3.121e-01 4.143e-02 -7.532
## recursos_de_pessoas_juridicas -3.038e-01 4.012e-02 -7.570
## recursos_proprios -3.277e-01 4.042e-02 -8.109
## quantidade_despesas 4.695e+01 4.283e+00 10.961
## quantidade_fornecedores -5.202e+01 6.213e+00 -8.373
## total_despesa -2.538e-02 7.430e-03 -3.416
## media_despesa 1.832e+00 4.030e-01 4.547
## idade 3.774e+01 4.820e+01 0.783
## sexoMASCULINO 1.874e+03 1.195e+03 1.568
## grauENSINO FUNDAMENTAL INCOMPLETO 1.483e+03 3.876e+03 0.383
## grauENSINO MÉDIO COMPLETO 9.051e+02 2.400e+03 0.377
## grauENSINO MÉDIO INCOMPLETO 1.223e+03 3.909e+03 0.313
## grauLÊ E ESCREVE 5.410e+02 7.596e+03 0.071
## grauSUPERIOR COMPLETO 3.172e+03 2.296e+03 1.381
## grauSUPERIOR INCOMPLETO -1.372e+03 2.680e+03 -0.512
## estado_civilDIVORCIADO(A) -9.940e+01 1.673e+03 -0.059
## estado_civilSEPARADO(A) JUDICIALMENTE -4.512e+03 3.705e+03 -1.218
## estado_civilSOLTEIRO(A) -3.572e+02 1.267e+03 -0.282
## estado_civilVIÚVO(A) -6.314e+03 3.720e+03 -1.697
## Pr(>|t|)
## (Intercept) 0.676417
## UFAL 0.013505 *
## UFAM 0.027977 *
## UFAP 0.172573
## UFBA 0.000467 ***
## UFCE 8.26e-05 ***
## UFDF 0.104473
## UFES 0.019120 *
## UFGO 0.039890 *
## UFMA 0.000143 ***
## UFMG 0.003715 **
## UFMS 0.657078
## UFMT 0.164428
## UFPA 0.000449 ***
## UFPB 9.12e-05 ***
## UFPE 0.000215 ***
## UFPI 0.013911 *
## UFPR 0.001497 **
## UFRJ 0.007528 **
## UFRN 0.000623 ***
## UFRO 0.286789
## UFRR 0.182545
## UFRS 0.001256 **
## UFSC 0.000443 ***
## UFSE 0.002455 **
## UFSP 0.003126 **
## UFTO 0.527494
## partidoPCB 0.413668
## partidoPC do B 0.028458 *
## partidoPCO 0.704709
## partidoPDT 0.007256 **
## partidoPEN 0.031297 *
## partidoPHS 0.085687 .
## partidoPMDB 0.283318
## partidoPMN 0.041550 *
## partidoPP 0.410908
## partidoPPL 0.050151 .
## partidoPPS 0.076457 .
## partidoPR 0.698871
## partidoPRB 0.873692
## partidoPROS 0.128765
## partidoPRP 0.138245
## partidoPRTB 0.067974 .
## partidoPSB 0.024238 *
## partidoPSC 0.488752
## partidoPSD 0.296359
## partidoPSDB 0.744927
## partidoPSDC 0.129589
## partidoPSL 0.030945 *
## partidoPSOL 0.205956
## partidoPSTU 0.259553
## partidoPT 0.017251 *
## partidoPTB 0.249524
## partidoPTC 0.030527 *
## partidoPT do B 0.048266 *
## partidoPTN 0.406726
## partidoPV 0.038525 *
## partidoSD 0.146537
## quantidade_doacoes 0.697513
## quantidade_doadores 4.81e-10 ***
## total_receita < 2e-16 ***
## media_receita 3.10e-12 ***
## recursos_de_outros_candidatos.comites 1.42e-07 ***
## recursos_de_partidos 4.67e-15 ***
## recursos_de_pessoas_físicas 6.10e-14 ***
## recursos_de_pessoas_juridicas 4.58e-14 ***
## recursos_proprios 6.71e-16 ***
## quantidade_despesas < 2e-16 ***
## quantidade_fornecedores < 2e-16 ***
## total_despesa 0.000642 ***
## media_despesa 5.60e-06 ***
## idade 0.433645
## sexoMASCULINO 0.116886
## grauENSINO FUNDAMENTAL INCOMPLETO 0.702040
## grauENSINO MÉDIO COMPLETO 0.706088
## grauENSINO MÉDIO INCOMPLETO 0.754470
## grauLÊ E ESCREVE 0.943217
## grauSUPERIOR COMPLETO 0.167257
## grauSUPERIOR INCOMPLETO 0.608630
## estado_civilDIVORCIADO(A) 0.952637
## estado_civilSEPARADO(A) JUDICIALMENTE 0.223417
## estado_civilSOLTEIRO(A) 0.778043
## estado_civilVIÚVO(A) 0.089704 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 32230 on 4069 degrees of freedom
## Multiple R-squared: 0.5034, Adjusted R-squared: 0.4934
## F-statistic: 50.3 on 82 and 4069 DF, p-value: < 2.2e-16
Não, algumas variáveis servem apenas para identificar quem é o deputado, como um ID. Inclusive, estes campo são redundantes: O numero_cadidato, o sequencial_cadidato. O nome também não é útil para a variável de saída nesse modelo.
Formalizando um pouco mais, podemos utilizar um método de busca exaustiva no contexto de seleção de variáveis. Essa seleção de variáveis diagnostica quais variáveis estão associadas à variável resposta.
Por questões de simplicidade na geração do modelo utilizando esse método vamos desconsiderar partidos e estados (UF), pois eles contém muitos níveis de fator fazendo com que haja demora no processamento dos dados.
library(leaps)
eleicoes_filtradas <- eleicoes_filtradas %>%
select(-partido, -UF)
regsubsets.out <-
regsubsets(votos ~ .,
data = eleicoes_filtradas,
nbest = 1, # 1 único modelo para cada cojunto de preditores
nvmax = NULL, # NULL para não haver limite no número de variáveis preditoras
force.in = NULL, force.out = NULL,
method = "exhaustive",
really.big=T)
summary.out <- summary(regsubsets.out)
summary.out
## Subset selection object
## Call: regsubsets.formula(votos ~ ., data = eleicoes_filtradas, nbest = 1,
## nvmax = NULL, force.in = NULL, force.out = NULL, method = "exhaustive",
## really.big = T)
## 25 Variables (and intercept)
## Forced in Forced out
## quantidade_doacoes FALSE FALSE
## quantidade_doadores FALSE FALSE
## total_receita FALSE FALSE
## media_receita FALSE FALSE
## recursos_de_outros_candidatos.comites FALSE FALSE
## recursos_de_partidos FALSE FALSE
## recursos_de_pessoas_físicas FALSE FALSE
## recursos_de_pessoas_juridicas FALSE FALSE
## recursos_proprios FALSE FALSE
## quantidade_despesas FALSE FALSE
## quantidade_fornecedores FALSE FALSE
## total_despesa FALSE FALSE
## media_despesa FALSE FALSE
## idade FALSE FALSE
## sexoMASCULINO FALSE FALSE
## grauENSINO FUNDAMENTAL INCOMPLETO FALSE FALSE
## grauENSINO MÉDIO COMPLETO FALSE FALSE
## grauENSINO MÉDIO INCOMPLETO FALSE FALSE
## grauLÊ E ESCREVE FALSE FALSE
## grauSUPERIOR COMPLETO FALSE FALSE
## grauSUPERIOR INCOMPLETO FALSE FALSE
## estado_civilDIVORCIADO(A) FALSE FALSE
## estado_civilSEPARADO(A) JUDICIALMENTE FALSE FALSE
## estado_civilSOLTEIRO(A) FALSE FALSE
## estado_civilVIÚVO(A) FALSE FALSE
## 1 subsets of each size up to 25
## Selection Algorithm: exhaustive
## quantidade_doacoes quantidade_doadores total_receita
## 1 ( 1 ) " " " " "*"
## 2 ( 1 ) " " " " "*"
## 3 ( 1 ) " " "*" "*"
## 4 ( 1 ) " " "*" "*"
## 5 ( 1 ) " " "*" " "
## 6 ( 1 ) " " "*" "*"
## 7 ( 1 ) " " "*" "*"
## 8 ( 1 ) " " "*" "*"
## 9 ( 1 ) " " "*" "*"
## 10 ( 1 ) " " "*" "*"
## 11 ( 1 ) " " "*" "*"
## 12 ( 1 ) " " "*" "*"
## 13 ( 1 ) " " "*" "*"
## 14 ( 1 ) " " "*" "*"
## 15 ( 1 ) " " "*" "*"
## 16 ( 1 ) " " "*" "*"
## 17 ( 1 ) " " "*" "*"
## 18 ( 1 ) " " "*" "*"
## 19 ( 1 ) " " "*" "*"
## 20 ( 1 ) "*" "*" "*"
## 21 ( 1 ) "*" "*" "*"
## 22 ( 1 ) "*" "*" "*"
## 23 ( 1 ) "*" "*" "*"
## 24 ( 1 ) "*" "*" "*"
## 25 ( 1 ) "*" "*" "*"
## media_receita recursos_de_outros_candidatos.comites
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " "*"
## 3 ( 1 ) " " "*"
## 4 ( 1 ) "*" "*"
## 5 ( 1 ) "*" "*"
## 6 ( 1 ) "*" "*"
## 7 ( 1 ) "*" "*"
## 8 ( 1 ) "*" "*"
## 9 ( 1 ) "*" "*"
## 10 ( 1 ) "*" "*"
## 11 ( 1 ) "*" "*"
## 12 ( 1 ) "*" "*"
## 13 ( 1 ) "*" "*"
## 14 ( 1 ) "*" "*"
## 15 ( 1 ) "*" "*"
## 16 ( 1 ) "*" "*"
## 17 ( 1 ) "*" "*"
## 18 ( 1 ) "*" "*"
## 19 ( 1 ) "*" "*"
## 20 ( 1 ) "*" "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## recursos_de_partidos recursos_de_pessoas_físicas
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " " "
## 10 ( 1 ) "*" "*"
## 11 ( 1 ) "*" "*"
## 12 ( 1 ) "*" "*"
## 13 ( 1 ) "*" "*"
## 14 ( 1 ) "*" "*"
## 15 ( 1 ) "*" "*"
## 16 ( 1 ) "*" "*"
## 17 ( 1 ) "*" "*"
## 18 ( 1 ) "*" "*"
## 19 ( 1 ) "*" "*"
## 20 ( 1 ) "*" "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## recursos_de_pessoas_juridicas recursos_proprios
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " "*"
## 10 ( 1 ) "*" "*"
## 11 ( 1 ) "*" "*"
## 12 ( 1 ) "*" "*"
## 13 ( 1 ) "*" "*"
## 14 ( 1 ) "*" "*"
## 15 ( 1 ) "*" "*"
## 16 ( 1 ) "*" "*"
## 17 ( 1 ) "*" "*"
## 18 ( 1 ) "*" "*"
## 19 ( 1 ) "*" "*"
## 20 ( 1 ) "*" "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## quantidade_despesas quantidade_fornecedores total_despesa
## 1 ( 1 ) " " " " " "
## 2 ( 1 ) " " " " " "
## 3 ( 1 ) " " " " " "
## 4 ( 1 ) " " " " " "
## 5 ( 1 ) "*" "*" " "
## 6 ( 1 ) "*" "*" " "
## 7 ( 1 ) "*" "*" " "
## 8 ( 1 ) "*" "*" " "
## 9 ( 1 ) "*" "*" " "
## 10 ( 1 ) "*" "*" " "
## 11 ( 1 ) "*" "*" " "
## 12 ( 1 ) "*" "*" "*"
## 13 ( 1 ) "*" "*" "*"
## 14 ( 1 ) "*" "*" "*"
## 15 ( 1 ) "*" "*" "*"
## 16 ( 1 ) "*" "*" "*"
## 17 ( 1 ) "*" "*" "*"
## 18 ( 1 ) "*" "*" "*"
## 19 ( 1 ) "*" "*" "*"
## 20 ( 1 ) "*" "*" "*"
## 21 ( 1 ) "*" "*" "*"
## 22 ( 1 ) "*" "*" "*"
## 23 ( 1 ) "*" "*" "*"
## 24 ( 1 ) "*" "*" "*"
## 25 ( 1 ) "*" "*" "*"
## media_despesa idade sexoMASCULINO
## 1 ( 1 ) " " " " " "
## 2 ( 1 ) " " " " " "
## 3 ( 1 ) " " " " " "
## 4 ( 1 ) " " " " " "
## 5 ( 1 ) " " " " " "
## 6 ( 1 ) " " " " " "
## 7 ( 1 ) "*" " " " "
## 8 ( 1 ) "*" " " " "
## 9 ( 1 ) "*" " " " "
## 10 ( 1 ) " " " " " "
## 11 ( 1 ) "*" " " " "
## 12 ( 1 ) "*" " " " "
## 13 ( 1 ) "*" " " " "
## 14 ( 1 ) "*" " " "*"
## 15 ( 1 ) "*" " " "*"
## 16 ( 1 ) "*" " " "*"
## 17 ( 1 ) "*" " " "*"
## 18 ( 1 ) "*" "*" "*"
## 19 ( 1 ) "*" "*" "*"
## 20 ( 1 ) "*" "*" "*"
## 21 ( 1 ) "*" "*" "*"
## 22 ( 1 ) "*" "*" "*"
## 23 ( 1 ) "*" "*" "*"
## 24 ( 1 ) "*" "*" "*"
## 25 ( 1 ) "*" "*" "*"
## grauENSINO FUNDAMENTAL INCOMPLETO grauENSINO MÉDIO COMPLETO
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " " "
## 10 ( 1 ) " " " "
## 11 ( 1 ) " " " "
## 12 ( 1 ) " " " "
## 13 ( 1 ) " " " "
## 14 ( 1 ) " " " "
## 15 ( 1 ) " " " "
## 16 ( 1 ) " " " "
## 17 ( 1 ) " " " "
## 18 ( 1 ) " " " "
## 19 ( 1 ) " " " "
## 20 ( 1 ) " " " "
## 21 ( 1 ) " " " "
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## grauENSINO MÉDIO INCOMPLETO grauLÊ E ESCREVE
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " " "
## 10 ( 1 ) " " " "
## 11 ( 1 ) " " " "
## 12 ( 1 ) " " " "
## 13 ( 1 ) " " " "
## 14 ( 1 ) " " " "
## 15 ( 1 ) " " " "
## 16 ( 1 ) " " " "
## 17 ( 1 ) " " " "
## 18 ( 1 ) " " " "
## 19 ( 1 ) " " " "
## 20 ( 1 ) " " " "
## 21 ( 1 ) " " " "
## 22 ( 1 ) " " " "
## 23 ( 1 ) "*" " "
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## grauSUPERIOR COMPLETO grauSUPERIOR INCOMPLETO
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) "*" " "
## 9 ( 1 ) "*" " "
## 10 ( 1 ) " " " "
## 11 ( 1 ) " " " "
## 12 ( 1 ) " " " "
## 13 ( 1 ) "*" " "
## 14 ( 1 ) "*" " "
## 15 ( 1 ) "*" " "
## 16 ( 1 ) "*" "*"
## 17 ( 1 ) "*" "*"
## 18 ( 1 ) "*" "*"
## 19 ( 1 ) "*" "*"
## 20 ( 1 ) "*" "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" " "
## 23 ( 1 ) "*" " "
## 24 ( 1 ) "*" " "
## 25 ( 1 ) "*" "*"
## estado_civilDIVORCIADO(A) estado_civilSEPARADO(A) JUDICIALMENTE
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " " "
## 10 ( 1 ) " " " "
## 11 ( 1 ) " " " "
## 12 ( 1 ) " " " "
## 13 ( 1 ) " " " "
## 14 ( 1 ) " " " "
## 15 ( 1 ) " " " "
## 16 ( 1 ) " " " "
## 17 ( 1 ) " " "*"
## 18 ( 1 ) " " "*"
## 19 ( 1 ) "*" "*"
## 20 ( 1 ) "*" "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
## estado_civilSOLTEIRO(A) estado_civilVIÚVO(A)
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## 9 ( 1 ) " " " "
## 10 ( 1 ) " " " "
## 11 ( 1 ) " " " "
## 12 ( 1 ) " " " "
## 13 ( 1 ) " " " "
## 14 ( 1 ) " " " "
## 15 ( 1 ) " " "*"
## 16 ( 1 ) " " "*"
## 17 ( 1 ) " " "*"
## 18 ( 1 ) " " "*"
## 19 ( 1 ) " " "*"
## 20 ( 1 ) " " "*"
## 21 ( 1 ) "*" "*"
## 22 ( 1 ) "*" "*"
## 23 ( 1 ) "*" "*"
## 24 ( 1 ) "*" "*"
## 25 ( 1 ) "*" "*"
A chamada ao summary.out mostra qual o melhor modelo para cada tamanho do subconjunto de variáveis. O melhor modelo é definido pelo R² ajustado - que é a capacidade que o modelo tem de explicar os dados - e p valor.
Verificando qual modelo possui o melhor R², temos:
which.max(summary.out$adjr2)
## [1] 17
Quais variáveis estão presentes nesse modelo?
var <- summary.out$which[17,]
var
## (Intercept)
## TRUE
## quantidade_doacoes
## FALSE
## quantidade_doadores
## TRUE
## total_receita
## TRUE
## media_receita
## TRUE
## recursos_de_outros_candidatos.comites
## TRUE
## recursos_de_partidos
## TRUE
## recursos_de_pessoas_físicas
## TRUE
## recursos_de_pessoas_juridicas
## TRUE
## recursos_proprios
## TRUE
## quantidade_despesas
## TRUE
## quantidade_fornecedores
## TRUE
## total_despesa
## TRUE
## media_despesa
## TRUE
## idade
## FALSE
## sexoMASCULINO
## TRUE
## grauENSINO FUNDAMENTAL INCOMPLETO
## FALSE
## grauENSINO MÉDIO COMPLETO
## FALSE
## grauENSINO MÉDIO INCOMPLETO
## FALSE
## grauLÊ E ESCREVE
## FALSE
## grauSUPERIOR COMPLETO
## TRUE
## grauSUPERIOR INCOMPLETO
## TRUE
## estado_civilDIVORCIADO(A)
## FALSE
## estado_civilSEPARADO(A) JUDICIALMENTE
## TRUE
## estado_civilSOLTEIRO(A)
## FALSE
## estado_civilVIÚVO(A)
## TRUE
indexes <- which(summary.out$which[17,])
not_indexes <- which(!summary.out$which[17,])
var_true <- names(var)[indexes]
var_false <- names(var)[not_indexes]
No total se encontram 17 variáveis que têm alguma influência na variável de saída.
var_true
## [1] "(Intercept)"
## [2] "quantidade_doadores"
## [3] "total_receita"
## [4] "media_receita"
## [5] "recursos_de_outros_candidatos.comites"
## [6] "recursos_de_partidos"
## [7] "recursos_de_pessoas_físicas"
## [8] "recursos_de_pessoas_juridicas"
## [9] "recursos_proprios"
## [10] "quantidade_despesas"
## [11] "quantidade_fornecedores"
## [12] "total_despesa"
## [13] "media_despesa"
## [14] "sexoMASCULINO"
## [15] "grauSUPERIOR COMPLETO"
## [16] "grauSUPERIOR INCOMPLETO"
## [17] "estado_civilSEPARADO(A) JUDICIALMENTE"
## [18] "estado_civilVIÚVO(A)"
As variáveis que não influenciam em votos:
var_false
## [1] "quantidade_doacoes" "idade"
## [3] "grauENSINO FUNDAMENTAL INCOMPLETO" "grauENSINO MÉDIO COMPLETO"
## [5] "grauENSINO MÉDIO INCOMPLETO" "grauLÊ E ESCREVE"
## [7] "estado_civilDIVORCIADO(A)" "estado_civilSOLTEIRO(A)"
Vamos construir o modelo sem as variáveis que não influenciam em votos. Como grau e estado_civil possuem níveis de fatores que também influenciam em votos, vamos conservar essas duas variáveis.
modelo_melhorado <- eleicoes_filtradas %>%
select(
-quantidade_doacoes, -idade
)
modelo_agora_vai <- lm(formula = votos ~ ., modelo_melhorado)
summary(modelo_agora_vai)
##
## Call:
## lm(formula = votos ~ ., data = modelo_melhorado)
##
## Residuals:
## Min 1Q Median 3Q Max
## -303830 -6617 -1168 2635 1243899
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 7.397e+03 2.836e+03 2.608
## quantidade_doadores 2.347e+02 2.397e+01 9.789
## total_receita 3.511e-01 3.952e-02 8.884
## media_receita 3.973e-01 4.906e-02 8.099
## recursos_de_outros_candidatos.comites -2.209e-01 3.963e-02 -5.574
## recursos_de_partidos -3.144e-01 3.880e-02 -8.103
## recursos_de_pessoas_físicas -3.120e-01 4.003e-02 -7.795
## recursos_de_pessoas_juridicas -3.026e-01 3.873e-02 -7.812
## recursos_proprios -3.269e-01 3.906e-02 -8.371
## quantidade_despesas 4.810e+01 4.214e+00 11.415
## quantidade_fornecedores -5.481e+01 6.049e+00 -9.061
## total_despesa -2.821e-02 7.390e-03 -3.818
## media_despesa 2.015e+00 3.941e-01 5.114
## sexoMASCULINO 1.900e+03 1.185e+03 1.604
## grauENSINO FUNDAMENTAL INCOMPLETO 2.030e+03 3.877e+03 0.524
## grauENSINO MÉDIO COMPLETO 1.387e+03 2.393e+03 0.580
## grauENSINO MÉDIO INCOMPLETO 1.117e+03 3.905e+03 0.286
## grauLÊ E ESCREVE 1.711e+03 7.590e+03 0.225
## grauSUPERIOR COMPLETO 3.485e+03 2.286e+03 1.524
## grauSUPERIOR INCOMPLETO -7.429e+02 2.649e+03 -0.280
## estado_civilDIVORCIADO(A) -1.312e+03 1.660e+03 -0.790
## estado_civilSEPARADO(A) JUDICIALMENTE -4.472e+03 3.705e+03 -1.207
## estado_civilSOLTEIRO(A) -1.088e+03 1.204e+03 -0.904
## estado_civilVIÚVO(A) -5.746e+03 3.693e+03 -1.556
## Pr(>|t|)
## (Intercept) 0.009133 **
## quantidade_doadores < 2e-16 ***
## total_receita < 2e-16 ***
## media_receita 7.22e-16 ***
## recursos_de_outros_candidatos.comites 2.65e-08 ***
## recursos_de_partidos 7.01e-16 ***
## recursos_de_pessoas_físicas 8.12e-15 ***
## recursos_de_pessoas_juridicas 7.09e-15 ***
## recursos_proprios < 2e-16 ***
## quantidade_despesas < 2e-16 ***
## quantidade_fornecedores < 2e-16 ***
## total_despesa 0.000137 ***
## media_despesa 3.30e-07 ***
## sexoMASCULINO 0.108794
## grauENSINO FUNDAMENTAL INCOMPLETO 0.600628
## grauENSINO MÉDIO COMPLETO 0.562107
## grauENSINO MÉDIO INCOMPLETO 0.774881
## grauLÊ E ESCREVE 0.821690
## grauSUPERIOR COMPLETO 0.127533
## grauSUPERIOR INCOMPLETO 0.779133
## estado_civilDIVORCIADO(A) 0.429311
## estado_civilSEPARADO(A) JUDICIALMENTE 0.227504
## estado_civilSOLTEIRO(A) 0.366272
## estado_civilVIÚVO(A) 0.119783
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 32460 on 4128 degrees of freedom
## Multiple R-squared: 0.489, Adjusted R-squared: 0.4861
## F-statistic: 171.7 on 23 and 4128 DF, p-value: < 2.2e-16
Com o modelo construído anteriormente, apesar de sexo, grau e estado_civil serem considerados relevantes, após uma análise no segundo modelo podemos perceber que seus p valores são muito altos, de forma que podemos criar um novo modelo sem essas variáveis.
modelo_final <- modelo_melhorado %>%
select(
-sexo, -grau, -estado_civil
)
modelo_agora_vai2 <- lm(formula = votos ~ ., modelo_final)
summary(modelo_agora_vai2)
##
## Call:
## lm(formula = votos ~ ., data = modelo_final)
##
## Residuals:
## Min 1Q Median 3Q Max
## -308197 -6631 -834 2121 1245139
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 1.087e+04 1.441e+03 7.543
## quantidade_doadores 2.395e+02 2.395e+01 9.999
## total_receita 3.776e-01 3.873e-02 9.749
## media_receita 4.076e-01 4.892e-02 8.332
## recursos_de_outros_candidatos.comites -2.474e-01 3.884e-02 -6.369
## recursos_de_partidos -3.412e-01 3.798e-02 -8.983
## recursos_de_pessoas_físicas -3.380e-01 3.926e-02 -8.610
## recursos_de_pessoas_juridicas -3.291e-01 3.793e-02 -8.677
## recursos_proprios -3.538e-01 3.825e-02 -9.249
## quantidade_despesas 4.821e+01 4.212e+00 11.446
## quantidade_fornecedores -5.506e+01 6.046e+00 -9.107
## total_despesa -2.803e-02 7.395e-03 -3.791
## media_despesa 2.066e+00 3.936e-01 5.249
## Pr(>|t|)
## (Intercept) 5.63e-14 ***
## quantidade_doadores < 2e-16 ***
## total_receita < 2e-16 ***
## media_receita < 2e-16 ***
## recursos_de_outros_candidatos.comites 2.12e-10 ***
## recursos_de_partidos < 2e-16 ***
## recursos_de_pessoas_físicas < 2e-16 ***
## recursos_de_pessoas_juridicas < 2e-16 ***
## recursos_proprios < 2e-16 ***
## quantidade_despesas < 2e-16 ***
## quantidade_fornecedores < 2e-16 ***
## total_despesa 0.000152 ***
## media_despesa 1.61e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 32490 on 4139 degrees of freedom
## Multiple R-squared: 0.4868, Adjusted R-squared: 0.4854
## F-statistic: 327.2 on 12 and 4139 DF, p-value: < 2.2e-16
Comparando o primeiro modelo gerado e o último, temos:
Para os dois casos, o F possui um valor maior que 1 e o tamanho da amostra é maior que o número de preditores. A estatística F revela se há relação entre alguma variável preditora e a variável de saída. Para o primeiro caso, F = 50.3 e para o segundo caso, F = 327.2.
Os p valores do primeiro modelo em algumas variáveis é bem alto, indicando uma alta probabilidade de que estas não influenciem na variável de saída. É o caso de alguns partidos, idade, sexo, grau e estado civil.
No último modelo, todos os p valores das variáveis estão muito baixos, o que apontam a influência muito forte destas na variável de saída.
Para o primeiro modelo, temos Residual standard error: 32230 on 4069 degrees of freedom contra Residual standard error: 32490 on 4139 degrees of freedom do modelo final. Embora o segundo modelo apresente um RSE maior, este apresenta mais graus de liberdade.
O R² é o quadrado da correlação entre variável resposta e o modelo linear ajustado e mede a fração da variância explicada. Embora o primeiro modelo apresente um valor R² maior - Multiple R-squared: 0.5034, Adjusted R-squared: 0.4934 contra Multiple R-squared: 0.4868, Adjusted R-squared: 0.4854 do modelo final - Isso não significa que o modelo final está incorreto ou menos preciso, mostra apenas que o modelo se adequa menos aos dados, porém ganha em poder de generalização. Não devemos considerar apenas o R² para a seleção de variáveis, mas sempre aliar essa leitura ao p valor.
modelo_final$residuals <- residuals(modelo_agora_vai2)
nomes_variaveis <- c(names(modelo_final), "residuals")
plotDF <- reshape2::melt(modelo_final[, nomes_variaveis], id="residuals")
ggplot(plotDF, aes(x=value, y=residuals)) +
geom_point(color="slateblue") + facet_wrap(~variable)
Os gráficos de resíduos apontam alguns outliers, mas em geral os pontos se concentram próximos à 0 no eixo y, o que indica que o modelo não subestima ou superestima os valores.
Pela análise dos p valores podemos perceber que os valores mais baixos são das variáveis: quantidade_doadores, total_receita, media_receita,recursos_de_outros_candidatos.comites, recursos_de_partidos, recursos_de_pessoas_fisicas, recursos_de_pessoas_juridicas, recursos_proprios, quantidade_despesas, quantidade_fornecedores, total_despesa e media_despesa. O p valor é um forte indicador de correlação entre a variável de saída e a variável analisada, pois aponta a probabilidade dessa correlação entre as variáveis ser aleatória. Ou seja, quanto menor essa probabilidade, maior a chance da correlação ser relevante ou existente.