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)
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"))
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))
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))
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")
})
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.
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")
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")
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))
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")
})
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