post-image

Uma análise 'imparcial' das evidências de fraude encontradas na eleição presidencial da Bolívia


Neste post discutiremos a polêmica evolvendo a eleição presidencial da Bolívia e as evidências apresentadas, tanto a favor quanto contra a existência de fraude.

Introdução

Há algumas semanas escrevi um post sobre a eleição boliviana, no qual discuti anomalias estatísticas que podem ser causadas por fraudes eleitorais. Naquele momento ainda havia muita indefinição sobre o resultado da eleição, pois a contagem de votos não havia terminado. Muitos eventos importantes transcorreram após a publicação desse post; então decidi retornar ao tema para rever as evidências estatísticas de uma possível fraude.

Para entender melhor o tema, é importante rever um pouco da história recente da Bolívia e de Evo Morales, que era o presidente em exercício durante a eleição de 2019, e estava concorrendo ao seu quarto mandato consecutivo. Evo foi eleito pela primeira vez em 2005, quando obteve mais de 54% dos votos válidos, e uma vantagem de mais de 25% sobre o segundo colocado. Depois foi reeleito em 2009 com 64% dos votos válidos e uma vantagem de 38% sobre o segundo colocado. Nesse mesmo ano uma nova constituição foi promulgada no país, limitando cargos eletivos a dois mandatos consecutivos.

Em 2014, Evo Morales conseguiu seu terceiro mandado. A sua participação no pleito eleitoral foi permitida na base do argumento de que seu primeiro mandato datava de antes da decisão de 2009, e que por isso não deveria ser considerada. Nessa eleição Evo ganhou novamente com folga, obtendo 61% dos votos válidos, com uma enorme vantagem de 35% sobre o segundo candidato.

Em 2016, houve um referendo constitucional na Bolívia. Nesse referendo a população deveria decidir se Evo Morales poderia concorrer ao quarto mandato consecutivo em 2019. Apesar do enorme capital político acumulado nas eleições anterioes, Evo perdeu essa votação por um margem de 2.5% dos votos válidos. Entretanto, em 2017 ele recorreu ao Tribunal Constitucional para poder concorrer ao quarto mandato. Ganhou alegando que se não fosse permitido à ele concorrer ao cargo seriam feridos os seus direitos humanos, visto que a Declaração Universal dos Direitos Humanos estabelece que todo cidadão tem o direito de concorrer a qualquer cargo público.

Então houve a eleição presidencial no dia 20 de outubro de 2019. Após o encerramento das urnas, os votos começaram a ser contabilizados. Faltando a apuração de pouco mais de 15% dos votos, a contabilizacão foi paralizada. Com 83% dos votos apurados, o candidato Evo Morales liderava a disputa com 45% dos votos válidos. Em segundo lugar, estava o candidato Carlos Mesa, com 38% dos votos válidos. O governo boliviano justificou a paralisacão, afirmando que ocorreu um erro na apuração.

No momento da paralisação parecia provável que um haveria segundo turno da eleição presidencial boliviana pela primeira vez na historia do país. Na Bolívia, o segundo turno não ocorre em dois casos: se algum candidato consegue mais de 50% dos votos válidos, ou se o candidato em primeiro lugar tem 40% ou mais dos votos válidos e uma vantagem maior do que 10% em relação ao segundo colocado. Entretanto, quando a contagem foi reiniciada 24 horas depois, e finalizada, o resultado mudou. Evo Morales foi declarado vencedor no primeiro turno, com 47,08% dos votos válidos, contra 36,51% de Carlos Mesa, uma vantagem de 10,57%.

Dado essa mudança após a paralisação, candidatos da oposição e diversas entidades, como a Organização dos Estados Americanos (OEA), manifestaram preocupacão com relacão a fraude na eleição. A OEA chegou a afirmar que a melhor opção para o país seria realizar o segundo turno por causa das suspeitas de fraude. Por sua vez, o presidente em exercício, Evo Morales, disse que as denúncias eram na verdade uma tentativa de golpe de estado da oposição.

Diante da pressão dentro do país e da comunidade internacional, o governo de Evo Morales anunciou, em 30 de outubro, que autorizaria a Organização dos Estados Americanos (OEA) a realizar uma auditoria das eleições, e que iria aceitar o resultado apresentado pelos auditores. A OEA enviou uma equipe de especialistas, e no dia 10 de Novembro confirmou que identificou irregularidades graves no sistema de apuração. Recomendou a anulação da eleição e a renovação do Tribunal Supremo Eleitoral. Os resultados dessa apuração estão nesse relatório. Evo Morales chegou a convocar novas eleições, sem data marcada, porém não resistiu à pressão popular e das Forças Armadas do país contra o seu Governo e renunciou à presidência no mesmo dia. O comandante do Exército, Williams Kaliman, havia pedido sua renúncia horas antes: “Depois de analisar a situação conflituosa interna, sugerimos que o presidente do Estado renuncie a seu mandato presidencial, permitindo a pacificação e a manutenção da estabilidade pelo bem de nossa Bolívia”.

Os interlocutores e a interpretação das evidências nessa crise boliviana parecem ser bastante polarizados. Quem é de esquerda sustenta que não houve fraude e que houve golpe; quem é de direita tem certeza que houve fraude e que não foi golpe. No título do post coloquei a palavra imparcial entre aspas porque, como discuti no post sobre imparcialidade, é quase impossível ser imparcial, porém para uma análise estatística não deveria importar o posicionamento do ex-presidente. Uma análise estatística deveria se basear apenas nos dados. As vezes é necessário fazer suposições ao analisar os dados, mas neste caso é importante deixar claro que foram feitas e porque.

Os dois sistemas de contagem

Foram utilizados dois sistemas diferentes para a contagem dos votos da eleição boliviana: a Transmissão de Resultados Eleitorais Preliminares (TREP) e o Sistema Oficial de Contagem (COMPUTO). O objetivo do TREP foi fazer uma contagem rápida dos votos, permitindo que a mídia pudesse divulgar resultados atualizados da eleição, além de fornecer a possibilidade de checagem. Seus resultados são incompletos. O segundo sistema de contagem, o COMPUTO, é a contagem oficial, embora seja mais lenta e detalhada. Ele fornece a contagem oficial dos resultados da eleição utilizado pelo Superior Tribunal Eleitoral (STE) da Bolívia.

Após o encerramento da votação, as cédulas de votos individuais são contabilizadas nas seções eleitorais e agregadas em atas (actas), ou folhas de contagem. Para a contagem rápida do TREP, os resultados das atas, juntamente com fotos das atas, foram enviados para o agentes de verificação do Servicio de Registro Cívico (SERECÍ) utilizando um app no celular. Depois disso as atas foram fisicamente enviadas ao Tribunal Eleitoral Departamental (TED), onde as informações foram verificadas e inseridas no COMPUTO oficial. Cada seção eleitoral têm seis jurados, posição essa para a qual cidadões bolivianos são convocados, de forma muito similar à usada para mesários nas eleições brasileiras. Os seis jurados têm que assinar as atas.

Entretando, na noite da eleição, houve uma interrupção no sistema de contagem TREP. A interrupção foi justificada porque supostamente houve uma divergência entre os votos computados pelo TREP e pelo COMPUTO.

As evidências de fraude da OEA

A equipe da OEA consistiu em 36 especialistas de 18 nacionalidades, incluindo advogados eleitorais, estatísticos, profissionais de T.I. e especialistas em documentação, escrita, cadeia de custódia1 e organização eleitoral. O objetivo da missão da OEA na Bolívia era:

“O objetivo da análise de integridade eleitoral era obter insights detalhados dos processos de contagem de votos, da transmissão preliminar dos resultados, da contagem oficial, da cadeia de custódia dos materiais eleitorais para poder verificar, baseado nessas informações, a integridade e confiabilidade dos resultados da eleição de 20 de Outubro de 2019.”

O relatório da OEA sobre a auditoria da eleição boliviana analisa quatro aspectos importantes da eleição boliviana: tecnologia, cadeia de custódia, integridade dos dados e projeções estatísticas. As conclusões do relatório dos aspectos não estatísticos estão resumidas abaixo. Esta descrição baseia-se no relatório e nessa reportagem. Como a maioria das informações apresentadas nessa parte do relatório são sobre tecnologia de informação, não vou questionar os achados, apenas repetí-los aqui. É importante mencionar que no relatório não é explicitamente informado quais são as provas, e se elas podem ser verificadas por terceiros; o relatório tráz apenas as conclusões dos técnicos.

A auditoria da OEA descobriu que antes de chegar ao SERECÍ boliviano, os dados do TREP passavam por um servidor que não estava previsto no sistema, e tampouco era controlado pelos órgãos oficiais eleitorais. Depois de registradas no sistema, as imagens das atas enviadas pelos mesários não foram preservadas nos computadores do tribunal eleitoral. Portanto, os resultados não podiam ser verificados pela sistema de checagem planejado.

Ao analisar o sistema oficial de computação de votos no TSE boliviano, observou-se que era fácil logar-se no sistema como administrador. Não havia nenhuma exigência de múltiplos códigos de autenticação; uma vez logado os dados oficiais podiam ser alterados indiscriminadamente. Também era possível o acesso remoto a esse sistema por meio de um VPN2.

Além disso, as atas de votação do TREP que deveriam servir apenas para checagem e divulgação, foram incluídas na cômputo oficial de votos. Tal medida não era prevista pelo sistema de votação e é ainda mais grave quando se considera a vulnerabilidade da transmissão dos dados deste sistema, fora dos servidores oficiais.

Do ponto de vista estatístico, foram realizadas duas análises principais. A primeira análise mostra a distrituição dos horários de envio, pelo app, de cada ata da seção eleitoral até o SERECÍ. Mostra uma distribuição normal muito bem comportada com um único pico, como é possível ver na figura abaixo.



Porém o horário de verificação das atas tem um comportamento bem diferente. Aproximadamente 5% das atas foram verificadas apenas no outro dia, após a paralisação do sistema de contagem do TREP. Ou seja, apesar de todas as atas terem sido enviadas em horários razoavelmente próximos, 5% delas não foram incluídas no sistema por muitas horas. Esse comportamento estranho poderia ser resultado de algum ato de fraude, envolvendo a adulteração das atas no servidor intermediário antes do reenvio ao SERECÍ. Mas também poderia ocorrer porque o sistema teve um problema, o que fez com que as atas só pudessem ser incluídas no servidor após a paralisação do sistema. Na figura abaixo mostra-se claramente o segundo pico de inclusão de atas, que ocorreu após o termino da paralisação.



A segunda análise estatística diz respeito à mudança no comportamento dos votos antes e depois da paralisação da contagem do TREP. O percentual de votos para o Evo Morales aumentou consideravelmente após a paralisação, e mais ainda nos últimos 5% dos votos contabilizados, como pode ser visto no gráfico abaixo, onde o eixo x identifica o horário de contabilização da ata. Porém esse comportamento dos votos, mesmo sem fraude, é bastante comum em eleições. Geralmente os votos mais distantes ou mais isolados, que requerem uma lógistica maior para serem enviados, são os últimos a chegar, e muitas vezes esses votos têm um perfil bem específico. Por exemplo, nos Estados Unidos, usualmente os últimos votos a chegarem para a contagem são provenientes do Alasca, estado este que notoriamente é bastante Republicano.



No relatório afirma-se que a mudança de votos pró-Evo é muito maior do que seria possível apenas pela geografia dos votos ainda não registrados no sistema antes da interrupçao, porém nenhuma evidência ou detalhe sobre essa afirmação é mencionada no texto. Na seção seguinte veremos que essa afirmação não é verdadeira.

As evidências apresentadas pelo relatório da OEA sobre os aspectos não-estatísticos são bastante sérias, e se forem comprovadamente verdadeiras mostram que uma fraude poderia facilmente ter sido cometida. Quanto as evidências estatísticas, elas são circunstanciais, e poderiam ser explicadas tanto por fraude quanto pelo processo eleitoral em si ou pelo problema com o servidor do TREP.

O outro lado?

Por outro lado, o Center for Economic and Policy Research (CEPR) dos EUA divulgou um relatório que mostrou um estudo prevendo o resultado final da eleição baseado somente nos dados divulgados até o momento da interrupção da contagem do TREP. Diferentemente da percepção que havia no momento da paralisação, essa previsão mostrou que a vitória do Evo Morales no primeiro turno era muito provável. Pelo estudo, a vantagem de Evo Morales sobre o segundo candidato foi de 10,09%, muito próximo da diferença oficial da apuração de 10.57%.

A justificativa para este resultado aparentemente inesperado é que os votos faltantes eram de áreas rurais e periféricas da Bolívia, as quais têm votado historicamente disproporcionalmente a favor do Evo Morales. Por causa da logística, da tecnologia e provavelmente por causa de outras limitações, esse votos acabariam sendo computados no final da apuração. Dessa forma, o aumento dos votos para Evo Morales, interepretada pela OEA como fraude, na verdade poderia ser conseqüência desse fato.

Esse tipo de previsão pode ser feita fazendo simulações que levam em conta a localização do voto. Quando uma ata está faltando na contagem, os votos dos candidatos podem ser imputados levando em consideração os votos dos mesmos candidatos no nível geográfico superior, ou mesmo outras atas pertencentes ao mesmo nível geográfico. Esses votos faltantes podem ser estimados a partir da média dos votos do recinto a qual pertence, ou então a partir dos votos de outra mesa escolhida aleatoriamente no mesmo recinto. Se não houverem votos nesse recinto, pode-se utilizar os votos do nível geográfico acima, a Localidad, para fazer essas estimativas. E assim sucessivamente até imputar todos as atas faltantes.

No estudo do CEPR foram realizadas 500 simulações. Em cada simulação, ao invês de utilizar a média do percentual de votos no nível geográfico superior, selecionou-se aleatoriamente uma ata do mesmo nível com votos já contabilizados. Os resultados de todas as simulações estão no gráfico abaixo, onde mostra-se a margem de vitória em cada iteração. Fica evidente que em todas as simulações realizadas a margem obtida por Evo Morales era maior do que os 10% necessários para garantir a vitória no primeiro turno. Ou seja, utilizando esse modelo, a probabilidade de vitória de Evo Morales no momento da paralisação da contagem é estimada em 100%.



Apesar de diversos veículos de mídia no Brasil noticiarem que esse estudo mostrou que não houve fraude na eleição, essa não é a interpretação correta. Ele somente mostra que os resultados divulgados após a paralisação da contagem são consistentes com os resultados divulgados antes da paralisação. Ou seja, mostra que provavelmente não ocorreu uma fraude no momento da paralisação, porém poderia ter ocorrido fraude em qualquer outro momento anterior. Se a logística da fraude foi realizada em locais específicos, independente da paralisação, esta análise não teria como detectar a fraude.

Replicando o estudo do CEPR

Replicar resultados de estudos estatísticos é muito importante, tanto para entender de fato o que foi feito, quanto para confirmar a validade dos resultados. Neste post não conseguirei reproduzir as análises estatísticas realizadas pela OEA, pois não tenho acesso aos resultados indexados pelo horário de envio, verificação ou divulgação. Porém é possivel replicar o estudo do CEPR. Meu objetivo não foi replicar o estudo em si, porém realizar uma análise seguindo a ideia proposta por eles, fazendo uma previsão do resultado final da eleição utilizando apenas os dados divulgados até o momento da paralisação.

Os resultados o TREP foram divulgados nesse site, porém o único link para o resultado consolidado das atas é esse, que já contém 99% dos votos válidos. Para obter os dados antes da paralisação, eu descobri que todas as atas parciais ainda estão disponíveis no servidor, porém de difícil acesso porque é preciso saber o nome do arquivo. Como o nome dos arquivos divulgado têm esse formato acta.2019.10.25.13.00.59.xlsx, o qual depende de segundo, minuto e hora além de dia, mês e ano, escrevi um programa para tentar baixar todos as possíveis arquivos do dia 20/10/2019, entre as 19 e 21 horas (a paralisação ocorreu próximo das 20 horas).

Baixando os dados

O código no code chunck abaixo foi tentará baixar todos os arquivos do servidor TREP no timeframe determinado. O timeframe considerado pode ser controlado alterando os valores das variáveis hora, min e seg dentro do dataframe df.dim. Se desejar alterar o dia, será necessário modificar a string acta.2019.10.20 no código abaixo para o dia desejado.


require(tidyverse)
require(rvest)

dir = tempdir()

df.sim <- tibble(
  hora = 19:20,
  min=map(hora,~1:60)
) %>% unnest()

df.sim <- df.sim %>% mutate(
  seg=map(min,~1:60)
) %>% unnest()

df.sim <- df.sim %>% mutate(
  file=paste0(dir,"/acta.2019.10.20.",str_pad(hora,2,"left",pad="0"),".",str_pad(min,2,"left",pad="0"),".",str_pad(seg,2,"left",pad="0"),".xlsx"),
  url=paste0("https://trep.oep.org.bo/PubResul/acta.2019.10.20.",str_pad(hora,2,"left",pad="0"),".",str_pad(min,2,"left",pad="0"),".",str_pad(seg,2,"left",pad="0"),".xlsx")
)

map2(df.sim$url,df.sim$file,~try(download.file(url=.x,destfile=.y,method="curl")))


A ata mais próxima desse horário que consegui baixar do servidor foi essa: acta.2019.10.20.19.40.57.xlsx. Ou seja, a ata que foi divulgada as 19:40:57 do dia 20/10/2019. Nesta ata, 83,5% dos votos já estavam computados. Na análise realizada a seguir, utilizei esses dados para fazer uma previsão dos resultados completos da eleição. Como curiosidade, utilizei a mesma estratégia de busca de atas no site do COMPUTO para ver quais os resultados oficiais que já estavam sendo divulgados nesse mesmo período. Entretando nenhuma ata foi localizada.

A simulação apresentada aqui é um pouco diferente daquela realizada pelo CEPR. Nessa simulação sempre imputamos votos faltantes com a média de votos da área geográfica um nível acima, nunca selecionamos uma mesa dentro da mesma geografia. A estraégia adotada aqui deve ter uma variância menor das previsões do que aquela adotada pelo CEPR. Na figura 1 mostramos os resultados da simulação, a qual tem resultado muito similar ao CEPR. Em todas as 1000 simulações realizadas o candidato Evo Morales atinge a margem mínima para ganhar a eleição no primeiro turno.

Simulando a chance de vitória de Evo Morales no momento da paralisação da contagem

Figure 1: Simulando a chance de vitória de Evo Morales no momento da paralisação da contagem

Simulação

O code chunck abaixo mostra como baixar os dados das atas. Utiliazaremos duas atas: a do TREP antes da paralisação e a do COMPUTO no final da contagem dos votos. A ata do COMPUTO será utilizada apenas para indicar qual o número de pessoas que votaram, pois dessa forma não é necessário fazer um modelo para prever quantas pessas iriam votas.


require(openxlsx)

dir = tempdir()

#baixando ata do TREP - ante da paralisação
url.trep <- "http://www.pollingdata.com.br/blog/fraude eleitoral bolivia - 10-23-2019/acta.2019.10.20.19.40.57 - trep.xlsx"
file.trep <- tempfile(tmpdir=dir, fileext=".xlsx")
download.file(url.trep,file.trep,method="curl")

#baixando ata do COMPUTO - completa
url.computo <- "http://www.pollingdata.com.br/blog/fraude eleitoral bolivia - 10-23-2019/acta.2019.10.25.13.00.59 - computo.xlsx"
file.computo <- tempfile(tmpdir=dir, fileext=".xlsx")
download.file(url.computo,file.computo,method="curl")

#novos titulos para as variáveis das atas
nome.pop <- c("pais", "num_depto", "depto", "prov", "mun_mun", "mun", "circ", "localidad", "recinto", "num_mesa", "cod_mesa", "eleicao", "pop", "CC", "FPV", "MTS", "UCS", "MAS - IPSP", "21F", "PDC", "MNR", "PAN-BOL", "voto_valido_check", "brancos", "nulos","status")
nome.trep <- c("pais", "num_depto", "depto", "prov", "mun_mun", "mun", "circ", "localidad", "recinto", "num_mesa", "cod_mesa", "eleicao", "pop", "CC", "FPV", "MTS", "UCS", "MAS - IPSP", "21F", "PDC", "MNR", "PAN-BOL", "voto_valido_check", "brancos", "nulos")

###############################
#### Resultado final - computo
###############################

df.pop <- read.xlsx(file.computo,sheet = 1,colNames = FALSE,startRow = 2)
names(df.pop) <- nome.pop

df.pop <- df.pop %>% filter(eleicao == "Presidente y Vicepresidente")
df.pop <- df.pop %>% mutate(
  mundo = ifelse(pais == "Bolivia","Bolivia","Exterior"),
  total = `MAS - IPSP`+CC+FPV+MTS+UCS+`21F`+PDC+MNR+`PAN-BOL`+brancos+nulos
) 
df.pop <- df.pop %>% select(mundo,pais,depto,prov,mun,localidad,recinto,cod_mesa,total)

###############################
#### Resultado parcial
###############################

df.trep <- read.xlsx(file.trep,sheet = 1,colNames = FALSE,startRow = 2)
names(df.trep) <- nome.trep

df.trep <- df.trep %>% filter(eleicao == "Presidente y Vicepresidente")
df.trep <- df.trep %>% mutate(
  mundo = ifelse(pais == "Bolivia","Bolivia","Exterior"),
  parcial = `MAS - IPSP`+CC+FPV+MTS+UCS+`21F`+PDC+MNR+`PAN-BOL`+brancos+nulos,
  voto_ivo = `MAS - IPSP`,
  voto_mesa = CC,
  voto_outros = FPV+MTS+UCS+`21F`+PDC+MNR+`PAN-BOL`,
  voto_nv = brancos + nulos
) 
df.trep <- df.trep %>% select(mundo,pais,depto,prov,mun,localidad,recinto,cod_mesa,parcial,starts_with('voto_'),-voto_valido_check)

O code chunck abaixo mostra funções que foram criadas para ajudar na simulação. A função gerar_voto simula um distribuição multinomial utilizando os parametros encontrados no dataframe df. A função simular_eleicao executa uma iteração da simulação, que consite essencialmente em gerar todos os dados faltantes e agregá-los com os votos observados no momento da paralisação, os quais estão no dataframe df.trep.


# função que gera o voto de uma distribuição multinomial
gerar_voto <- function(votos,df){
  df.voto = tibble(
    cand=df$input,
    voto=rmultinom(1, votos, df$voto)
  )
  return(df.voto)  
}

# função que executa uma iteração da simulação
simular_eleicao <- function(univ,sim){
  df <- sim
  df$input <- map2(df$sim,df$data,~try(gerar_voto(.x,.y)))
  df <- df %>% select(-data) %>% unnest()
  df <- df %>% spread(cand,voto)
  df <- univ %>% bind_rows(df)
  df <- df %>% select(mundo:total,starts_with('voto_'))
  #df <- df %>% group_by_at(vars(-starts_with('voto_'),-total)) %>% summarise_at(vars(starts_with('voto_'),total),list(~sum(.,na.rm = TRUE)))
  df <- df %>% ungroup() %>% summarise_at(vars(starts_with('voto_')),list(~sum(.,na.rm = TRUE)))
  return(df)
}

No code chunck abaixo todas as estapas necessárias para construir a base de dados com o resultado da simulação. Para cada hierarquia geográfica da Bolívia foi criado um dataframe, que contém a proporção de votos dos candidatos para cada mesa no nível geográfico de referência. Por exemplo, o dataframe df.rec contém a proporção de votos do recinto a qual a mesa pertence. Os níveis geográficos consideradis foram: mundo,pais,depto,prov,mun,localidad,recinto e mesa, nessa ordem hierárquica.

O dataframe df.sim é o dataframe principal da simulação. Nele criamos a variável status, que indica se a mesa da ata já tem todos os seus votos ou se existem votos que devem ser simulados. Note que essa variável também tem uma categoria chamda ERRO, que indica mesas onde o número de votos no momento da paralisação é maior do que o total de votos ao final da contagem. Essas mesas foram retiradas da simulação.

Cada linha do dataframe df.bolivia contém uma iteração da simulação. Esse é o dataframe com os resultados finais da simulação.


df.sim <- df.pop %>% left_join(df.trep)
df.sim$parcial <- ifelse(is.na(df.sim$parcial),0,df.sim$parcial)
df.sim$sim <- df.sim$total - df.sim$parcial
df.sim$status <- case_when(
  df.sim$sim < 0 ~ "ERRO",
  df.sim$sim == 0 ~ "OK",
  df.sim$sim > 0 ~ "SIMULAR",
)
df.sim <- df.sim %>% filter(total > 0,status != "ERRO")
#removendo zeros de mesas com zero votos
df.sim <- df.sim %>% mutate(
  del = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE)
) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(~ifelse(del == TRUE,NA,.))
) %>% select(-del)

df.rec <- df.sim %>% group_by(mundo,pais,depto,prov,mun,localidad,recinto) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(rec=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_rec')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_rec')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.loc <- df.sim %>% group_by(mundo,pais,depto,prov,mun,localidad) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(loc=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_loc')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_loc')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.mun <- df.sim %>% group_by(mundo,pais,depto,prov,mun) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(mun=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_mun')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_mun')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.prov <- df.sim %>% group_by(mundo,pais,depto,prov) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(prov=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_prov')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_prov')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.dept <- df.sim %>% group_by(mundo,pais,depto) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(dept=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_dept')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_dept')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.pais <- df.sim %>% group_by(mundo,pais) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(pais=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_pais')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_pais')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.mundo <- df.sim %>% group_by(mundo) %>% mutate_at(
  vars(matches('voto_.*(ivo|mesa|outros|nv)$')),
  list(mundo=~sum(.,na.rm = TRUE))
) %>% ungroup() %>% mutate(
  check1 = ifelse(rowSums(select(.,matches('voto_.*(ivo|mesa|outros|nv)$')),na.rm = TRUE) == 0,TRUE,FALSE),
  check2 = ifelse(rowSums(select(.,ends_with('_mundo')),na.rm = TRUE) == 0,FALSE,TRUE)
) %>% mutate_at(
  vars(ends_with('_mundo')),
  list(~ifelse(check1 == TRUE & check2 == TRUE & status == "SIMULAR",.,NA))
) %>% select(-starts_with('check'))

df.fim <- df.sim %>%
  left_join(df.rec) %>%
  left_join(df.loc) %>%
  left_join(df.mun) %>%
  left_join(df.prov) %>%
  left_join(df.dept) %>%
  left_join(df.pais) %>%
  left_join(df.mundo)

df.fim <- df.fim %>% select(mundo:cod_mesa,sim,starts_with("voto_")) %>% filter(sim > 0)
df.fim <- df.fim %>% gather(input,voto,starts_with('voto_'),na.rm = TRUE)
df.fim$geog <- str_extract(df.fim$input,"[^_]*$")
df.fim$geog <- ifelse(df.fim$geog %in% c("ivo","nv","outros","mesa"),"mesa",df.fim$geog)
df.fim$input <- str_extract(df.fim$input,"^[^_]*_[^_]*")
df.fim <- df.fim %>% arrange_at(vars(-geog))
df.fim <- df.fim %>% group_by_at(vars(-geog,-voto)) %>% mutate(
  filtro = row_number()
) %>% filter(filtro == 1) %>% select(-filtro)
df.fim <- df.fim %>% group_by_at(vars(-input,-voto)) %>% mutate(
  voto = voto / sum(voto)
) %>% nest()

###########
### iterações

df.bolivia <-  tibble(
  iter=1:1000,
  sim= map_df(iter,~simular_eleicao(df.sim,df.fim))
)

O code chunck abaixo mostra como gerar o gráfico que resume o resultado final da simulação.


df.bolivia <- df.bolivia$sim
df.bolivia$iter <- 1:nrow(df.bolivia)
df.bolivia <- df.bolivia %>% gather(cand,voto,-iter)
df.bolivia <- df.bolivia %>% group_by(iter) %>% mutate(
  voto = voto / sum(voto)
)
df.bolivia <- df.bolivia %>% spread(cand,voto)
df.bolivia$margem <- round(100*((df.bolivia$voto_ivo/(1-df.bolivia$voto_nv)) - (df.bolivia$voto_mesa/(1-df.bolivia$voto_nv))),2)

g1 <- ggplot(df.bolivia, aes(x = margem))
g1 <- g1 + geom_histogram(aes(y = ..density..),binwidth = 0.01, fill = "yellow",colour="darkgray",alpha=0.8)
g1 <- g1 + geom_density(aes(y = ..density..),adjust = 4,alpha = .6, colour="darkgray", size=1)
g1 <- g1 + geom_vline(xintercept = 10, linetype="dashed",color = "red", size=1.5)
g1 <- g1 + xlim(c(9.95,10.2))
g1 <- g1 + geom_text(y=15,x=10.005,label="Margem mínima para vitória no 1º Turno",colour="black",angle=90)
g1 <- g1 + labs(title = "Previsão do resultado da eleição",subtitle="1000 simulações") + xlab("Margem de vantagem de Evo Morales")
g1


Outras evidências

No post sobre a eleição boliviana, mostrei que haviam anomalias estatísticas nos resultados da eleição que poderiam ser causadas por fraude. As anomalias consistiam em seções eleitorais com altíssimo nível de comparecimento na votação, e também com altíssimo nível de voto em Morales. Ou seja, são áreas onde todos os eleitores registrados compareceram e votaram no Evo Morales.

Essas anomalias podem ocorrer sem fraude, porém quanto maior o número de eleitores no local, menos provável que isso ocorra. A ocorrência depende do contexto, e mesmo em áreas grandes podem ocorrer sem fraude. Por exemplo, eu trabalhei com a eleição da Nigéria em 2011, e no estado de Ekiti, com população de 1,8 milhões de pessoas, 98% dos votos foram para o candidato a reeleição Jonathan Goodluck, porém o índice de comparecimento foi de apenas 81%.

Como benchmark, comparei os resultados da Bolívia com as eleições da Rússia em 2011 e 2012, e de Uganda em 2011, ambas apontadas como tendo muitas evidências de fraude no artigo (Klimek et al. 2012). As anomalias detectadas na Bolívia são mais sutis do que as encontradas nesses paises, em grande parte porque o índice de comparecimento na Bolívia no geral é de 90%, muito maior do que o da Rússia e de Uganda. Um comparecimento tão alto faz com que seja bem mais provável encontrar seções eleitorais com 100% de comparecimento. Ou seja, a anomalia é bem mais provável de ocorrer sem fraude na Bolívia do que na Rússia e Uganda, onde o comparecimento é próximo de 60%.

Neste post também olhamos as previsões baseadas nas pesquisas eleitorais divulgadas no Wikipedia. Baseado nesses dados, não existe evidência de fraude eleitoral. Inclusive, a disputa entre os dois principais candidatos foi bem mais acirrada na eleição do que era de se esperar.

Conclusão

Houve ou não fraude nas eleições da Bolívia? Como mostra esse post, existem muitas notícias sobre a crise política na Bolívia, mas as evidências não são muito claras. Algumas evidências parecem sugerir fraude, outras não. Ainda não é possível dizer com certeza o que aconteceu na Bolívia. As evidências ainda estão sendo coletadas e analisadas. Para comprovar fraude é preciso entender como ela ocorrreu, onde ocorreu, quando ocorreu e por quem foi cometida essa fraude. É uma investigação policial, que deve ser completada antes que as evidências sejam tratadas como fato.

Formular diferentes hipóteses sobre como uma possível fraude ocorreu é importante. Nos obriga a pensar sobre a logística do problema e sobre possíveis evidências que poderiam ser encontradas. Dificilmente um crime é perfeito. Por enquanto, a única hipótese formulada é que uma fraude poderia ter sido cometida no momento da paralisação, algo que de fato parece não ter ocorrido. Porém é preciso investigar mais, pois existem muitas formas de fraudar, e no contexto político da Bolívia, Evo Morales sabia desde o referendo constitucional de 2016 que ele tinha uma chance muito maior de perder essa eleição do que as anteriores que havia disputado. Ou seja, se ele tivesse a intenção de fraudar a eleição, ele teve bastante tempo para preparar uma estratégia.

A profusão de opiniões superficiais e rápidas, sem embasamento em dados ou evidências, tem se tornado cada vez mais recorrente na nossa sociedade e em todos os aspectos da nossa vida. A facilidade com que as pessoas conseguem ter certeza absoluta sobre o que aconteceu é assustador. Essa certeza, tão comum nos dias de hoje, pode até ser justificada em parte pelo viés de confirmação, porém acho que é mais do que isso. São pessoas torcendo pela direita ou pela esquerda, como times de futebol. O sistema de governo que desejamos para o nosso país não é um time de futebol. Não existe somente um ponto de vista correto nesse espectro político, sem falar na complexidade e variedade de temas incluídos no debate. Além disso, estamos falando de corrupção e fraude, crimes que são cometidos por pessoas, não sistemas políticos. Para encerrar este post, vou usar uma frase que eu já repeti milhares de vezes em conversas de bar, da qual eu não sei o autor:

“O mundo não é branco e preto. Ele é cinza!”

Você, leitor, deve pensar sobre isso sempre que estiver se posicionando de forma radical. Você acha que quando existem dois lados debatendo, algum deles têm 100% de razão? Não é mais provável que a verdade esteja em algum lugar entre os dois extremos? Nos dias de hoje, não precisamos de mais opiniões extremas. Não seja parte do problema. Seja parte da solução.

Referências

Klimek, P., Y. Yegorov, R. Hanel, and S. Thurner. 2012. “Statistical Detection of Systematic Election Irregularities.” Proceedings of the National Academy of Sciences 109 (41): 16469–73. https://www.pnas.org/content/109/41/16469.


  1. Cadeia de custódia, no contexto legal, refere-se à documentação cronológica ou histórico que registra a sequencia de custódia, controle, transferência, análise e disposição de evidências físicas ou eletrônicas.

  2. Uma VPN é uma conexão estabelecida sobre uma infraestrutura pública ou compartilhada, usando tecnologias de tunelamento e criptografia para manter seguros os dados trafegados.

Voltar ao blog

Especialistas em pesquisas de opinião pública e amostragem.

Prestamos consultoria em estatística. Entre em contato com a gente...

Consultoria