Parlamentarytics

Explorando las métricas de la votaciones de la Ley Bases en el Congreso

tutorial
codigo
apuntes
visualizaciones
machine learning
Author

Pedro Damian Orden

Published

March 4, 2024

Presentación

El viernes 1 de marzo por la noche, el Presidente Javier Milei pronunció el discurso de apertura de sesiones ordinarias del Congreso, donde repasó los primeros meses de su mandato y dio cuenta de su desacuerdo con algunas representaciones políticas dentro de la institución legislativa.

La confrontación de Milei con distintos bloques del Congreso se enmarca en un contexto de tensiones evidentes en relación con las decisiones y acciones tomadas por los diputados. Uno de los antecedentes recientes, que posiblemente haya contribuido a la molestia del presidente, es el proceso de votación de una ley en particular.

Habida cuenta del final del discurso, donde el Presidente convoca a los gobernadores y sus representantes legislativos a un pacto político, este documento técnico procura adentrarse en la compleja dinámica parlamentaria del Congreso Argentino, enfocándose en el proceso de votación de la Leybases y puntos de partida para la libertad” durante enero y febrero de 2024, última referencia manifiesta del alineamiento o no de los legisladores nacionales con el Gobierno.

Nuestro propósito aquí, será llevar adelante una exploración tan innovadora como preliminar, basada en el procesamiento y sistematización de datos para conocer el funcionamiento de la Cámara de Diputados. La perspectiva tácita, girará en torno a lo que denominaremos como “parlamentaritics”, un conjunto de técnicas y variables que fusionan el análisis de los comportamientos parlamentarios (políticos y estratégicos) con técnicas de programación y analítica avanzada basada en evidencia.

La elección de la denominada Ley Ómnibus como caso de aplicación, está dada por la disponibilidad y volumen de datos abiertos detallados, compuestos de varios procesos de votación en un único proyecto legislativo. Aunque fue aprobada en la votación general, su avance se vio obstaculizado por desavenencias políticas en aspectos específicos durante la votación particular.

Este escenario singular, datificado, nos brinda una oportunidad privilegiada para explorar las fases de acuerdo y desacuerdo parlamentario. Vamos por eso.

La Data

Para dar con nuestro cometido, descargaremos de Github y alojaremos en este proyecto1 la carpeta comprimida "csv.zip". La misma contiene 14 archivos csv que recuperan las votaciones de los diputados en general y en particular en el marco de la Ley Bases.

Los mismos fueron obtenidos del muy buen portal que tiene a la fecha la Cámara de Diputados, el cual nos permite consultar los resultados de votaciones de distintas leyes, y cuenta además con un apartado especial dedicado a estadísticas de dichos procesos.

Localicemos y descomprimamos la carpeta vía código:

Code
# 1. descargamos la carpeta comprimida
url <- "https://github.com/pedroorden/parlamentarytics/raw/main/csv.zip"
archivo_zip <- "csv.zip"
download.file(url, archivo_zip)

# 2. Descomprimimos el archivo zip
unzip(archivo_zip)

Exploremos los datos de una de las bases, lb_general.csv , que contiene los resultados de la votación en general de la Ley Ómnibus.

Code
library(tidyverse)

lb_gral <- read_csv("csv/lb_gral.csv")

glimpse(lb_gral)
Rows: 257
Columns: 4
$ DIPUTADO      <chr> "ACEVEDO, SERGIO EDGARDO", "AGOST CARREÑO, OSCAR", "AGUI…
$ BLOQUE        <chr> "Por Santa Cruz", "Hacemos Coalicion Federal", "Union Po…
$ PROVINCIA     <chr> "Santa Cruz", "Córdoba", "La Rioja", "Corrientes", "C.A.…
$ `¿CÓMO VOTÓ?` <chr> "NEGATIVO", "AFIRMATIVO", "NEGATIVO", "AFIRMATIVO", "AFI…

El dataframe, como ya fue mencionado, contiene información sobre la votación de la Ley Ómnibus, con un total de 257 filas (cada una refiere a un diputado) y 4 columnas. Las columnas incluyen el nombre del representante, su bloque político, la provincia a la que pertenece y cómo ha votado en la sesión.

Veamos gráficamente cómo esta compuesta la cámara en términos de bloques.

Code
library(highcharter) #utilizamos hc para visualizar la data

# Obtenemos los datos de bloque y su frecuencia
bloques <- lb_gral %>% 
  group_by(BLOQUE) %>% 
  count() %>% 
  arrange(n)  

# Definimos colores para las barras
colores <- c("#80bbd3", "#9DC5BD", "#d6f2eb", "orange", "#4682B4" , "#f4b8f4", "#ffe272",  "#f45b5b","#2b908f", "#B3C8E0", "#b15662", "gold", "#8085e9")

# Creamos el gráfico 
hchart(
  bloques,
  "item", 
  hcaes(name = BLOQUE, y = n),
  name = "bloque",
  showInLegend = FALSE,
  size = "100%",
  center = list("50%", "75%"),
  startAngle = -100,
  endAngle  = 100) %>% 
  hc_colors(colores) %>%  
  hc_title(
text = "Distribución de los Diputados Nacionales por bloque político en el Congreso") %>%
  hc_subtitle(
text = "Congreso de la Nación. Año 2024") %>%
  hc_legend(labelFormat = '{name} <span style="opacity: 0.4">{y}</span>')%>%
  hc_tooltip(
    useHTML = TRUE,  
    headerFormat = '',  
    crosshairs = TRUE,  
    pointFormat = '<span style="color:{point.color}">Nombre de bloque: <b>{point.BLOQUE}</b></span><br>Cantidad de diputados: <b>{point.n}</b>') %>% 
    hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    )

Los datos indican que Unión Por La Patria es el bloque que más diputados tiene (99), seguido por La Libertad Avanza (38) , el Pro (37), la Ucr - Unión Cívica Radical (34) y Hacemos Coalición Federal (23).

Otra referencia relevante será conocer cómo se distribuyen en la Cámara, por provincia, los 257 Diputados Nacionales, independientemente de los bloques de los que participan.

Code
library(highcharter)

provincias <- lb_gral %>% 
  group_by(PROVINCIA) %>% 
  count() %>% 
  arrange(desc(n))

hc <- hctreemap2(
  data = provincias,
  group_vars = "PROVINCIA", 
  size_var = "n",
  color_var = "n",
  layoutAlgorithm = "squarified",
  levelIsConstant = FALSE,
  levels = list(
    list(level = 1, dataLabels = list(enabled = TRUE)),
    list(level = 2, dataLabels = list(enabled = FALSE))
  )
)

hc <- hc %>%
  hc_colorAxis(
    minColor = "#b7ded2" ,
    maxColor = "#529873")

hc <- hc %>%
  hc_title(text = "Cantidad de Diputados Nacionales por Provincia") %>% 
  hc_subtitle(text="Año 2024") %>% 
  hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    )

hc

Cabrá resaltar que la cantidad de diputados nacionales en Argentina se determina en función de la población de cada territorio.

Según la ley 22.847, se establece que cada Provincia y la Ciudad de Buenos Aires deben tener un mínimo de cinco diputados, independientemente de su población. Además, se asigna un diputado por cada ciento sesenta y un mil habitantes. Sin embargo, si la cantidad resultante es inferior a cinco diputados, se eleva automáticamente a cinco.

Creemos finalmente una representación gráfica de la votación en general de la ley:

Code
vot <- lb_gral %>% 
  group_by(`¿CÓMO VOTÓ?`) %>% 
  count() %>% 
  arrange(n) 

colores <- c("gold", "grey", "#f45b5b","#56B93C")

hchart(
  vot,
  "item", 
  hcaes(name = `¿CÓMO VOTÓ?`, y = n),
  name = "Voto",
  showInLegend = FALSE,
  size = "100%",
  center = list("50%", "75%"),
  startAngle = -100,
  endAngle  = 100) %>% 
  hc_colors(colores) %>%  
  hc_title(
  text = "Distribución de los resultados de la votación de la Ley Bases en la Cámara de Diputados de la Nación") %>%
  hc_subtitle(text = "Febrero 2024. Congreso de la Nación.") %>%
  hc_legend(labelFormat = '{name} <span style="opacity: 0.4">{y}</span>') %>%
  hc_tooltip(
    useHTML = TRUE,  
    headerFormat = '',  
    crosshairs = TRUE,  
    pointFormat = '<span style="color:{point.color}">Votaron: <b>{point.name}</b></span><br>Diputados: <b>{point.n}</b>') %>% 
  hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    )

Con la información disponible, y una técnica de visualización simple pero atractiva, desarrollamos una primera aproximación a nuestros datos, conocimos el esquema de representación en la Honorable Cámara y verificamos el resultado de la votación en general, momento inicial en el cual el oficialismo pudo lograr los acuerdos para construir una mayoría simple que le permitió aprobar su proyecto de forma preliminar. Pero la historia fue distinta…

Transformación de los datos

En este análisis parlamentario, nos enfocaremos en las dinámicas dentro del Congreso, investigando cómo los bloques colaboran y compiten entre sí. Analizaremos la creación de métricas basadas en la frecuencia del voto de los diputados para comprender mejor estas interacciones. Esto nos permitirá profundizar en las estrategias políticas y la toma de decisiones en el contexto legislativo.

En el contexto de nuestros datos, sabemos que para el oficialismo de LLA, la capacidad de generar consensos fue, es y será un activo crucial para cumplir con sus expectativas y estrategias políticas, por tanto cuanto mayor y amplios sean los acuerdos alcanzados, mayores serán las posibilidades para avanzar en una agenda y proyecto de gestión.

Desde la técnica, lo que buscaremos es integrar en una misma base consolidada múltiples conjuntos de datos de votaciones. Esta estrategia nos permitirá construir una matriz de votos por diputado y bloque, que facilitará la generación de inferencias. Esta aproximación integral aportará una visión más clara y detallada de las relaciones de fuerza en el ámbito legislativo.

Creación de una base única de votaciones

Dado que todos los csv de la carpeta descargada tienen la misma estructura, vamos a recuperarlos y unirlos con unas pocas funciones:

Code
# 1. Establecemos el directorio donde se encuentran los archivos CSV
directorio <- "csv"

# 2. Obtenemos la lista de archivos CSV en el directorio
archivos_csv <- list.files(path = directorio, pattern = "\\.csv$", full.names = TRUE)

# 3. Creamos una función para cargar los CSV y agregar la columna "id"
cargar_csv_con_id <- function(archivo) {
  # Cargar el CSV
  datos <- read.csv(archivo)
  # Obtener el nombre del archivo sin extensión
  nombre_archivo <- tools::file_path_sans_ext(basename(archivo))
  # Agregar la columna "id" con el nombre del archivo
  datos$id <- nombre_archivo
  return(datos)
}

# 4. Aplicamos la función a cada archivo CSV y combinar los resultados en un solo dataframe
debate_df <- do.call(rbind, lapply(archivos_csv, cargar_csv_con_id))

# 5. Verificamos el resultado
glimpse(debate_df)
Rows: 3,598
Columns: 5
$ DIPUTADO     <chr> "ACEVEDO, SERGIO EDGARDO", "AGOST CARREÑO, OSCAR", "AGUIR…
$ BLOQUE       <chr> "Por Santa Cruz", "Hacemos Coalicion Federal", "Union Por…
$ PROVINCIA    <chr> "Santa Cruz", "Córdoba", "La Rioja", "Corrientes", "C.A.B…
$ X.CÓMO.VOTÓ. <chr> "NEGATIVO", "AFIRMATIVO", "NEGATIVO", "AFIRMATIVO", "AFIR…
$ id           <chr> "lb_gral", "lb_gral", "lb_gral", "lb_gral", "lb_gral", "l…

Como lo podemos notar, se trata de una estructura de datos que ya abordamos más arriba. Los ids creados se corresponden con las siglas de cada artículo/capítulo votado y machean con index, un diccionario que también tenemos en Github, el cual nos va a permitir obtener una referencia ampliada de la ley y sus componentes.

Procedamos a obtener el diccionario y joinearlo a nuestros datos.

Code
index <- read_csv("https://raw.githubusercontent.com/pedroorden/parlamentarytics/main/index.csv")

debate_full <- debate_df %>% 
  left_join(index, by="id") %>% 
  select(!c(subtema, ...6))

debate_full %>% 
  select(DIPUTADO,BLOQUE, nombre, X.CÓMO.VOTÓ.) %>% 
  head(5) %>% 
  kableExtra::kable()
DIPUTADO BLOQUE nombre X.CÓMO.VOTÓ.
ACEVEDO, SERGIO EDGARDO Por Santa Cruz O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. VOT. EN GRAL. NEGATIVO
AGOST CARREÑO, OSCAR Hacemos Coalicion Federal O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. VOT. EN GRAL. AFIRMATIVO
AGUIRRE, HILDA Union Por La Patria O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. VOT. EN GRAL. NEGATIVO
AGUIRRE, MANUEL IGNACIO Ucr - Union Civica Radical O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. VOT. EN GRAL. AFIRMATIVO
AJMECHET, SABRINA Pro O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. VOT. EN GRAL. AFIRMATIVO

Como bien podemos ver, ya contamos con tenemos la base, pero aún falta una última transformación.

The Matrix

En nuestro análisis, transformaremos el esquema lógico de nuestros datos, originalmente en formato tidy, a una matriz. Este cambio nos permitirá abordar de manera sistemática el comportamiento de los legisladores y sus bloques durante el proceso de votación de la ley.

Al organizar los datos de la votación de ley-artículos, diputados y bloques en una estructura coherente lo que obtenemos una visión holística que puede contribuir a revelar patrones y relaciones complejas entre los actores políticos. Cada voto aquí se convierte en un punto de datos valioso que ayudará a desandar las interacciones intra y extra bloques junto con las estrategias detrás de la toma de posiciones políticas.

En un contexto donde la adhesión u oposición son los pares opuestos fundamentales para diagramar acuerdos parlamentarios, la elaboración de una matriz de votos se convierte en una estrategia viable para identificar, por medio de la evidencia, márgenes de alianzas, los grados de cohesión dentro de los bloques y dimensionar cómo se forjan las mayorías y se alcanzan los consensos en un momento determinado.

Reacomodemos los datos en la mencionada matriz de votos para terminar de concretar el planteo.

Code
# Creamos una nueva columna llamada 'voto_individual' en el dataframe 'debate_full'

# Esta columna asigna el valor 1 si el valor de la columna 'X.CÓMO.VOTÓ.' es "AFIRMATIVO",
# y 0 en cualquier otro caso.
debate_full1 <- debate_full %>%
  filter(!X.CÓMO.VOTÓ.=="PRESIDENTE") %>% 
  mutate(voto_individual = case_when(
    X.CÓMO.VOTÓ. == "AFIRMATIVO" ~ 1, 
    X.CÓMO.VOTÓ. == "AUSENTE" ~ NA_real_,  # Establecer NA cuando es "AUSENTE"
    TRUE ~ 0))

# Creamos un nuevo dataframe llamado 'referencia' que contiene información sobre 
# el voto más común ('voto_bloque_gral') de cada bloque ('BLOQUE') en la votación general ('lb_gral').
# Primero, filtramos los datos para quedarnos solo con la votación general ('lb_gral').
# Luego, agrupamos por 'BLOQUE' y 'voto_individual' (que representa el voto individual de cada diputado).
# Calculamos la cantidad de votos ('n') para cada combinación de 'BLOQUE' y 'voto_individual'.
# Luego, nuevamente agrupamos por 'BLOQUE' y seleccionamos el voto más común para cada bloque
# utilizando la función 'slice_max'.
# Renombramos la columna resultante a 'voto_bloque_gral' y eliminamos la columna 'n'.
# Finalmente, filtramos aquellos bloques que no sean "Por Santa Cruz".

referencia <- debate_full1 %>%
  filter(id == "lb_gral") %>%
  group_by(BLOQUE, voto_individual) %>%
  summarize(n = n()) %>%
  group_by(BLOQUE) %>%
  slice_max(n, n = 1) %>% 
  rename(voto_bloque_gral = voto_individual) %>%
  select(-n) %>% 
  filter(!BLOQUE == "Por Santa Cruz")

# Convertimos el dataframe 'debate_full1' a un formato más ancho ('matriz_votos'),
# donde cada fila representa un diputado y cada columna representa un artículo o 
# sección de la ley ('id') con su respectivo voto.
matriz_votos <- pivot_wider(debate_full1, 
                            id_cols = c("DIPUTADO", "BLOQUE", "PROVINCIA"),
                            names_from = "id",
                            values_from = "voto_individual")

# Luego, creamos un nuevo dataframe ('matriz_votos2') uniendo 'matriz_votos' con 
# la información de votación general ('voto_bloque_gral') de cada bloque desde 'referencia'.
# Además, realizamos algunas modificaciones adicionales en los datos, como 
# asignar un voto predeterminado para ciertos diputados ('ACEVEDO, SERGIO EDGARDO' y 'GARRIDO, JOSE LUIS').

matriz_votos2 <- matriz_votos %>% 
    filter(!DIPUTADO=="MENEM, MARTÍN") %>% 
  left_join(referencia, by = "BLOQUE") %>% #OJOOOOOOOOO
  mutate(voto_bloque_gral = ifelse(DIPUTADO == "ACEVEDO, SERGIO EDGARDO" & is.na(voto_bloque_gral), 0, voto_bloque_gral)) %>% 
  mutate(voto_bloque_gral = ifelse(DIPUTADO == "GARRIDO, JOSE LUIS" & is.na(voto_bloque_gral), 1, voto_bloque_gral))

matriz_votos2 %>% 
  head(5) %>% 
  kableExtra::kable()
DIPUTADO BLOQUE PROVINCIA lb_gral t1_c1_a1 t1_c1_a2 t1_c2_a3 t1_c2_a4_iag t1_c2_a4_ih t1_c2_a4_iij t2_c1_a5_ia t2_c1_a5_ib t2_c1_a5_ic t2_c1_a5_id t2_c1_a5_ie t2_c1_a5_if t2_c1_a6 voto_bloque_gral
ACEVEDO, SERGIO EDGARDO Por Santa Cruz Santa Cruz 0 0 0 0 0 0 0 NA NA NA NA NA NA NA 0
AGOST CARREÑO, OSCAR Hacemos Coalicion Federal Córdoba 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1
AGUIRRE, HILDA Union Por La Patria La Rioja 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AGUIRRE, MANUEL IGNACIO Ucr - Union Civica Radical Corrientes 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
AJMECHET, SABRINA Pro C.A.B.A. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Obtenemos aquí un conjunto de datos que representan la votación de diferentes Diputados Nacionales durante las sesiones extraordinarias. Cada fila corresponde a un diputado y contiene información sobre su nombre, el bloque al que pertenece y la provincia que representa. Además, hay múltiples columnas que indican el voto de cada diputado en distintos momentos de la votación en particular de la ley, identificados por códigos como “t1_c1_a1”, “t1_c2_a4_iag”, etc.

Finalmente, hay una columna llamada “voto_bloque_gral” que indica el voto más común del bloque al que pertenece el diputado durante la votación general de la ley. Es decir, representa la posición predominante del bloque en esa votación específica. La tendremos sólo como referencia.

Será importante mencionar que el objeto resultante no es un objeto matrix de R, sino que se trata de un dataframe con el ordenamiento lógico de una matriz.

Parlamentarytics

En esta sección, nos adentramos de lleno en el núcleo de nuestro análisis con la construcción de las “parlamentarytics”, un conjunto de métricas clave que nos permitirán sumergirnos en los datos de votaciones en el Congreso Nacional.

Comencemos con la votación de Ley Ómnibus en general, sabemos que fue aprobada una mayoría, pero habida cuenta de su fracaso posterior, cabe preguntarse si los bloques oficialistas, aliados y opositores votaron monolíticamente a favor y en contra, o más bien hubo matices.

Adhesión por bloque a la Ley Ómnibus en general

Para responder esta pregunta examinaremos el Porcentaje de Adhesión al Proyecto de Ley por Bloque. Conceptualmente, esta métrica representa el nivel de respaldo que un bloque político brinda al proyecto de ley presentado por el oficialismo o gobierno. La calcularemos como la proporción de diputados dentro de un bloque que votaron a favor del proyecto de ley en relación con el total de diputados que componen ese bloque.

Code
adhesion_gral <- matriz_votos2 %>% 
  group_by(BLOQUE) %>%
  summarise(n_bloque=n(),
            votos_tot=sum(lb_gral, na.rm = TRUE),
            adhesion_bloque=round(votos_tot*100/n_bloque, 1)) %>% 
  select(BLOQUE, adhesion_bloque, n_bloque) %>% 
  arrange(desc(adhesion_bloque)) 

reactable::reactable(adhesion_gral)

Mejoremos la visualización de nuestros datos con reactablefmtr para entender mejor los resultados

Code
library(reactablefmtr)

adhesion_gral_renamed <- adhesion_gral %>%
  rename(
    Bloque = BLOQUE,
    `Adhesión del bloque %` = adhesion_bloque,
    `Cantidad de diputados` = n_bloque
  )

adhesion_gral_renamed %>% 
  reactable(
    pagination = FALSE,
    defaultSorted = 'Cantidad de diputados',
    defaultSortOrder = "desc",
    columns = list(
      `Adhesión del bloque %` = colDef(
        align = "left",
        cell = data_bars(adhesion_gral_renamed,
                         fill_color = c("gold", "#741b47"),
                         fill_gradient = TRUE,
                         box_shadow = TRUE)
      ),
      `Cantidad de diputados` = colDef(
        cell = color_tiles(., 
                           number_fmt = scales::comma, 
                           colors = RColorBrewer::brewer.pal(7, 'YlOrRd'))
      )
    )
  ) %>% 
  add_title("Adhesión por Bloque a la Ley Ómnibus en general") %>% 
  add_subtitle("Análisis del respaldo de los bloques políticos al proyecto de ley y distribución en la Cámara de  diputados") 

Adhesión por Bloque a la Ley Ómnibus en general

Análisis del respaldo de los bloques políticos al proyecto de ley y distribución en la Cámara de diputados

Una interpretación posible sobre el gráfico que creamos, es que aún en la votación en general no hubo consensos cerrados con respecto a la ley, con excepción del PRO y los denominados bloques “chicos” aliados al oficialismo, el resto de las fuerzas presentaron internamente algún tipo de disenso. Independientemente de ello, como vimos mas arriba, la mayoría de los diputados votó a favor de la ley.

Veamos que pasó luego.

Votaciones en particular

Como es bien sabido, la Ley Ómnibus no avanzó en el Congreso debido a las dificultades que enfrentó el Gobierno para lograr los consensos necesarios con los demás bloques parlamentarios en la votación particular.

Conozcamos cuales fueron los 3 artículos-capítulos de la ley que contó la menor cantidad de votos a favor.

Code
# Filtramos columnas que empiezan con "t" y sumar por columna
top_3_menos_votos <- matriz_votos2 %>%
  select(starts_with("t")) %>%
  summarise(across(everything(), sum, na.rm = TRUE)) %>%
  pivot_longer(cols = everything(), names_to = "id", values_to = "votos_positivos") %>%
  arrange(votos_positivos) %>%
  slice_head(n = 3)

# Mostramos el resultado
top_3_menos_votos %>% 
  left_join(index) %>%
  select(id, nombre, votos_positivos, resultado_final) %>% 
  kableExtra::kable()
id nombre votos_positivos resultado_final
t2_c1_a5_ic O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. TÍTULO II, CAP. I ART. 5 INCISO C. 98 NEGATIVO
t2_c1_a5_ie O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. TÍTULO II, CAP. I ART. 5 INCISO E. 101 NEGATIVO
t2_c1_a5_if O.D. 1 - BASES Y PUNTOS DE PARTIDA PARA LA LIBERTAD DE LOS ARGENTINOS. TÍTULO II, CAP. I ART. 5 INCISO F. 103 NEGATIVO

Los tres puntos que mas resistencia generaron fueron fueron los incisos c (Reorganización o disolución de entidades del sector público), e (Transformar o eliminar fideicomisos y/o revertir sus recursos a rentas generales) y f (Intervención de sociedades del sector público) del Título 2, Capítulo 1, Artículo 5 de la Ley Ómnnibus.

Creamos una tabla para profundizar en las adhesiones de los distintos bloques a la ley por artículo.

Code
voto_bloques <- matriz_votos2 %>%
  group_by(BLOQUE) %>%
  summarise(across(starts_with("t"), sum, na.rm = TRUE)) %>%
  pivot_longer(cols = starts_with("t"), names_to = "id", values_to = "votos_positivos") %>%
  arrange(votos_positivos) %>% 
  left_join(bloques) %>% 
  mutate(adhesion_bloque=round(votos_positivos*100/n)) %>% 
  select(BLOQUE, id, adhesion_bloque)

data <- voto_bloques %>%
  mutate(adhesion_bloque = as.numeric(adhesion_bloque)) %>%
  spread(id, adhesion_bloque)


reactable(
  data,
       defaultColDef = colDef(
      cell = color_tiles(data,
                         colors = RColorBrewer::brewer.pal(7, 'YlOrRd')),
    )) %>% 
  add_title("Adhesión por Bloque a la Ley Ómnibus en las votaciones particulares") %>% 
  add_subtitle("Análisis del respaldo de los bloques políticos al proyecto de ley y distribución en la Cámara de  diputados") 

Adhesión por Bloque a la Ley Ómnibus en las votaciones particulares

Análisis del respaldo de los bloques políticos al proyecto de ley y distribución en la Cámara de diputados

La tabla indica los distintos niveles de acuerdo con el oficialismo por bloque, destacándose de manera manifiesta que la UCR y Hacemos Coalición como dos actores que inicialmente fueron aliados pero en las votaciones particulares plantearon desacuerdos significativos que supusieron la caída formal de la Ley Ómnibus.

Los que nos ha permitido ese ejercicio es identificar con destreza gráfica en qué bloque y artículos estuvieron los mayores niveles de fricción. Aún así, deberá destacarse que el método no es perfecto y las ausencias de algunos diputados fueron computadas como disensos, lo cual deja margen para la interpretación: un diputado que no vota o no acude a una sesión tan relevante teniendo al responsabilidad de hacerlo, está yendo en contra de su bloque?

Acuerdos

Dada la centralidad de los acuerdos en este proceso de debate, pongamos nuestra atención ahora en la dinámica los acuerdos generales, queremos conocer cuántos diputados votaron afirmativamente los 13 artículos/capítulos en particular.

Code
acuerdan <- matriz_votos2 %>% 
  mutate(votos_afirmativos = rowSums(select(., starts_with("t")), na.rm = TRUE))%>%
  filter(votos_afirmativos==13)

nrow(acuerdan)
[1] 90

La tendencia de nuestros datos indica que existen 90 diputados nacionales que hasta el momento votarán en todas las circunstancias a favor del oficialismo.

En términos relativos:

Code
numero <- 90
total <- 257
porcentaje <- (numero / total) * 100
print(porcentaje)
[1] 35.01946

Se trata de un 35%, poco más de un tercio de la mayoría.

y a qué bloques de la cámara representan?

Code
bloques<-acuerdan %>%
  group_by(BLOQUE) %>% 
  count() %>% 
  arrange(desc(n))

hc <- hctreemap2(
  data = bloques,
  group_vars = "BLOQUE", 
  size_var = "n",
  color_var = "n",
  layoutAlgorithm = "squarified",
  levelIsConstant = FALSE,
  levels = list(
    list(level = 1, dataLabels = list(enabled = TRUE)),
    list(level = 2, dataLabels = list(enabled = FALSE))
  )
)

hc <- hc %>%
  hc_colorAxis(
    minColor = "#a8b1db" ,
    maxColor = "#8e4585")

hc <- hc %>%
  hc_title(text = "Cantidad de Diputados Nacionales por Bloque que apoyan activamente al oficialismo") %>% 
  hc_subtitle(text="Año 2024")%>% 
  hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    )

hc

De la gráfica notamos que los dos bloques plenamente alineados con el proyecto del Gobierno es el oficialista de La Libertad Avanza, con sólo un aliado incondicional, el PRO. Los consensos creados con los otros dos bloques que a priori habían acompañado en general la ley, Hacemos Coalición y la UCR, parece haberse quebrado, al menos hasta el próximo round parlamentario.

Relaciones de fuerza

Las relaciones de fuerza en el Congreso son clave para comprender cómo se perfilan los acuerdos y desacuerdos en torno a proyectos de ley. Estas relaciones reflejan las posturas y alianzas entre los diferentes sectores políticos, y son fundamentales para proyectar las posibilidades de aprobar los proyectos de ley del Gobierno en el Congreso Nacional.

Para profundizar en este análisis, vamos a emplear una clasificación para nuestros datos que nos permitirá examinar y medir estas relaciones. Conformaremos para ello un sistema que comprenderá dos categorías excluyentes: “Expectativa de acuerdo” y “Dificultad para el acuerdo”.

En la categoría de “Dificultad para el acuerdo”, hemos establecido un criterio de corte que incluye a aquellos diputados que han respaldado seis artículos o menos. Esta decisión se fundamenta en la premisa de que, considerando un total de 13 artículos en juego, votar en contra de más de siete de ellos constituye una oposición sustancial al acuerdo, lo que revela tensiones significativas en las relaciones de fuerza.

Por otro lado, la categoría de “Expectativa de acuerdo” contempla aquellos diputados que han respaldado siete artículos o más. Este grupo se percibe como más proclive a apoyar el acuerdo en su totalidad, lo que sugiere una mayor cohesión y alineación con las propuestas gubernamentales.

Code
acuerdos <- matriz_votos2 %>% 
  mutate(votos_afirmativos = rowSums(select(., starts_with("t")), na.rm = TRUE),
         grupo = ifelse(votos_afirmativos > 6, 
                        "Expectativa de acuerdo",
                        "Dificultad para el acuerdo"))

#MOSTRAMOS 10 CASOS

acuerdos %>% 
  select(DIPUTADO, BLOQUE, PROVINCIA, grupo) %>% 
  head(10) %>% 
  reactable()

Grafiquemos los resultados:

Code
acuerdo_plot <- acuerdos %>% 
  group_by(grupo) %>% 
  summarize(n = n(),
            pct= round(n*100/256, 1)) %>% 
  arrange(n)  # Ordenamos los datos de menor a mayor frecuencia

colores <- c("#56B93C", "#f45b5b")

hchart(
  acuerdo_plot,
  "item", 
  hcaes(name = grupo, y = n),
  name = "Voto",
  showInLegend = FALSE,
  size = "100%",
  center = list("50%", "75%"),
  startAngle = -100,
  endAngle  = 100) %>% 
  hc_colors(colores) %>%  # Asignamos la paleta de colores personalizada
  hc_title(text = "Distribucion de grupos según posibilidades de acuerdo con el oficialismo",
           align = "center",
           margin = 20) %>%
  hc_subtitle(text = "Febrero 2024. Congreso de la Nación.",
              align = "center",
              margin = 10) %>%
  hc_legend(labelFormat = '<span style="opacity: 0.4">{y}</span>') %>%
    # hc_caption(
    # text = "Cálculo elaborado en base a las votaciones particulares de la ley.", 
    # useHTML = TRUE
    # ) |> 
  hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    ) %>% 
  hc_tooltip(
    useHTML = TRUE,  # Activa HTML para el tooltip
    headerFormat = '',  # Elimina el encabezado del tooltip
    crosshairs = TRUE,  # Muestra líneas de referencia cruzadas
    pointFormat = '<span style="color:{point.color}">Condición: <b>{point.name}</b></span><br>Diputados: <b>{point.n}</b><br> Porcentual: <b>{point.pct} %</b>') 

En función de la evidencia y la clasificación planteada, el 52% de los Diputados, más de la mitad de la Cámara, tendría dificultades para acordar con el oficialismo.

Aunque el disenso es un componente esencial de la democracia, la dinámica del poder en el Congreso requiere contar con diputados que estén dispuestos a respaldar las estrategias políticas del gobierno. La capacidad de generar acuerdos y llevar adelante proyectos legislativos efectivos depende en gran medida de la cohesión y la disciplina dentro de las filas parlamentarias, lo que resalta la importancia de contar con legisladores que sean leales y de manifiesta obediencia a las líneas de acción delineadas por sus respectivos partidos o coaliciones.

Según nuestros datos, el Gobierno tendrá una ardua tarea al momento de generar los consensos en Diputados.

Antes de finalizar, generemos un último gráfico que muestre cómo se distribuyen los bloques en función de su predispoción al acuerdo.

Code
acuerdo_bloque <- acuerdos %>% 
  mutate(grupo=case_when(DIPUTADO=="CHUMPITAZ, GABRIEL FELIPE"~"Expectativa de acuerdo",
                         TRUE ~ grupo 
                         )) %>% #harcodeamos un adiputado que se ausentó en algunas votaciones en particular :)
  group_by(grupo, BLOQUE) %>% 
  count()

# Crear el gráfico con las modificaciones
hchart(acuerdo_bloque, type = "packedbubble", hcaes(name = BLOQUE, value = n, group = grupo)) %>%
  hc_chart(width = 800, height = 600, marginTop = 1) %>%
  hc_plotOptions(packedbubble = list(
    layoutAlgorithm = list(splitSeries = TRUE),
    dataLabels = list(enabled = TRUE, 
                      format = "{point.name}", 
                      style = list(fontSize = "10px")),
    tooltip = list(pointFormat = "<b>Bloque:</b> {point.name}<br><b>N:</b> {point.value}")
  )) %>%
  hc_title(text = "Distribución de Bloques según posibilidades de acuerdo") %>%
  hc_colors(c("#93C6D3", "#b888dc")) %>%
  hc_legend(enabled = TRUE)  %>% 
  hc_credits(
    text = "Elaboración propia, en base a datos abiertos de la Honorable Cámara de Diputados de la Nación.",
    href = "",
    enabled = TRUE
    )

Tal como están conformados hoy los grupos, da la impresión de que la falta de acuerdos del oficialismo con los bloques es capitalizado por la primera minoría, la opositora Unión por la Patria.

Bonus

En este apartado adicional, exploraremos el proceso de clustering aplicado a los datos de votaciones particulares de la ley, buscando una tercera posición al modelo que diagramamos para agrupar los bloques en función de su frecuencia de voto positivo a las propuestas oficialistas, basado en las categorías dicotómicas de “expectativa de acuerdo”/“dificultad para el acuerdo”.

Para ello utilizaremos el algoritmo K-means, una técnica popular de aprendizaje no supervisado, propia de la ciencia de datos, que se acopla naturalmente al paradigma de las parlamentarytics.

  • El clustering es un método de análisis exploratorio de datos que agrupa un conjunto de objetos en subconjuntos homogéneos o “clusters” basados en características similares.

  • K-means es uno de los algoritmos de clustering más comunes y simples. Funciona dividiendo un conjunto de datos en k grupos, donde k es un valor predefinido. El algoritmo asigna cada observación al cluster más cercano, minimizando la distancia euclidiana entre los puntos y los centroides de los clusters.

En el contexto de nuestro contexto, los diputados serán agrupados en clusters en función de la similitud de sus votos respecto a la Ley Ómnibus, con qué nos encontraremos?

Definamos los datos y el modelo, para nuestro planteo vamos a utilizar sólo las variables numericas de las votaciones en particular.

Code
library(caret)  # Para codificación de variables categóricas
library(stats)  # Para kmeans

# 1. Cargamos los datos

datos <- matriz_votos2 %>%
  select(t1_c1_a1:t2_c1_a6, BLOQUE, DIPUTADO) %>% 
  drop_na()

# 2. Preprocesamos los datos
datos_numericos <- datos %>% 
  select(-BLOQUE, -DIPUTADO)  # Eliminar variables categóricas

# dejamos atras valores faltantes, si los hay
datos_numericos <- na.omit(datos_numericos) #vamos a perder 10 diputados ojo!

# 3. Aplicamos el algoritmo de clustering K-means solo a variables numéricas
clusters <- kmeans(datos_numericos, centers = 3)  # Especificamos el número de clusters deseado

# 4. presentamos y visualizamos los resultados
table(clusters$cluster)

  1   2   3 
100  31 115 

Después de ejecutar el algoritmo de clustering, hemos identificado tres grupos distintos de diputados. El primer grupo consta de 31 diputados, el segundo grupo, siendo el más numeroso, incluye a 115 diputados, y el tercero contiene 100 diputados. Si bien este proceso nos brinda información sobre cómo se agrupan los diputados según su predisposición al voto de la ley, aún no conocemos la composición específica de cada grupo.

Para enriquecer nuestros hallazgos, vamos combinar los resultados del clustering con variables categóricas, como el bloque al que pertenecen los diputados. Esto nos permitirá obtener una comprensión más completa de los patrones de agrupamiento y las posibles influencias que puedan estar presentes dentro de cada grupo.

Code
# 5. Unir los resultados de clustering con las variables categóricas
resultados <- data.frame(DIPUTADO = datos$DIPUTADO, BLOQUE = datos$BLOQUE, Cluster = clusters$cluster)

Finalmente, visualizaremos los resultados para comprender mejor la distribución de los bloques y grupo de acuerdo por cluster:

A la luz de los resultados generados, cabe hacer algunas observaciones.

El algoritmo pudo captar los diputados que se encuentran en los polos de la tendencia al acuerdo/desacuerdo, con mayor claridad en las voluntades firmes de acompañar o no acompañar. Por eso, vemos que el grupo 1 está compuesto principalmente por diputados dispuestos a acordar, los leales, mientras que el grupo 3 está conformado por diputados refractarios a cualquier acuerdo con el oficialismo. Por otro lado, el grupo 2 está compuesto por un mix de parlamentarios cuyo alineamiento no es automático, alojando una mayoría que podría negociar, pero también incluye a un grupo de opositores.

Al analizar por bloque político, dentro del grupo 3 que muestra predisposición al acuerdo, se encuentran los partidos aliados al oficialismo, como el PRO y La Libertad Avanza (LLA), entre otros. En cambio, en el grupo 1 se posicionan los bloques abiertamente opositores, en particular Unión por la Patria y FIT.

Por su parte, el grupo 2 captura esa tercera posición de partidos que pueden o no apoyar, y que probablemente jugarán un papel clave en la búsqueda de consensos a partir del 1 de marzo en el congreso.

Importante: los resultados no son perfectos, cabrá destacar que no trabajamos con la totalidad de los diputados de la cámara, sino que al remover los NA perdimos 10 diputados. Aún así marcan una tendencia.

Conclusiones

Después de adentrarnos en el terreno de la dinamica de las votaciones parlamentarias relacionadas con la Ley Ómnibus, trazaremos una serie de conclusiones que proporcionan una visión fundamentada sobre la coyuntura del proceso legislativo en nuestro país. A continuación, se exponen los hallazgos más relevantes y las implicaciones derivadas de este análisis:

  1. Diversidad y Tensiones Parlamentarias: El análisis revela una notable diversidad de opiniones y posturas entre los diferentes bloques políticos representados en el Congreso. Las votaciones específicas muestran tensiones y discrepancias que reflejan la complejidad de la política nacional y la variedad de intereses en juego.

  2. Herramientas Analíticas Avanzadas: La aplicación de herramientas analíticas avanzadas, como las “parlamentarytics”, proporciona una comprensión más profunda de las estrategias y dinámicas dentro del Congreso. Estas herramientas son fundamentales para desentrañar los patrones subyacentes en el comportamiento legislativo y político.

  3. Desafíos para el Gobierno: A pesar de las estrategias del oficialismo por construir consensos, persisten desafíos significativos para avanzar en su agenda legislativa. La falta de acuerdos sólidos con otros bloques políticos subraya la necesidad de mejorar la capacidad de negociación y construcción de coaliciones.

  4. Importancia de la Coordinación Política: La capacidad del Gobierno para lograr sus objetivos legislativos depende en gran medida de su habilidad para coordinar y negociar con otros actores políticos. La falta de acuerdos amplios resalta la importancia de fortalecer la cohesión interna y la capacidad de negociación.

  5. Perspectivas Futuras: El análisis sugiere que el Gobierno enfrentará desafíos continuos en su agenda legislativa futura. La capacidad para superar las diferencias y construir consensos será crucial para avanzar en temas clave y abordar los desafíos nacionales.

En el complejo entramado político actual, es vital adoptar enfoques innovadores y fundamentados en evidencia para comprender la realidad, superando las inclinaciones ideológicas y enfocándonos en los comportamientos observables y los resultados tangibles. Las parlamentaritics representan un avance significativo en esta dirección, ofreciendo una comprensión detallada y cuantificada de la actividad legislativa, fomentando la transparencia y la eficiencia en el proceso democrático. Por tanto, es imperativo seguir explorando y desarrollando métodos avanzados para interpretar y enfrentar los desafíos políticos contemporáneos.

Footnotes

  1. En este proyecto de R.↩︎

Reuse

Citation

BibTeX citation:
@online{damian orden2024,
  author = {Damian Orden, Pedro},
  title = {Parlamentarytics},
  date = {2024-03-04},
  url = {https://tecysoc.netlify.app/posts/parlamentarytics},
  langid = {en}
}
For attribution, please cite this work as:
Damian Orden, Pedro. 2024. “Parlamentarytics.” March 4, 2024. https://tecysoc.netlify.app/posts/parlamentarytics.