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 graficos2.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 graficos2.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 nacionalesp5c: Añop6: Regiónp13a-d: Grupos socialesp19a1-e1: Demandasp21: Presencia policialP25: Presencia de heridosp27: Presencia de muertosp29a-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.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 summarytoolsprint(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 |
|
11 distinct values | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| region [factor] | Regiones |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| educacion [factor] | Demanda - Educacional |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| indigena [factor] | Demanda - Indígenas |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| laboral [factor] | Demanda - Laborales |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| salud [factor] | Demanda - Salud |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pacifica [factor] | Táctica - Pacífica |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| disruptiva [factor] | Táctica - Disruptiva |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| violenta [factor] | Táctica - Violenta |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| macrozona [character] | Macrozonas |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| estudiantes [factor] | Grupos social - Estudiantes |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trabajadores [factor] | Grupos social - Trabajadores |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| policial [factor] | Presencia policial |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| heridos [factor] | Presencia heridos |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| muertes [factor] | Presencia muertos |
|
|
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
g13.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))
g23.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))
g33.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 graficos3.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 Sí 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
g73.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 Sí 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
g83.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