Proyectos de Ley

En una base de datos, tenemos 66 proyectos de ley presentados en el Congreso de la República entre 2018 y 2022. Con la información de los autores y los distintos partidos, debemos codificar la información sobre la cantidad de mujeres, hombres y partidos para las autorías, así como el número de autores por cada categoría del Estatuto de la Oposición.

# Cargamos las librerías necesarias
library(readxl)
library(tidyverse)
library(dplyr)
library(readr)
library(stringdist)
library(fuzzyjoin)
library(writexl)

Partidos de los congresistas

Para determinar los partidos de los Congresistas, importamos una base de datos desde el directorio de congresistas COL Legislative Directory que con una concatenación (=CONCAT) en Excel de los nombres y apellidos de los congresistas con el Partido Político en el que militan. debemos intentar completar la información de los congresistas faltantes y unificar la información de los dos cuatrenios. Como hay congresistas que cambian de partido, primero está la información del cuatrenio 2022-26 y luego 2018-22 para conservar el partido más reciente.

#Cargamos la base de datos
Partidos_congresistas <- read_excel("Partidos congresistas.xlsx")

Ahora hacemos una limpieza de la base de datos para que no hayan congresistas repetidos. En esta base de datos, se da prioridad al partido más reciente del congresista, por lo que primero se conservan los partidos del 22-26 y luego se completa la base de datos con los congresistas del 18-22 que no repitieron curul.

# Eliminar duplicados en la columna "Congresista", además se cambian las ñ por n para pasos posteriores
Partidos_congresistas1822 <- Partidos_congresistas %>%
 group_by(Congresista) %>%
 distinct(Congresista, .keep_all = TRUE) %>%
 mutate(Congresista = stringr::str_replace_all(Congresista, "Ñ", "N"))

Senado 2022

Originalmente, no existen los datos para el partido de los congresistas de 2022, por lo que con el siguiente código extraemos los partidos de quien están repitiendo periodo en el congreso y lo añadimos a los nuevos congresistas. En Excel se llena manualmente los partidos de los congresistas faltantes.

#Senadores de 2022 sin partido
Senado22 <- Partidos_congresistas1822 %>%
 filter(is.na(Partido))

#Senadores de 2022 que están repetidos en la base de datos y ya tienen un partido nuevo
Senado22_partido <- Partidos_congresistas1822 %>% 
 filter(duplicated(Congresista) | is.na(Partido)) %>%
 arrange(Partido, na.last = TRUE) %>%
 distinct(Congresista, .keep_all = TRUE) %>%
 arrange(Congresista)

#Join para añadir el partido existente a la base de los senadores de 2022. En Excel manualmente se deben añadir los demás partidos y cambiar los senadores que hacen parte de la coalición "Pacto Histórico"
Senado22 <- left_join(Senado22, Senado22_partido, 
           by = join_by(Congresista == Congresista)) 

Reemplazo en Proyectos de Ley.

Cargamos la base de datos de Proyectos de Ley. Hay que desglosar la lista de autores en Nombres_autores para que queden como vector y se pueda unir cada uno con un partido dentro de la lista de Partidos_congresistas, esta lista de vectores quedará en Autores_separados. Luego, vamos a crear una nueva función llamada asignar_partido en donde estandariza el texto de los autores para que queden en mayúsculas y sin tíldes, más adelante, la función toma los partidos y crea una lista con base en los nombres de los congresistas. De esta manera, resulta una nueva columna en donde aparece la lista de partidos para cada proyecto de ley.

Para que la unión se haga correctamente, primero hay que verificar que no hayan incosistencias entre la lista de nombres en el directorio de congresistas y la lista dentro de los Proyectos de Ley. De igual manera, se deben añadir todos los remplazos dentro del congreso como filas adicionales a la base de datos de Partidos_congresistas.

# Base de datos original
Proyectos_Ley <- read_excel("Proyectos de Ley.xlsx")


# Divide la columna "Nombres autores" en "Proyectos_Ley" para obtener una lista de nombres
Proyectos_Ley <- Proyectos_Ley %>%
 mutate(Autores_separados = strsplit(Nombres_autores, ", "))

# Función para asignar partidos a cada autor
asignar_partido <- function(autores, partidos) {
 autores <- unlist(autores)
 autores <- stringr::str_replace_all(autores, "ñ", "n") # Reemplazar "ñ" con "n"
 autores <- stringr::str_replace_all(autores, "[Ááàâä]", "a") # Reemplazar á, à, â, ä con "a"
 autores <- stringr::str_replace_all(autores, "[Ééèêë]", "e") # Reemplazar é, è, ê, ë con "e"
 autores <- stringr::str_replace_all(autores, "[Ííìîï]", "i") # Reemplazar í, ì, î, ï con "i"
 autores <- stringr::str_replace_all(autores, "[Óóòôö]", "o") # Reemplazar ó, ò, ô, ö con "o"
 autores <- stringr::str_replace_all(autores, "[Úúùûü]", "u") # Reemplazar ú, ù, û, ü con "u"
 autores <- toupper(autores)

 partidos_asignados <- sapply(autores, function(autor) {
  partido <- partidos$Partido[grep(autor, partidos$Congresista, ignore.case = TRUE)]
  if (length(partido) > 0) {
   return(partido)
  } else {
   return("Gobierno")
  }
 })
 
 return(paste(partidos_asignados, collapse = ", "))
}

# Aplicamos la función para asignar partidos a cada proyecto de ley
Proyectos_Ley <- Proyectos_Ley %>%
 rowwise() %>%
 mutate(Partidos_autores = asignar_partido(Autores_separados, Partidos_congresistas1822))

Autoría de los proyectos por partido.

Luego, hacemos el conteo de cuántos congresistas de los partidos más grandes aparecen como autores en cada Proyecto de Ley. Se crea una columna en donde se listan los partidos como vectores (Partidos_separados) y luego una nueva columna por cada partido para hacer el conteo de los vectores.

# Desglosar las listas de partidos en cada celda como vectores "c()"
Proyectos_Ley$Partidos_separados <- sapply(Proyectos_Ley$Partidos_autores, function(partidos) {
 unlist(strsplit(partidos, ", "))
})

# Contar las veces que los partidos más grandes aparecen en cada observación
Proyectos_Ley$Autores_cons <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO CONSERVADOR COLOMBIANO")
})


Proyectos_Ley$Autores_lib <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO LIBERAL COLOMBIANO")
})

Proyectos_Ley$Autores_U <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO SOCIAL DE UNIDAD NACIONAL - PARTIDO DE LA U")
})

Proyectos_Ley$Autores_pacto <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PACTO HISTORICO")
})

Proyectos_Ley$Autores_CR <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO CAMBIO RADICAL COLOMBIANO")
})

Proyectos_Ley$Autores_CD <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO CENTRO DEMOCRATICO - MANO FIRME CORAZON GRANDE")
})

Proyectos_Ley$Autores_AV <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "PARTIDO ALIANZA VERDE")
})

Proyectos_Ley$Autores_gob <- sapply(Proyectos_Ley$Partidos_separados, function(partidos) {
 sum(partidos == "Gobierno")
})

Datos de oposición

A continuación, clasificamos a los partidos de los autores y a los autores según las distintas categorías del Estatuto de la Oposición. Para esto primero cargamos la base de datos con la información de las declaratorias de los partidos para 2018-2022. De igual forma, importamos la base de datos con los códigos para cada movimiento político de la registraduría para trabajar con el número y evitar problemas de nomenclatura.

Declaratorias a nivel nacional

Como la última versión del diccionario de partidos es de 2019, no hay partidos como el Partido Comunes o el Pacto Histórico. Estos dos son los más grandes, por lo que les asignamos un código manualmente. También se deben añadir las declaratorias de los nuevos partidos y las declaratorias para el periodo 2022-2026. Para esto, exportamos la base de datos a un archivo Excel y allí completamos la información.

Nuevamente importamos la base completa con los datos para el cuatrenio 2022-2026.

Oposicion_nacional <- read.csv2("Oposicion_nacional.csv")

Declaratorias por cuatrenio

Las declaratorias de cada partido cambian por cuatrenio, así como el Gobierno Nacional. Por esto, dividimos las bases de datos en dos grupos para los respectivos cuatrenios antes de asignar las declaratorias a los congresistas por su partido. Tanto los proyectos de Ley como los distintos grupos de congresistas con sus partidos.

# Proyectos de Ley en dos grupos
Proyectos_Ley18 <- Proyectos_Ley %>%
 filter(Cuatrenio == "2018-2022")
 
Proyectos_Ley22 <- Proyectos_Ley %>%
 filter(Cuatrenio == "2022-2026")

#Congresistas en dos grupos
Partidos_congresistas18 <- Partidos_congresistas %>%
 filter(Cuatrenio == "2018-2022")

Partidos_congresistas22 <- Partidos_congresistas %>%
 filter(Cuatrenio == "2022-2026")

Luego, a cada grupo le damos el código de partido otorgado por el CNE y la Registraduría (si tienen) y su declaratoria según el Estatuto de la Oposición.

# Unión con base de datos de Partidos para asignar el código
Partidos_congresistas18 <- left_join(Partidos_congresistas18, Partidos, 
                  by = join_by("Partido" == "nombre_partido"))

# Unión con base de datos de oposición nacional para añadir declaratoria, luego filtrar para el cuatrenio
Partidos_congresistas18 <- stringdist_left_join(Partidos_congresistas18, Oposicion_nacional,
 by = c("Partido" = "agp_nombre", "Cuatrenio" = "cuatrenio"),
 max_dist = 3,
 method = "dl",
 ignore_case = TRUE) %>%
 filter(cuatrenio == "2018-2022")

# Se repite el mismo proceso para 2022-26
Partidos_congresistas22 <- left_join(Partidos_congresistas22, Partidos, 
                  by = join_by("Partido" == "nombre_partido"))

Partidos_congresistas22 <- stringdist_left_join(Partidos_congresistas22, Oposicion_nacional,
 by = c("Partido" = "agp_nombre", "Cuatrenio" = "cuatrenio"),
 max_dist = 3,
 method = "dl",
 ignore_case = TRUE) %>%
 filter(cuatrenio == "2022-2026")

Asignar declaratoria a cada autor

Ahora, con la misma estrategia que para la asignación de los partidos a cada congresista dentro de los Proyectos de Ley, creamos una nueva función para asignar las declaratorias en cada cuatrenio. Esta función convierte la lista de autores en caracteres en mayúscula y sin tíldes, y luego itera por cada uno buscando su partido en la lista de Partidos_congresitas## y luego asignándole la declaratoria para el partido dentro del cuatrenio de la base. Convierte las declaratorias en una lista que van en una nueva columna. Para los autores del Gobierno Nacional o de partidos sin declaratoria, les asigna "Sin declaratoria".

# Función para asignar declaratoria a cada autor
asignar_declaratoria <- function(autores, partidos, cuatrenio) {
 autores <- unlist(autores)
 autores <- stringr::str_replace_all(autores, "ñ", "n") # Reemplazar "ñ" con "n"
 autores <- stringr::str_replace_all(autores, "[Ááàâä]", "a") # Reemplazar á, à, â, ä con "a"
 autores <- stringr::str_replace_all(autores, "[Ééèêë]", "e") # Reemplazar é, è, ê, ë con "e"
 autores <- stringr::str_replace_all(autores, "[Ííìîï]", "i") # Reemplazar í, ì, î, ï con "i"
 autores <- stringr::str_replace_all(autores, "[Óóòôö]", "o") # Reemplazar ó, ò, ô, ö con "o"
 autores <- stringr::str_replace_all(autores, "[Úúùûü]", "u") # Reemplazar ú, ù, û, ü con "u"
 autores <- toupper(autores)

 declaratoria_asignada <- sapply(autores, function(autor) {
declaratoria <- partidos$lst_descripcion[grep(autor, partidos$Congresista, ignore.case = TRUE)]
  if (length(declaratoria) > 0) {
   return(declaratoria)
  } else {
   return("Sin declaratoria")
  }
 })

 return(paste(declaratoria_asignada, collapse = ", "))
}

# Aplicamos la función para asignar declaratoria a cada proyecto de ley en ambos cuatrenios
Proyectos_Ley18 <- Proyectos_Ley18 %>%
 rowwise() %>%
 mutate(Declaratoria_autores = asignar_declaratoria(Autores_separados, Partidos_congresistas18, Cuatrenio))

Proyectos_Ley22 <- Proyectos_Ley22 %>%
 rowwise() %>%
 mutate(Declaratoria_autores = asignar_declaratoria(Autores_separados, Partidos_congresistas22, Cuatrenio))

Conteo de declaratorias

Finalmente, unificamos ambas bases de datos para hacer el conteo de las declaratorias.

# Unificamos las bases con `rbind()`, pues ambas tienen las mismas columnas
Proyectos_Ley <- rbind(Proyectos_Ley18, Proyectos_Ley22)

Creamos una nueva columna con la lista de las declaratorias como vector (Declaratorias_separadas) y 4 nuevas columnas para cada categoría del Estatuto de la Oposición con la suma de los autores en cada categoría.

# Desglosar las listas de declaratorias en cada celda dentro de una nueva columna
Proyectos_Ley$Declaratorias_separadas <- sapply(Proyectos_Ley$Declaratoria_autores, function(partidos) {
 unlist(strsplit(partidos, ", "))
})

# Contar las veces que cada categoría aparece en cada observación
Proyectos_Ley$Autores_gobierno <- sapply(Proyectos_Ley$Declaratorias_separadas, function(partidos) {
 sum(partidos == "Gobierno")
})


Proyectos_Ley$Autores_independientes <- sapply(Proyectos_Ley$Declaratorias_separadas, function(partidos) {
 sum(partidos == "Independiente")
})

Proyectos_Ley$Autores_oposicion <- sapply(Proyectos_Ley$Declaratorias_separadas, function(partidos) {
 sum(partidos == "Oposición")
})

Proyectos_Ley$Autores_sindcl <- sapply(Proyectos_Ley$Declaratorias_separadas, function(partidos) {
 sum(partidos == "Sin declaratoria")
})

Exportar

Ahora que ya completamos todas las tareas, exportamos la base de datos a un documento en Excel dentro de nuestro directorio. En Excel podemos eliminar las columnas de Autores_separados, Partidos_separados y Declaratorias_separadas