Manejo y visualización de datos Observatorio de Conflictos - COES

1 Introducción

Este documento tiene por objetivo aportar en el manejo, operacionalización y visualización de variables de la base de datos del Observatorio de Conflictos del Centro de Estudios de Conflicto y Cohesión Social (COES), en la cual se registra información sobre acciones de protesta en Chile durante los años 2009-2019. Para estos fines se utilizan un conjunto de paquetes y comandos mínimos que permiten el manejo y análisis visual de los datos. Este documento se divide en dos grandes apartados: uno sobre manejo y operacionalización de datos, y otro sobre visualización de datos con ggplot2.

2 Operacionalización y manejo de datos

2.1 Librerías principales a utilizar

En esta sección comenzaremos cargando las librerías que nos servirán para la recodificación y creación de nuevas variables. Se recomienda el uso del paquete pacman para instalar y cargar librerías de forma más eficiente y actualizada. Para quienes deseen hacerlo sin pacman también se incluye la opción pero las librerías deben estar previamente instaladas mediante la función install.packages().

2.1.1 Con pacman

# Ajustar espacio de trabajo
rm(list=ls())
options(scipen=9999) # desactivar notacion cientifica

# Cargar librerías
if (!require("pacman")) install.packages("pacman") # Pacman para instalar y cargar librerías
pacman::p_load(car, # recodificacion de variables
               tidyverse, # universo de funciones para manipular datos (dplyr)
               sjlabelled, # etiquetar
               ggplot2, # visualizar datos
               sjmisc, # describir y explorar datos
               summarytools, # manipular y resumir datos
               sjPlot, # describir datos
               RColorBrewer, # paleta colores
               gridExtra, # unir graficos
               plotly) # animar graficos

2.1.2 Sin pacman

# Ajustar espacio de trabajo
rm(list=ls())
options(scipen=9999) # desactivar notacion cientifica

# Cargar librerías
library(car) # recodificacion de variables
library(tidyverse) # universo de funciones para manipular datos (dplyr)
library(sjlabelled) # etiquetar
library(ggplot2) # visualizar datos
library(sjmisc) # describir y explorar datos
library(summarytools) # manipular y resumir datos
library(sjPlot) # describir datos
library(RColorBrewer) # paleta colores
library(gridExtra) # unir graficos
library(plotly) # animar graficos

2.2 Cargar datos desde repositorio Dataverse

Cargamos la base de datos del Observatorio de Conflictos 2009-2019 disponible en el Dataverse de Harvard. La unidad de análisis de la base de datos son las acciones contenciosas, las cuales se definen como: “la forma en la que un actor, grupo o movimiento social expresa un malestar colectivo, pacífica u hostilmente, frente a otro actor, grupo, movimiento, o instancia pública o privada, a través del despliegue de ciertas tácticas en el espacio público”.

# Cargar datos desde Dataverse
load(url("https://dataverse.harvard.edu/api/access/datafile/4880232"))

2.3 Selección y etiquetado de variables

Para el desarrollo de este documento utilizaremos las siguientes variables:

  • pb: Radios nacionales
  • p5c: Año
  • p6 : Región
  • p13a-d: Grupos sociales
  • p19a1-e1: Demandas
  • p21: Presencia policial
  • P25: Presencia de heridos
  • p27: Presencia de muertos
  • p29a-f: Tácticas

Las variables p13a-d, p19a1-e1 y p29a-f son variables que contienen columnas múltiples, por ejemplo, en el caso de las tácticas puede suceder que exista una marcha, luego una barricada y finalmente enfrentamientos con carabineros, por lo que se hace necesario tener una serie de columnas que permita dar cuenta de esas diferencias. Asimismo, esta característica aplica para el caso de los grupos sociales y las demandas que también contienen más de una columna.

Otro caso relevante es la variable pb que permite filtrar las radios nacionales (Radio Biobío - Radio Cooperativa), ya que la base de datos 2009-2019 no cuenta con información de estas radios para los años 2009-2011. Es relevante filtrar estos medios para realizar análisis para el total de años y para eliminar sesgos temporales asociados a la falta de información.

# Selección de variables
proc_data <- acciones_de_protesta_2009_2019 %>% 
  dplyr::select(pb, p5c, p6, p13a, p13b, p13c, p13d, p19a1, p19b1,      
                p19c1, p19d1, p19e1, p21, p25, p27, p29a, p29b, p29c, p29d, p29e, p29f) # funcion select del paquete dplyr

rm(acciones_de_protesta_2009_2019) # removemos base original
## Región
proc_data$region <- factor(proc_data$p6,labels = c('Tarapacá', 'Antofagasta', 'Atacama','Coquimbo','Valparaíso','O´Higgins','Maule','Biobío','Araucanía','Los Lagos','Aysén','Magallanes','Metropolitana','Los Ríos','Arica y Parinacota','Ñuble')) # recodificamos los nombres de las regiones y pasamos la variable a factor

## Macrozonas
proc_data <- proc_data %>% mutate(macrozona = case_when(p6 %in% c(15, 1:4) ~ "Norte", 
                                p6 %in% c(5:7, 16) ~ "Centro",
                                p6 %in% c(13) ~ "RM",
                                p6 %in% c(8:12, 14) ~ "Sur")) # creamos nueva variable "macrozona" mediante la funcion mutate del paquete dplyr. Se aplican distintas condiciones a la variable original para crear nuevos valores en la nueva variable

## Años
proc_data$ano <- car::recode(proc_data$p5c, recodes = c("9 = 2009; 10 = 2010; 11 = 2011; 
                                                        12 =2012; 13 = 2013; 14 = 2014; 15 = 2015;
                                                        16 = 2016; 17 = 2017; 18 = 2018; 19 = 2019"), as.numeric = T) # recodificamos valores de los años y pasamos la variable a numerica

# Etiquetas
proc_data$region <- sjlabelled::set_label(proc_data$region, label = c('Regiones')) # etiquetamos 
proc_data$macrozona <- sjlabelled::set_label(proc_data$macrozona, label = c('Macrozonas'))
proc_data$ano <- sjlabelled::set_label(proc_data$ano, label = c('Año'))

2.4 Operacionalización de variables

De acuerdo con las indicaciones del libro de códigos del Observatorio de Conflictos, se recomienda agrupar las distintas demandas, repertorios de protesta o grupos sociales participantes por categorías específicas. Esto resulta especialmente útil para describir el comportamiento por región o el desarrollo en el tiempo de algunas demandas, ciertas tácticas de protesta y la participación de determinados grupos sociales. Para ello, generaremos una serie de variables dicotómicas a partir de las categorías descritas en el libro de códigos.

2.4.1 Demandas

# Educación
proc_data <- proc_data %>%
    mutate(educacion = case_when(p19a1 >=100 & p19a1 < 200 ~ "1", # creamos una variable nueva a partir de ciertas condiciones a p19a1-e1
                                 p19b1 >=100 & p19b1 < 200 ~ "1", 
                                 p19c1 >=100  & p19c1  < 200 ~ "1",
                                 p19d1 >=100 & p19d1  < 200 ~ "1",
                                 p19e1 >=100  & p19e1  < 200~ "1",
                                 TRUE ~ "0")) # todo lo demás devuelveme valor cero

proc_data$educacion <- factor(proc_data$educacion,labels = c('No', 'Sí')) # recodificamos valores y pasamos la variable a factor

# Etiqueta
proc_data$educacion <- sjlabelled::set_label(proc_data$educacion, label = c('Demanda - Educacional'))
# Indigena
proc_data <- proc_data %>%
    mutate(indigena = case_when(p19a1 >=200 & p19a1 < 300 ~ "1",
                                p19b1 >=200 & p19b1 < 300 ~ "1", 
                                p19c1 >=200  & p19c1  < 300 ~ "1",
                                p19d1 >=200 & p19d1  < 300 ~ "1",
                                p19e1 >=200  & p19e1  < 300~ "1",
                                TRUE ~ "0")) 

proc_data$indigena <- factor(proc_data$indigena,labels = c('No', 'Sí')) 

# Etiqueta
proc_data$indigena <- sjlabelled::set_label(proc_data$indigena, label = c('Demanda - Indígenas'))
# Laboral
proc_data <- proc_data %>%
    mutate(laboral = case_when(p19a1 >=300 & p19a1 < 400 ~ "1", 
                               p19b1 >=300 & p19b1 < 400 ~ "1", 
                               p19c1 >=300  & p19c1  < 400 ~ "1",
                               p19d1 >=300 & p19d1  < 400 ~ "1",
                               p19e1 >=300  & p19e1  < 400~ "1",
                               TRUE ~ "0")) 

proc_data$laboral <- factor(proc_data$laboral,labels = c('No', 'Sí'))

# Etiqueta
proc_data$laboral <- sjlabelled::set_label(proc_data$laboral, label = c('Demanda - Laborales'))
# Salud
proc_data <- proc_data %>%
    mutate(salud = case_when(p19a1 >=600 & p19a1 < 700 ~ "1",
                             p19b1 >=600 & p19b1 < 700 ~ "1", 
                             p19c1 >=600  & p19c1  < 700 ~ "1",
                             p19d1 >=600 & p19d1  < 700 ~ "1",
                             p19e1 >=600  & p19e1  < 700~ "1",
                             TRUE ~ "0")) 

proc_data$salud <- factor(proc_data$salud,labels = c('No', 'Sí'))

# Etiqueta
proc_data$salud <- sjlabelled::set_label(proc_data$salud, label = c('Demanda - Salud'))

2.4.2 Repertorios de protesta

# Protesta pacífica
proc_data <- proc_data %>%
    mutate(pacifica = case_when(p29a >=1 & p29a <= 17 ~ "1",
                                p29b >=1 & p29b <= 17  ~ "1", 
                                p29c >=1 & p29c <= 17  ~ "1",
                                p29d >=1 & p29d <= 17  ~ "1",
                                p29e >=1 & p29e <= 17  ~ "1",
                                p29f >=1 & p29f <=17 ~ "1",
                                TRUE ~ "0"))

proc_data$pacifica <- factor(proc_data$pacifica,labels = c('No', 'Sí'))

# Etiqueta
proc_data$pacifica <- sjlabelled::set_label(proc_data$pacifica, label = c('Táctica - Pacífica'))
# Protesta disruptiva
proc_data <- proc_data %>%
    mutate(disruptiva = case_when(p29a >=18 & p29a <=24  ~ "1",
                                  p29b >=18 & p29b <= 24  ~ "1", 
                                  p29c >=18 & p29c <=24  ~ "1",
                                  p29d >=18 & p29d <= 24  ~ "1",
                                  p29e >=18 & p29e <= 24  ~ "1",
                                  p29f >=18 & p29f <=24 ~ "1",
                                  TRUE ~ "0")) 

proc_data$disruptiva <- factor(proc_data$disruptiva,labels = c('No', 'Sí'))

# Etiqueta
proc_data$disruptiva <- sjlabelled::set_label(proc_data$disruptiva, label = c('Táctica - Disruptiva'))
# Protesta violenta
proc_data <- proc_data %>%
    mutate(violenta = case_when(p29a >=25 & p29a <=36  ~ "1",
                                p29b >=25 & p29b <= 36  ~ "1", 
                                p29c >=25 & p29c <=36  ~ "1",
                                p29d >=25 & p29d <= 36  ~ "1",
                                p29e >=25 & p29e <= 36  ~ "1",
                                p29f >=25 & p29f <=36 ~ "1",
                                TRUE ~ "0"))  

proc_data$violenta <- factor(proc_data$violenta,labels = c('No', 'Sí'))

# Etiqueta
proc_data$violenta <- sjlabelled::set_label(proc_data$violenta, label = c('Táctica - Violenta'))

2.4.3 Grupos sociales participanes

# Trabajadores (Sector público, privado, por cuenta propia o indeterminado)
proc_data <- proc_data %>%
    mutate(trabajadores = case_when(p13a >=12 & p13a <=15  ~ "1",
                                    p13b >=12 & p13b <= 15  ~ "1", 
                                    p13c >=12 & p13c <=15  ~ "1",
                                    p13d >=12 & p13d <= 15  ~ "1",
                                    TRUE ~ "0"))  

proc_data$trabajadores <- factor(proc_data$trabajadores,labels = c('No', 'Sí'))

# Etiqueta
proc_data$trabajadores <- sjlabelled::set_label(proc_data$trabajadores, label = c('Grupos social - Trabajadores'))
# Estudiantes (Universitarios y secundarios)
proc_data <- proc_data %>%
    mutate(estudiantes = case_when(p13a >=9 & p13a <=11  ~ "1",
                                   p13b >=9 & p13b <= 11  ~ "1", 
                                   p13c >=9 & p13c <=11  ~ "1",
                                   p13d >=9 & p13d <= 11  ~ "1",
                                   TRUE ~ "0"))

proc_data$estudiantes <- factor(proc_data$estudiantes,labels = c('No', 'Sí'))

# Etiqueta
proc_data$estudiantes <- sjlabelled::set_label(proc_data$estudiantes, label = c('Grupos social - Estudiantes'))

2.4.4 Existencia de presencia policial, heridos y muertos en la protesta

# Presencia policial
proc_data$policial <- factor(proc_data$p21, labels = c('Sí', 'No'))
proc_data$heridos <- factor(proc_data$p25, labels = c('Sí', 'No'))
proc_data$muertes <- factor(proc_data$p27, labels = c('Sí', 'No'))

# Etiquetas
proc_data$policial <- sjlabelled::set_label(proc_data$policial, label = c('Presencia policial'))
proc_data$heridos <- sjlabelled::set_label(proc_data$heridos, label = c('Presencia heridos'))
proc_data$muertes <- sjlabelled::set_label(proc_data$muertes, label = c('Presencia muertos'))

2.5 Filtrado y selección de variables base procesada

Para asegurar la consistencia del análisis en el tiempo es relevante separar (filtrar) las radios nacionales Cooperativa y Biobío. Esto se debe a que la base del Observatorio de Conflictos no cuenta con registros para los años 2009-2011 para estos medios, por lo que se hace necesario filtrar la base de datos en caso de que se quieran realizar análisis que abarquen el total de años. Esto lo realizaremos a partir de la variable pb de la base de datos que permite filtrar dichos medios. Luego, seleccionamos las variables procesadas para la posterior visualización. Por último y opcionalmente, podemos guardar la base de datos procesada.

# Filtramos los casos reportados por los medios presentes entre 2009-2019 
proc_data <- proc_data %>% filter(pb == 0) # funcion filter del paquete dpplyr: "si pb es igual a 0 eliminalo y dejame con lo demas"

# Seleccionamos variables para visualización
data <- proc_data%>% 
  dplyr::select(ano, region, educacion, indigena, laboral, salud, pacifica, disruptiva, violenta, macrozona,
                estudiantes, trabajadores, policial, heridos, muertes)

# Guardar (opcional)
# save(data, file = "[ruta carpeta local]/data2009-2019.RData")

2.6 Descriptivos preliminares

Para finalizar esta sección y antes de comenzar con la visualización mediante ggplot2, siempre es recomendable realizar una mirada general de la distribución de los datos.

st_css() # Alinear descriptivos dentro de summarytools
print(dfSummary(data, varnumbers = F, headings = F, valid.col = F, na.col = F, style = "grid", split.cells = 3), method = "render") # "imprimimos" en el viewer la tabla 
Variable Label Stats / Values Freqs (% of Valid) Graph
ano [numeric] Año
Mean (sd) : 2014.4 (3.3)
min ≤ med ≤ max:
2009 ≤ 2014 ≤ 2019
IQR (CV) : 7 (0)
11 distinct values
region [factor] Regiones
1. Tarapacá
2. Antofagasta
3. Atacama
4. Coquimbo
5. Valparaíso
6. O´Higgins
7. Maule
8. Biobío
9. Araucanía
10. Los Lagos
[ 6 others ]
1395(7.5%)
1245(6.7%)
1252(6.7%)
1124(6.0%)
1770(9.5%)
789(4.2%)
664(3.6%)
700(3.8%)
1902(10.2%)
1103(5.9%)
6690(35.9%)
educacion [factor] Demanda - Educacional
1. No
2. Sí
14941(80.2%)
3693(19.8%)
indigena [factor] Demanda - Indígenas
1. No
2. Sí
17607(94.5%)
1027(5.5%)
laboral [factor] Demanda - Laborales
1. No
2. Sí
11749(63.1%)
6885(36.9%)
salud [factor] Demanda - Salud
1. No
2. Sí
17623(94.6%)
1011(5.4%)
pacifica [factor] Táctica - Pacífica
1. No
2. Sí
8079(43.4%)
10555(56.6%)
disruptiva [factor] Táctica - Disruptiva
1. No
2. Sí
9230(49.5%)
9404(50.5%)
violenta [factor] Táctica - Violenta
1. No
2. Sí
15280(82.0%)
3354(18.0%)
macrozona [character] Macrozonas
1. Centro
2. Norte
3. RM
4. Sur
3264(17.5%)
5856(31.4%)
2917(15.7%)
6597(35.4%)
estudiantes [factor] Grupos social - Estudiantes
1. No
2. Sí
14976(80.4%)
3658(19.6%)
trabajadores [factor] Grupos social - Trabajadores
1. No
2. Sí
10411(55.9%)
8223(44.1%)
policial [factor] Presencia policial
1. Sí
2. No
4824(25.9%)
13810(74.1%)
heridos [factor] Presencia heridos
1. Sí
2. No
907(4.9%)
17727(95.1%)
muertes [factor] Presencia muertos
1. Sí
2. No
39(0.2%)
18593(99.8%)

Generated by summarytools 1.0.0 (R version 4.0.3)
2021-12-28

3 Visualización de datos

Una advertencia a considerar es que los gráficos no siempre suman 100 o en algunos casos suman más de 100 debido a que los porcentajes son para el total de cada variable por separado. Precisamente, esto se debe, por ejemplo, a que muchas tácticas dentro de la base del Observatorio ocurren de forma conjunta (una marcha que es pacífica pero que, a su vez, termina con barricadas que son tácticas disruptivas). Para visualizar las diferencias se aíslan las formas de repertorio de protesta y se grafica cada una por separado. Esta característica se repite en la creación de otras variables como demandas y grupos sociales, entre otras que están presentes en los datos.

3.1 Cantidad de acciones contenciosas

Para conocer la frecuencia de acciones contenciosas entre los años 2009-2019 haremos tres gráficos diferentes: uno con las frecuencias totales por año, otro con los porcentajes por año, y uno con los porcentajes por año según las distintas regiones del país.

3.1.1 Frecuencias

g1 <- data %>% mutate(ano = as.factor(data$ano)) %>% # convertimos a factor variable año
  group_by(ano) %>% # agrupamos por año
  summarise(porcentaje = n()) %>% # contamos la frecuencia de casos por año
  ggplot(aes(y = porcentaje, x = ano, label = as.character(scales::percent(porcentaje, accuracy = .1))))+ # indicar el contenido del gráfico: ejes y escala del eje y en frecuencias
  geom_col(fill="#440154FF", position= 'dodge2') + # indicar geometria o forma del grafico geom_col. fill para indicar color. 'dodge2' para formato side-to-side
  labs(title = 'Cantidad de acciones contenciosas según año', 
       y = 'Frecuencia de eventos', 
       x = 'Año',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019') + # etiquetas titulo, ejes y fuente
  geom_text(aes(label = porcentaje), vjust = -0.8,
            position = position_dodge(width = .9),
            size= 3)+ #etiquetas por sobre cada barra
  theme_bw()+ # indicar tema
  coord_cartesian(ylim=c(0,5000))+ # limites del eje y 0 a 5000
  theme(axis.title = element_text(), text = element_text(size = 12)) # tamaño texto

g1

3.1.2 Porcentajes

g2 <- data %>% mutate(ano = as.factor(data$ano)) %>% 
  group_by(ano) %>% 
  summarise(porcentaje = n()) %>% 
  mutate(prop = prop.table(porcentaje)) %>% # calculamos proporciones a partir de frecuencias por año
  ggplot(aes(y = prop, x = ano, label = as.character(scales::percent(prop, accuracy = .1))))+
  geom_col(fill="#414487FF", position= 'dodge2') +
  labs(title = 'Porcentaje de acciones contenciosas según año', 
       y = 'Porcentaje de eventos', 
       x = 'Año',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019')+
  geom_text(vjust = -0.8,
            position = position_dodge(width = .9),
            size= 3)+
  scale_y_continuous(labels = scales::percent) + # escala eje y en porcentajes 
   theme_bw() + 
  coord_cartesian(ylim=c(0,0.3)) + 
  theme(axis.title = element_text(), text = element_text(size = 12))

g2

3.1.3 Región

g3 <- data %>% group_by(region) %>% 
  summarise(porcentaje = n()) %>% 
  mutate(prop = prop.table(porcentaje)) %>% 
  mutate(region = fct_reorder(region, prop)) %>% # reordenamos valores de mayor a menor por región
  ggplot(aes(x = region, y = prop, fill = region, label = scales::percent(prop, accuracy = .1))) +
  geom_bar(stat="identity", width=0.8, position = "dodge") + # stat="identity" para indicar que use los valores del eje y en la base de datos
   geom_text(position = position_dodge2(width = .9),    
              vjust = 0.35,
              hjust = -0.8,
              size = 3) + 
  scale_y_continuous(labels=function(x) format(x, big.mark = ".", scientific = FALSE)) + # indicar scala eje y continua
  scale_fill_viridis_d(option = "viridis") + # colores para regiones 
  theme_bw() +  
  coord_flip(ylim =c(0,0.3)) +
  labs(title = 'Porcentaje de acciones contenciosas según región', 
       y = 'Porcentaje de eventos', 
       x = 'Regiones',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019',
       fill = 'Regiones')+
  theme(axis.title = element_text(), text = element_text(size = 12))

g3

3.2 Tácticas por macrozona

Para conocer la cantidad de tácticas pácificas, disruptivas y violentas empleadas en las macrozonas del país, generamos tres gráficos por cada táctica agrupando por macrozona. Luego, mediante la función grid.arrange() unimos estos gráficos en una sola lámina.

g4 <- data %>% group_by(macrozona) %>% # agrupamos por macrozona
  count(pacifica) %>% # contamos la cantidad de eventos con valor tactica "pacifica"
  mutate(prop = prop.table(n)) %>% # calculamos proporciones
  ggplot(aes(x = pacifica, y = prop, fill = macrozona, label = scales::percent(prop, accuracy = .1))) +
  geom_bar(stat="identity", width=0.8, position = "dodge") +
   geom_text(position = position_dodge2(width = .9),    
              vjust = 0.35,
              hjust = -0.8,
              size = 3)  +
  scale_fill_viridis_d(option = "viridis") + 
  theme_bw() +  
  coord_flip(ylim =c(0,1)) + 
  labs(title = 'Porcentaje de tácticas pacíficas según macrozona', 
       y = 'Porcentaje', 
       x = 'Tácticas pacíficas',
       fill = 'Macrozonas')+
  theme(axis.title = element_text(), text = element_text(size = 12))

g5 <- data %>% group_by(macrozona) %>% 
  count(disruptiva) %>% 
  mutate(prop = prop.table(n)) %>% 
  ggplot(aes(x = disruptiva, y = prop, fill = macrozona, label = scales::percent(prop, accuracy = .1))) +
  geom_bar(stat="identity", width=0.8, position = "dodge") +
   geom_text(position = position_dodge2(width = .9),    
              vjust = 0.35,
              hjust = -0.8,
              size = 3)  +
  scale_fill_viridis_d(option = "viridis") + 
  theme_bw() + 
  coord_flip(ylim =c(0,1)) + 
  labs(title = 'Porcentaje de tácticas disruptivas según macrozona', 
       y = 'Porcentaje', 
       x = 'Tácticas disruptivas',
       fill = 'Macrozonas')+
  theme(axis.title = element_text(), text = element_text(size = 12))

g6 <- data %>% group_by(macrozona) %>% 
  count(violenta) %>% 
  mutate(prop = prop.table(n)) %>% 
  ggplot(aes(x = violenta, y = prop, fill = macrozona, label = scales::percent(prop, accuracy = .1))) +
  geom_bar(stat="identity", width=0.8, position = "dodge") +
   geom_text(position = position_dodge2(width = .9),    
              vjust = 0.35,
              hjust = -0.8,
              size = 3)  +
  scale_fill_viridis_d(option = "viridis") + 
  theme_bw() +  
  coord_flip(ylim =c(0,1)) + 
  labs(title = 'Porcentaje de tácticas violentas según macrozona', 
       y = 'Porcentaje', 
       x = 'Tácticas violentas',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019',
       fill = 'Macrozonas')+
  theme(axis.title = element_text(), text = element_text(size = 12))

grid.arrange(g4, g5, g6, nrow = 3) # unir graficos. nrow indica separacion entre graficos

3.3 Evolución de demandas

La base de datos del Observatorio registra las demandas (si es que las hay) presentes en cada acción contenciosa. En este documento operacionalizamos solo 4: educacion, indigena, laboral, y salud. Ahora graficaremos estas 4 demandas para conocer su distribución general durante los años.

Primero, generamos un data.frame aparte que contenga la cantidad de eventos por cada tipo de demanda para cada año. Esto implica que debamos quedarnos solo con los valores de cada demanda mediante la función filter. Luego, unimos estos distintos data.frames en uno solo mediante la función rbind. Finalmente, graficamos agrupando las demandas para los años 2009 a 2019.

df_ed <- data %>% filter(educacion == "Sí") %>% # filtramos por valor "Sí" en la variable
  group_by(ano) %>% # agrupamos por año
  mutate(ano = as.numeric(ano)) %>% # convertimos año a numerica
  summarise(porcentaje = n()) %>% # contamos frecuencias
  mutate(demanda = "educacion") # creamos variable y recodificamos valor con tipo caracter

df_lab <- data %>% filter(laboral == "Sí") %>% 
  group_by(ano) %>% 
  mutate(ano = as.numeric(ano)) %>% 
  summarise(porcentaje = n()) %>% 
  mutate(demanda = "laboral")

df_sal <- data %>% filter(salud == "Sí") %>% 
  group_by(ano) %>% 
  mutate(ano = as.numeric(ano)) %>% 
  summarise(porcentaje = n()) %>% 
  mutate(demanda = "salud")

df_ind <- data %>% filter(indigena == "Sí") %>% 
  group_by(ano) %>% 
  mutate(ano = as.numeric(ano)) %>% 
  summarise(porcentaje = n()) %>% 
  mutate(demanda = "indigena")

df <- rbind(df_ed, df_lab, df_sal, df_ind) # unimos data.frames pegandolos hacia "abajo". Importante: las columnas deben ser iguales en nombre, orden y cantidad

g7 <- ggplot(df) + # especificamos datos
 aes(x = ano, y = porcentaje, colour = demanda) +
 geom_line() + # figura o geometria
 geom_point() + # figura o geometria
  scale_x_continuous(breaks=seq(2009, 2019, 1)) +
  scale_color_viridis_d(option = "viridis") +
   labs(title = 'Evolución cantidad de acciones contenciosas por demanda',
       y = 'Frecuencia de eventos',
       x = 'Año',
       colour = 'Demanda', 
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019')+
  geom_text(aes(label = porcentaje), vjust = -0.8,
            position = position_dodge(width = .9),
            size= 3)+
  theme_bw()+
  coord_cartesian(ylim=c(0,2000))+
  theme(legend.position = 'top', axis.title = element_text(), text = element_text(size = 12)) # legend.position para indicar posicion de la leyenda

g7

3.4 Presencia policial, heridos y muertos

La base de datos del observatorio también registra la presencia policial en los eventos de protesta, así como también la existencia de heridos y muertes en contexto de protesta. Para visualizar estos datos, primero haremos un gráfico con la evolución de la cantidad de acciones de protesta por cada año y la evolución de la presencia policial asociada. Luego, generaremos otro gráfico de barras para conocer la evolución de la cantidad de heridos y muertos por año. En ambos casos haremos data.frames respectivos para quedarnos solamente con las frecuencias de respuesta en estas tres variables: policial, heridos, muertes.

3.4.1 Presencia policial y acciones contenciosas

df_pol <- data %>% group_by(ano) %>%  # agrupamos por año
  filter(policial == "Sí") %>% # filtramos valor "Sí"
  summarise(porcentaje = n()) %>% # contamos frecuencias
  mutate(prop_poli = prop.table(porcentaje)) %>% # calculamos porcentajes
  select(ano, prop_poli) # nos quedamos con el porcentaje por año de presencia policial

df_n <- data %>% mutate(ano = as.factor(data$ano)) %>% # convertimos año a factor
  group_by(ano) %>% # agrupamos por año
  summarise(porcentaje = n()) %>% # contamos frecuencias
  mutate(prop_n = prop.table(porcentaje)) %>% # calculamos porcentajes
  select(ano, prop_n) # nos quedamos con el porcentaje de eventos por año
  
df <- merge(df_pol, df_n, by = "ano") # unimos a partir de una columna compartida en ambos data.frames o "llave" 

g8 <- df %>% ggplot(aes(x = ano)) +
  geom_col(aes(y = prop_n, label = as.character(scales::percent(prop_n, accuracy = .1)), fill = "#20A387FF")) + # grafico de barras
  geom_line(aes(y = prop_poli), stat = "identity", color = "black", size = 0.7) + # grafico de lineas
  scale_x_continuous(breaks=seq(2009, 2019, 1)) + # indicar limites de años y breaks de 1 año
   geom_text(aes(label = (round(prop_n, 3)), x = ano, y = prop_n), vjust = -0.8,
            position = position_dodge(width = .9),
            size= 3) + # redondeamos valores arriba de cada barra
   scale_y_continuous(labels = scales::percent) +  
   labs(title = 'Evolución acciones contenciosas y presencia policial', 
       y = 'Porcentaje', 
       x = 'Año',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019')+
   theme_bw() + 
  coord_cartesian(ylim=c(0,0.3)) + 
  theme(legend.position = 'top', axis.title = element_text(), text = element_text(size = 12))+
  scale_fill_manual('', labels = 'Acciones contenciosas', values = "#20A387FF") # leyenda eje y
  
g8

3.4.2 Presencia de heridos y muertos

df_m <- data %>% group_by(ano) %>% # agrupamos por año
  filter(muertes == "Sí") %>% # filtramos valor "Sí"
  mutate(muertes = "Muertos") %>% # creamos variable y recodificamos valor con tipo caracter
  select(ano, hm = muertes) # nos quedamos solo con la cantidad de muertes por año

df_h <- data %>% group_by(ano) %>% # agrupamos por año
  filter(heridos == "Sí") %>% # filtramos valor "Sí"
  mutate(heridos = "Heridos") %>% # creamos variable y recodificamos valor con tipo caracter
  select(ano, hm = heridos) # nos quedamos solo con la cantidad de heridos por año

df_hm <- rbind(df_h, df_m) %>% count(hm) # unimos y contamos frecuencias

g9 <- df_hm %>% 
ggplot(aes(fill=hm, y= n, x=ano)) + 
    geom_bar(position="dodge", stat="identity")+
  scale_x_continuous(breaks=seq(2009, 2019, 1)) +
  labs(title = 'Evolución cantidad de heridos y muertos', 
       y = 'Frecuencia', 
       x = 'Año',
       fill = '',
       caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019')+
  scale_fill_brewer(palette = "Paired") +
  geom_text(aes(label = n), vjust = -0.8,
            position = position_dodge(width = .9),
            size= 3) +
  theme_bw()+ 
  coord_cartesian(ylim=c(0,350))+
   theme(legend.position = 'bottom', axis.title = element_text(), text = element_text(size = 12))

g9

3.5 Grupos sociales en la protesta

Para finalizar, visualizaremos la evolución de participación de los grupos sociales que hemos codificado anteriormente, estos son: trabajadores y estudiantes. Primero crearemos data.frames respectivos para quedarnos con el porcentaje de respuestas para cada grupo social. Luego, unimos estos data.frames y hacemos un gráfico simple de líneas. Sin embargo, como bonus track haremos a este gráfico interactivo mediante la función ggplotly del paquete plotly.

df_t <- data %>% group_by(ano) %>% # agrupamos por año
  filter(trabajadores == "Sí") %>% # filtramos valor "Sí"
  mutate(trabajadores = "Trabajadores") %>% # creamos variable y recodificamos valor con tipo caracter
  select(ano, grupo = trabajadores, region) # nos quedamos solo los eventos donde hubo trabajadores por año y region

df_e <- data %>% group_by(ano) %>% # agrupamos por año
  filter(estudiantes == "Sí") %>% # filtramos valor "Sí"
  mutate(estudiantes = "Estudiantes") %>% # creamos variable y recodificamos valor con tipo caracter
  select(ano, grupo = estudiantes, region) # nos quedamos solo los eventos donde hubo estudiantes por año y region

df_act <- rbind(df_t, df_e) %>% # unimos data.frames
  group_by(ano) %>% # agrupamos por año
  count(grupo) %>% # contamos frecuencia de cada grupo
  mutate(prop = prop.table(n)) # calculamos porcentajes


g10 <- df_act %>% mutate(prop = round(prop, 2)) %>% # redondeamos variable prop
  ggplot(aes(x = ano, y = prop, colour = grupo))+
  geom_line(size = 1)+
  geom_point() + 
  scale_x_continuous(breaks=seq(2009, 2019, 1))+
  labs(title = 'Evolución participación trabajadores y estudiantes',
    x = 'Año',
    y = 'Porcentaje',
    caption = 'Fuente: Elaboración propia en base a Observatorio de Conflictos 2009-2019') +
  scale_colour_manual(name="Grupo social", breaks=c("Estudiantes", "Trabajadores"),
                      labels=c("Estudiantes", "Trabajadores"), values = c(Estudiantes = "#1D77E2", Trabajadores = "#c5305b")) +  # etiquetas y colores para cada grupo
 scale_y_continuous(labels = scales::percent) +  
 theme_bw() + 
 coord_cartesian(ylim=c(0,1)) + 
 theme(legend.position = 'bottom', axis.title = element_text(), text = element_text(size = 10))
  
ggplotly(g10) # animamos con ggplotly