Leitura dos dados

eleicoes2014 <- read.csv("~/Documents/Database/eleicoes2014.csv", encoding="latin1")

Investigação Inicial

Começaremos com um boxplot dos votos dos 100 deputados mais votados

top100 <- eleicoes2014 %>% arrange(-votos) %>% head(100)

ggplot(top100, aes(x = '', y = votos)) + 
  theme_bw() +
  geom_boxplot() +
  labs(title="Boxplot dos votos dos 100 deputados mais votados", x="", y="Votos") + 
  scale_y_continuous(breaks=seq(0, 2000000, 150000))

Podemos notar vários outliers neste boxplot. O deputado mais votado, Celso Russomano (PRB-SP), possui mais de um milhão e meio de votos, enquanto que o próximo mais votado, Jair Bolsonaro (PP-RJ) possui bem menos, tendo aproximadamente 450.000 votos. É perceptível que levando em conta apenas o número de votos, este gráfico não nos revela tantas informações tendo em vista que existem outras informações cruciais para esta análise.

Veremos agora o mesmo boxplot distribuído por estado e incluindo todos os deputados.

ggplot(eleicoes2014, aes(x = UF, y = votos)) + 
  theme_bw() +
  geom_boxplot() +
  labs(title="Boxplot dos votos dos deputados por estado", x="", y="Votos") + 
  scale_y_continuous(breaks=seq(0, 1500000, 250000))


Podemos ver que as disparidades são enormes. Existem vários outliers em vários estados. Talvez esses outliers representem os candidatos que conseguiram eleger-se de forma a não precisar dos votos da legenda, os chamados “puxadores de votos”.

Veremos agora o mesmo gráfico, mas limitando o número de votos exibidos.

ggplot(eleicoes2014, aes(x = UF, y = votos)) + 
  theme_bw() +
  geom_boxplot() +
  labs(title="Boxplot dos votos dos deputados por estado (limitando o eixo y)", x="", y="Votos") + 
  scale_y_continuous(breaks=seq(0, 50000, 5000)) +
  coord_cartesian(ylim=c(0, 50000))

Limitando agora o número de votos no gráfico, podemos melhor apreciar as disparidades dos votos em cada estado. A mediana dos votos, na maioria dos estados, sequer ultrapassa 5000. Neste lab, vamos tentar construir um modelo que tente explicar quais os atributos de um deputado bem votado!

Perguntas


Um modelo de regressão múltipla com todas as variáveis é plausível para explicar a variação em número de votos? Justifique sua resposta.

Vamos primeiro eliminar as colunas que possuem muitos NA, o que pode influenciar de uma maneira ruim o nosso modelo, e depois usar todas as variáveis restantes.

data1 <- eleicoes2014 %>% select(-cargo, -recursos_de_outros_candidatos.comites, -recursos_de_partidos, -recursos_de_pessoas_físicas, -recursos_de_pessoas_juridicas, -recursos_proprios, -sequencial_candidato)
fit <- lm(votos ~ ., data=data1)
fitSummary <- summary(fit)
sprintf("Estatistica F: %f    Adj. R Sqr.: %f", fitSummary$fstatistic[1], fitSummary$adj.r.squared)
## [1] "Estatistica F: NaN    Adj. R Sqr.: NaN"

Pelo o que podemos ver das propriedades do summary do modelo, usar todas as variáveis não é uma boa ideia, pois sequer obtemos algum resultado e os coeficientes são inválidos.

Todas as variáveis são úteis para o modelo de regressão? Há variáveis redudantes? Justifique sua resposta em ambos os casos.

Como visto acima, nem todas as variáveis são úteis para o modelo. Por exemplo a variável cargo possui o mesmo valor para todas as observações, o que obviamente não deve explicar nada. Também existem variáveis como setor_econômico_despesa que poderia ajudar a entender como os tipos de gastos influenciam nos votos, mas por ter muitos valores nulos, acaba não explicando muita coisa. Em relação à existência de variáveis redundantes, vamos investigar algumas variáveis que parecem estar bem correlacionadas.

c1 = cor(data1$total_despesa, data1$quantidade_despesa)
c2 = cor(data1$total_despesa, data1$media_despesa)
c3 = cor(data1$quantidade_despesas, data1$media_despesa)
c4 = cor(data1$quantidade_doacoes, data1$quantidade_doadores)
c5 = cor(data1$quantidade_despesas, data1$quantidade_fornecedores)
c6 = cor(data1$total_despesa, data1$total_receita)
## [1] "0.807345 - Correlação entre total_despesa e quantidade_despesa"
## [1] "0.365338 - Correlação entre total_despesa e media_despesa"
## [1] "0.079632 - Correlação entre media_despesa e quantidade_despesa"
## [1] "0.861766 - Correlação entre quantidade_doacoes e quantidade_doadores"
## [1] "0.933685 - Correlação entre quantidade_despesas e quantidade_fornecedores"
## [1] "0.994335 - Correlação entre total_receita e total_despesa"
Podemos ver que existe grande correlação entre algumas variáveis, chegando a atingir 0.99. Vamos analisar se essas variáveis são importantes para o modelo futuramente.

No caso de haver variáveis pouco explicativas e/ou redudantes, construa um novo modelo sem essas variáveis e o compare ao modelo com todas as variáveis

Primeiro vamos remover variáveis pouco explicativas

data2 <- data1 %>% select(-setor_economico_receita, -setor_economico_despesa, -nome, -numero_cadidato, -total_receita)

Agora vamos tentar melhorar os dados removendo outliers e ajustando a escala dos mesmos, mas antes precisamos ter uma melhor noção de como estão distribuídos os valores dos votos.

summary(data2$votos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       2     511    1683   17258    9585 1524361
top5 <- data2 %>%  select(votos) %>% arrange(-votos) %>% top_n(5, votos)
print(top5)
##     votos
## 1 1524361
## 2  464572
## 3  398087
## 4  352708
## 5  336151

Podemos ver que o primeiro quartil de deputados receberam até, aproximadamente, 500 votos enquanto que os deputados do terceiro quartil obtiveram menos de 10.000 votos. Sendo assim, ao vermos que os 5 mais votados possuem 40x mais votos que estes, podemos pensar em considerá-los como outliers. Ao menos os dois primeiros, que seriam Celso Russomano e Jair Bolsonaro

data2 <- data2 %>% filter(votos < 400000 && votos > 50)

Agora que os outliers foram removidos, vamos construir o modelo.

fit <- lm(votos ~ ., data=data2)
fitSummary <- summary(fit)
sprintf("Estatistica F: %f    Adj. R Sqr.: %f", fitSummary$fstatistic[1], fitSummary$adj.r.squared)
## [1] "Estatistica F: 45.908219    Adj. R Sqr.: 0.451218"

Com este novo modelo, conseguimos uns R ajustado de 0.45, o que é algo muito bom levando em conta a dificuldade do problema. Não há muito o que comparar com o primeiro modelo, visto que este não pôde ser calculado.

Analise plots de resíduos e verifique se há tendências nos erros

Vamos ver os plots de resíduos e checar as tendências que ocorrem.

par(mfrow=c(2,2))
plot(fit)

Pelos plots podemos perceber que há sim tendência nesses plots. É possível que haja algum tipo de enviesamento. Vamos excluir as variáveis que já descobrimos serem altamente correlacionadas entre si e investigar que tipo de influências elas exercem sobre o modelo.

data2 <- data2 %>% select(-quantidade_despesas, -media_despesa, -quantidade_doadores, -media_receita)
fit <- lm(votos ~., data2)
par(mfrow=c(2,2))
plot(fit)

Como podemos ver, não houve uma melhora significativa, o que indica que essas variáveis são pouco explicativas para o modelo e que não eram a justificativa para essa tendência que vemos nos plots.

Quais variáveis conseguem explicar melhor o número de votos? Justifique sua resposta.

A partir de tudo que vimos até agora, podemos ter uma boa intuição das variáveis que têm maior potencial explicativo. Entre elas, eu destacaria total_despesa. Vejamos a sua correlação com a variável votos

cor(data2$votos, data2$total_despesa)
## [1] 0.6094031
ggplot(data2, aes(y=votos, x=total_despesa)) +
  geom_point() + 
  geom_smooth(method="lm") +
  scale_x_continuous(breaks=seq(0, 8000000, 1000000), label=comma)

Podemos ver que o modelo até que se ajusta bem para um modelo completamente linear. Nota-se também a influência que os outliers exercem sobre o mesmo.