Aplicación de Métodos de Patrones Puntuales en el Análisis Geográfico del Conflicto Armado y la Intervención del Banco Agrario en Colombia

Este proyecto utiliza el Análisis de Patrones Puntuales (APP) para estudiar la distribución espacial de eventos del conflicto armado en Colombia, centrándose en las áreas de influencia del Banco Agrario. El objetivo es identificar patrones de concentración y dispersión de la violencia para generar insumos clave para la gestión del riesgo y la toma de decisiones estratégicas en el desarrollo rural.

La metodología se aplica a tres categorías de eventos registrados entre 2023 y 2024:

Actos Letales: Homicidio y desaparición.

Dinámicas de Expulsión: Desplazamiento y despojo.

Estrategias de Control: Atentados, terrorismo y amenazas.

Se emplearán técnicas de conteo espacial, estimación de densidad y análisis de puntos calientes (Hot Spots) para analizar la intensidad y el alcance territorial de estos fenómenos en los municipios priorizados.

Solucion

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.)

procedemos a cargar la base de datos utilizada en el análisis y a visualizar su estructura, con el fin de verificar la correcta importación de las variables y comprender la organización general de la información.

# BASE DE DATOS

base_datos <- read_excel("C:/Users/johan/Downloads/MAESTRIA - CIENCIA DE DATOS/SEGUNDO SEMESTRE/ANALISIS GROGRAFICO Y ESPACIAL/TALLER 4/Banco_Agrario_DG.xlsx")
print(base_datos)
## # A tibble: 8,241 × 11
##    Departamento       ciudad   Longitud Latitud    id genero fecha_inicio_op    
##    <chr>              <chr>       <dbl>   <dbl> <dbl> <chr>  <dttm>             
##  1 Nariño             Tumaco      -78.8   1.81     95 MASCU… 2024-03-08 00:00:00
##  2 Cauca              Caloto      -76.4   3.03    104 MASCU… 2023-12-07 00:00:00
##  3 Cauca              Corinto     -76.2   3.14    106 MASCU… 2024-01-10 00:00:00
##  4 Cauca              Santand…    -76.5   3.01    124 MASCU… 2024-04-09 00:00:00
##  5 Antioquia          Tarazá      -75.4   7.58    201 MASCU… 2023-10-05 00:00:00
##  6 Cauca              Toribío     -76.3   2.96    219 MASCU… 2023-09-18 00:00:00
##  7 Cauca              Buenos …    -76.6   3.02    249 MASCU… 2022-10-28 00:00:00
##  8 Putumayo           Puerto …    -76.4   0.964   274 MASCU… 2022-08-26 00:00:00
##  9 Valle del Cauca    Cali        -76.5   3.45    541 MASCU… 2022-06-06 00:00:00
## 10 Norte de Santander Tibú        -72.7   8.64    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>

Temporalidad de los eventos del conflicto en Colombia

El análisis temporal constituye una de las primeras aproximaciones en el estudio de datos relacionados con el conflicto armado, ya que permite identificar patrones en la ocurrencia de los hechos a lo largo del tiempo. Para ello, se extraen las horas y fechas de los registros utilizando la librería lubridate, lo que facilita el filtrado, la segmentación y la exploración de tendencias específicas.

En este apartado se analiza si existen concentraciones de eventos violentos —incluyendo desplazamientos, homicidios, atentados, amenazas y desapariciones— durante los 28 dias en los distintos meses y años del periodo 2023–2024. Este enfoque busca observar si la ocurrencia de estos hechos coincide con variaciones en los montos desembolsados por el Banco Agrario, considerando que dicho día corresponde al cierre operativo mensual para múltiples productos financieros.

Al vincular la temporalidad de los eventos del conflicto con los niveles de desembolso, es posible identificar si la intensidad de la violencia podría estar asociada a cambios en la ejecución crediticia o en la dinámica financiera territorial. Este tipo de análisis aporta evidencia relevante para comprender cómo los factores de seguridad y riesgo pueden intervenir en la actividad operativa y financiera del banco en diferentes regiones del país.

# FECHAS ESTABLECIDAS
fecha_hora <- parse_date_time(
  base_datos$fecha_inicio_op,
  orders = c("dmy HMS", "ymd HMS", "mdy HMS",
             "dmy HM", "ymd HM", "mdy HM",
             "dmy", "ymd", "mdy")
)

hora <- hour(fecha_hora)
dia <- day(fecha_hora)

base_datos$dia <- dia

Distribución espacial de los hechos victimizantes en Colombia

# Calcular la frecuencia de cada tipo de evento en Trama_Waze
frecuencia_eventos <- base_datos %>%
  group_by(hecho_victimizante) %>%
  summarise(Frecuencia = n()) %>%
  arrange(desc(Frecuencia))

# Mostrar la tabla de frecuencia de tipos de eventos
table(base_datos$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 = " Tipos de Eventos en el Conflicto Armado en colombia",
       x = "Tipo de Evento", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set2")

El análisis de frecuencias revela que el evento Desplazamiento-Despojo afecta a la inmensa mayoría (96.4%) de los clientes del Banco Agrario (7,946 casos) antes de la originación de su crédito, indicando que la cartera del banco en las zonas de conflicto está compuesta mayoritariamente por población previamente victimizada en búsqueda de rehabilitación productiva. No obstante, los 280 casos que sufrieron el evento después del desembolso (3.4%) representan un riesgo crediticio directo y posterior a la inversión, subrayando la necesidad de aplicar el Análisis de Patrones Puntuales para mapear el riesgo de conflicto actualizado en las áreas de influencia del banco.

Filtro de eventos por desplazamientos - despojos para el dia 27

Este filtro se aplica para identificar y analizar los eventos de desplazamiento y despojo ocurridos específicamente el día 27 entre los años 2023 y 2024 reportados al banco.

El propósito de esta selección temporal es:

Detectar Patrones: Observar si esta fecha presenta patrones particulares de concentración o picos en la dinámica del conflicto armado.

Analizar Concentraciones: Facilitar el examen de la intensidad, las tendencias y las posibles relaciones temporales con otros factores (eventos institucionales, operativos de seguridad, o acciones de actores armados) en el territorio.

Este enfoque de corte temporal específico es útil para refinar tu Análisis de Patrones Puntuales (APP), permitiendo aislar un día de alto riesgo para su posterior georreferenciación.

# DESPLAZAMIENTO Y DESPOJO (día 27)
violencia27 <- base_datos %>% filter(hecho_victimizante == "Desplazamiento y despojo", dia == 27)

isualización Geográfica de Desplazamiento y Despojo

Una vez filtrados los datos por el evento Desplazamiento y Despojo, estos se visualizan en un mapa interactivo mediante la librería leaflet. El mapa permite la exploración de las ubicaciones exactas (Longitud y Latitud) de los eventos reportados, los cuales son agrupados en clusters dinámicos para mejorar la legibilidad y manejar la alta densidad de casos.

La interactividad del mapa es crucial para el análisis exploratorio. Al permitir a los usuarios hacer zoom y desagrupar los clusters, facilita la identificación visual inmediata de los puntos de alta concentración y ayuda a detectar patrones espaciales y estructuras territoriales que serán verificados formalmente con el Análisis de Patrones Puntuales (APP).

# Creaciòn de mapa interactivo con leaflet
m28_dd <- leaflet(violencia27) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~Longitud, lat = ~Latitud,
                   clusterOptions = markerClusterOptions(),
                   label = ~dia) %>%
  addControl(html = "<h3>Mapa de Desplazamiento y Despojo</h3>", position = "topleft")

m28_dd

Análisis Espacial de la Distribución del Hecho Desplazamiento-Despojo

En esta sección, se aplica el Análisis de Patrones Puntuales (APP) para estudiar la distribución geográfica de los eventos de Desplazamiento y Despojo ocurridos el día 28. El objetivo es generar un Mapa de Densidad Kernel (Mapa de Calor) para visualizar la intensidad continua del riesgo y determinar, mediante el análisis de Puntos Calientes (Hot Spots), las áreas de concentración estadísticamente significativa del conflicto en esta fecha.

# Crear un mapa interactivo con leaflet y addHeatmap
leaflet(violencia27) %>%
  addProviderTiles("OpenStreetMap") %>%
  addHeatmap(
    lng = ~Longitud, lat = ~Latitud,
    intensity = ~monto_desembolso,
    blur = 20, max = 0.08, radius = 15
  ) %>%
  addLegend("bottomright",
            title = "Mapa de Calor de Desplazamiento y Despojo",
            colors = c("#66C2FF", "#7FFF00", "#FFB600", "#FF006E"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Eventos de Homicidio - Desaparición (Día 27)

Se aplica un filtro para aislar los eventos de Homicidio y Desaparición ocurridos específicamente el día 27 (del período en estudio). Esta selección temporal busca identificar patrones o picos en la dinámica del conflicto armado para esa fecha. El objetivo es facilitar la examinación de concentraciones espaciales y tendencias que puedan vincularse a factores territoriales o institucionales específicos, lo cual es fundamental para el posterior Análisis de Patrones Puntuales (APP) de los actos letales.

hd27 <- base_datos %>% filter(hecho_victimizante == "Homicidio - desaparicion", dia == 27)

Visualización del Hecho Homicidio - Desaparición

Una vez filtrados los datos por el evento Homicidio y Desaparición, se utiliza la librería leaflet para generar un mapa interactivo. Este mapa permite la exploración de las ubicaciones exactas (Longitud y Latitud) de los eventos reportados, presentados en clusters dinámicos para mantener la legibilidad. La interactividad es clave para el análisis exploratorio, ya que facilita la identificación visual de los puntos de alta concentración de violencia letal, ayudando a detectar patrones espaciales iniciales que serán verificados formalmente mediante el Análisis de Patrones Puntuales (APP).

# Creaciòn del mapa interactivo
m27_hd <- leaflet(hd27) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~Longitud, lat = ~Latitud,
                   clusterOptions = markerClusterOptions(),
                   label = ~monto_desembolso) %>%
  addControl(html = "<h3>Mapa de Homicidio y Desaparición</h3>", position = "topleft")

m27_hd

Patrón de Puntos y Test de Cuadrantes

# Obtenemos los valores maximos y minimos para tener el area de interes
# Longitud
zona <- owin(
  xrange = range(base_datos$Longitud, na.rm = TRUE),
  yrange = range(base_datos$Latitud, na.rm = TRUE)
)
# Graficar el test de cuadrantes
patron_homi <- ppp(x = hd27$Longitud, y = hd27$Latitud, window = zona)
## Warning: data contain duplicated points
plot(quadratcount(patron_homi), main = "Patrón de Puntos y Test de Cuadrantes")
points(patron_homi, col = "darkred")

El gráfico representa el Conteo Espacial (Spatial Count) de los eventos de Homicidio y Desaparición dentro de una cuadrícula predefinida. La variación en el conteo por celda demuestra que los eventos letales no siguen un patrón uniforme, sino que exhiben una concentración significativa en ciertas zonas. Esta distribución heterogénea confirma la existencia de clusters espaciales que delimitan posibles áreas de mayor actividad del conflicto, sirviendo como un paso inicial para el análisis de Puntos Calientes (Hot Spots).

Gráfica de la funcion K

# Gráfico independiente: Función K-Estimación
plot(Kest(patron_homi), main = "Función K - Homicidio y Desaparición")

El gráfico de la Función K de Ripley es la prueba formal de la existencia de un patrón espacial no aleatorio. La observación de que las curvas de estimación del patrón espacial se sitúan consistentemente por encima de la curva de referencia (Patrón de Poisson) confirma la existencia de un agrupamiento espacial (clustering) en los eventos analizados.

Esto indica que la probabilidad de encontrar un evento cerca de otro es significativamente mayor que la esperada bajo una distribución completamente aleatoria, lo cual valida el uso posterior de técnicas de enfoque como el análisis de Puntos Calientes (Hot Spots).

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)

# Calcular la densidad espacial
im1 <- density(patron_homi, sigma = 0.01)
mapa_homidepa <- rast(im1)

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") %>%
  addHeatmap(lng = ~Longitud, lat = ~Latitud, intensity = ~intensity,
             blur = 20, max = 1, radius = 15) %>%
  addLegend("bottomright",
            title = "Mapa de Calor de Homicidios y Desaparición",
            colors = c("#66C2FF", "#7FFF00", "#FFB600", "#FF006E"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Filtro de Eventos por Atentados - Terrorismo - Amenazas (Día 27)

Se aplica un filtro para aislar los eventos de Atentados, Terrorismo y Amenazas ocurridos específicamente el día 27 (del período en estudio). Esta selección temporal busca identificar patrones o picos en la dinámica del conflicto armado para esa fecha. El objetivo es facilitar la examinación de concentraciones espaciales y tendencias que puedan vincularse a factores territoriales o institucionales específicos, lo cual es fundamental para el posterior Análisis de Patrones Puntuales (APP) de las estrategias de control e intimidación.

# Filtrar eventos de ATENTADOS - TERRORISMO - AMENAZAS del día 27
ata_27 <- base_datos %>% filter(hecho_victimizante == "Atentados - terrorismo - amenazas", dia == 27)

Visualizacion de hecho atentados - terrorismo - amenazas

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

m27_ata

Patrón de Puntos y Test de Cuadrantes

# Obtenemos los valores maximos y minimos para tener el area de interes
# Longitud
patron_ata <- ppp(x = ata_27$Longitud, y = ata_27$Latitud, window = zona)
# Graficar el test de cuadrantes
plot(quadratcount(patron_ata), main = "Patrón de Puntos y Test de Cuadrantes")
points(patron_ata, col = "#CC4C02")

Aquí tienes el párrafo ajustado, conciso y con la terminología precisa para describir el Test de Cuadrantes (o Análisis de Varianza en Cuadrantes) en el contexto de tu APP:

🔪 Test de Cuadrantes (Análisis de Concentración) El gráfico presenta el resultado del Test de Cuadrantes, que evalúa la distribución de los puntos de eventos dentro de una cuadrícula espacial predefinida. La variación observada en el conteo por celda (algunos cuadrantes con múltiples puntos y otros vacíos) confirma visualmente la existencia de un patrón agrupado y no una distribución espacial uniforme (aleatoria). El valor estadístico derivado de este test permite determinar si esta concentración de puntos es estadísticamente significativa o si, por el contrario, es una simple fluctuación del azar, validando la necesidad de aplicar análisis más complejos como la Función K de Ripley o el análisis de Puntos Calientes (Hot Spots).

Gráfica de la funcion K

# Gráfico independiente: Función K-Estimación
plot(Kest(patron_ata), main = "Función K - Atentados/Amenazas")

El gráfico compara las distintas estimaciones de la Función K que evalúan el patrón espacial de los eventos. La curva que representa el comportamiento esperado bajo un patrón completamente aleatorio (Kpois), sirve como referencia. El hecho de que todas las curvas estimadas (K_iso, K_trans y K_bord), que aplican diferentes correcciones de borde, se sitúen consistentemente por encima de la curva de referencia, evidencia que los eventos presentan un agrupamiento espacial (clustering). Esto confirma formalmente que los eventos ocurren más cerca unos de otros de lo que se esperaría aleatoriamente, validando la necesidad de aplicar análisis de concentración como los Puntos Calientes (Hot Spots).

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)
im2 <- density(patron_ata, sigma = 0.01)
mapa_ata <- rast(im2)

df_ata <- as.data.frame(mapa_ata, xy = TRUE)
colnames(df_ata) <- c("Longitud", "Latitud", "intensity")

df_ata$intensity <- (df_ata$intensity - min(df_ata$intensity)) /
  (max(df_ata$intensity) - min(df_ata$intensity))

# Crear un mapa interactivo usando leaflet
leaflet(df_ata) %>%
  addProviderTiles("OpenStreetMap") %>%
  addHeatmap(lng = ~Longitud, lat = ~Latitud, intensity = ~intensity,
             blur = 20, max = 1, radius = 15) %>%
  addLegend("bottomright",
            title = "Mapa de Calor de Atentados y Terrorismo",
            colors = c("#66C2FF", "#7FFF00", "#FFB600", "#FF006E"),
            labels = c("Bajo", "Moderado", "Alto", "Muy Alto"))

Conclusiones

Profe el presente estudio concluye que el análisis se ha segmentado estratégicamente en los municipios de Colombia con la más alta presencia histórica y actual de grupos armados, zonas que, a su vez, son cruciales para las operaciones y la cartera de clientes del Banco Agrario de Colombia.

Este enfoque geográfico riguroso fue implementado por Flavio Castillo y Johan Valencia como parte central de su proyecto de grado. Su trabajo correlaciona variables del conflicto armado (utilizando el Análisis de Patrones Puntuales) con la dinámica económica y de riesgo de la clientela de BancAgrario. La selección de estos municipios altamente sensibles garantiza que los hallazgos y las visualizaciones de Puntos Calientes (Hot Spots) generen un insumo de alto valor estratégico para la gestión del riesgo y la formulación de políticas de desarrollo rural en los territorios más afectados por la violencia.

Los datos aqui desarrollados son reales pues soy colaborar del banco.