library(readr)
library(dplyr)
library(stringr)
library(corrplot)
library(ggplot2)
library(kableExtra)Entrega 1
setwd("~/EspecializacionUNAL/TopicosEstadistica_2024/Global Protests from 1990 to March 2020")
data <- read_csv("data.csv")kable(head(data))| id | Country | Year | region | protest | protesterviolence | protesterdemand1 | protesterdemand2 | protesterdemand3 | protesterdemand4 | stateresponse1 | stateresponse2 | stateresponse3 | stateresponse4 | stateresponse5 | stateresponse6 | stateresponse7 | Electoral_Score | Liberal_Score | Participatory_Score | Deliberative_Score | Egalitarian_Score | HDI_Score | violenceStatus | predicted_prob |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 201990001 | Canada | 1990 | North America | 1 | 0 | political behavior, process | labor wage dispute | NA | NA | ignore | NA | NA | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 0 | 0.2993848 |
| 201990002 | Canada | 1990 | North America | 1 | 0 | political behavior, process | NA | NA | NA | ignore | NA | NA | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 0 | 0.2993848 |
| 201990003 | Canada | 1990 | North America | 1 | 0 | political behavior, process | NA | NA | NA | ignore | NA | NA | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 0 | 0.2993848 |
| 201990004 | Canada | 1990 | North America | 1 | 1 | land farm issue | NA | NA | NA | accomodation | NA | NA | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 1 | 0.2993848 |
| 201990005 | Canada | 1990 | North America | 1 | 1 | political behavior, process | NA | NA | NA | crowd dispersal | arrests | accomodation | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 1 | 0.2993848 |
| 201990006 | Canada | 1990 | North America | 1 | 0 | police brutality | NA | NA | NA | crowd dispersal | shootings | NA | NA | NA | NA | NA | 0.834 | 0.759 | 0.58 | 0.756 | 0.719 | 0.85 | 1 | 0.2993848 |
Este conjunto de datos registra todas las protestas ocurridas desde 1990 hasta marzo de 2020, integrando información detallada sobre demandas de los manifestantes, respuestas gubernamentales, ubicación, identidad de los protestantes y niveles de violencia asociados. Combina datos del proyecto Mass Mobilization, centrado en los movimientos ciudadanos contra gobiernos en 162 países, con indicadores de democracia del V-Dem Dataset y medidas de desarrollo humano del HDI. Las variables incluyen el país, región, año, demandas principales de los protestantes, respuestas estatales específicas, puntuaciones de gobernanza y desarrollo, así como una probabilidad predicha asociada a la violencia en cada evento. Este dataset es una herramienta valiosa para analizar dinámicas sociales, políticas y económicas a nivel global.
summary(data) id Country Year region
Min. :2.020e+08 Length:12652 Min. :1990 Length:12652
1st Qu.:2.052e+09 Class :character 1st Qu.:1999 Class :character
Median :3.732e+09 Mode :character Median :2008 Mode :character
Mean :4.264e+09 Mean :2007
3rd Qu.:6.452e+09 3rd Qu.:2014
Max. :9.102e+09 Max. :2019
protest protesterviolence protesterdemand1 protesterdemand2
Min. :1 Min. :0.000 Length:12652 Length:12652
1st Qu.:1 1st Qu.:0.000 Class :character Class :character
Median :1 Median :0.000 Mode :character Mode :character
Mean :1 Mean :0.264
3rd Qu.:1 3rd Qu.:1.000
Max. :1 Max. :1.000
protesterdemand3 protesterdemand4 stateresponse1 stateresponse2
Length:12652 Length:12652 Length:12652 Length:12652
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
stateresponse3 stateresponse4 stateresponse5 stateresponse6
Length:12652 Length:12652 Length:12652 Mode:logical
Class :character Class :character Class :character NA's:12652
Mode :character Mode :character Mode :character
stateresponse7 Electoral_Score Liberal_Score Participatory_Score
Length:12652 Min. :0.0140 Min. :0.0060 Min. :0.0090
Class :character 1st Qu.:0.3520 1st Qu.:0.2110 1st Qu.:0.2030
Mode :character Median :0.5490 Median :0.4030 Median :0.3460
Mean :0.5661 Mean :0.4467 Mean :0.3703
3rd Qu.:0.8430 3rd Qu.:0.7550 3rd Qu.:0.5820
Max. :0.9220 Max. :0.8960 Max. :0.8070
Deliberative_Score Egalitarian_Score HDI_Score violenceStatus
Min. :0.0060 Min. :0.034 Min. :0.1970 Min. :0.0000
1st Qu.:0.2410 1st Qu.:0.213 1st Qu.:0.5580 1st Qu.:0.0000
Median :0.4150 Median :0.331 Median :0.6940 Median :0.0000
Mean :0.4556 Mean :0.421 Mean :0.6795 Mean :0.4406
3rd Qu.:0.7270 3rd Qu.:0.680 3rd Qu.:0.8070 3rd Qu.:1.0000
Max. :0.8860 Max. :0.885 Max. :0.9550 Max. :1.0000
NA's :216
predicted_prob
Min. :0.2379
1st Qu.:0.3096
Median :0.4554
Mean :0.4395
3rd Qu.:0.5392
Max. :0.7754
NA's :216
El dataset contiene 12,652 observaciones y abarca eventos desde 1990 hasta 2019.
La variable protest indica que cada registro corresponde a un evento de protesta, con valores mínimos y máximos que sugieren su presencia (1) en todas las filas.
La variable protesterviolence, que refleja si hubo violencia asociada, muestra que aproximadamente el 26.4% de los eventos incluyen violencia (media = 0.264).
Las demandas de los manifestantes (protesterdemand1 a protesterdemand4) y las respuestas estatales (stateresponse1 a stateresponse7) son variables categóricas que registran las motivaciones de las protestas y las reacciones gubernamentales.
En cuanto a las puntuaciones de gobernanza y desarrollo (Electoral_Score, Liberal_Score, Participatory_Score, Deliberative_Score, Egalitarian_Score y HDI_Score), se observa una amplia variabilidad entre países y eventos, con valores mínimos cercanos a 0, reflejando bajos niveles de desarrollo o democracia, y máximos que alcanzan 0.9, indicando contextos de mayor desarrollo y democracia. Finalmente, la probabilidad predicha de violencia (predicted_prob) tiene una media de 0.44, mostrando un riesgo moderado de violencia en los eventos registrados.
missing_values_summary <- sapply(data, function(column) sum(is.na(column)))
# Mostrar el número de valores faltantes por columna
missing_values_summary <- as.data.frame(missing_values_summary)
names(missing_values_summary) <- "Missing_Values"
# Mostrar las columnas con sus valo
head(missing_values_summary,25) Missing_Values
id 0
Country 0
Year 0
region 0
protest 0
protesterviolence 0
protesterdemand1 1
protesterdemand2 10091
protesterdemand3 12317
protesterdemand4 12011
stateresponse1 23
stateresponse2 10280
stateresponse3 11896
stateresponse4 12453
stateresponse5 11995
stateresponse6 12652
stateresponse7 11893
Electoral_Score 0
Liberal_Score 0
Participatory_Score 0
Deliberative_Score 0
Egalitarian_Score 0
HDI_Score 216
violenceStatus 0
predicted_prob 216
Tras analizar los valores faltantes en el dataset, se identificaron varias columnas con una alta proporción de valores ausentes, como protesterdemand2, protesterdemand3, protesterdemand4, stateresponse2, stateresponse3, stateresponse4, stateresponse5, y stateresponse7. Además, la columna stateresponse6 no contiene ningún dato válido. Dado que estas columnas tienen más del 80% de valores faltantes, se considera que aportan poca o ninguna información relevante para el análisis. Por lo tanto, se procederá a eliminarlas del dataset para simplificar el preprocesamiento y enfocar el análisis en las variables con información más completa.
columns_to_remove <- c("protesterdemand2", "protesterdemand3", "protesterdemand4",
"stateresponse2", "stateresponse3", "stateresponse4",
"stateresponse5", "stateresponse6", "stateresponse7")
data <- data[ , !(names(data) %in% columns_to_remove)]statistical summary
numeric variables
numeric_data <- data %>%
select(where(is.numeric))
central_tendency_summary <- data.frame(
Variable = colnames(numeric_data),
Mean = sapply(numeric_data, mean, na.rm = TRUE),
Median = sapply(numeric_data, median, na.rm = TRUE),
Mode = sapply(numeric_data, function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
})
)
row.names(central_tendency_summary) <- NULL
kable(central_tendency_summary)| Variable | Mean | Median | Mode |
|---|---|---|---|
| id | 4.263609e+09 | 3.732010e+09 | 2.0199e+08 |
| Year | 2.006627e+03 | 2.008000e+03 | 2.0150e+03 |
| protest | 1.000000e+00 | 1.000000e+00 | 1.0000e+00 |
| protesterviolence | 2.639899e-01 | 0.000000e+00 | 0.0000e+00 |
| Electoral_Score | 5.660691e-01 | 5.490000e-01 | 8.9000e-01 |
| Liberal_Score | 4.467354e-01 | 4.030000e-01 | 4.2100e-01 |
| Participatory_Score | 3.702861e-01 | 3.460000e-01 | 6.3900e-01 |
| Deliberative_Score | 4.556037e-01 | 4.150000e-01 | 4.3500e-01 |
| Egalitarian_Score | 4.209568e-01 | 3.310000e-01 | 3.2900e-01 |
| HDI_Score | 6.794709e-01 | 6.940000e-01 | NA |
| violenceStatus | 4.406418e-01 | 0.000000e+00 | 0.0000e+00 |
| predicted_prob | 4.395304e-01 | 4.553887e-01 | NA |
Categoric variables
categoric_vars <- c("protest","protesterviolence","protesterdemand1",
"stateresponse1", "violenceStatus")
categoric_vars_df <- data[,categoric_vars]
sapply(categoric_vars_df, function(col) table(col))$protest
col
1
12652
$protesterviolence
col
0 1
9312 3340
$protesterdemand1
col
labor wage dispute land farm issue
1421 409
police brutality political behavior, process
657 7964
price increases, tax policy removal of politician
966 848
social restrictions
386
$stateresponse1
col
accomodation arrests beatings crowd dispersal ignore
830 874 186 3313 6841
killings shootings
219 366
$violenceStatus
col
0 1
7077 5575
La variable protest está completamente llena con el valor 1, lo que indica que todas las filas corresponden a protestas.
La variable protesterviolence muestra que la mayoría de las protestas no involucraron violencia (0), con 9312 casos frente a 3340 con violencia (1).
En cuanto a las demandas de los manifestantes protesterdemand1, la mayor parte de las protestas se enfocaron en cuestiones de comportamiento político y procesos, representando una proporción significativa con 7964 casos, seguido por otros temas como disputas laborales y aumento de precios.
La variable stateresponse1 refleja la respuesta estatal, donde la opción más común fue la ignorancia o falta de respuesta a las protestas, con 6841 casos, seguida de dispersión de multitudes y arrestos. Finalmente.
la variable violenceStatus muestra una distribución más equilibrada entre los estados de violencia, con 7077 protestas sin violencia (0) y 5575 con violencia (1).
Data visualization
num_col <- c("Year","Electoral_Score", "Liberal_Score","Participatory_Score",
"Deliberative_Score", "Egalitarian_Score", "HDI_Score", "predicted_prob")
par(mfrow = c(3,3))
for( i in num_col){
hist(numeric_data[[i]], main = i)
}categoric data
par(mfrow = c(3, 2))
barplot(table(data$Country), main = "Country")
barplot(table(data$region), main = "Region")
barplot(table(data$protesterviolence), main = "protester violence")
barplot(table(data$protesterdemand1) , main ="protesterdemand1")
barplot(table(data$stateresponse1) , main ="stateresponse1")
barplot(table(data$violenceStatus) , main ="violenceStatus")par(mfrow = c(2,4))
for(i in num_col){
boxplot(numeric_data[,i], main = i)
}Bivariate analysis
corrplot(cor(numeric_data))Warning in cor(numeric_data): the standard deviation is zero
Correlaciones fuertes entre Electoral_Score, Liberal_Score, Participatory_Score, Deliberative_Score, y Egalitarian_Score:
Estas variables miden diferentes aspectos de la democracia electoral, por lo que se espera que estén altamente correlacionadas. Los puntajes son evaluaciones de las características democráticas de un país, por lo que es natural que compartan patrones comunes. Las altas correlaciones entre estas variables son completamente coherentes con la naturaleza de las mediciones.
Una relación negativa moderada entre el puntaje electoral y la violencia de los protestantes (-0.10) puede ser interpretada como que en contextos donde hay una menor calidad democrática (puntajes más bajos de Electoral_Score), es más probable que ocurran protestas violentas. Esto podría reflejar un descontento de los ciudadanos con las condiciones democráticas, lo que lleva a que las protestas se vuelvan más intensas.
La correlación positiva de 0.675 entre estas dos variables tiene sentido, ya que ambas indican la presencia de violencia, pero desde diferentes perspectivas. Mientras que protesterviolence mide si los protestantes están involucrados en actos violentos, violenceStatus refleja si el estado ha respondido con violencia (arrestos, disparos, etc.). Es lógico que las protestas violentas tengan una alta probabilidad de estar asociadas con una respuesta violenta del estado.
La correlación de -0.22 entre Electoral_Score y violenceStatus es moderada y negativa. Esto podría sugerir que en países con mayores puntajes democráticos en términos electorales, las protestas tienden a ser menos violentas. Sin embargo, esta correlación podría ser más compleja, ya que la violencia no solo depende de los puntajes democráticos, sino también de otros factores sociales, políticos y económicos.
Relaciones no esperadas
Las correlaciones entre violenceStatus y las variables ideológicas (Liberal_Score, Participatory_Score, etc.) son negativas y relativamente bajas, lo que no es necesariamente esperado. Esto sugiere que las protestas violentas no están directamente relacionadas con los aspectos ideológicos de la democracia electoral. Sin embargo, esto podría indicar que la violencia en las protestas puede ser más influenciada por factores externos a las ideologías políticas, como las respuestas estatales o el contexto socioeconómico.
Las correlaciones cercanas a cero entre HDI_Score y las demás variables podrían ser sorprendentes, dado que se esperaría que el Índice de Desarrollo Humano (HDI) influencie en algunos aspectos de las protestas, como la participación política y la violencia. Sin embargo, la falta de correlación fuerte puede sugerir que otros factores son más determinantes en la ocurrencia de las protestas y su naturaleza (violenta o no), más allá del nivel de desarrollo humano de un país.