electionsBR: analisando a apuração das eleições para a Câmara dos Deputados

19 Aug 2016 por Fernando Meireles


Usando o nosso pacote no R para baixar e limpar dados eleitorais do TSE, desenvolvimento conjuntamente pelo Denisson Silva, Beatriz Costa e eu, vou mostrar aqui como é possível obter e analisar os resultados de apuração das eleições para a Câmara dos Deputados desde 1998 (o período disponível, por causa de limitações nos dados do TSE, vai de 98 a 2014 – mas pretendemos expandir ele no futuro) desagregados por município/zona eleitoral.

Baixando os dados de apuração das eleições federais

Como o pacote está no CRAN, a primeira coisa que precisamos fazer é instalá-lo via console:

# Instala o pacote electionsBR via CRAN
install.packages("electionsBR")

Também é possível baixar as versões pre-release do pacote via GitHub (o que permite acessar as modificações que vamos fazendo nele antes delas irem para o CRAN):

# Instala o pacote electionsBR via GitHub
if (!require("devtools")) install.packages("devtools")
devtools::install_github("silvadenisson/electionsBR")

Feito isto, o pacote pode ser carregado com library:

# Carrega o pacote electionsBR
library(electionsBR)

Os dados sobre a apuração (i.e. votos válidos, nulos, brancos, etc.) podem ser acessados pela função details_mun_zone_fed() (ou details_mun_zone_local, para as eleições municipais). O primeiro passo para analisar a votação nas eleições da Câmara, portanto, é extrair os dados para 1998, 2002, 2006, 2010 e 2014:

# Extrai os dados das eleicoes federais de 1998 a 2014
e1998 <- details_mun_zone_fed(1998)
e2002 <- details_mun_zone_fed(2002)
e2006 <- details_mun_zone_fed(2006)
e2010 <- details_mun_zone_fed(2010)
e2014 <- details_mun_zone_fed(2014)

Ainda é possível reduzir este código via lapply (com a desvantagem de que, se em algum momento o servidor do TSE tiver problemas, o código para de executar; ao coletar os dados por eleição, é possível lidar melhor com erros):

# Cria um vetor armazenando os anos
anos <- seq(1998, 2014, by = 4)

# Baixa os dados com lapply e details_mun_zone_fed
dados <- lapply(anos, details_mun_zone_fed)
## Processing the data...Done.Processing the data...Done.Processing the data...Done.Processing the data...Done.Processing the data...Done.

Para unir as bases, uma maneira fácil é por meio da função bind_rows() do pacote dplyr (uma pequena introdução a ele pode ser vista aqui):

# Carrega o pacote dplyr
if (!require("dplyr")) install.packages("dplyr")
library(dplyr)

# Une as bases (se foram baixadas separadamente, descomente a linha abaixo)
# dados <- bind_rows(list(e1998, e2002, e2006, e2010, e2014))

# Une as bases (se foram baixadas separadamente, comente a linha abaixo)
dados <- bind_rows(dados)

Feito isso (em poucos segundos!), a base final deve ficar com 196723 observações, algo que seria difícil de organizar manualmente ou em planilhas de excel. Só é necessário agora filtrar as observações para ficar apenas com as referentes às eleições da Câmara (excluindo, portanto, eleições para as assembleias estaduais, senado, etc.):

# Filtra os dados
dados <- dados[dados$DESCRICAO_CARGO == "DEPUTADO FEDERAL",]

Analisando os dados

Tendo todos estes dados já na memória do R, é possível analisá-los. Para fazer isto, utilizo o pacote ggplot2 para gerar alguns gráficos. O primeiro deles é para examinar a relação entre a quantidade de comparecimentos vs. quantidade de abstenções – obviamente, os dois têm de ser negativamente relacionados:

# Carrega o pacote ggplot2
if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)


ggplot(dados, aes(x = QTD_ABSTENCOES, y = QTD_COMPARECIMENTO)) + geom_point() +
  theme_bw() + labs(title = "Abstenções vs. Comparecimento", y = "Comparecimento", x = "Abstenções")

O que obtemos é justamente o contrário. Mas por quê? Porque o gráfico está captando o total de eleitores – é necessário transformar comparecimentos e abstenções em percentuais do total de eleitores aptos a votar. Podemos fazer isto da seguinte forma:

ggplot(dados, aes(x = I(QTD_ABSTENCOES / QTD_APTOS), y = I(QTD_COMPARECIMENTO / QTD_APTOS))) + 
  geom_point() +
  theme_bw() + labs(title = "Abstenções vs. Comparecimento", y = "% Comparecimento", x = "% Abstenções")

Agora obtemos o resultado esperado, uma relação perfeita entre comparecimento e abstenções. Com um código um pouco diferente (é preciso remover missings e converter a variável ANO_ELEICAO para factor), também podemos investigar a média de abstenções durante o período:

filter(dados, !is.na(ANO_ELEICAO)) %>% 
  mutate(ANO_ELEICAO = factor(ANO_ELEICAO)) %>%
  ggplot(aes(y = I(QTD_ABSTENCOES / QTD_APTOS), x = ANO_ELEICAO)) + geom_bar(stat = "summary", fun.y = "mean") +
  theme_bw() + labs(title = "Média de abstenções nas eleições para a Câmara", y = "% Abstenção", x = "Ano")

É possível ver que, após a eleição de 98, a média de abstenções cai, mas se mantém mais ou menos constante depois disso. Como a média sofre influência de outliers, podemos refazer o mesmo gráfico para visualizar a mediana das abstenções:

filter(dados, !is.na(ANO_ELEICAO)) %>% 
  mutate(ANO_ELEICAO = factor(ANO_ELEICAO),
         PERC_ABST = QTD_ABSTENCOES / QTD_APTOS) %>%
  ggplot(aes(y = PERC_ABST, x = ANO_ELEICAO)) + geom_bar(stat = "summary", fun.y = "median") +
  theme_bw() + labs(title = "Mediana de abstenções nas eleições para a Câmara", y = "% Abstenção", x = "Ano")

Por fim, podemos investigar a distribução destas abstenções por eleição para obter uma informação mais detalhada:

filter(dados, !is.na(ANO_ELEICAO)) %>% 
  mutate(ANO_ELEICAO = factor(ANO_ELEICAO),
         PERC_ABST = QTD_ABSTENCOES / QTD_APTOS) %>%
  ggplot(aes(x = PERC_ABST)) + geom_histogram() + facet_wrap(~ ANO_ELEICAO) +
  theme_bw() + labs(title = "Distribuição de abstenções nas eleições para a Câmara",
                    y = "Freqência", x = "% Abstenção")

O que corrobora os gráficos anteriores: a distribuição das abstenções em 98 estava mais dispersa do que nas eleições seguintes.

Notas finais

Este é apenas um dois possíveis tipos de análises que é possível fazer com a ajuda do pacote electionsBR. Como deve ter ficado claro, ele simplifica enormemente a tarefa de obter dados eleitorais, além de já os deixar prontos para uso. Mesmo assim, ainda é possível que alguns dos dados do TSE não possam ser tão simplemente analisados. A formação de alguns campos varia ao longo do tempo (a data de nascimento dos candidatos, por exemplo, era preenchida como “13/10/1976” em anos anteriores, mas também já foi preenchida como “13-10-76”), algumas variáveis são acrescentadas e, constantemente, outras são atualizadas pelo TSE. Por estas e outras razões, o pacote electionsBR ainda é um trabalho em aberto, que pode melhorar com a contribuição de outras pessoas.


« electionsBR: um pacote no R para baixar e limpar dados eleitorais do TSE
electionsBR: Exportando dados eleitorais do R para o Stata »