Aplicación de Métodos de Patrones Puntuales para el AnÔlisis del conflicto armado en el suroccidente colombiano

El anÔlisis de patrones puntuales nos permite determinar cómo se distribuyen espacialmente los eventos del conflicto armado en el suroccidente colombiano, revelando zonas de concentración, dispersión y posibles estructuras territoriales de la violencia.

En el suroccidente colombiano, este enfoque se aplica a tres eventos del conflcito armados claves ocurridos entre los aƱos 2023 y 2024 como lo fueron: homicidio–desaparición, asociadas a actos letales; desplazamiento–despojo, que evidencia dinĆ”micas de expulsión; y atentados–terrorismo–amenazas, ligados a estrategias de intimidación y control. Mediante mĆ©todos de conteo espacial y anĆ”lisis de densidad, es posible reconocer las variaciones locales que contribuyen a comprender la intensidad y el alcance territorial de estos hechos.

Desarrollo

Como primera medida se cargan las librerias necesarias para el desarrollo del ejercicio.

library(readxl)            # readxl: Para la carga de datos desde archivos Excel.
library(dplyr)             # dplyr: Para la manipulación y transformación de datos.
library(lubridate)         # lubridate: Para el manejo y procesamiento de fechas y tiempos.
library(leaflet)           # leaflet: Para la creación de mapas interactivos.
library(sf)                # sf: Para trabajar con datos geoespaciales.
library(mapview)           # mapview: Para la visualización interactiva de mapas.
library(spatstat)          # spatstat: Para el anƔlisis de patrones espaciales y anƔlisis de densidad.
library(terra)             # terra: Para el manejo de datos raster y anƔlisis espacial.
library(leaflet.extras)    # leaflet.extras: Para aƱadir funciones adicionales a los mapas de leaflet
library(ggplot2)           # ggplot2: Para la creación de grÔficos y visualizaciones.
library(leafsync)          # leafsync: Para la sincronización de múltiples mapas interactivos.)

Luego obtenemos la base de datos y la visualizamos.

# BASE DE DATOS
bd <- read_excel("C:/Users/Alejo/Downloads/points_patter.xlsx")
print(bd)
## # A tibble: 8,241 Ɨ 11
##    zonal  nombre_oficina       Longitud Latitud    id genero fecha_inicio_op    
##    <chr>  <chr>                   <dbl>   <dbl> <dbl> <chr>  <dttm>             
##  1 Cauca  CALOTO                  -76.4   3.03     95 MASCU… 2024-03-08 00:00:00
##  2 Cauca  EL TAMBO (CAUCA)        -76.8   2.45    104 MASCU… 2023-12-07 00:00:00
##  3 Cauca  EL TAMBO (CAUCA)        -76.8   2.45    106 MASCU… 2024-01-10 00:00:00
##  4 Cauca  EL TAMBO (CAUCA)        -76.8   2.45    124 MASCU… 2024-04-09 00:00:00
##  5 Cauca  MERCADERES              -77.2   1.79    201 MASCU… 2023-10-05 00:00:00
##  6 Cauca  EL BORDO                -77.0   2.11    219 MASCU… 2023-09-18 00:00:00
##  7 Cauca  SAN SEBASTIAN (CAUC…    -76.8   1.84    249 MASCU… 2022-10-28 00:00:00
##  8 Cauca  SAN SEBASTIAN (CAUC…    -76.8   1.84    274 MASCU… 2022-08-26 00:00:00
##  9 NariƱo PUERRES                 -77.5   0.885   541 MASCU… 2022-06-06 00:00:00
## 10 NariƱo PUERRES                 -77.5   0.885   542 MASCU… 2023-09-26 00:00:00
## # ℹ 8,231 more rows
## # ℹ 4 more variables: monto_desembolso <dbl>, hecho_victimizante <chr>,
## #   COMPARATIVO_OCURRENCIA_HECHO <chr>, `Tipo Factor Externo` <chr>

AnƔlisis temporal de los eventos del conflcito armado

El anÔlisis temporal es una de las primeras aproximaciones que se realiza en los datos, permitiendo identificar patrones en la distribución de eventos a lo largo del día. En esta sección, se extraen las horas y los días a partir de los datos originales utilizando la librería lubridate. Esto facilita el filtrado de eventos en fechas y horas específicas.

El objetivo es analizar si existen concentraciones de eventos dependiendo el monto de desembolso y cómo estos se distribuyen a lo largo del día 28 en los diferentes meses y años (2023 - 2024), Al vincular la ocurrencia de hechos como desplazamientos, homicidios, atentados y amenazas específicamente en esta fecha, es posible observar si existe una relación entre la intensidad de la violencia en esos días y cambios en la asignación de recursos crediticios o de apoyo económico, aportando evidencia para comprender cómo el conflicto incide en las dinÔmicas financieras del territorio.

# Convertir la fecha y extraer la hora y el dĆ­a
fecha_hora <- parse_date_time(
  bd$fecha_inicio_op,
  orders = c("dmy HMS", "ymd HMS", "mdy HMS",
             "dmy HM", "ymd HM", "mdy HM",
             "dmy", "ymd", "mdy")  # si no tiene hora
)

hora = hour(fecha_hora)

dia = day(fecha_hora)

# Agregar la columna de dia a los datos
bd$dia = dia

Distribución de eventos del conflicto armado

# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos <- bd %>%
  group_by(hecho_victimizante) %>%                 # Agrupar por tipo de evento
  summarise(Frecuencia = n()) %>%     # Contar la frecuencia de cada tipo
  arrange(desc(Frecuencia))           # Ordenar por frecuencia descendente

# Mostrar la tabla de frecuencia de tipos de eventos
table(bd$hecho_victimizante)
## 
## Abandono o Despojo Forzado de Tierras     Atentados - terrorismo - amenazas 
##                                     2                                   320 
##              Desplazamiento y despojo              Homicidio - desaparicion 
##                                  7294                                   615 
##      Violencia sexual - reclutamiento 
##                                    10
# Crear un grƔfico de barras con ggplot2 usando los datos de Trama_Waze
ggplot(frecuencia_eventos, aes(x = hecho_victimizante, y = Frecuencia, fill = hecho_victimizante)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Distribución de Tipos de Eventos en conflicto armado", 
       x = "Tipo de Evento", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  # Rotar etiquetas para mejor visualización
  scale_fill_brewer(palette = "Set2")  # Utilizar una paleta de colores predefinida

Como podemos observar los desplazamientos - despojos es el evento que ocurre con mayor frecuencia con mas de 7mil casos

Filtro de eventos por desplazamientos - despojos para el dia 26

Este filtro permite identificar y analizar los eventos de desplazamiento y despojo ocurridos específicamente el día 26, con el fin de observar si esta fecha presenta patrones particulares en la dinÔmica del conflicto armado. Esta selección temporal facilita examinar concentraciones, tendencias y posibles relaciones con otros factores territoriales o institucionales.

pos <- which(bd$hecho_victimizante == "Desplazamiento y despojo" & dia == 28)
peligro28 <- bd[pos,]

Visualización del hecho desplazamiento y despojo

Una vez filtrados los datos por el hecho victimizante, se procede a visualizarlos en un mapa interactivo utilizando la librerƭa leaflet. Este mapa permite explorar las ubicaciones exactas de los desplazamientos - despojos reportados, representando los eventos sobre un mapa geogrƔfico y agrupƔndolos en clusters para mejorar la legibilidad.

Los usuarios pueden interactuar con el mapa, lo que facilita la identificación visual de los puntos con mayor concentración de eventos y ayuda a identificar patrones espaciales en la distribución.

# Crear un mapa interactivo con leaflet
m28_dd <- leaflet() %>%
  addTiles() %>%
  addCircleMarkers(lng = peligro28$Longitud, lat = peligro28$Latitud,
                   clusterOptions = markerClusterOptions(),
                   label = peligro28$dia) %>%
  addControl(html = "<h3>Mapa de Desplazamiento y despojo</h3>", position = "topleft")

# Mostrar el mapa
m28_dd

AnÔlisis Espacial de la Distribución del hecho victimizante y despojo

En esta sección, se realiza un anÔlisis espacial de los eventos victimizante y despojo del día 28. El objetivo es estudiar la distribución geogrÔfica de los eventos de riesgo y generar mapas de calor que destaquen las Ôreas mÔs afectadas.

# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(peligro28) %>%
  addProviderTiles("OpenStreetMap") %>%  # AƱadir la capa base del mapa
  addHeatmap(
    lng = ~Longitud, lat = ~Latitud,               # Especificar las columnas de longitud y latitud
    intensity = ~monto_desembolso,                     # Intensidad opcional basada en la hora (o cualquier otra variable)
    blur = 20,                             # Nivel de desenfoque del mapa de calor
    max = 0.08,                            # Ajustar el valor mƔximo para la intensidad
    radius = 15                            # Radio de cada punto en el mapa de calor
  ) %>%
  addLegend("bottomright",                 # AƱadir leyenda
            title = "Mapa de Calor de Desplazamiento y despojo",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Filtro de eventos por homicidio - desaparicion para el dia 28

Este filtro permite identificar y analizar los eventos de homicidio - desaparicion ocurridos específicamente el día 26, con el fin de observar si esta fecha presenta patrones particulares en la dinÔmica del conflicto armado. Esta selección temporal facilita examinar concentraciones, tendencias y posibles relaciones con otros factores territoriales o institucionales.

pos <- which(bd$hecho_victimizante == "Homicidio - desaparicion" & dia == 28)
hd28 <- bd[pos,]

Visualización del hecho Homicidio - desaparicion

Una vez filtrados los datos por el hecho victimizante, se procede a visualizarlos en un mapa interactivo utilizando la librerƭa leaflet. Este mapa permite explorar las ubicaciones exactas de los Homicidio - desaparicion reportados, representando los eventos sobre un mapa geogrƔfico y agrupƔndolos en clusters para mejorar la legibilidad.

Los usuarios pueden interactuar con el mapa, lo que facilita la identificación visual de los puntos con mayor concentración de eventos y ayuda a identificar patrones espaciales en la distribución.

# Crear el mapa interactivo
m28_hd = leaflet(hd28) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~Longitud, lat = ~Latitud,
                   clusterOptions = markerClusterOptions(),
                   label = ~monto_desembolso) %>%
  addControl(html = "<h3>Mapa de homicidio y desapariciones<h3>", position = "topleft")

# Mostrar el mapa interactivo
m28_hd

Patrón de Puntos y Test de Cuadrantes

# Obtenemos los valores maximos y minimos para tener el area de interes
# Longitud
min(hd28$Longitud)
max(hd28$Longitud)

# Latitud
min(hd28$Latitud)
max(hd28$Latitud)

# Definir la zona de interƩs
zona <- owin(xrange = c(-77.99515, -76.22872), yrange = c(0.827732, 3.254651))

# Crear un patrón de puntos espaciales a partir de los eventos 
patron_via_homi_desa <- ppp(x = hd28$Longitud, y = hd28$Latitud, window = zona)
# Graficar el test de cuadrantes
plot(quadratcount(patron_via_homi_desa), main = "Patrón de Puntos y Test de Cuadrantes")

# Superponer los puntos sobre los cuadrantes
points(patron_via_homi_desa, col = "red")

El grÔfico muestra cómo se distribuyen los eventos de homicidio - desaparicion dentro de una cuadrícula. Cada cuadrado indica cuÔntos puntos cayeron allí. Se puede ver que algunos cuadrantes tienen muchos eventos (como 9 o 7), mientras que otros tienen 0. Esto significa que los eventos no estÔn repartidos de manera uniforme, sino que se concentran en ciertas zonas, mostrando posibles Ôreas de mayor actividad.

GrƔfica de la funcion K

# GrÔfico independiente: Función K-Estimación
plot(Kest(patron_via_homi_desa), main = "Función K-Estimación")

La grÔfica de la Función K muestra que las estimaciones del patrón espacial (Isotropica línea negra, Traslation línea roja y Border línea verde) se encuentran por encima de la curva azul (Poison), que representa el patrón aleatorio esperado. Esto indica que los eventos analizados presentan agrupamiento espacial (cluster).

Mapa de densidad de homicidios y desapariciones

# Asegurarse de que el objeto patron_via_cerrada estƩ correctamente definido
# Crear un patrón de puntos espaciales utilizando los datos correctos (via_cerrada_26)
zona <- owin(xrange = c(-77.99515, -76.22872), yrange = c(0.827732, 3.254651))
patron_via_homi_desa <- ppp(x = hd28$Longitud, y = hd28$Latitud, window = zona)
## Warning: 1 point was rejected as lying outside the specified window
## Warning: data contain duplicated points
# Calcular la densidad espacial
im1 <- density(patron_via_homi_desa, sigma = 0.01)  # Ajusta sigma segĆŗn sea necesario

# Convertir la densidad a un objeto raster usando terra
mapa_homidepa <- rast(im1)

# Convertir el raster a data.frame para leaflet
df_homidepa <- as.data.frame(mapa_homidepa, xy = TRUE)
colnames(df_homidepa) <- c("Longitud", "Latitud", "intensity")

# Normalizar los valores de intensidad entre 0 y 1
df_homidepa$intensity <- (df_homidepa$intensity - min(df_homidepa$intensity)) / 
  (max(df_homidepa$intensity) - min(df_homidepa$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(df_homidepa) %>%
  addProviderTiles("OpenStreetMap") %>%  # AƱadir la capa base
  addHeatmap(
    lng = ~Longitud, lat = ~Latitud,              # Coordenadas de longitud y latitud
    intensity = ~intensity,               # Intensidad normalizada
    blur = 20,                            # Nivel de desenfoque
    max = 1,                              # Valor mƔximo de la intensidad normalizada
    radius = 15                           # Radio para reflejar la densidad
  ) %>%
  addLegend("bottomright",                # AƱadir la leyenda
            title = "Mapa de Calor de homicidios y desaparicion",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Filtro de eventos por ATENTADOS - TERRORISMO - AMENAZAS del dĆ­a 28

Este filtro permite identificar y analizar los eventos de ATENTADOS - TERRORISMO - AMEnAZAS ocurridos específicamente el día 26, con el fin de observar si esta fecha presenta patrones particulares en la dinÔmica del conflicto armado. Esta selección temporal facilita examinar concentraciones, tendencias y posibles relaciones con otros factores territoriales o institucionales.

# Filtrar eventos de ATENTADOS - TERRORISMO - AMEAZAS del dĆ­a 28
pos <- which(bd$hecho_victimizante == "Atentados - terrorismo - amenazas" & dia == 28)
ata_28 <- bd[pos,]

Visualizacion de hecho atentados - terrorismo - amenazas

# Crear el mapa interactivo
m26_ata <- leaflet(ata_28) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~Longitud, lat = ~Latitud,
                   clusterOptions = markerClusterOptions(),
                   label = ~monto_desembolso) %>%
  addControl(html = "<h3>Mapa de Atentados, amenazas y terrorismo</h3>", position = "topleft")

# Mostrar el mapa interactivo
m26_ata

Patrón de Puntos y Test de Cuadrantes

# Obtenemos los valores maximos y minimos para tener el area de interes
# Longitud
min(ata_28$Longitud)
max(ata_28$Longitud)

# Latitud
min(ata_28$Latitud)
max(ata_28$Latitud)

# Definir la zona de interƩs
zona <- owin(xrange = c(-77.99515, -76.22872), yrange = c(0.827732, 3.254651))

# Crear un patrón de puntos espaciales a partir de los eventos 
patron_aat <- ppp(x = ata_28$Longitud, y = ata_28$Latitud, window = zona)
# Graficar el test de cuadrantes
plot(quadratcount(patron_aat), main = "Patrón de Puntos y Test de Cuadrantes")

# Superponer los puntos sobre los cuadrantes
points(patron_aat, col = "red")

El grÔfico muestra cómo se distribuyen los puntos dentro de una cuadrícula dividida en celdas. Los números indican cuÔntos eventos caen en cada cuadrante. En este caso, se observa que algunos cuadrantes tienen varios puntos mientras otros estÔn vacíos, lo cual sugiere un patrón agrupado y no una distribución uniforme. El test de cuadrantes permite evaluar si esta concentración de puntos es estadísticamente significativa o simplemente producto del azar

GrƔfica de la funcion K

# GrÔfico independiente: Función K-Estimación
plot(Kest(patron_aat), main = "Función K-Estimación")

La grÔfica compara distintas estimaciones de la Función K del patrón espacial. La línea azul representa el comportamiento esperado bajo un patrón completamente aleatorio (K_pois), mientras que las líneas negra, roja y verde (K_iso, K_trans y K_bord) muestran las estimaciones reales aplicando diferentes correcciones de borde. Como todas las curvas estimadas se sitúan por encima de la curva azul, se evidencia que los eventos presentan agrupamiento espacial, es decir, ocurren mÔs cerca unos de otros de lo que se esperaría bajo un patrón aleatorio.

Mapa de densidad de atentados - terrorismo - amenazas

# Asegurarse de que el objeto patron_via_cerrada estƩ correctamente definido
# Crear un patrón de puntos espaciales utilizando los datos correctos (via_cerrada_26)
zona <- owin(xrange = c(-77.99515, -76.22872), yrange = c(0.827732, 3.254651))
patron_aat <- ppp(x = hd28$Longitud, y = hd28$Latitud, window = zona)
## Warning: 1 point was rejected as lying outside the specified window
## Warning: data contain duplicated points
# Calcular la densidad espacial
im1 <- density(patron_aat, sigma = 0.01)  # Ajusta sigma segĆŗn sea necesario

# Convertir la densidad a un objeto raster usando terra
mapa_aat <- rast(im1)

# Convertir el raster a data.frame para leaflet
mapa_aat <- as.data.frame(mapa_aat, xy = TRUE)
colnames(mapa_aat) <- c("Longitud", "Latitud", "intensity")

# Normalizar los valores de intensidad entre 0 y 1
mapa_aat$intensity <- (mapa_aat$intensity - min(mapa_aat$intensity)) / 
  (max(mapa_aat$intensity) - min(mapa_aat$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(mapa_aat) %>%
  addProviderTiles("OpenStreetMap") %>%  # AƱadir la capa base
  addHeatmap(
    lng = ~Longitud, lat = ~Latitud,              # Coordenadas de longitud y latitud
    intensity = ~intensity,               # Intensidad normalizada
    blur = 20,                            # Nivel de desenfoque
    max = 1,                              # Valor mƔximo de la intensidad normalizada
    radius = 15                           # Radio para reflejar la densidad
  ) %>%
  addLegend("bottomright",                # AƱadir la leyenda
            title = "Mapa de Calor de atentados - amenazas - terrorismo",
            colors = c("blue", "green", "yellow", "red"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Nota

Cordial saludo profesor.

Lo primero a tener en cuenta, es que he usado otra base de datos, correspondiente a a la base de datos que he venido trabajando en la tesis de grado (la base de datos ha sido reoorganizada para evitar ambiguedades), con el fin de aplicar de mejor manera los conocimientos impartidos en las clases magistrales y los dispuestos en la plataforma.

Y para finalizar, me gustaria (si existe la posbilidad de) revisar el trabajo para mirar el tema de la intensidad. Ya que estuve buscando informacion acerca de esto, pero no me logro dar con el mapa de manera correcta, no se si es por que no trabaja con esas coordenadas geograficas, el tamaƱo del sigma o es alguna configuracion extra que deba hacer.