Introdução

Os resultados do primeiro turno das eleições no Brasil deixaram claro que o segundo turno vai depender dos eleitores de Tebet e Ciro. A transferência de votos desses candidatos, respectivamente em terceiro e quarto lugar no primeiro turno, vai determinar o próximo presidente. Quais são, então, as probabilidades de cada um?

O objetivo desta análise é calcular os cenários possíveis e ver onde isso vai dar. Ou seja: se 0,01% dos eleitores de Tebet e 0,01% dos eleitores de Ciro votarem em Lula e o resto em Bolsonaro, quem ganha? E se forem 0,02% e 0,01%? E por aí vai, até 99,9% e 99,9%.

Resultados

Lula ganha em 90% a 95% desses cenários. A análise abaixo mostra exatamente porque.

Carregando e limpando dados

Download

O primeiro passo é fazer o download dos resultados da eleição diretamente do site do TSE.

suppressMessages(library(tidyverse))
suppressMessages(library(lattice))
x <- httr::GET("https://resultados.tse.jus.br/oficial/ele2022/544/dados-simplificados/br/br-c0001-e000544-r.json") %>% 
  httr::content()

Criando dataframe

O segundo passo é organizar os dados em uma tabela que seja útil:

#nomes
candidatos <- as.data.frame(unlist(lapply(x$cand, `[[`, 4)))
# quantidade de votos no primeiro turno
candidatos$votos1T <- as.numeric(unlist(lapply(x$cand, `[[`, 10)))
# numero
candidatos$numero <- unlist(lapply(x$cand, `[[`, 3))
colnames(candidatos) <- c("nomes", "votos1T", "numero")
print(candidatos)
##                  nomes  votos1T numero
## 1                 LULA 57258115     13
## 2       JAIR BOLSONARO 51071277     22
## 3         SIMONE TEBET  4915306     15
## 4           CIRO GOMES  3599201     12
## 5     SORAYA THRONICKE   600953     44
## 6  FELIPE D&apos;AVILA   559680     30
## 7         PADRE KELMON    81127     14
## 8         LÉO PÉRICLES    53518     80
## 9        SOFIA MANZANO    45615     21
## 10                VERA    25623     16
## 11 CONSTITUINTE EYMAEL    16603     27

Pressuposições analíticas

Para viabilizar a análise eu pressuponho que todos os eleitores de Bolsonaro, Soraya, Felipe D’Ávila, Padre Kelmon e Eymael vão votar em Bolsonaro, e que todos os eleitores de Lula, Léo Péricles, Sofia Manzano e Vera vão votar em Lula.

transferenciaVoto <- data.frame (
  numero       = c(13, 22, 15, 12, 44, 30, 14, 80, 21, 16, 27),
  votosLula2T  = c(1, 0, NA, NA, 0, 0, 0, 1, 1, 1, 0)
)
transferenciaVoto$votosBolsonaro2T <- 1 - transferenciaVoto$votosLula2T
transferenciaVoto$abstencao <- 0
transferenciaVoto <- merge(transferenciaVoto, candidatos, by = "numero")
print(transferenciaVoto)
##    numero votosLula2T votosBolsonaro2T abstencao               nomes  votos1T
## 1      12          NA               NA         0          CIRO GOMES  3599201
## 2      13           1                0         0                LULA 57258115
## 3      14           0                1         0        PADRE KELMON    81127
## 4      15          NA               NA         0        SIMONE TEBET  4915306
## 5      16           1                0         0                VERA    25623
## 6      21           1                0         0       SOFIA MANZANO    45615
## 7      22           0                1         0      JAIR BOLSONARO 51071277
## 8      27           0                1         0 CONSTITUINTE EYMAEL    16603
## 9      30           0                1         0 FELIPE D&apos;AVILA   559680
## 10     44           0                1         0    SORAYA THRONICKE   600953
## 11     80           1                0         0        LÉO PÉRICLES    53518

Cálculo de cenários

Função de cálculo

Para calcular os cenários eu construí a seguinte função:

# Variaveis: ciroLula e simoneLula (proporção de eleitores de Ciro/Tebet que votam Lula no 2T), abstencaoCiro e abstencaoTebet (proporção de eleitores do Ciro/Tebet que votam nulo/branco no 2T)
calculoCenario <- function(ciroLula, simoneLula, abstencaoCiro, abstencaoSimone) {
  transferenciaVoto$votosLula2T[transferenciaVoto$numero == 15] <- simoneLula
  transferenciaVoto$votosLula2T[transferenciaVoto$numero == 12] <- ciroLula
  
  transferenciaVoto$abstencao[transferenciaVoto$numero == 15] <- abstencaoSimone
  transferenciaVoto$abstencao[transferenciaVoto$numero == 12] <- abstencaoCiro
  
  # Calculando que votos transferidos são todos os que não se abstiveram
  transferenciaVoto$votosTransferidos <- transferenciaVoto$votos1T * 
    (1 - transferenciaVoto$abstencao)
  
  # Calculando que os votos do Bolsonaro são todos os que não votaram Lula
  transferenciaVoto$votosBolsonaro2T <- 1 - transferenciaVoto$votosLula2T
  
  # Calculando votos em Lula
  votosLula =
    transferenciaVoto$votosTransferidos %*% 
    transferenciaVoto$votosLula2T
  
  # Calculando votos em Bolsonaro
  votosBolsonaro = 
    transferenciaVoto$votosTransferidos %*% 
    transferenciaVoto$votosBolsonaro2T
  
  # Ajeitando os resultados
  resultados <- list(
    "simoneLula" = simoneLula, "simoneBolsonaro" = 1 - simoneLula,
    "ciroLula" = ciroLula,  "ciroBolsonaro" = 1 - ciroLula,
    "abstencaoCiro" = abstencaoCiro, "abstencaoSimone" = abstencaoSimone,
    "votosLula" = votosLula, "votosBolsonaro" = votosBolsonaro,
    "propLula" = (votosLula/(votosLula + votosBolsonaro)),
    "propBolsonaro" = (votosLula/(votosLula + votosBolsonaro)))
  
  return(resultados)
  
}

Calculando

Primeiro é preciso montar uma tabela pra guardar os resultados.

cenarios = data.frame(matrix(vector(), 0, 10,
                       dimnames=list(c(), 
                                     c("simoneLula", "simoneBolsonaro",
                                       "ciroLula", "ciroBolsonaro",
                                       "abstencaoCiro", "abstencaoSimone",
                                       "votosLula", "votosBolsonaro",
                                       "propLula", "propBolsonaro"))),
                stringsAsFactors=F)

Agora finalmente podemos calcular todos os cenários.

Para:

  • Todas as possibilidades de transferência de voto de Ciro, de 0,00% a 100,0%;
  • Todas as possibilidades de transferência de voto de Tebet, de 0,00% a 100,0%;
  • Níveis de abstinência 10% e 20% para eleitores de cada candidato…
for (ciroLula in seq(0, 1, 0.01)) {
  for (simoneLula in seq(0, 1, 0.01)) {
    for (abstencaoCiro in c(0.1, 0.2)) {
      for (abstencaoSimone in c(0.1, 0.2)) {
    
    resultado <- calculoCenario(ciroLula, simoneLula, abstencaoCiro, abstencaoSimone)
    cenarios <- rbind(cenarios, resultado)
    
      }
    }
  }
}

cenarios$vitoriaLula <- ifelse(
  cenarios$votosLula > cenarios$votosBolsonaro, 1, 0)

Em qual percentagem desses cenários Lula é presidente?

print(100*mean(cenarios$vitoriaLula))
## [1] 95.10832

Um gráfico de duas dimensões ajuda a visualizar: Em azul claro temos vitória de Lula, e em magenta temos vitória de Bolsonaro.

levelplot(cenarios$vitoriaLula ~ cenarios$ciroLula*cenarios$simoneLula, 
          main="Vitória em diferentes cenários",
          ylab = "Proporção de eleitores Tebet que votam Lula",
          xlab = "Proporção de eleitores Ciro que votam Lula")

Limitações

A maior limitação dessa análise é considerar todos os cenários como igualmente prováveis, o que é uma simplificação pouco realista. Uma análise mais sofisticada deve levar em consideração diferentes distribuições probabilísticas.