Las Elecciones Generales 2021

Las elecciones generales de Perú de 2021 marcaron un hito crucial en la historia política del país. Celebradas el 11 de abril, estas elecciones no solo buscaban elegir al presidente de la República y a los vicepresidentes, sino también a los representantes ante el Congreso y el Parlamento Andino. Le seguiría las elecciones de segunda vuelta que tuvieron lugar el 6 de junio.

Para aquel momento el Perú ya se encontraba inmerso en una crisis sanitaria, económica y política, exacerbada por la pandemia de Covid-19. Además, la relación entre el poder ejecutivo y el legislativo había sido caótica en los últimos años. Desde la presidencia de Pedro Pablo Kuczynski hasta la llegada de Francisco Sagasti, el país había experimentado una serie de eventos que reflejaban una profunda inestabilidad política que atravesávamos, incluyendo múltiples renuncias presidenciales, cierres y disoluciones del Congreso, y vacancias presidenciales.

La segunda vuelta electoral enfrentó a dos candidatos polarizadores: Pedro Castillo, del partido Perú Libre, y Keiko Fujimori, de Fuerza Popular. Este segundo proceso, en particular, estuvo marcado por la difusión de acusaciones de vulneración de la neutralidad electoral por parte de algunos funcionarios públicos. Se difundieron rumores sobre la presencia de alteraciones en la mesas de votación y de personas fallecidas en el padrón electoral, insinuando la posibilidad de un fraude electoral.

Ante estas acusaciones, instituciones como la ONPE y la organización civil Transparencia salieron a desmentir los hechos pero la eventual difusión de este tipo de contenido dio lugar a la movilización de sectores políticos del partido perdedor (Fuerza Popular) a insistir en la investigación de un posible fraude electoral en su contra. Muchas cosas han sucedido en el escenario político del país desde entonces, pero existe aún sectores políticos que alegan que se dio un fraude electoral durante la segunda vuelta de la elecciones presidenciales.

Para aportar mayor luz al evento, este proyecto se propone desde utilizar una herramienta denominada la Ley de Benford para verificar la integridad de los resultados electorales. La Ley de Benford es una herramienta estadística que establece patrones esperados en las distribuciones de los primeros dígitos de conjuntos de datos, y su aplicación en el análisis de resultados electorales puede arrojar luz sobre posibles anomalías o indicios de fraude. Al examinar la distribución de los primeros dígitos de los resultados electorales y compararla con las expectativas teóricas de la Ley de Benford, se puede identificar si existen discrepancias significativas que pueden sugerir manipulación o irregularidades en los datos.

(2021) Adriana Urrutia, presidenta de la Asociación Civil Transparencia de Perú: “No tenemos evidencia de un fraude electoral sistemático”. La Tercera.
(2021) Adriana Urrutia, presidenta de la Asociación Civil Transparencia de Perú: “No tenemos evidencia de un fraude electoral sistemático”. La Tercera.

Manipulación de los datos

Antes de cargar los datos, realizo la lectura del archivo”2da vuelta.csv”, guardo la información en el objeto “elecciones” y cargo las librerías necesarias para el análisis. Comienzo filtrando los datos para incluir únicamente los resultados a nivel nacional, excluyendo regiones como “ASIA”, “EUROPA”, “OCEANIA”, “AFRICA” y “AMERICA”. Luego, sumo los votos para ambos partidos, selecciono las variables de interés y las agrupo para obtener el resumen por distrito:

library(readr)
library(dplyr)
library(infer)
library(ggplot2)


elecciones <- read_delim("2da vuelta.csv", 
    delim = ";", escape_double = FALSE, trim_ws = TRUE)

unique(elecciones$DEPARTAMENTO)
##  [1] "AMAZONAS"      "AMERICA"       "ANCASH"        "AREQUIPA"     
##  [5] "APURIMAC"      "AYACUCHO"      "ASIA"          "CAJAMARCA"    
##  [9] "CALLAO"        "CUSCO"         "EUROPA"        "HUANUCO"      
## [13] "HUANCAVELICA"  "ICA"           "JUNIN"         "LA LIBERTAD"  
## [17] "LAMBAYEQUE"    "LIMA"          "LORETO"        "MADRE DE DIOS"
## [21] "PIURA"         "PASCO"         "MOQUEGUA"      "PUNO"         
## [25] "SAN MARTIN"    "TACNA"         "TUMBES"        "UCAYALI"      
## [29] "OCEANIA"       "AFRICA"
votos <- elecciones %>%
                filter(!(DEPARTAMENTO %in% c("ASIA", "EUROPA", "OCEANIA", "AFRICA", "AMERICA"))) %>% # Filtro únicamente para los los resultados nacionales
                mutate(cantidad = VOTOS_P1 + VOTOS_P2) %>% # Sumo los votos para ambos partidos
                select(DEPARTAMENTO, PROVINCIA, DISTRITO, cantidad) %>% # Selecciono la variables de interés
                group_by(DEPARTAMENTO, PROVINCIA, DISTRITO) %>% # Las agrupo para el resumen
                summarize(cantidad = sum(cantidad)) # Calculo la suma de todas las mesas de votación por distrito

votos <- na.omit(votos)

La ley de Benford

Entonces ¿qué es la ley de Benford y por que la utilizaríamos para arrojar algo de luz a las acusaciones de fraude electoral? La Ley de Benford, concebida por el físico Frank Benford en 1938, arroja luz sobre la distribución no uniforme de los dígitos principales en conjuntos de datos, básicamente establece que, en muchos conjuntos de datos reales, es más probable encontrar el número 1 como el primer dígito que cualquier otro número. Lo importante es que su aplicación es más efectiva en conjuntos de datos que abarcan múltiples órdenes de magnitud. El argumento para utilizar la Ley de Benford como herramienta para detectar un posible fraude es que se espera que si los votos ha sido efectivamente alterados múltiples veces, esto se alejarán cada vez más de su distribución natural, en caso de ser significativamente diferentes, podría formularse un argumento respecto a una posible alteración en la cuenta de los votos.

En este proyecto vamos a utilizarla para observar si la diferencia entre el la distribución propuesta por Benford y la encontrada en las elecciones presidenciales son significativamente diferentes. Sin embargo, hemos de ser cocientes que su viabilidad como herramienta forense, especialmente en el análisis de elecciones, puede ser algo controversia. Deckert, Myagkov y Ordeshook (2011) argumentan que su eficacia en este contexto es comparable al azar, lo que la convierte en una herramienta problemática e incluso potencialmente engañosa. Es por ello que su aplicabilidad dependerá de que los datos de la elecciones abarquen varias magnitudes.

A continuación, grafico la distribución esperada según la ley de Benford utilizando un diagrama de barras:

# Distribución según la ley de Benford
p_benford <- c(0.30103000, 0.17609126, 0.12493874, 0.09691001, 0.07918125, 0.06694679, 0.05799195, 0.05115252, 0.04575749)
names(p_benford) <- 1:9

barplot(p_benford)

Genero la función

Ahora genero una función llamada “get_first” que extrae el primer dígito de los valores numéricos. Primero convierto los valores a caracteres, luego extraigo el primer dígito y lo convierto en un factor con niveles del 1 al 9:

# Genero la función
get_first <- function(x) {
  x %>%
    # Convierto los valores a caracteres
    as.character() %>%
    # Extraigo el primer dígito
    substr(1, 1) %>%
    # Categórico con niveles del 1 al 9
    factor(levels = 1:9)
}

Compruebo la distribución

Después, añado una nueva variable al dataframe original basada en la cantidad de votos. Reviso las primeras 25 filas del dataframe resultante y construyo un gráfico de barras para visualizar la distribución de los primeros dígitos:

# Añado la variable al dataframe en base a la variable votos
votos <- votos %>%
  mutate(first_digit = get_first(cantidad))
  
# Revisión
head(votos %>%
  select(cantidad, first_digit), 25)
## # A tibble: 25 × 4
## # Groups:   DEPARTAMENTO, PROVINCIA [3]
##    DEPARTAMENTO PROVINCIA cantidad first_digit
##    <chr>        <chr>        <dbl> <fct>      
##  1 AMAZONAS     BAGUA         5171 5          
##  2 AMAZONAS     BAGUA        12991 1          
##  3 AMAZONAS     BAGUA         2807 2          
##  4 AMAZONAS     BAGUA          940 9          
##  5 AMAZONAS     BAGUA         4465 4          
##  6 AMAZONAS     BONGARA        282 2          
##  7 AMAZONAS     BONGARA        239 2          
##  8 AMAZONAS     BONGARA        480 4          
##  9 AMAZONAS     BONGARA        417 4          
## 10 AMAZONAS     BONGARA       2968 2          
## # ℹ 15 more rows
# Construcción de la gráfica de barras
ggplot(votos, aes(x = first_digit)) +
  # Add bar layer
  geom_bar()

La distribución nula

¿Qué es una distribución nula?

De acuerdo, ya tenemos los datos de la segunda vuelta electoral del 2021. Ahora necesitamos compararlos con el modelo “ideal” dictado por la Ley de Benford para evaluar si los resultados de las elecciones se ajustan a la distribución de dígitos que esperaríamos ver según esta ley.

Para llevar a cabo esta comparación, primero calculamos un estadístico que nos indica qué tan diferentes son nuestros datos reales de lo que esperaríamos según la Ley de Benford.

En R, podemos utilizar el paquete infer para simular múltiples muestras de datos que sigan la distribución esperada según la Ley de Benford. Cada repetición de estas muestras representará un valor de Chi cuadrado que nos indicará en qué medida se alejan de la distribución ideal. Estos valores, debido a la variabilidad natural, pueden ser diversos, pero tenderán a agruparse en un rango de valores que sugieren una discrepancia mínima con la distribución “ideal”. Posteriormente, comparamos nuestros datos reales con esta distribución nula para determinar si existen diferencias significativas y si nuestros datos son consistentes con lo que esperaríamos según la Ley de Benford.

La distribución nula nos proporciona una referencia con la cual podemos contrastar nuestros datos reales y evaluar si se ajustan a lo que esperaríamos bajo condiciones ideales. Si los resultados reales difieren significativamente de lo que obtendríamos bajo la distribución nula, esto podría generar sospechas sobre la integridad de las elecciones.

Generamos la distribución nula

Identifico el estadístico de la muestra y genero una distribución nula para llevar a cabo la prueba de chi-cuadrado. Esto implica simular 10,000 repeticiones bajo la hipótesis nula de que los datos siguen la ley de Benford, para esto hago uso de la funciones del paquete infer:

set.seed(123)
# Identifico el estadístico de la muestra
chi_obs_stat <- votos %>%
  chisq_stat(response = first_digit, p = p_benford)

chi_obs_stat
## X-squared 
##  10.34666
# Genero la distribución nula
null <- votos %>%
  # Specify the response
  specify(response = first_digit) %>%
  # Establezco la H0
  hypothesize(null = 'point', p = p_benford) %>%
  # Genero 10000 repeticiones
  generate(reps = 10000, type = 'simulate') %>%
  # Calculo es estadístico para cada uno de ellas
  calculate(stat = 'Chisq') 

str(null)
## infer [10,000 × 2] (S3: infer/tbl_df/tbl/data.frame)
##  $ replicate: int [1:10000] 1 2 3 4 5 6 7 8 9 10 ...
##  $ stat     : num [1:10000] 6.57 6.35 1.07 9.7 5.64 ...
##  - attr(*, "response")= symbol first_digit
##  - attr(*, "response_type")= chr "factor"
##  - attr(*, "distr_param")= num 8
##  - attr(*, "theory_type")= chr "Chi-square Goodness of Fit"
##  - attr(*, "type_desc_response")= chr "mult"
##  - attr(*, "type_desc_explanatory")= chr ""
##  - attr(*, "null")= chr "point"
##  - attr(*, "params")= Named num [1:9] 0.301 0.1761 0.1249 0.0969 0.0792 ...
##   ..- attr(*, "names")= chr [1:9] "p.1" "p.2" "p.3" "p.4" ...
##  - attr(*, "generated")= logi TRUE
##  - attr(*, "type")= chr "simulate"
##  - attr(*, "hypothesized")= logi TRUE
##  - attr(*, "fitted")= logi FALSE
##  - attr(*, "stat")= chr "Chisq"

Representación gráfica

Determino los grados de libertad y gráfico la distribución nula junto con una línea vertical que indica el valor del estadístico observado en la muestra original:

# Determino los grados de libertad
degrees_of_freedom <- votos %>%
  # Extraigo el primer dígito
  pull("first_digit") %>% 
  # n niveles - 1
  nlevels - 1

# Grafico la districión nula
ggplot(null, aes(x = stat)) +
  # Elaboro un gráfico de densidad
  geom_density() +
  # Añado una línea vertical con el estadístico observado en la muestra original
  geom_vline(xintercept = chi_obs_stat, color = 'red') 

Resultados

Finalmente, obtengo el valor p a través de la distribución nula y lo muestro. Este valor p representa la probabilidad de observar un estadístico tan extremo como el observado en la muestra, bajo la hipótesis nula de que los datos siguen la ley de Benford:

# Obtengo el p valor a través de la distribución
null %>%
  summarise(pval = mean(stat >= chi_obs_stat))
## # A tibble: 1 × 1
##    pval
##   <dbl>
## 1 0.247

Se obtiene el valor p a través de la distribución nula. Con un valor p de 0.247, no se encuentra evidencia suficiente para rechazar la hipótesis nula de que los datos siguen la ley de Benford. Esto sugiere que la distribución de los primeros dígitos en los resultados de la segunda vuelta electoral no difiere significativamente de lo que se esperaría según la Ley de Benford, lo que indicaría que el número devotos no fueron manipulados.

Es importante señalar que la Ley de Benford es una herramienta estadística que proporciona indicadores potenciales de anomalías en los datos, pero no puede determinar definitivamente si ha habido fraude. Es por ello que es importante destacar que esta prueba no pretende ser una conclusión definitiva sobre la presencia o ausencia de fraude electoral, sino más bien un elemento adicional en el análisis. La Ley de Benford se utiliza como una herramienta para identificar posibles anomalías en los datos, y aunque su eficacia en este contexto puede ser objeto de controversia, puede proporcionar información relevante que contribuya a arrojar luz sobre las acusaciones de fraude electoral.

¡Gracias por leer hasta aquí!