Diferencias y similitudes entre partidos en la cámara de diputados





      Las votaciones en la cámara de diputados constituyen una medida excelente para ver diferencias y similitudes entre los partidos políticos, sobre todo por el componente cuantitativo de los cómputos; resulta menos equiparable y más difícil ver diferencias entre partidos en los ámbitos de gobiernos municipales, estatales o nacionales pues en estos casos, estamos comparando municipios con presupuestos y características socioeconómicas distintas, si comparamos gobiernos contemporáneos, o dos gobiernos del mismo municipio en dos instantes históricos distintos, si nos enfocamos en el espacio y variamos el tiempo.









Las votaciones de las legislaturas se encuentran "estructuradas" en una URL por cada votación, por lo cual podemos hacerles web-scrapping para estructurarlas y visualizarlas (como se hace con todo en este blog); la URL cuenta con el nombre de la votación, en la estructura "De la Comisión x, por la que se modifica el párrafo x de la Ley x"; no da más información sobre qué es lo que se cambia, adiciona o deroga.
Nos centraremos en los 3 últimos periodos completos de la LXIII legislatura.

Primero hacemos una gráfica con el número total de sesiones propuestas por cada comisión, para ver cuáles son las problemáticas principales en el país, salta a la vista la gran cantidad de sesiones propuestas por la Comisión de Justicia, además de aquellas propuestas por las Comisiones de Recursos Naturales, Hacienda y Economía.

Ahora veamos las votaciones por Ley, que modifican, derogan o adicionan párrafos a Leyes existentes, o crean nuevas en algunos casos; vemos que las ambientales tienen números altos, así como las de atención a grupos vulnerables; destacan en estas gráficas algunas votaciones con mayores números de votos en contra, en comparación con el resto.

Entonces hagamos un zoom a las votaciones que tuvieron más de 30 votos en contra y enfoquémonos a los principales partidos. Es notable que el PRI domina las votaciones y que jamás vota en contra; el PAN en pocas ocasiones vota en contra del PRI (8/37) y casi siempre sólo lo hace parcialmete. El PRD, el aliado del PAN en los últimos seis años, no sigue la tendencia de su compañero de fórmula y, junto con Morena, son los partidos que más ejercen la oposición al PRI, a pesar de haber sido creados por ex-militantes del tricolor.

Más abajo, después de las gráficas sigue el código para generar las estadísticas, descargando directamente las tablas de las votaciones y procesando la información, en RStudio.













library(tidyr)
library(forcats)
library(magrittr)
library(dplyr)
library(rvest)
library(ggplot2)
library(stringi)
library(grid)
library(jpeg)
###   ----    I M A G E N  -  C O N G R E S O -------##
temp <- tempfile()
download.file(
  "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX7rbR32meSdDOcOtuL8xjrnSZiO6pFNRNVYsl8zwvCskTQPHwSRk0Vl5OJjd79pNRhL-4VIzIt5YQxepvmoMy3XMhIPW0wUbYF1gOmjQBnlzTmB-N-gAv0pg4q_NH-jhU-DtifdXhNqs/s1600/camara-de-diputados.jpg",temp)
m <- jpeg::readJPEG(temp)
w <- matrix(rgb(m[,,1],m[,,2],m[,,3], alpha=  0.2), nrow=dim(m)[1])

#tabla 2or1: length 127; tabla 2or2: length 135; tabla 3or1, length 155
getwd()
df <- tibble()
for(i in 1:155){
  url <- read_html(sprintf("http://gaceta.diputados.gob.mx/Gaceta/Votaciones/63/tabla3or1-%s.php3",i))
  temp <- html_nodes(url, "body > form:nth-child(2)") %>%
    html_form()
  temp2 <- tibble(votacion=temp[[1]]$fields$nomtit$value,
                  favor=temp[[1]]$fields$`lola[11]`$value,
                  contra=ifelse(is.null(temp[[1]]$fields$`lola[12]`$value), 0,temp[[1]]$fields$`lola[12]`$value),
                  ausente=temp[[1]]$fields$`lola[15]`$value,
                  url_i= i)
  df <- rbind(df, temp2)
}
### SESIONES POR COMISION ###

stri_match_first_regex(df$votacion, "^(.+?),")[,2] %>%
  as_tibble() %>% filter(!is.na(value)) %>%
  ggplot(aes(fct_rev(fct_infreq(value)))) +
  annotation_custom(xmin=-Inf, xmax=Inf, ymin= -Inf, ymax=Inf, grid::rasterGrob(w)) +
    geom_bar() + coord_flip() +
  labs(title="Sesiones por Comisión, LXIII/3er. año/1", caption="datamarindo.blogspot.mx CC-by-SA") +
  ylab("Número de votaciones") + xlab("")

### HAY QUE REFACTORIZAR
df$leyes <- stri_match_first_regex(df$votacion, "(?=Ley)(.+?)(?=\\sy|,|\\()")[,2] %>% trimws()
gather(df, key="posicion", value = "voto", favor, contra, ausente ) %>%
  mutate(voto=as.numeric(voto)) %>% group_by(leyes) %>%
  summarise(total=sum(voto)) %>% arrange(total) -> para_factor
df$leyes <- factor(df$leyes, levels=para_factor$leyes)

###   OJO, VOTO NO SALE NUMERIC DE RVEST
gather(df, key="posicion", value = "voto", favor, contra, ausente ) %>%
  mutate(voto=as.numeric(voto)) %>%
  filter(!is.na(leyes)) %>%
  ggplot(aes(leyes, voto, fill=posicion)) +
  annotation_custom(xmin=-Inf, xmax=Inf, ymin= -Inf, ymax=Inf, grid::rasterGrob(w)) +
  geom_bar(stat="identity") +
  coord_flip() + scale_fill_manual(values=c("paleturquoise4","tomato", "olivedrab3")) +
  labs(title="Votación por ley, LXIII/3er. año/1", caption="datamarindo.blogspot.mx") +
  xlab("") + ylab("Votación")

df %>% filter(as.numeric(contra)>34) %>% select(url_i) -> principales_contra
df_vs <- tibble()
for(i in principales_contra$url_i){
  url <- read_html(sprintf("http://gaceta.diputados.gob.mx/Gaceta/Votaciones/63/tabla3or1-%s.php3",i))
  temp <- html_nodes(url, "body > form:nth-child(2)") %>%
    html_form()
  temp2 <- tibble(votacion = temp[[1]]$fields$nomtit$value,
                  favor    = temp[[1]]$fields$`lola[11]`$value,
                  contra   = ifelse(is.null(temp[[1]]$fields$`lola[12]`$value), 0,temp[[1]]$fields$`lola[12]`$value),
                  ausente  =temp[[1]]$fields$`lola[15]`$value,
                  f_pri = ifelse(is.null(temp[[1]]$fields$`lola[21]`$value), 0,temp[[1]]$fields$`lola[21]`$value),
                  f_pan = ifelse(is.null(temp[[1]]$fields$`lola[31]`$value), 0,temp[[1]]$fields$`lola[31]`$value),
                  f_prd = ifelse(is.null(temp[[1]]$fields$`lola[41]`$value), 0,temp[[1]]$fields$`lola[41]`$value),
                  f_vrd = ifelse(is.null(temp[[1]]$fields$`lola[51]`$value), 0,temp[[1]]$fields$`lola[51]`$value),
                  f_mor = ifelse(is.null(temp[[1]]$fields$`lola[61]`$value), 0,temp[[1]]$fields$`lola[61]`$value),
                  c_pri = ifelse(is.null(temp[[1]]$fields$`lola[22]`$value), 0,temp[[1]]$fields$`lola[22]`$value),
                  c_pan = ifelse(is.null(temp[[1]]$fields$`lola[32]`$value), 0,temp[[1]]$fields$`lola[32]`$value),
                  c_prd = ifelse(is.null(temp[[1]]$fields$`lola[42]`$value), 0,temp[[1]]$fields$`lola[42]`$value),
                  c_vrd = ifelse(is.null(temp[[1]]$fields$`lola[52]`$value), 0,temp[[1]]$fields$`lola[52]`$value),
                  c_mor = ifelse(is.null(temp[[1]]$fields$`lola[62]`$value), 0,temp[[1]]$fields$`lola[62]`$value),
                  url_i= i)
  df_vs <- rbind(df_vs, temp2)
}

df_vs[,2:14] <- sapply(df_vs[,2:14], as.integer)
select(df_vs, -2, -3, -4) %>% gather(key=posicion_partido, value=voto,
                                     2:11) -> largo
largo$posicion_partido <- factor(largo$posicion_partido, levels =
                                   c("f_pri", "c_pri", "f_pan", "c_pan",
                                     "f_prd", "c_prd","f_vrd", "c_vrd", "f_mor", "c_mor"))
largo$partido3 <- substr(largo$posicion_partido,3,5) %>% factor(levels=c("pri", "pan", "prd",
                                                                         "mor", "vrd"))
largo$votacion <- stri_match_first_regex(largo$votacion, "(?=Ley)(.+?)(?=\\sy|,|\\()")[,2] %>% trimws()
largo$contra <- largo$voto
largo$contra[grep("c_", largo$posicion_partido)] <- -largo$voto[grep("c_", largo$posicion_partido)]

cols=c("tomato","mediumblue", "gold3", "brown", "chartreuse4")
ggplot(largo %>% filter(!is.na(votacion)), aes(votacion, contra, fill=partido3)) +
annotation_custom(xmin=-Inf, xmax=Inf,ymin= -Inf, ymax=Inf, grid::rasterGrob(w)) +
  geom_bar(stat="identity",width = 0.4) +
  coord_flip() + scale_fill_manual(values=cols) + geom_hline(aes(yintercept=0), size=1.5) +
  labs(title="Votaciones, LXIII/3er. año/1", caption="datamarindo.blogspot.mx CC-by-SA")+
  xlab("") + ylab("Votación") + guides(fill=guide_legend(title="Partido")) +
  annotate("text", x=7, y=-150, label="italic('En contra')", angle=0, size=5, col="brown", parse=T) +
  annotate("text", x=7, y=500, label="italic('A Favor')", angle=0, size=5,
           col="chartreuse4", parse=T)

Comentarios

Entradas más populares de este blog

Construyendo sobre otro post y la conjetura de Collatz y Escher, Gödel, Bach...

El estado de las cosas: QGIS vs ArcGIS

datos socioeconómicos y resultados electorales.