6 ¿Dónde se producen más conflictos internacionales?
6.1 Introducción
¿Dónde se producen más conflictos internacionales? Para responder a esta pregunta, necesitamos mapear los conflictos que se están produciendo en el mundo. Y esto nos lo permitirá hacer una base de datos que ofrezca datos sobre violencia organizada. Probablemente, la más reconocida en Europa es la que aloja la ** Uppsala Conflict Data Program **, un programa de investigación orientado a la recolección de datos y a la investigación cuantitativa de conflictos armados.
Las bases de datos que publica la UCDP se pueden dividir en dos tipos. En primer lugar, hay un grupo de datos que se publican con relativa frecuencia desagregados por acontecimiento: son la Candidate Events Dataset (CED) y la Georeferenced Event Dataset (GED). En segundo lugar, hay un grupo de datos que se publican anualmente, agregados por conflicto y proporcionan información de los conflictos por estado y año. La más conocida es la UCDP-PRIO, que seguramente habréis visto en muchas estadísticas sobre conflictos que aparecen a los medios de comunicación e informes como los PRIO Annual Reports.
En este apartado utilizaremos datos del primer grupo, puesto que nos permitirá visualizar los acontecimientos de conflicto que se han producido en el último mes de datos. Para hacer la actividad:
Necesitaremos herramientas cartográficas digitales. En coherencia con otras asignaturas del grado, utilizaremos el programa R. Esto nos permitirá escoger un tipo de mapa y la escala con el que lo queremos representar.
Necesitaremos la información de conflictos armados sistematizada en una base de datos. Esta base de datos es la CED (Hegre et al. 2020) de UCDP, que proporciona información sobre los acontecimientos de conflictos brutos que se han producido en un mes determinado. La misma base de datos tiene información geográfica sobre las coordenadas en donde se han producido los acontecimientos de un determinado conflicto.
También necesitaremos saber cómo interpretar la base de datos. Por eso haremos uso del libro de códigos y de información general sobre los conflictos, más cualitativa, que podremos obtener de la misma web de UCDP y de otras páginas web.
6.2 El mapa
Las herramientas cartográficas digitales nos las proporciona el programa R. Antes de continuar en este apartado, es necesario haberse familiarizado con el programa RStudio. Por eso es necesario consultar la Guía de RStudio previamente.
Recuerda que, para utilizar un paquete, este tiene que estar instalado previamente en RStudio. Si no has instalado alguno de estos paquetes, ahora es el momento de hacerlo:
install.packages(c("dplyr", "readr",
"ggplot2", "leaflet"))
Uno de los paquetes que hemos de tener cargados para esta actividad es leaflet1, un paquete que nos permite crear mapas. El paquete contiene la función leaflet()
, que es la base para construir mapas. Utilizaremos el código que vemos a continuación para crear un mapa, que visualizaremos en el Viewer de RStudio. Dentro de la función indicaremos:
1 Para mayor información de cómo utilizar leaflet, podéis consultar Leaflet: Create Interactive Web Maps with the Javascript Leaflet Library (Cheng, Karambelkar, and Xie 2022)
- Las coordenadas del mapa con los argumentos
lng
(longitud) ylat
(latitud). - La escala del mapa con el argumento
zoom
.
También se puede cambiar el mapa base sobre el que se está operando. Con leaflet podemos conformarnos con el mapa que tenemos por defecto o bien seleccionar otro mediante la función addProviderTiles()
, que pondremos en el código en sustitución de addTiles()
. Hay varios proveedores que pueden proporcionar este mapa base. En este enlace tenéis decenas de mapas para escoger. Los tipos de mapas que se pueden escoger están almacenados en el objeto providers
, que podemos consultar si tecleamos names(providers)
.
leaflet() |>
addProviderTiles(providers$Esri.NatGeoWorldMap) |>
setView(lng = 138.727424,
lat = 35.362465,
zoom = 11)
6.3 Los datos
La base de datos CED contiene información de todos los acontecimientos relacionados con violencia armada que se han producido en el mundo en el último mes. El UCDP actualiza los datos aproximadamente a mediados de mes y, por lo tanto, por ejemplo, hacia el 15 de octubre de 2023 aparecerán los datos CED del mes de septiembre de 2023. Para descargar los datos del último mes, iremos al apartado de descargas de la web de UCDP y bajaremos el archivo CSV (marcado en la imagen siguiente en rojo) de la CED.
Si pulsamos el icono CSV, descargaremos un archivo que se llamará GEDEvent_vXX_X_X.csv; por ejemplo:
- GEDEvent_v23_0_4.csv
Nos aseguraremos que el archivo que descargamos lo ponemos en la carpeta del proyecto, de forma que lo podremos visualizar desde la ventana ‘Files’ de RStudio. A continuación, crearemos un objeto de R llamado ged
que contenga los datos del archivo.
A continuación, daremos un vistazo al objeto ged
. El marco de datos que vemos en este documento corresponde a los acontecimientos de conflicto que se produjeron durante abril de 2023. Por lo tanto, se tiene que tener en cuenta que estos datos no coincidirán con los que aparezcan en RStudio cuando se intente replicar el ejemplo. El código de R, no obstante, servirá igual.
Primero introduciremos ged
, donde tendremos una vista general de los datos. Fijémonos, por ejemplo, que en abril de 2023 se registraron 1.706 conflictos. El marco de datos tiene 49 variables. Detectamos una variable year
donde, efectivamente, vemos que todas las observaciones se han registrado en 2023. Y detectamos que al primer conflicto observado le han asignado el código 360.
ged
# A tibble: 1,706 × 49
id relid year active_year code_status type_of_violence conflict_dset_id
<dbl> <chr> <dbl> <lgl> <chr> <dbl> <chr>
1 469588 BFO-2… 2023 TRUE Clear 1 360
2 469603 BFO-2… 2023 TRUE Check dyad 1 360
3 469604 BFO-2… 2023 TRUE Clear 1 360
4 469622 RUS-2… 2023 TRUE Clear 1 13243
5 469677 PHI-2… 2023 FALSE Clear 1 14275
6 469742 BRA-2… 2023 TRUE Clear 2 15142
7 469845 BRA-2… 2023 TRUE Clear 2 15142
8 469846 BRA-2… 2023 TRUE Clear 2 15142
9 469849 BRA-2… 2023 TRUE Clear 2 15142
10 469859 AFG-2… 2023 TRUE Clear 1 13637
# ℹ 1,696 more rows
# ℹ 42 more variables: conflict_new_id <dbl>, conflict_name <chr>,
# dyad_dset_id <chr>, dyad_new_id <dbl>, dyad_name <chr>,
# side_a_dset_id <chr>, side_a_new_id <dbl>, side_a <chr>,
# side_b_dset_id <chr>, side_b_new_id <dbl>, side_b <chr>,
# number_of_sources <dbl>, source_article <chr>, source_office <chr>,
# source_date <chr>, source_headline <chr>, source_original <chr>, …
Veamos el mismo marco de datos más a fondo con glimpse()
. Esta función permite dar un vistazo rápido a todas las variables e identifica cuáles son las primeras observaciones de cada variable2.
2 Alternativamente, también podemos usar View()
.
glimpse(ged)
Rows: 1,706
Columns: 49
$ id <dbl> 469588, 469603, 469604, 469622, 469677, 469742, 4698…
$ relid <chr> "BFO-2023-1-15175-54", "BFO-2023-1-15175-57.1", "BFO…
$ year <dbl> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023…
$ active_year <lgl> TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRU…
$ code_status <chr> "Clear", "Check dyad", "Clear", "Clear", "Clear", "C…
$ type_of_violence <dbl> 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ conflict_dset_id <chr> "360", "360", "360", "13243", "14275", "15142", "151…
$ conflict_new_id <dbl> 360, 360, 360, 13243, 14275, 13972, 13972, 13972, 13…
$ conflict_name <chr> "Burkina Faso: Government", "Burkina Faso: Governmen…
$ dyad_dset_id <chr> "15175", "15175", "15175", "14117", "15473", "15142"…
$ dyad_new_id <dbl> 15175, 15175, 15175, 14117, 15473, 15142, 15142, 151…
$ dyad_name <chr> "Government of Burkina Faso - JNIM", "Government of …
$ side_a_dset_id <chr> "78", "78", "78", "57", "154", "772", "772", "772", …
$ side_a_new_id <dbl> 78, 78, 78, 57, 154, 772, 772, 772, 772, 130, 130, 1…
$ side_a <chr> "Government of Burkina Faso", "Government of Burkina…
$ side_b_dset_id <chr> "6716", "6716", "6716", "61", "234", "3176", "3176",…
$ side_b_new_id <dbl> 6716, 6716, 6716, 61, 234, 3176, 3176, 3176, 3176, 2…
$ side_b <chr> "JNIM", "JNIM", "JNIM", "Government of Ukraine", "IS…
$ number_of_sources <dbl> 1, 2, 2, 2, 2, 1, 1, 1, 1, 8, 6, 7, 10, 9, 4, 1, 2, …
$ source_article <chr> "\"@AlerteTemoin,2023-04-03,Zondoma \"", "\"@Danoumi…
$ source_office <chr> "@AlerteTemoin", "@Danoumis_Traore;Sahel Intelligenc…
$ source_date <chr> "2023-04-03", "2023-04-03;2023-04-04", "2023-04-04;2…
$ source_headline <chr> "Zondoma", "#Burkina;Burkina Faso: several terrorist…
$ source_original <chr> NA, "Army", NA, "Daily Kos, Reporting from Ukraine",…
$ where_prec <dbl> 1, 2, 1, 1, 4, 2, 1, 1, 2, 1, 1, 1, 3, 2, 5, 5, 1, 1…
$ where_coordinates <chr> "Bougounam village", "Soum-Bellah village", "Tawori …
$ where_description <chr> "Bougounam, Zondoma", "Soum Bella (Sahel), area of",…
$ adm_1 <chr> "Nord region", "Sahel region", "Est region", "Donets…
$ adm_2 <chr> "Zondoma province", "Soum province", "Tapoa province…
$ latitude <dbl> 13.36259, 14.76129, 12.04667, 48.59244, 7.90000, -10…
$ longitude <dbl> -2.39254, -1.11884, 1.40688, 37.99993, 124.35000, -3…
$ geom_wkt <chr> "POINT (-2.39254 13.36259)", "POINT (-1.11884 14.761…
$ priogrid_gid <dbl> 148676, 150838, 147243, 199876, 141009, 114766, 1161…
$ country <chr> "Burkina Faso", "Burkina Faso", "Burkina Faso", "Ukr…
$ country_id <dbl> 439, 439, 439, 369, 840, 140, 140, 140, 140, 700, 70…
$ region <chr> "Africa", "Africa", "Africa", "Europe", "Asia", "Ame…
$ event_clarity <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ date_prec <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ date_start <dttm> 2023-04-02, 2023-04-03, 2023-04-03, 2023-04-04, 202…
$ date_end <dttm> 2023-04-02, 2023-04-03, 2023-04-03, 2023-04-04, 202…
$ deaths_a <dbl> 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 4, 0, 0, 0…
$ deaths_b <dbl> 7, 10, 0, 0, 3, 0, 0, 0, 0, 6, 2, 1, 6, 2, 0, 24, 2,…
$ deaths_civilians <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0…
$ deaths_unknown <dbl> 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1…
$ best <dbl> 8, 10, 0, 8, 3, 2, 1, 1, 1, 7, 2, 1, 6, 6, 4, 24, 2,…
$ high <dbl> 8, 10, 1, 10, 3, 2, 1, 1, 1, 14, 2, 1, 6, 16, 4, 24,…
$ low <dbl> 8, 10, 0, 2, 3, 2, 1, 1, 1, 3, 0, 1, 6, 2, 4, 24, 2,…
$ gwnoa <dbl> 439, 439, 439, 365, 840, NA, NA, NA, NA, 700, 700, 7…
$ gwnob <dbl> NA, NA, NA, 369, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
De nuevo, recuerda que la información de este ejemplo no coincidirá con el marco de datos que estáis reproduciendo en vuestro ordenador, porque este ejemplo es de abril de 2023 y vosotros estaréis trabajando con unos datos más nuevos. Siguiendo con el ejemplo que se detalla con el resultado del código anterior, fijémonos en algunos detalles3:
3 La variable priogrid_gid
contiene los datos en formato raster.
- La variable
conflict_name
parece que contiene el nombre del conflicto. La primera observación se ha codificado como “Burkina Faso: Government”. - Si nos vamos moviendo hacia abajo, encontraremos que este primer conflicto del marco de datos registra un acontecimiento con violencia que involucraba al Gobierno de Burkina Faso (
side_a
) y al Grupo de Apoyo al Islam y los Musulmanes (JNIM) (side_b
), que deducimos que debe de ser un grupo armado. - El conflicto se produjo en el pueblo de Bougounam (
where_coordinates
ywhere_description
), en la provincia de Zondoma (adm_2
). - Las coordenadas son latitud 13.362590 (
latitude
) y longitud -2.39254 (longitud
). Entraremos en Google Maps y escribiremos en el buscador “13.362590 -2.39254” (orden inverso) para ver el lugar exacto. - Hacia el final del marco de datos, vemos que este acontecimiento de violencia armada no causó ninguna muerte al Gobierno de Burkina Faso (
deaths_a
), causó 7 muertos al JNIM (deaths_b
) y causó la muerte de un civil (deaths_civilians
). Las codificaciones de UCDP generan tres estimaciones de muertes:low
, que es una estimación a la baja;high
, que es una estimación al alza, ybest
, que es la estimación más fiable. En este caso, la estimación de muertes es exacta, puesto que las codificaciones de UCDP saben con certeza que se produjeron 8 muertos —las estimaciones mejor, alta y baja no coinciden en todos los acontecimientos.
6.4 El libro de códigos
Una explicación mucho más precisa de los datos que tenemos nos la dará el libro de códigos. El libro de códigos es un documento anexo a una base de datos con la información esencial para interpretar los datos que contiene. Normalmente, dentro del libro de códigos encontramos una introducción con una explicación general de lo que miden los datos y una descripción de las variables.
En la web de UCDP, iremos al apartado de descargas y bajaremos el libro de códigos de la CED.
Si abrimos el PDF del libro de códigos y vamos a la segunda práctica, veremos un índice de su contenido:
Las definiciones (página 3-4 y apéndice I) son un elemento importantísimo en cualquier base de datos de calidad. En el apartado Definitions se explica, por ejemplo, que el acontecimiento es la unidad de observación del conjunto de datos, definido como “an individual incident (phenomenon) of lethal violence occurring at a given time and place”. Por lo tanto, podemos esperar que cada una de las 1.704 filas contenga un episodio de violencia letal ocurrida en un lugar y un momento concreto del tiempo 4.
A partir de la página 5 empieza el apartado Variables in the UCDP Candidate dataset, donde se describen todas las variables de la base de datos. Si el libro de códigos está bien hecho, la lista de variables que observamos en el PDF tendría que coincidir con la lista de variables que hemos visto anteriormente mediante la función
glimpse()
.Todos los apartados del libro de códigos son interesantes. En ** Data Collection Methods** se explica qué fuentes de información utilizan los codificadores del UCDP a la hora de recoger datos de los acontecimientos.
4 Concretamente, un acontecimiento es definido como “an incident where armed force was used by an organised actor against another organized actor, or against civilians, resulting in at least 1 direct death at a specific location and a specific date”.
6.5 Exploración de los datos
Ahora que ya tenemos a mano los datos y el libro de códigos, explorémoslo más a fondo. Por eso, en este apartado conoceremos algo más a fondo las funciones unique()
, sort()
y count()
. La función unique()
nos permite saber qué categorías únicas contiene una variable. Combinada con sort()
, vemos el listado ordenado alfabéticamente. La función count()
, por su parte, nos cuenta las veces que está repetida una categoría en una variable determinada. Veamos algunos ejemplos de cómo aplicar estas funciones en el marco de datos ged
:
- ¿Qué conflictos diferentes tenemos en la base de datos?
- ¿Qué divisiones administrativas diferentes tenemos en la base de datos?
- ¿En qué países han sucedido más acontecimientos?
count(ged, country, sort = TRUE)
6.6 Mapear un conflicto internacional
Ahora agruparemos toda la información que hemos ido acumulando a lo largo de los últimos apartados para mapear un conflicto internacional. En primer lugar, miraremos de mapear todos los acontecimientos que se produjeron en el mundo en el mes que hemos tomado datos. En el caso de este ejemplo, veremos los conflictos de abril de 2023.
- Antes de la función
leaflet()
introducimos el nombre de la base de datosged
. - Especificamos una nueva función,
addCircleMarkers()
, e indicamos los argumentoslng
ylat
, nombre de los vectores donde se encuentran las coordenadas.
ged |>
leaflet() |>
addTiles() |>
addCircleMarkers(lng = ~longitude,
lat = ~latitude)
Ahora concretaremos algo más el mapa. Con las funciones que hemos visto anteriormente, hemos obtenido una lista de los conflictos que tenemos en la base de datos. Por ejemplo, si en la variable conflict_name
tenemos un conflicto que se denomina "Turkey: Kurdistan"
, podemos reproducirlo en el mapa.
ged |>
filter(conflict_name == "Turkey: Kurdistan") |>
leaflet() |>
addTiles() |>
addCircleMarkers(lng = ~longitude,
lat = ~latitude)
A continuación, veremos algunas de las opciones que se pueden introducir en el mapa:
- Con
setView()
, se pueden modificar las coordenadas y la escala del mapa. - Con
addProviderTiles()
, se puede modificar el tipo de mapa. - Dentro de
addCircleMarkers()
, se puede especificar la medida de los puntos, el color y si queremos borde.
ged |>
filter(conflict_name == "Turkey: Kurdistan") |>
leaflet() |>
setView(lng = 38.727424,
lat = 35.362465,
zoom = 6) |>
addProviderTiles(providers$Esri.NatGeoWorldMap) |>
addCircleMarkers(lng = ~longitude,
lat = ~latitude,
radius = 5,
stroke = T,
color = "black")
A continuación, se muestra alguna de las variaciones más avanzadas que se puede hacer con el paquete leaflet.
En el primer ejemplo, se quiere saber las bajas estimadas (best
) existentes en un conflicto determinado (conflict_name
):
- Se ha creado un nuevo objeto
ged_confl
en el cual solo hay los datos del conflicto que se quiere observar. - En el objeto
pal_num
se ha guardado la paleta de colores de la variable que se quiere observar (best
)5. - Se ha definido el tipo de mapa
Esri.NatGeoWorldMap
.
5 En lugar de “viridis”, se puede cambiar el color de la paleta por “magma”, “inferno” o “plasma”.
ged_confl <- ged |>
filter(conflict_name == "Turkey: Kurdistan")
pal_num <- colorNumeric(palette = "viridis",
domain = ged_confl$best,
reverse = TRUE)
ged_confl |>
leaflet() |>
addProviderTiles(providers$Esri.NatGeoWorldMap) |>
addCircleMarkers(lng = ~longitude,
lat = ~latitude,
popup = ~best,
color = ~pal_num(best),
label = ~best) |>
addLegend(pal = pal_num, #paleta de colores
values = c(min(ged_confl$best):max(ged_confl$best)), #valores mínimo y máximo
position = "bottomleft", #posición de la leyenda
title = "Baixes estimades", #título
opacity = 0.8) #transparencia de la leyenda
En el segundo ejemplo, se quiere saber los conflictos (conflict_name
) existentes en un país (country
) determinado:
- Se ha creado un nuevo objeto
ged_ctr
en el cual solo hay los datos del país que se quiere observar. - En el objeto
pal_fact
se ha guardado la paleta de colores de la variable que se quiere observar (conflict_name
)6. - Se ha definido el tipo de mapa
CartoDB.Voyager
.
6 Se pueden ver otros colores de paleta en esta web.
ged_ctr <- ged |>
filter(country == "Cameroon")
pal_fact <- colorFactor(palette = "Dark2", domain = ged_ctr$conflict_name)
ged_ctr |>
leaflet() |>
addProviderTiles(providers$CartoDB.Voyager) |>
addCircleMarkers(lng = ~longitude,
lat = ~latitude,
popup = ~conflict_name,
color = ~pal_fact(conflict_name),
label = ~conflict_name) |>
addLegend(position = "bottomright", pal = pal_fact,
values = c(unique(ged_ctr$conflict_name)),
opacity = 0.6)
6.7 Aprender más
Si quieres practicar la creación de mapas con otros paquetes de R, otras bases de datos u otras geometrías, puedes probar de hacer los ejercicios siguientes:
- Con paciencia, puedes replicar el proceso con la GED dataset, que también encontrarás en la misma página de UCDP. Ten en cuenta que el archivo tiene un nombre diferente y que el nombre de las variables puede cambiar, por lo que tendrás que consultar el libro de códigos.
- Disputas interestatales de la base de datos Correlates of War
- Disputas interestatales con el paquete leaflet
- Polígonos con los datos del Quality of Government Institute