Panorama eleitoral · Pernambuco · 2026

O voto também conta histórias sobre um estado.

Um olhar sobre o comparecimento e a abstenção no primeiro turno das eleições de 2026 em Pernambuco. Este relatório reúne uma investigação exploratória sobre a participação eleitoral e suas diferenças pelo território pernambucano.

Dados abertos do TSE1º turno · 2026Análise em R

Explore as seções pelo menu lateral para conhecer as fontes, acompanhar as etapas de preparação dos dados e navegar pelos resultados da análise.

1. Introdução

O cenário político brasileiro é marcado por uma expressiva polarização ideológica, tornando a conquista de votos de eleitores com posicionamentos já estabelecidos um desafio para as campanhas eleitorais. Nesse contexto, a mobilização dos cidadãos que não compareceram às urnas no primeiro turno pode representar uma oportunidade estratégica para ampliar o eleitorado no segundo turno. Compreender o perfil desses eleitores, portanto, torna-se relevante para orientar ações de aproximação e comunicação.

Diante disso, este estudo tem como objetivo analisar os padrões de comparecimento e abstenção eleitoral em Pernambuco no primeiro turno das Eleições Gerais de 2026. A partir de dados oficiais do Tribunal Superior Eleitoral (TSE), são exploradas características demográficas e territoriais do eleitorado, como gênero, faixa etária e grau de escolaridade, buscando identificar grupos e regiões com diferentes níveis de abstenção.

Espera-se que os resultados forneçam subsídios para o planejamento de campanhas presidenciais no segundo turno, auxiliando na identificação de públicos prioritários e na definição de estratégias de mobilização e comunicação mais adequadas. Ressalta-se, contudo, que os dados agregados permitem caracterizar padrões de abstenção, mas não determinar as motivações individuais ou as preferências políticas dos eleitores ausentes.

2. Fonte dos dados e pacotes necessários

Fontes

Os dados utilizados neste estudo foram obtidos por meio do Portal de Dados Abertos do Tribunal Superior Eleitoral (TSE), que disponibiliza informações estatísticas referentes ao comparecimento e à abstenção eleitoral nas Eleições de 2026.

O conjunto de dados pode ser consultado no seguinte endereço:

Comparecimento e Abstenção – Eleições 2026

A documentação técnica disponibilizada pelo TSE também foi utilizada para compreender a estrutura dos arquivos, o significado das variáveis e os códigos empregados no registro das informações.

Pacotes

A análise é desenvolvida na linguagem R e utiliza pacotes que oferecem recursos para manipulação, organização e visualização dos dados. A tabela a seguir apresenta os pacotes necessários para a execução do código que você verá nesse projeto e garantem a reprodutibilidade das análises.

Pacote Finalidade
library(tidyverse) Conjunto de pacotes para manipulação, transformação e visualização de dados. Já carregado no setup.
library(sf) Manipulação de dados espaciais, especialmente para a elaboração de mapas.

3. Preparação e auditoria dos dados

Carregamento

O download disponibilizado pelo Tribunal Superior Eleitoral (TSE) contém um arquivo compactado (.zip) com os dados referentes ao perfil dos eleitores aptos a votar que compareceram e dos que se abstiveram no primeiro turno das Eleições Gerais de 2026, abrangendo as 27 unidades da Federação. O pacote também inclui um leiaute com a descrição das variáveis presentes no conjunto de dados (dataset).

Os arquivos de dados possuem extensão .csv. Para esta análise, foi utilizado exclusivamente o arquivo correspondente ao estado de Pernambuco (PE).

dados_originais <- readr::read_csv2(
  "perfil_comparecimento_abstencao_2026_PE.csv",
  locale = readr::locale(encoding = "latin1")
)

tibble(
  total_observacoes = nrow(dados_originais),
  total_variaveis = ncol(dados_originais)
) |>
  knitr::kable(
    caption = "Dimensões da base de dados",
    col.names = c("Total de observações", "Total de variáveis"),
    align = 'l'
  )
Dimensões da base de dados
Total de observações Total de variáveis
467244 45

Para facilitar a compreensão da estrutura do conjunto de dados, apresenta-se a seguir o dicionário de variáveis, contendo a identificação e a descrição dos campos disponibilizados pelo TSE. As variáveis estão agrupadas conforme sua finalidade, abrangendo informações de geração do arquivo, identificação territorial, características demográficas e indicadores de comparecimento e abstenção.

Observa-se que os campos iniciados por CD_ representam códigos de identificação, enquanto aqueles iniciados por DS_ apresentam suas respectivas descrições. Já os campos iniciados por QT_ correspondem a quantidades relacionadas ao eleitorado e à participação eleitoral.

dicionario_variaveis <- tibble::tibble(
  grupo = c(
    rep("Metadados", 4),
    rep("Identificação territorial", 4),
    rep("Características demográficas", 22),
    rep("Indicadores eleitorais gerais", 3),
    rep("Indicadores relacionados à deficiência", 2),
    rep("Transferência temporária", 2),
    rep("Obrigatoriedade do voto", 4),
    rep("Deficiência e obrigatoriedade do voto", 4)
  ),

  variavel = names(dados_originais),

  descricao = c(
    "Data de geração do arquivo pelo TSE.",
    "Horário de geração do arquivo pelo TSE.",
    "Ano de realização da eleição.",
    "Número do turno eleitoral.",

    "Sigla da unidade da Federação.",
    "Código de identificação do município.",
    "Nome do município.",
    "Número da zona eleitoral.",

    "Código correspondente ao gênero.",
    "Descrição do gênero.",
    "Código correspondente ao estado civil.",
    "Descrição do estado civil.",
    "Código correspondente à faixa etária.",
    "Descrição da faixa etária.",
    "Código correspondente ao grau de instrução.",
    "Descrição do grau de instrução.",
    "Código correspondente à classificação de cor ou raça.",
    "Descrição da classificação de cor ou raça.",
    "Código de identificação da condição quilombola.",
    "Descrição da condição quilombola.",
    "Código que identifica se o eleitor declarou ser intérprete de Libras.",
    "Descrição da condição de ser ou não intérprete de Libras.",
    "Código correspondente à identidade de gênero.",
    "Descrição da identidade de gênero.",
    "Código correspondente ao idioma indígena.",
    "Descrição do idioma indígena.",
    "Código correspondente ao grupo indígena.",
    "Descrição do grupo indígena.",
    "Código correspondente ao idioma quilombola.",
    "Descrição do idioma quilombola.",

    "Quantidade de eleitores aptos a votar.",
    "Quantidade de eleitores que compareceram.",
    "Quantidade de eleitores que se abstiveram.",

    "Quantidade de eleitores com deficiência que compareceram.",
    "Quantidade de eleitores com deficiência que se abstiveram.",

    "Quantidade de eleitores vinculados à transferência temporária que compareceram.",
    "Quantidade de eleitores vinculados à transferência temporária que se abstiveram.",

    "Quantidade de eleitores com voto facultativo que compareceram.",
    "Quantidade de eleitores com voto facultativo que se abstiveram.",
    "Quantidade de eleitores com voto obrigatório que compareceram.",
    "Quantidade de eleitores com voto obrigatório que se abstiveram.",

    "Quantidade de eleitores com deficiência e voto facultativo que compareceram.",
    "Quantidade de eleitores com deficiência e voto facultativo que se abstiveram.",
    "Quantidade de eleitores com deficiência e voto obrigatório que compareceram.",
    "Quantidade de eleitores com deficiência e voto obrigatório que se abstiveram."
  )
)

knitr::kable(
  dicionario_variaveis,
  col.names = c("Grupo", "Variável", "Descrição"),
  align = c("l", "l", "l"),
  caption = "Dicionário de variáveis da base de dados"
)
Dicionário de variáveis da base de dados
Grupo Variável Descrição
Metadados DT_GERACAO Data de geração do arquivo pelo TSE.
Metadados HH_GERACAO Horário de geração do arquivo pelo TSE.
Metadados ANO_ELEICAO Ano de realização da eleição.
Metadados NR_TURNO Número do turno eleitoral.
Identificação territorial SG_UF Sigla da unidade da Federação.
Identificação territorial CD_MUNICIPIO Código de identificação do município.
Identificação territorial NM_MUNICIPIO Nome do município.
Identificação territorial NR_ZONA Número da zona eleitoral.
Características demográficas CD_GENERO Código correspondente ao gênero.
Características demográficas DS_GENERO Descrição do gênero.
Características demográficas CD_ESTADO_CIVIL Código correspondente ao estado civil.
Características demográficas DS_ESTADO_CIVIL Descrição do estado civil.
Características demográficas CD_FAIXA_ETARIA Código correspondente à faixa etária.
Características demográficas DS_FAIXA_ETARIA Descrição da faixa etária.
Características demográficas CD_GRAU_INSTRUCAO Código correspondente ao grau de instrução.
Características demográficas DS_GRAU_INSTRUCAO Descrição do grau de instrução.
Características demográficas CD_COR_RACA Código correspondente à classificação de cor ou raça.
Características demográficas DS_COR_RACA Descrição da classificação de cor ou raça.
Características demográficas CD_QUILOMBOLA Código de identificação da condição quilombola.
Características demográficas DS_QUILOMBOLA Descrição da condição quilombola.
Características demográficas CD_INTERPRETE_LIBRAS Código que identifica se o eleitor declarou ser intérprete de Libras.
Características demográficas DS_INTERPRETE_LIBRAS Descrição da condição de ser ou não intérprete de Libras.
Características demográficas CD_IDENTIDADE_GENERO Código correspondente à identidade de gênero.
Características demográficas DS_IDENTIDADE_GENERO Descrição da identidade de gênero.
Características demográficas CD_IDIOMA_INDIGENA Código correspondente ao idioma indígena.
Características demográficas DS_IDIOMA_INDIGENA Descrição do idioma indígena.
Características demográficas CD_GRUPO_INDIGENA Código correspondente ao grupo indígena.
Características demográficas DS_GRUPO_INDIGENA Descrição do grupo indígena.
Características demográficas CD_IDIOMA_QUILOMBOLA Código correspondente ao idioma quilombola.
Características demográficas DS_IDIOMA_QUILOMBOLA Descrição do idioma quilombola.
Indicadores eleitorais gerais QT_APTOS Quantidade de eleitores aptos a votar.
Indicadores eleitorais gerais QT_COMPARECIMENTO Quantidade de eleitores que compareceram.
Indicadores eleitorais gerais QT_ABSTENCAO Quantidade de eleitores que se abstiveram.
Indicadores relacionados à deficiência QT_COMPARECIMENTO_DEFICIENCIA Quantidade de eleitores com deficiência que compareceram.
Indicadores relacionados à deficiência QT_ABSTENCAO_DEFICIENCIA Quantidade de eleitores com deficiência que se abstiveram.
Transferência temporária QT_COMPARECIMENTO_TTE Quantidade de eleitores vinculados à transferência temporária que compareceram.
Transferência temporária QT_ABSTENCAO_TTE Quantidade de eleitores vinculados à transferência temporária que se abstiveram.
Obrigatoriedade do voto QT_COMPAREC_FACULTATIVO Quantidade de eleitores com voto facultativo que compareceram.
Obrigatoriedade do voto QT_ABST_FACULTATIVO Quantidade de eleitores com voto facultativo que se abstiveram.
Obrigatoriedade do voto QT_COMPAREC_OBRIGATORIO Quantidade de eleitores com voto obrigatório que compareceram.
Obrigatoriedade do voto QT_ABST_OBRIGATORIO Quantidade de eleitores com voto obrigatório que se abstiveram.
Deficiência e obrigatoriedade do voto QT_COMPAREC_DEFIC_FACULTATIVO Quantidade de eleitores com deficiência e voto facultativo que compareceram.
Deficiência e obrigatoriedade do voto QT_ABST_DEFIC_FACULTATIVO Quantidade de eleitores com deficiência e voto facultativo que se abstiveram.
Deficiência e obrigatoriedade do voto QT_COMPAREC_DEFIC_OBRIGATORIO Quantidade de eleitores com deficiência e voto obrigatório que compareceram.
Deficiência e obrigatoriedade do voto QT_ABST_DEFIC_OBRIGATORIO Quantidade de eleitores com deficiência e voto obrigatório que se abstiveram.

Após a identificação das variáveis, é possível observar uma amostra dos registros importados.

head(dados_originais)

Limpeza

Como o conjunto de dados é composto essencialmente por variáveis categóricas, observa-se que as colunas iniciadas em CD_ e DS_ representam, em geral, a mesma informação, diferenciando-se apenas pela forma de apresentação: códigos numéricos e descrições textuais, respectivamente. Dessa forma, para evitar redundâncias e facilitar a interpretação dos resultados, serão mantidas preferencialmente as colunas descritivas (DS_), enquanto as colunas de códigos (CD_) serão removidas da base utilizada nas análises.

Também foram identificadas colunas cujos valores permanecem constantes em todas as observações, como DT_GERACAO, HH_GERACAO, ANO_ELEICAO, NR_TURNO e SG_UF. Como essas variáveis não apresentam variação entre os registros, não contribuem para as análises propostas e podem ser removidas sem perda de informação relevante para os objetivos deste estudo.

dados_originais |>
  summarise(
    across(
      c(DT_GERACAO, HH_GERACAO, ANO_ELEICAO, NR_TURNO, SG_UF),
      ~ n_distinct(.x, na.rm = FALSE)
    )
  )
dados <- dados_originais |>
  select(
    -starts_with("CD_"),
    -c(
      DT_GERACAO,
      HH_GERACAO,
      ANO_ELEICAO,
      NR_TURNO,
      SG_UF
    )
  )

Após a remoção das colunas consideradas irrelevantes para as análises, a estrutura do conjunto de dados passou a apresentar as seguintes dimensões:

tibble(
  total_observacoes = nrow(dados),
  total_variaveis = ncol(dados)
) |>
  knitr::kable(
    caption = "Dimensões da base de dados após limpeza",
    col.names = c("Total de observações", "Total de variáveis"),
    align = 'l'
  )
Dimensões da base de dados após limpeza
Total de observações Total de variáveis
467244 28

Vale destacar que os códigos -1 e -3, utilizados nas colunas numéricas para representar informações não registradas ou inválidas, possuem correspondência nas respectivas colunas descritivas, sendo representados por categorias textuais como “NÃO INFORMADO” e “Inválido”, respectivamente. Dessa forma, considerando que as descrições textuais serão priorizadas nesta análise, não é necessário realizar um tratamento adicional desses códigos na base preparada para as análises.

dados |>
  summarise(
    across(
      everything(),
      ~ sum(is.na(.x))
    )
  ) |>
  pivot_longer(
    cols = everything(),
    names_to = "variavel",
    values_to = "valores_ausentes"
  ) |>
  knitr::kable(
    caption = "Quantidade de valores ausentes por variável",
    col.names = c("Nome da variável", "Valores ausentes"),
    align = "lr"
  )
Quantidade de valores ausentes por variável
Nome da variável Valores ausentes
NM_MUNICIPIO 0
NR_ZONA 0
DS_GENERO 0
DS_ESTADO_CIVIL 0
DS_FAIXA_ETARIA 0
DS_GRAU_INSTRUCAO 0
DS_COR_RACA 0
DS_QUILOMBOLA 0
DS_INTERPRETE_LIBRAS 0
DS_IDENTIDADE_GENERO 0
DS_IDIOMA_INDIGENA 0
DS_GRUPO_INDIGENA 0
DS_IDIOMA_QUILOMBOLA 0
QT_APTOS 0
QT_COMPARECIMENTO 0
QT_ABSTENCAO 0
QT_COMPARECIMENTO_DEFICIENCIA 0
QT_ABSTENCAO_DEFICIENCIA 0
QT_COMPARECIMENTO_TTE 0
QT_ABSTENCAO_TTE 0
QT_COMPAREC_FACULTATIVO 0
QT_ABST_FACULTATIVO 0
QT_COMPAREC_OBRIGATORIO 0
QT_ABST_OBRIGATORIO 0
QT_COMPAREC_DEFIC_FACULTATIVO 0
QT_ABST_DEFIC_FACULTATIVO 0
QT_COMPAREC_DEFIC_OBRIGATORIO 0
QT_ABST_DEFIC_OBRIGATORIO 0

Auditoria dos dados

A identificação de registros duplicados é uma etapa importante da auditoria dos dados, pois permite detectar possíveis inconsistências que podem comprometer os resultados da análise, especialmente em situações de dupla contagem.

Neste estudo, considera-se um registro inteiramente duplicado quando uma linha apresenta valores idênticos aos de outra em todas as colunas do conjunto de dados. Inicialmente, verifica-se a quantidade de registros duplicados identificados:

total_duplicados <- sum(duplicated(dados))

str(total_duplicados)
##  int 53

Para visualizar todas as ocorrências envolvidas nas duplicações, incluindo tanto as primeiras aparições quanto suas respectivas repetições, são selecionados os registros correspondentes:

dados_duplicados <- dados |>
  filter(
    duplicated(dados) |
      duplicated(dados, fromLast = TRUE)
  )

dados_duplicados |>
  arrange(NM_MUNICIPIO, NR_ZONA, DS_FAIXA_ETARIA)

Caracterização das duplicatas

Ao examinar as observações duplicadas, verifica-se que elas ocorrem em pares, isto é, cada registro repetido possui exatamente duas ocorrências no conjunto de dados. Essa distribuição é apresentada a seguir:

dados_duplicados |>
  count(across(everything()), name = "ocorrencias") |>
  filter(ocorrencias > 1) |>
  count(ocorrencias, name = "quantidade_de_grupos") |>
  knitr::kable(
    caption = "Grupos fuplicados",
    col.names = c(
      "Ocorrências",
      "Quantidade de grupos"
    ),
    align = "l"
  )
Grupos fuplicados
Ocorrências Quantidade de grupos
2 53

Na análise das características dos registros duplicados, observa-se que todos compartilham o mesmo valor na variável DS_IDENTIDADE_GENERO: “Transgênero”. Para investigar esse padrão, são contabilizadas as categorias distintas de cada variável, desconsiderando as colunas de quantidade (QT_).

dados_duplicados |>
  summarise(
    across(
      -starts_with("QT_"),
      ~ n_distinct(.x, na.rm = FALSE)
    )
  )

Essa constatação levanta a hipótese de que a duplicidade possa estar relacionada à forma como os registros referentes à identidade de gênero foram organizados ou disponibilizados pelo TSE. Entretanto, a coincidência observada não é suficiente para estabelecer uma relação entre os dois fatores, tampouco para afirmar que houve uma falha no registro dessas informações.

Dessa forma, torna-se necessário investigar se a categoria “Transgênero” está efetivamente associada à ocorrência de duplicidades ou se esse padrão pode ser explicado por outras características dos registros.


Investigação da relação com a identidade de gênero

Para aprofundar a investigação, verifica-se a distribuição dos registros duplicados e não duplicados entre as categorias da variável DS_IDENTIDADE_GENERO. Para isso, é criada uma variável indicadora de duplicidade, permitindo comparar as ocorrências entre os grupos:

dados |>
  mutate(
    duplicado = duplicated(dados) |
      duplicated(dados, fromLast = TRUE)
  ) |>
  group_by(DS_IDENTIDADE_GENERO) |>
  summarise(
    total_registros = n(),
    registros_duplicados = sum(duplicado),
    percentual_duplicados = registros_duplicados / total_registros * 100
  ) |>
  arrange(desc(percentual_duplicados))|>
  knitr::kable(
    caption = "Percentual de duplicatas por identidade de gênero",
    col.names = c("Descrição identidade de gênero", "Total de registro", "Registros duplicados", "Percentual de duplicados"),
    align = "l",
    digits = 2
  )
Percentual de duplicatas por identidade de gênero
Descrição identidade de gênero Total de registro Registros duplicados Percentual de duplicados
Transgênero 3909 106 2.71
Cisgênero 261378 0 0.00
NÃO INFORMADO 141755 0 0.00
Prefere não informar 60202 0 0.00

O resultado evidencia que todos os 106 registros identificados como duplicados pertencem à categoria “Transgênero”. Entretanto, essa categoria também apresenta 3.803 registros que não possuem duplicidade. Nas demais categorias de identidade de gênero, não foram identificadas ocorrências duplicadas.

Portanto, embora as duplicidades estejam concentradas na categoria “Transgênero”, elas não abrangem todos os registros associados a essa classificação. Esse comportamento indica uma possível associação entre a identidade de gênero e a ocorrência de duplicidades, entretanto, os resultados, isoladamente, não permitem determinar a causa desse padrão nem afirmar que houve uma falha no processo de registro ou disponibilização dos dados pelo TSE.


Verificação da consistência dos quantitativos

Apesar da identificação de registros duplicados na etapa anterior, é possível realizar verificações adicionais para avaliar a consistência dos quantitativos presentes no conjunto de dados. Como a base apresenta informações agregadas, a repetição de uma linha não significa necessariamente que os valores totais estejam incorretos. Entretanto, essas ocorrências podem influenciar os resultados de operações de soma, sendo necessário avaliar seu impacto separadamente.

Inicialmente, verifica-se se os quantitativos de cada registro respeitam a relação entre eleitores aptos, comparecimento e abstenção. Considera-se consistente o registro em que a quantidade de eleitores aptos corresponde à soma dos eleitores que compareceram e daqueles que se abstiveram, conforme a seguinte expressão:

\[ QT\_APTOS = QT\_COMPARECIMENTO + QT\_ABSTENCAO \]

Para verificar essa condição, calcula-se a diferença entre a quantidade de eleitores aptos e a soma das duas categorias de participação eleitoral:

dados_validacao <- dados |>
  mutate(
    diferenca = QT_APTOS -
      (QT_COMPARECIMENTO + QT_ABSTENCAO)
  )

Em seguida, são contabilizados os registros consistentes, inconsistentes e aqueles que eventualmente apresentam valores ausentes nos campos necessários à verificação.

dados_validacao |>
  summarise(
    total_registros = n(),
    registros_consistentes = sum(diferenca == 0, na.rm = TRUE),
    registros_inconsistentes = sum(diferenca != 0, na.rm = TRUE),
    registros_sem_validacao = sum(is.na(diferenca)),
    percentual_consistente = mean(diferenca == 0, na.rm = TRUE) * 100
  ) |>
  knitr::kable(
    caption = "Consistência dos quantitativos por registro",
    col.names = c(
      "Total de registros",
      "Consistentes",
      "Inconsistentes",
      "Sem validação",
      "Consistentes (%)"
    ),
    align = "l"
  )
Consistência dos quantitativos por registro
Total de registros Consistentes Inconsistentes Sem validação Consistentes (%)
467244 467244 0 0 100

Após essa primeira verificação, observa-se que os registros apresentam coerência quanto à relação entre as três quantidades analisadas. Isso indica que, individualmente, os valores de comparecimento e abstenção correspondem ao total de eleitores aptos informado em cada linha.

Entretanto, essa consistência individual não garante que a soma dos quantitativos de toda a base esteja livre de possíveis distorções decorrentes das duplicidades identificadas anteriormente. Por esse motivo, torna-se necessário comparar os totais calculados a partir do conjunto de dados com os números divulgados pelo Tribunal Superior Eleitoral (TSE).

Para essa comparação, foram consultadas duas fontes oficiais. O portal Resultados do TSE (quando consultado: Última atualização 24/10/2026 - 12:41:15 (Horário local)) apresenta os seguintes quantitativos para Pernambuco:

Eleitorado apto Comparecimento Taxa comparecimento Abstenção Taxa abstenção
7.216.989 5.905.236 81,82% 1.311.753 18.18%

Por outro lado, o portal Estatíticas eleitorais do TSE (quando consultado: Última atualização: 13/10/2026 - 16:46) apresenta valores ligeiramente diferentes:

Eleitorado apto Comparecimento Taxa comparecimento Abstenção Taxa abstenção
7.225.744 5.913.207 81,84% 1.312.537 18,16%

Observa-se, portanto, uma diferença entre os quantitativos apresentados pelas duas fontes, o que exige cautela na escolha dos valores de referência para a validação. Essas divergências podem estar relacionadas a critérios de atualização, extração ou apresentação dos dados, sendo necessário considerar o período e os filtros utilizados em cada consulta.

Para reproduzir os indicadores apresentados pelos portais, também são calculadas as taxas de comparecimento e abstenção a partir dos quantitativos da base:

\[ \text{Taxa de abstenção} = \frac{QT\_ABSTENCAO}{QT\_APTOS} \times 100 \]

\[ \text{Taxa de comparecimento} = \frac{QT\_COMPARECIMENTO}{QT\_APTOS} \times 100 \]

Por fim, os quantitativos totais e suas respectivas taxas são calculados para a base original e para uma versão sem registros inteiramente duplicados. Essa comparação permite avaliar se as duplicidades identificadas anteriormente interferem nos resultados agregados.

resumo_comparativo <- bind_rows(
  dados |>
    summarise(
      total_aptos = sum(QT_APTOS, na.rm = TRUE),
      total_comparecimento = sum(QT_COMPARECIMENTO, na.rm = TRUE),
      total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE)
    ) |>
    mutate(base = "Original"),

  dados |>
    distinct() |>
    summarise(
      total_aptos = sum(QT_APTOS, na.rm = TRUE),
      total_comparecimento = sum(QT_COMPARECIMENTO, na.rm = TRUE),
      total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE)
    ) |>
    mutate(base = "Sem duplicatas")
) |>
  mutate(
    taxa_comparecimento = total_comparecimento / total_aptos * 100,
    taxa_abstencao = total_abstencao / total_aptos * 100
  ) |>
  select(
    base,
    total_aptos,
    total_comparecimento,
    taxa_comparecimento,
    total_abstencao,
    taxa_abstencao
  )

resumo_comparativo |>
  knitr::kable(
    caption = "Comparação dos quantitativos gerais da base",
    col.names = c(
      "Base",
      "Eleitores aptos",
      "Comparecimento",
      "Taxa de comparecimento (%)",
      "Abstenção",
      "Taxa de abstenção (%)"
    ),
    align = "l",
    digits = 2
  )
Comparação dos quantitativos gerais da base
Base Eleitores aptos Comparecimento Taxa de comparecimento (%) Abstenção Taxa de abstenção (%)
Original 7225744 5913207 81.84 1312537 18.16
Sem duplicatas 7225690 5913161 81.84 1312529 18.16

A soma dos quantitativos presentes na base original resultou em 7.225.744 eleitores aptos, dos quais 5.913.207 compareceram às urnas e 1.312.537 se abstiveram. As taxas calculadas correspondem, respectivamente, a 81,84% de comparecimento e 18,16% de abstenção.

Ao comparar os resultados com as informações do portal Estatísticas Eleitorais do TSE, observa-se correspondência exata entre os quantitativos e percentuais, apesar das duplicidades identificadas anteriormente. Entretanto, existem pequenas divergências em relação aos dados do portal Resultados do TSE.

Dessa forma, embora a base apresente consistência em relação a uma das fontes oficiais consultadas, essa concordância não permite descartar possíveis inconsistências nos registros nem determinar a origem das duplicidades. Ainda assim, considera-se viável dar continuidade às análises, mantendo-se essas ressalvas.

4. Análise exploratória

Abstenção por gênero

Inicialmente, foram examinadas as categorias presentes na variável DS_GENERO, com o objetivo de identificar os valores registrados e verificar a quantidade de ocorrências de cada um. Para complementar essa caracterização, também foram contabilizados os quantitativos de eleitores aptos e de abstenções correspondentes a cada categoria.

Observou-se a presença de registros classificados como “NÃO INFORMADO”, que não apresentam informações suficientes para a comparação pretendida. Por esse motivo, essa categoria foi desconsiderada no cálculo das taxas de abstenção por gênero, mantendo-se os demais registros da base original.

dados |>
  group_by(DS_GENERO) |>
  summarise(
    total_registros = n(),
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(total_aptos)) |>
  knitr::kable(
    caption = "Distribuição dos registros e quantitativos eleitorais por gênero",
    col.names = c(
      "Gênero",
      "Registros",
      "Eleitores aptos",
      "Abstenções"
    ),
    align = "l"
  )
Distribuição dos registros e quantitativos eleitorais por gênero
Gênero Registros Eleitores aptos Abstenções
FEMININO 252482 3876071 639907
MASCULINO 214487 3349351 672397
NÃO INFORMADO 275 322 233

A partir dos quantitativos de eleitores aptos e de abstenções, foi calculada a taxa de abstenção de cada gênero, dividindo-se o total de abstenções pelo total de eleitores aptos da respectiva categoria.

abstencao_genero <- dados |>
  group_by(DS_GENERO) |>
  summarise(
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    taxa_abstencao = total_abstencao / total_aptos * 100,
    .groups = "drop"
  ) |>
  filter(
    DS_GENERO != "NÃO INFORMADO"
  ) |>
  arrange(desc(taxa_abstencao))

abstencao_genero |>
  knitr::kable(
    caption = "Abstenção eleitoral por gênero",
    col.names = c(
      "Gênero",
      "Eleitores aptos",
      "Abstenções",
      "Taxa de abstenção (%)"
    ),
    align = "l",
    digits = 2
  )
Abstenção eleitoral por gênero
Gênero Eleitores aptos Abstenções Taxa de abstenção (%)
MASCULINO 3349351 672397 20.08
FEMININO 3876071 639907 16.51
ggplot(
  abstencao_genero,
  aes(
    x = reorder(DS_GENERO, taxa_abstencao),
    y = taxa_abstencao
  )
) +
  geom_col(fill = "#C98791") +
  coord_flip() +
  labs(
    title = "Taxa de abstenção por gênero",
    x = "Gênero",
    y = "Taxa de abstenção (%)"
  ) +
  theme_minimal()

O gráfico apresenta uma taxa de abstenção superior entre os eleitores do gênero masculino, aproximadamente 20%, enquanto entre os eleitores do gênero feminino o percentual fica em torno de 16,5%. Essa diferença indica que, proporcionalmente ao eleitorado apto de cada grupo, a abstenção foi mais elevada entre os homens.

É importante destacar que essa comparação considera as taxas relativas de cada grupo, e não apenas os quantitativos absolutos de abstenções. Dessa forma, evita-se que diferenças no tamanho dos eleitorados sejam interpretadas equivocadamente como diferenças na proporção de eleitores que deixaram de comparecer.

Abstenção por faixa etária

Em seguida, foi realizada uma análise semelhante utilizando a variável DS_FAIXA_ETARIA. Inicialmente, foram identificadas as categorias existentes e contabilizados os registros, os eleitores aptos e as abstenções correspondentes a cada faixa etária.

Assim como na análise anterior, foi identificada uma categoria sem informação válida para a comparação, denominada “Inválido”. Seus registros foram desconsiderados no cálculo das taxas de abstenção por idade.

dados |>
  group_by(DS_FAIXA_ETARIA) |>
  summarise(
    total_registros = n(),
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(total_aptos)) |>
  knitr::kable(
    caption = "Distribuição dos registros e quantitativos eleitorais por faixa etária",
    col.names = c(
      "Faixa etária",
      "Registros",
      "Eleitores aptos",
      "Abstenções"
    ),
    align = "l"
  )
Distribuição dos registros e quantitativos eleitorais por faixa etária
Faixa etária Registros Eleitores aptos Abstenções
40 a 44 anos 37763 726026 100412
25 a 29 anos 30243 713973 143260
35 a 39 anos 35826 706772 112825
30 a 34 anos 33230 703286 127875
45 a 49 anos 38073 690351 85808
50 a 54 anos 37311 615681 69051
55 a 59 anos 37085 540311 57597
21 a 24 anos 26420 525979 106518
60 a 64 anos 35634 482228 54201
65 a 69 anos 31336 373732 51572
70 a 74 anos 25394 287305 85515
75 a 79 anos 19158 207411 97705
20 anos 13936 121215 21028
80 a 84 anos 13613 120417 75631
19 anos 12180 109626 16866
18 anos 9943 97126 10165
85 a 89 anos 9425 62696 46943
17 anos 6054 59726 5472
16 anos 4057 36311 3034
90 a 94 anos 5743 25441 21743
95 a 99 anos 3102 11280 10643
100 anos ou mais 1595 8722 8624
Inválido 123 129 49
abstencao_faixa_etaria <- dados |>
  group_by(DS_FAIXA_ETARIA) |>
  summarise(
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    taxa_abstencao = total_abstencao / total_aptos * 100,
    .groups = "drop"
  ) |>
  filter(
    DS_FAIXA_ETARIA != "Inválido"
  ) |>
  arrange(desc(taxa_abstencao))

abstencao_faixa_etaria |>
  knitr::kable(
    caption = "Abstenção eleitoral por faixa etária",
    col.names = c(
      "Faixa etária",
      "Eleitores aptos",
      "Abstenções",
      "Taxa de abstenção (%)"
    ),
    align = "lrrr",
    digits = 2
  )
Abstenção eleitoral por faixa etária
Faixa etária Eleitores aptos Abstenções Taxa de abstenção (%)
100 anos ou mais 8722 8624 98.88
95 a 99 anos 11280 10643 94.35
90 a 94 anos 25441 21743 85.46
85 a 89 anos 62696 46943 74.87
80 a 84 anos 120417 75631 62.81
75 a 79 anos 207411 97705 47.11
70 a 74 anos 287305 85515 29.76
21 a 24 anos 525979 106518 20.25
25 a 29 anos 713973 143260 20.07
30 a 34 anos 703286 127875 18.18
20 anos 121215 21028 17.35
35 a 39 anos 706772 112825 15.96
19 anos 109626 16866 15.39
40 a 44 anos 726026 100412 13.83
65 a 69 anos 373732 51572 13.80
45 a 49 anos 690351 85808 12.43
60 a 64 anos 482228 54201 11.24
50 a 54 anos 615681 69051 11.22
55 a 59 anos 540311 57597 10.66
18 anos 97126 10165 10.47
17 anos 59726 5472 9.16
16 anos 36311 3034 8.36
ggplot(
  abstencao_faixa_etaria,
  aes(
    x = reorder(DS_FAIXA_ETARIA, taxa_abstencao),
    y = taxa_abstencao
  )
) +
  geom_col(fill = "#C98791") +
  coord_flip() +
  labs(
    title = "Taxa de abstenção por faixa etária",
    x = "Faixa etária",
    y = "Taxa de abstenção (%)"
  ) +
  theme_minimal()

Os resultados evidenciam uma relação expressiva entre a faixa etária e a taxa de abstenção. As maiores proporções concentram-se nas faixas de idade mais avançadas, especialmente a partir dos 70 anos. A taxa cresce de maneira acentuada nas categorias seguintes, ultrapassando 75% entre os eleitores de 85 a 89 anos e aproximando-se de 100% na faixa de 100 anos ou mais.

Entre as faixas etárias mais jovens, por outro lado, as taxas são consideravelmente menores. Observa-se uma elevação gradual até a faixa de 21 a 24 anos, seguida de uma redução progressiva ao longo de boa parte das faixas seguintes, até aproximadamente os 60 a 64 anos. A partir desse ponto, a taxa volta a crescer, com uma elevação mais acentuada entre os eleitores a partir dos 70 anos.

Esse comportamento demonstra que a abstenção não se distribui uniformemente entre as diferentes idades. Entretanto, os percentuais extremamente elevados nas faixas etárias mais avançadas devem ser interpretados com cautela, especialmente porque essas categorias podem reunir quantitativos menores de eleitores aptos. Assim, é importante considerar também os totais apresentados na tabela, e não apenas as taxas exibidas no gráfico.

Abstenção por gênero e faixa etária

Por fim, as variáveis de gênero e faixa etária foram analisadas conjuntamente, permitindo observar como as taxas de abstenção se comportam entre os diferentes grupos demográficos. Para isso, os quantitativos de eleitores aptos e de abstenções foram agrupados por combinação de gênero e faixa etária, possibilitando calcular uma taxa específica para cada grupo.

Na visualização, as faixas etárias foram organizadas em ordem crescente, de modo a facilitar a identificação de tendências ao longo da idade. Também foram mantidas apenas as categorias de gênero com informações válidas para a comparação.

abstencao_genero_idade <- dados |>
  group_by(DS_GENERO, DS_FAIXA_ETARIA) |>
  summarise(
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    taxa_abstencao = total_abstencao / total_aptos * 100,
    .groups = "drop"
  ) |>
  filter(
    DS_FAIXA_ETARIA != "Inválido",
    DS_GENERO != "NÃO INFORMADO"
  ) |>
  arrange(desc(taxa_abstencao))

ordem_faixas <- c(
  "16 anos",
  "17 anos",
  "18 anos",
  "19 anos",
  "20 anos",
  "21 a 24 anos",
  "25 a 29 anos",
  "30 a 34 anos",
  "35 a 39 anos",
  "40 a 44 anos",
  "45 a 49 anos",
  "50 a 54 anos",
  "55 a 59 anos",
  "60 a 64 anos",
  "65 a 69 anos",
  "70 a 74 anos",
  "75 a 79 anos",
  "80 a 84 anos",
  "85 a 89 anos",
  "90 a 94 anos",
  "95 a 99 anos",
  "100 anos ou mais"
)

abstencao_genero_idade <- abstencao_genero_idade |>
  mutate(
    DS_FAIXA_ETARIA = factor(
      DS_FAIXA_ETARIA,
      levels = ordem_faixas
    )
  )
ggplot(
  abstencao_genero_idade,
  aes(
    x = DS_FAIXA_ETARIA,
    y = taxa_abstencao,
    color = DS_GENERO,
    group = DS_GENERO
  )
) +
  geom_line(linewidth = 1) +
  geom_point(size = 2.5) +
  scale_color_manual(
    values = c(
      "FEMININO" = "#C98791",
      "MASCULINO" = "#E9D38D"
    )
  ) +
  labs(
    title = "Taxa de abstenção por gênero e faixa etária",
    x = "Faixa etária",
    y = "Taxa de abstenção (%)",
    color = "Gênero"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

O gráfico evidencia que a diferença entre os gêneros varia conforme a faixa etária. Entre os eleitores de 16 a 69 anos, as taxas de abstenção masculinas são, em geral, superiores às femininas. Essa diferença é mais perceptível nas faixas de 19 a 49 anos, nas quais a linha correspondente ao gênero masculino permanece acima da feminina.

A partir da faixa de 70 a 74 anos, entretanto, observa-se uma inversão desse comportamento: as taxas femininas passam a superar as masculinas, e a diferença se amplia nas faixas etárias seguintes. Na categoria de 100 anos ou mais, as taxas dos dois gêneros voltam a apresentar valores bastante próximos, ambos próximos de 100%.

Portanto, a análise conjunta revela que a diferença observada na comparação geral por gênero não se mantém uniforme ao longo das idades. Enquanto a abstenção masculina tende a ser superior entre os eleitores mais jovens e de meia-idade, o comportamento se inverte nas faixas mais avançadas. Esse resultado reforça a importância de considerar simultaneamente diferentes características demográficas para compreender a distribuição da abstenção eleitoral.

Abstenção por instrução

Inicialmente, foram identificadas as categorias presentes na variável DS_GRAU_INSTRUCAO, contabilizando-se os registros, os eleitores aptos e as abstenções correspondentes a cada nível de escolaridade. Também foi identificada a categoria “NÃO INFORMADO”, cujos registros foram desconsiderados no cálculo das taxas, por não apresentarem informações suficientes para a comparação pretendida.

dados |>
  group_by(DS_GRAU_INSTRUCAO) |>
  summarise(
    total_registros = n(),
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(total_abstencao)) |>
  knitr::kable(
    caption = "Distribuição dos registros e quantitativos eleitorais por escolaridade",
    col.names = c(
      "Grau de escolaridade",
      "Registros",
      "Eleitores aptos",
      "Abstenções"
    ),
    align = "l"
  )
Distribuição dos registros e quantitativos eleitorais por escolaridade
Grau de escolaridade Registros Eleitores aptos Abstenções
ENSINO FUNDAMENTAL INCOMPLETO 83744 1622083 306301
ENSINO MÉDIO COMPLETO 88218 1978608 261467
ENSINO MÉDIO INCOMPLETO 63360 1247876 208755
ANALFABETO 48231 432693 188898
LÊ E ESCREVE 52953 664126 165160
SUPERIOR COMPLETO 50992 603235 72557
ENSINO FUNDAMENTAL COMPLETO 44090 332362 60515
SUPERIOR INCOMPLETO 35423 344427 48659
NÃO INFORMADO 233 334 225
abstencao_escolaridade <- dados |>
  group_by(DS_GRAU_INSTRUCAO) |>
  summarise(
    total_aptos = sum(QT_APTOS, na.rm = TRUE),
    total_abstencao = sum(QT_ABSTENCAO, na.rm = TRUE),
    taxa_abstencao = total_abstencao / total_aptos * 100,
    .groups = "drop"
  ) |>
  filter(
    DS_GRAU_INSTRUCAO != "NÃO INFORMADO"
  ) |>
  arrange(desc(taxa_abstencao))
ggplot(
  abstencao_escolaridade,
  aes(
    x = reorder(DS_GRAU_INSTRUCAO, taxa_abstencao),
    y = taxa_abstencao
  )
) +
  geom_col(fill = "#C98791") +
  coord_flip() +
  labs(
    title = "Taxa de abstenção por grau de escolaridade",
    x = "Grau de escolaridade",
    y = "Taxa de abstenção (%)"
  ) +
  theme_minimal()

Os resultados revelam diferenças expressivas nas taxas de abstenção entre os níveis de escolaridade. O maior percentual foi observado entre os eleitores analfabetos, cuja taxa se aproxima de 44%, seguido daqueles que sabem ler e escrever, com aproximadamente 25%. Em contrapartida, os menores percentuais foram registrados entre os eleitores com ensino superior completo (cerca de 12%) e ensino médio completo (aproximadamente 13%).

É importante destacar que a maior taxa de abstenção não corresponde necessariamente ao maior quantitativo absoluto de abstenções. Embora os eleitores com ensino fundamental incompleto apresentem um número maior de abstenções do que os analfabetos (306.301 contra 188.898), a taxa entre as pessoas que não sabem ler e escrever é notavelmente maior, pois seu eleitorado apto é menor. Isso evidencia a importância de considerar a proporção de abstenções em relação ao total de eleitores aptos de cada categoria, e não apenas os números absolutos.

De modo geral, os resultados indicam uma associação entre escolaridade e abstenção eleitoral, com taxas mais elevadas entre os grupos de menor escolaridade. Entretanto, essa observação não permite estabelecer uma relação de causalidade, uma vez que outros fatores demográficos e sociais também podem influenciar o comparecimento às urnas.

5. Conclusão