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.
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)
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)
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)
}
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()
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.
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"
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')
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í!