15 min read

polaR on CRAN

Publicaron en CRAN una primera versión del paquete polAr: -POLítica ARgentina usando R. En este post intentaré detallar un poco más el proceso de trabajo con el que llegamos hasta acá y, como yapa, el de geofaceteAr.

polAr

La idea del paquete es brindar herramientas que faciliten el flujo de trabajo del análisis político - electoral y el acceso a datos de Argentina usando R. Podriamos dividir las funciones de esta primera versión en tres familias: (i) datos, (ii) indicadores y (iii) visualización:

datos

El paquete no incluye datos, sino que funciona como motor de búsqueda y descarga desde un repositorio alternativo. La idea detrás de ello es que funcione de modo indpendiente, que ésta pudiera ser aumentada o modificada sin efectos directos sobre el paquete. En una próxima publicación intetnaré avanzar sobre la documentación de este repositorio y un proceo de chequeo de información.

La principal fuente de información es el siempre útil Atlas Electoral de Andy Tow. Sitio que, además de ser la fuente de tabulados electorales más completa que existe en Argentina, disponibiliza las bases con los datos desagregados publicados por los escrutinios provisorios desde el año 2003 en adelante.

El primer paso de lo acá compartido fue el procesamiento de esas bases de datos y el armado de un repositorio propio que me facilitara el trabajo de llamado de elecciones. En resumen: transformamos archivos .mdb (formato para tablas relacionles de Microsoft Acces) en sqlite para cada año electoral e hicimos consultas a esas basese de datos para obtener un archivo .csv para cada elección con una estrcutura así: distrito_categoria_turno_año.csv.

Solo para las elecciones del proceso electoral de 2019 trabajamos con datos compartidos por pmoracho en github. Algo más de detalle del estado actual de todo esto esta disponible en el repositorio PolAr_Data.

Al día de hoy el repositorio cuenta con 425 archvios de elecciones para las catgorías a Presidente, Diputades y Senadores Nacionales, para elecciones generales, primarias (P.A.S.O.) y balotaje presidencial.

Con show_available_elections() accedemos a un índice con la información disponible que podemos descargar:

## # A tibble: 425 x 5
##    district category round  year  NOMBRE   
##    <chr>    <chr>    <chr>  <chr> <chr>    
##  1 arg      presi    balota 2015  ARGENTINA
##  2 arg      presi    gral   2003  ARGENTINA
##  3 arg      presi    gral   2007  ARGENTINA
##  4 arg      presi    gral   2011  ARGENTINA
##  5 arg      presi    gral   2015  ARGENTINA
##  6 arg      presi    gral   2019  ARGENTINA
##  7 arg      presi    paso   2011  ARGENTINA
##  8 arg      presi    paso   2015  ARGENTINA
##  9 arg      presi    paso   2019  ARGENTINA
## 10 caba     dip      gral   2005  CABA     
## # ... with 415 more rows

Tomando los parámetros de la tabla anterior con el siguiente comando podemos completar los campos obligatorios para obtener los datos, en este caso de la elección general para presidente de 2019.

arg19 <- get_election_data(district = "arg",
                  category = "presi",
                  round = "gral", 
                  year = 2019)

arg19
## # A tibble: 192 x 8
## # Groups:   codprov [24]
##    category round  year codprov name_prov    electores listas    votos
##    <chr>    <chr> <dbl> <chr>   <chr>            <dbl> <chr>     <dbl>
##  1 presi    gral   2019 01      CABA                 0 00024    128795
##  2 presi    gral   2019 01      CABA                 0 00036     58040
##  3 presi    gral   2019 01      CABA                 0 00037    707158
##  4 presi    gral   2019 01      CABA                 0 00039     13559
##  5 presi    gral   2019 01      CABA                 0 00050   1039750
##  6 presi    gral   2019 01      CABA                 0 00108     37404
##  7 presi    gral   2019 01      CABA                 0 blancos   30542
##  8 presi    gral   2019 01      CABA                 0 nulos         0
##  9 presi    gral   2019 02      BUENOS AIRES         0 00024    610009
## 10 presi    gral   2019 02      BUENOS AIRES         0 00036    260597
## # ... with 182 more rows

arg19 es un tibble de \(192\) filas y 8 variables. Las filas son el producto de 8 filas únicas por provincia (los 24 grupos) con la cantidad de votos obtenidos por las distintas opciones electorales en este turno, categoría y año.

En este artículo se puede encontrar más detalles de la función.


indicadores

El acceso a la información es quizás la función princiapl de polAr, la cual permitirá a usuaries trabajar con los datos como quieran. Pero el paquete incopora además funciones para realizar cálculos de interés para el análisis político. Esta primera versión solamente incluye dos varianes: compute_nep(), que devulelve el Número Efectivo de Partidos (según dos fórmulas distintas) y compute_cometitiveness(), que calcula el nivel de competencia de una elección determinada.

arg19 %>% 
  compute_competitiveness() %>% 
  print(n= 24)
## # A tibble: 24 x 2
##    codprov competitividad
##    <chr>            <dbl>
##  1 01               0.835
##  2 02               0.841
##  3 03               0.785
##  4 04               0.685
##  5 05               0.915
##  6 06               0.801
##  7 07               0.779
##  8 08               0.998
##  9 09               0.636
## 10 10               0.954
## 11 11               0.877
## 12 12               0.974
## 13 13               0.879
## 14 14               0.767
## 15 15               0.900
## 16 16               0.721
## 17 17               0.869
## 18 18               0.823
## 19 19               0.965
## 20 20               0.692
## 21 21               0.991
## 22 22               0.441
## 23 23               0.763
## 24 24               0.694

Este artículo del paquete tiene algo más de detalle.


visualización

Por último polAr incluye un par funciones que ayudan a visualizar rápidamente las elecciones de manera resumida. Una primera alternativa es generar tabulados con los resultados agregados de un comicio:

arg19 %>% 
  get_names() %>% 
  tabulate_results()
Argentina - 2019
Elección General - Presidente de la Nación
Lista Votos
00037-FRENTE DE TODOS 47.4%
00050-JUNTOS POR EL CAMBIO 39.8%
00024-CONSENSO FEDERAL 6.1%
00036-FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD 2.1%
00039-FRENTE NOS 1.7%
blancos 1.5%
00108-UNITE POR LA LIBERTAD Y LA DIGNIDAD 1.5%
nulos 0.0%
Fuente: polAr - Política Argentina usando R - https://electorarg.github.io/polAr

Otra alternativa es analizarlos de manera gráfica1:

arg19 %>% 
  get_names() %>% 
  plot_results(national = T)

Ambas funciones requieren utilizar primero get_names en la versión de CRAN. Esta es una función auxiliar para vincular la base de datos de resultados con los nombres de las listas que compiten.

La versión en desarrollo elimina ese paso intermedio para los casos por defecto de obtención de datos (con fomato long) pero sigue funcionando para los casos en que los datos de la elección fueron descargados wide.

Puede notarse que plot_results() fue llamado con un parámatro national = TRUE. De esta manera, para elecciones a presidente, el gráfico resultante muestra el agregado de votos al nivel del distrito que se elige el cargo. Si, en cambio, no especificamos nada, el parámetro FALSE por defecto nos devolverá los resultados a nivel de provncias en grillas cómo si fueran mapas. De igual modo, si descargamos una elección a nivel departamental, plot_results()automáticamente graficará los resultados con geofacetAR.

get_election_data(district = "caba",
                  category = "dip", 
                  round = "paso" , 
                  year = 2019 , 
                  level = "departamento") %>% 
  plot_results()

RESUMIENDO


gofaceteAr

Lo anterior es posible gracias a otro paquete, disponible para descarga desde un repositorio de github. geofaceteAr es una extensión local del paquete geofacet de Ryan Haffen. El empaquetado fue el resultado de ordenar la aplicación para Argentina de esta técnica de acomodar las grillas de ggplot2 como si fueran mapas, originalmente presentadas en LatinR 2018.

Éste carga el paquete geofacet y agrega funciones de utilidad para la geografía argentina. La priemra de ellas es show_arg_codes()que muestra un diccionario de grillas con el id correspondiente para descarga y equivalencias de los id correspodientes a los diferentes distritos.

library(geofaceteAR)

show_arg_codes()
Diccionario de equivalencias para identificadores geogrficos
Argentina - Nivel Provincial
ID grilla INDRA INDEC ISO
codprov codprov_censo codprov_iso name_iso
ARGENTINA AR Argentina
CABA 01 02 AR-C Ciudad Autónoma de Buenos Aires
BUENOS AIRES 02 06 AR-B Buenos Aires
CATAMARCA 03 10 AR-K Catamarca
CORDOBA 04 14 AR-X Córdoba
CORRIENTES 05 18 AR-W Corrientes
CHACO 06 22 AR-H Chaco
CHUBUT 07 26 AR-U Chubut
ENTRE RIOS 08 30 AR-E Entre Ríos
FORMOSA 09 34 AR-P Formosa
JUJUY 10 38 AR-Y Jujuy
LA PAMPA 11 42 AR-L La Pampa
LA RIOJA 12 46 AR-F La Rioja
MENDOZA 13 50 AR-M Mendoza
MISIONES 14 54 AR-N Misiones
NEUQUEN 15 58 AR-Q Neuquén
RIO NEGRO 16 62 AR-R Río Negro
SALTA 17 66 AR-A Salta
SAN JUAN 18 70 AR-J San Juan
SAN LUIS 19 74 AR-D San Luis
SANTA CRUZ 20 78 AR-Z Santa Cruz
SANTA FE 21 82 AR-S Santa Fe
SANTIAGO DEL ESTERO 22 86 AR-G Santiago del Estero
TUCUMAN 23 90 AR-T Tucumán
TIERRA DEL FUEGO 24 94 AR-V Tierra del Fuego
Fuente: geofaceteAR - https://electorarg.github.io/geofaceteAR

Usamos la función get_grid() para llamar una grilla disponible en la tabla anterior. Y grid_preview() si queremos ver el diseño de la grilla.

get_grid("TUCUMAN") 
##    name_provincia row col code            name
## 1         TUCUMAN   1   4  013       BURRUYACU
## 2         TUCUMAN   2   4  001         CAPITAL
## 3         TUCUMAN   4   2  005     CHICLIGASTA
## 4         TUCUMAN   2   5  012       CRUZ ALTA
## 5         TUCUMAN   3   3  003        FAMAILLA
## 6         TUCUMAN   5   4  009        GRANEROS
## 7         TUCUMAN   5   3  007 JUAN B. ALBERDI
## 8         TUCUMAN   6   3  008        LA COCHA
## 9         TUCUMAN   3   5  011          LEALES
## 10        TUCUMAN   3   4  002           LULES
## 11        TUCUMAN   3   2  004        MONTEROS
## 12        TUCUMAN   4   3  006       RIO CHICO
## 13        TUCUMAN   4   4  010          SIMOCA
## 14        TUCUMAN   2   1  017  TAFI DEL VALLE
## 15        TUCUMAN   2   2  016      TAFI VIEJO
## 16        TUCUMAN   1   3  014         TRANCAS
## 17        TUCUMAN   2   3  015     YERBA BUENA

Luego, podemos hacer uso nuevamente de la información en nuestro diccionario de identificadores geográficos para recodificar los distritos. El código por default - el que figura dentro de cada cajita del mapa- es el correspondiente a los escrutinios provisorios (que utilizamos en polAr), pero podemos disponer de otros. Por ejemplo, los del INDEC:

get_grid("TUCUMAN") %>%
  recode_district(type = "indec")
## # A tibble: 17 x 4
##    name            code    row   col
##    <chr>           <chr> <dbl> <dbl>
##  1 BURRUYACU       007       1     4
##  2 CAPITAL         084       2     4
##  3 CHICLIGASTA     021       4     2
##  4 CRUZ ALTA       014       2     5
##  5 FAMAILLA        028       3     3
##  6 GRANEROS        035       5     4
##  7 JUAN B. ALBERDI 042       5     3
##  8 LA COCHA        049       6     3
##  9 LEALES          056       3     5
## 10 LULES           063       3     4
## 11 MONTEROS        070       3     2
## 12 RIO CHICO       077       4     3
## 13 SIMOCA          091       4     4
## 14 TAFI DEL VALLE  098       2     1
## 15 TAFI VIEJO      105       2     2
## 16 TRANCAS         112       1     3
## 17 YERBA BUENA     119       2     3

Hasta acá llegamos con la primera entrada respecto de {polAr} ya formalmente en CRAN. Espero en una próxima entrada contar un poco más del repositorio de datos y la incorporación de nuevas funciones en la versión de desarrollo.


  1. Inspirados en ggplotme de Juan Cruz Rodrígurez con Camila Higa - mentaComunicación- trabajamos en un bot de Twitter que permite consultar resultados de elecciones. La idea es que un usuario le pregunta a @pol_ar_bot sobre una elección, cumpliendo con los parámetros necesarios (distrito + turno + año + categoria) y el bot responde graficando el resultado. bot: https://twitter.com/pol_Ar_bot