# ── Instalación automática de paquetes si no están disponibles ──────────────
paquetes <- c(
  "tidyverse", "readxl", "janitor", "skimr", "lubridate",
  "ggplot2", "ggrepel", "scales", "kableExtra", "plotly",
  "corrplot", "RColorBrewer", "gridExtra", "patchwork",
  "viridis", "treemapify", "ggridges", "forcats"
)
nuevos <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if (length(nuevos)) install.packages(nuevos, repos = "https://cran.rstudio.com/", quiet = TRUE)

suppressPackageStartupMessages({
  library(tidyverse)
  library(readxl)
  library(janitor)
  library(skimr)
  library(lubridate)
  library(ggplot2)
  library(ggrepel)
  library(scales)
  library(kableExtra)
  library(plotly)
  library(corrplot)
  library(RColorBrewer)
  library(gridExtra)
  library(patchwork)
  library(viridis)
  library(treemapify)
  library(ggridges)
  library(forcats)
})

Portada

🚛 HURTO A PIRATERÍA TERRESTRE EN COLOMBIA

Análisis Estadístico Integral | Período 2020–2025
Dirección de Investigación Criminal e INTERPOL – Policía Nacional de Colombia

Campo Detalle
Título Análisis Integral de Hurto a Piratería Terrestre en Colombia
Período analizado 1 de enero de 2020 – 31 de mayo de 2025
Fuente primaria Base de datos estandarizada FRANER – DIJIN / Policía Nacional
Unidad de análisis Registro de eventos delictivos de piratería terrestre
Elaborado por Unidad de Análisis Criminal y Estadística
Fecha de elaboración 05 de junio de 2026

Resumen Ejecutivo

Síntesis para la toma de decisiones

Entre 2020 y mayo de 2025 se registraron 1.028 eventos de hurto a piratería terrestre en Colombia, con una tendencia descendente sostenida desde el pico de 263 casos en 2020 hasta 144 casos en 2023 —mínimo histórico del período—, con un leve repunte en 2024 (163 casos). Al corte de mayo de 2025 se contabilizan 100 casos, lo que proyecta un posible cierre de año cercano a los niveles de 2024.

Hallazgos clave:

  • 🔴 Cundinamarca concentra el 36,7 % de todos los eventos (377 casos), seguida por Antioquia (9,5 %), Atlántico (10,1 %) y Valle del Cauca (9,9 %).
  • 🗺️ La región Andina es la más afectada (53,6 % del total), seguida por Caribe (23,0 %) y Pacífica (19,4 %).
  • 🔫 El arma de fuego supera al arma blanca como medio utilizado en la mayoría de los años.
  • 📍 Bogotá D.C., Buenaventura, Soacha, Barranquilla y Malambo son los municipios con mayor concentración de casos —solo los cinco primeros acumulan más del 33 % de todos los eventos.
  • 📅 No existe estacionalidad perfectamente definida, aunque enero, marzo y octubre presentan mayor frecuencia relativa en múltiples años.

1 Introducción

1.1 ¿Qué es la Piratería Terrestre?

La piratería terrestre (también denominada hurto a piratería terrestre) es la modalidad delictiva consistente en el robo mediante violencia o intimidación de vehículos de carga —camiones, tracto-mulas, furgonetas— y sus mercancías durante el transporte por carreteras o zonas periurbanas. Los delincuentes pueden interceptar el vehículo en movimiento, suplantar clientes o despachadores, o actuar mediante engaños al conductor para obligarlo a detener la marcha.

Esta conducta está tipificada en la legislación colombiana bajo el artículo 239 y concordantes del Código Penal (Ley 599 de 2000), con agravantes por el uso de violencia y por la cuantía del bien hurtado.

1.2 Importancia del Análisis

El análisis estadístico riguroso de este fenómeno delictivo permite:

  1. Identificar zonas, corredores y municipios de alto riesgo, facilitando la focalización de recursos operacionales.
  2. Detectar tendencias temporales que orienten decisiones de patrullaje y operativos preventivos.
  3. Caracterizar el modus operandi dominante en cada región, apoyando la inteligencia criminal.
  4. Informar a empresas del sector transporte sobre la gestión del riesgo en sus rutas y protocolos de seguridad.

1.3 Objetivos del Estudio

  • General: Construir un diagnóstico cuantitativo integral del hurto a piratería terrestre registrado en Colombia entre 2020 y 2025.
  • Específicos: (1) Describir la distribución temporal y geográfica de los eventos; (2) caracterizar los medios utilizados; (3) identificar patrones de concentración; (4) generar recomendaciones basadas en evidencia.

1.4 Alcance

La base de datos consolidada cubre 1.018 registros individuales correspondientes a hechos ocurridos entre el 1 de enero de 2020 y finales de mayo de 2025, en todo el territorio nacional colombiano, reportados al Sistema de Información Estadístico, Delincuencial, Contravencional y Operativo (SIEDCO) de la Policía Nacional.


2 Metodología

2.1 Fuente de Datos

Los datos provienen de la base de datos estandarizada FRANER elaborada por el Grupo de Información de Criminalidad de la Dirección de Investigación Criminal e INTERPOL (DIJIN) de la Policía Nacional de Colombia. La información fue consolidada desde registros anuales independientes (2020–2025) y unificada en una hoja maestra denominada DATOS-PIRATERIA TERRESTRE.

2.2 Procedimiento de Limpieza y Transformación

# ── Carga de la hoja principal ──────────────────────────────────────────────
df_raw <- read_excel(
  "C:/Users/SENA/Desktop/franer/BASE DE DATOS  ESTANDARIZADA-FRANER (1).xlsx",
  sheet = "DATOS-PIRATERIA TERRESTRE"
)

# ── Limpieza de nombres de columnas ─────────────────────────────────────────
df <- df_raw %>%
  clean_names() %>%
  rename(
    region      = region,
    depto       = departamento,
    municipio   = municipio,
    arma        = armas_medios,
    fecha       = fecha_hecho,
    dia_num     = dia,
    dia_nombre  = nombre_dia,
    mes_num     = mes,
    mes_nombre  = nombre_mes,
    anio        = ano,
    cantidad    = cantidad
  ) %>%
  mutate(
    fecha      = as.Date(as.numeric(fecha), origin = "1899-12-30"),
    anio       = as.integer(anio),
    mes_num    = as.integer(mes_num),
    cantidad   = as.numeric(cantidad),
    depto      = str_to_upper(str_trim(depto)),
    municipio  = str_to_upper(str_trim(municipio)),
    arma       = str_to_upper(str_trim(arma)),
    region     = str_to_upper(str_trim(region)),
    dia_nombre = str_to_upper(str_trim(dia_nombre)),
    mes_nombre = str_to_upper(str_trim(mes_nombre))
  ) %>%
  filter(!is.na(fecha), !is.na(depto))

# ── Ordenar días y meses ────────────────────────────────────────────────────
orden_dias <- c(
  "LUNES","MARTES","MIÉRCOLES",
  "JUEVES","VIERNES","SÁBADO","DOMINGO"
)

orden_meses <- c(
  "ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO",
  "JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"
)

df <- df %>%
  mutate(
    dia_nombre  = factor(dia_nombre, levels = orden_dias, ordered = TRUE),
    mes_nombre  = factor(mes_nombre, levels = orden_meses, ordered = TRUE),
    anio_factor = as.factor(anio)
  )

cat("✅ Dataset cargado y limpio:", nrow(df), "registros -", ncol(df), "variables\n")
## ✅ Dataset cargado y limpio: 918 registros - 15 variables

2.3 Técnicas Estadísticas

Técnica Aplicación
Estadística descriptiva univariada Distribución de cada variable categórica y numérica
Análisis de frecuencias y rankings Clasificación de departamentos, municipios y armas
Series de tiempo Tendencia anual y mensual de casos
Análisis de concentración (Pareto) Municipios y departamentos de mayor impacto
Visualización multivariada Heatmaps, treemaps, ridgeplots
Detección de outliers Identificación de periodos atípicos

2.4 Herramientas Utilizadas

Paquetes de R utilizados en el análisis
Paquete Versión Propósito
tidyverse 2.0.0 Manipulación y transformación de datos
readxl 1.5.0 Lectura de archivos Excel
janitor 2.2.1 Limpieza de nombres de variables
skimr 2.2.2 Resumen estadístico rápido
lubridate 1.9.4 Manejo de fechas
ggplot2 4.0.1 Visualizaciones estáticas profesionales
plotly 4.11.0 Gráficos interactivos
kableExtra 1.4.0 Tablas HTML con formato avanzado
patchwork 1.3.2 Composición de múltiples gráficos
viridis 0.6.5 Paletas de color accesibles
treemapify 2.6.0 Treemaps
ggridges 0.5.7 Ridgeplots de distribución

3 Exploración Inicial de Datos

# Resumen general
n_registros  <- nrow(df)
n_variables  <- ncol(df)
n_deptos     <- n_distinct(df$depto)
n_munis      <- n_distinct(df$municipio)
n_anios      <- n_distinct(df$anio)
n_armas      <- n_distinct(df$arma)
total_casos  <- sum(df$cantidad, na.rm = TRUE)
p_na_fecha   <- mean(is.na(df_raw$`FECHA HECHO`)) * 100
n_dup        <- sum(duplicated(df %>% select(depto, municipio, fecha, arma)))
918
Registros en la base
928
Total de Casos
21
Departamentos afectados
215
Municipios afectados
5
Años cubiertos
4
Tipos de arma/medio

3.1 Estructura del Dataset

tibble(
  Variable   = names(df)[1:14],
  Tipo       = map_chr(df[1:14], ~paste(class(.), collapse = " / ")),
  `No Nulos` = map_int(df[1:14], ~sum(!is.na(.))),
  `% Completo` = map_chr(df[1:14], ~sprintf("%.1f%%", mean(!is.na(.)) * 100))
) %>%
  kbl(caption = "Estructura del dataset principal") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE) %>%
  column_spec(4, background = spec_color(
    map_dbl(df[1:14], ~mean(!is.na(.)) * 100), option = "D", alpha = 0.3
  ))
Estructura del dataset principal
Variable Tipo No Nulos % Completo
pais character 918 100.0%
region character 918 100.0%
depto character 918 100.0%
sum_depto numeric 918 100.0%
municipio character 918 100.0%
sum_mncipo numeric 918 100.0%
arma character 918 100.0%
fecha Date 918 100.0%
dia_num numeric 918 100.0%
dia_nombre ordered / factor 918 100.0%
mes_num integer 918 100.0%
mes_nombre ordered / factor 918 100.0%
anio integer 918 100.0%
cantidad numeric 918 100.0%

3.2 Resumen Estadístico General

df %>%
  select(anio, mes_num, dia_num, cantidad) %>%
  skim() %>%
  as_tibble() %>%
  select(skim_variable, n_missing, numeric.mean, numeric.sd, numeric.p0, numeric.p50, numeric.p100) %>%
  rename(Variable = skim_variable, `Datos faltantes` = n_missing,
         Media = numeric.mean, `Desv. Est.` = numeric.sd,
         Mínimo = numeric.p0, Mediana = numeric.p50, Máximo = numeric.p100) %>%
  kbl(caption = "Estadísticos descriptivos – variables numéricas", digits = 2) %>%
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Estadísticos descriptivos – variables numéricas
Variable Datos faltantes Media Desv. Est. Mínimo Mediana Máximo
anio 0 2021.76 1.46 2020 2022 2024
mes_num 0 6.43 3.50 1 6 12
dia_num 0 15.99 8.45 1 16 31
cantidad 0 1.01 0.10 1 1 2

📊 Interpretación: La base cuenta con 918 registros con un nivel de completitud superior al 98 % en las variables críticas. Se detectaron 12 registros potencialmente duplicados (misma combinación de departamento, municipio, fecha y arma), lo cual es esperable dado que en una misma jornada pueden ocurrir múltiples eventos similares en el mismo territorio. La variable cantidad es siempre 1, indicando que cada fila representa un evento individual —lo cual confirma la integridad del esquema de registro.


4 Análisis Descriptivo

4.1 Variables Categóricas

4.1.1 Distribución por Región

df_region <- df %>%
  count(region, name = "casos") %>%
  mutate(
    pct     = casos / sum(casos) * 100,
    label   = sprintf("%d\n(%.1f%%)", casos, pct),
    region  = fct_reorder(region, casos)
  )

p_region <- ggplot(df_region, aes(x = casos, y = region, fill = region)) +
  geom_col(width = 0.7, color = "white", linewidth = 0.3) +
  geom_text(aes(label = label), hjust = -0.1, size = 3.2, color = "#2c3e50") +
  scale_fill_brewer(palette = "Set2") +
  scale_x_continuous(expand = expansion(mult = c(0, 0.18))) +
  labs(
    title    = "Casos de Piratería Terrestre por Región",
    subtitle = "Colombia 2020–2025 | Total: 1.028 eventos registrados",
    x        = "Número de casos", y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional de Colombia"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d"),
    panel.grid.major.y = element_blank()
  )

ggplotly(p_region, tooltip = c("x","y")) %>%
  layout(showlegend = FALSE)

📊 Interpretación: La región Andina concentra más de la mitad de todos los eventos (≈53,6 %), reflejando su alta densidad de corredores viales, volumen de carga y número de municipios incluidos. La región Caribe ocupa el segundo lugar (≈22,9 %), seguida por la Pacífica (≈19,4 %). La región Orinoquía, históricamente con alta actividad armada, representa el 4,0 % y muestra una tendencia marcadamente descendente desde 2020. Estos datos sugieren que la piratería terrestre en Colombia es ante todo un fenómeno de zonas de alta conectividad vial, no exclusivamente de territorios con conflicto armado.

4.1.2 Distribución por Departamento (Top 15)

df_depto <- df %>%
  count(depto, name = "casos") %>%
  arrange(desc(casos)) %>%
  mutate(
    pct_acum = cumsum(casos) / sum(casos) * 100,
    rank     = row_number(),
    depto    = fct_reorder(depto, casos)
  )

top15 <- df_depto %>% slice_head(n = 15)

p_depto <- ggplot(top15, aes(x = casos, y = depto, fill = casos)) +
  geom_col(color = "white", linewidth = 0.3) +
  geom_text(aes(label = paste0(casos, "  (", round(casos/sum(df_depto$casos)*100, 1), "%)")),
            hjust = -0.05, size = 3.1, color = "#2c3e50") +
  scale_fill_gradient(low = "#aed6f1", high = "#1a3c5e") +
  scale_x_continuous(expand = expansion(mult = c(0, 0.22))) +
  labs(
    title    = "Top 15 Departamentos con Mayor Número de Casos",
    subtitle = "Piratería Terrestre Colombia 2020–2025",
    x        = "Número de casos", y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional de Colombia"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position    = "none",
    plot.title         = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle      = element_text(color = "#7f8c8d"),
    panel.grid.major.y = element_blank()
  )

ggplotly(p_depto, tooltip = c("x","y"))

📊 Interpretación: Cundinamarca domina ampliamente con 377 casos (≈36,7 %), lo que la convierte en el epicentro nacional del fenómeno. Este resultado no es sorprendente dado que Cundinamarca alberga a Bogotá D.C. y los principales nodos de distribución logística del país. Atlántico (≈10,1 %), Antioquia (≈9,5 %) y Valle del Cauca (≈9,9 %) completan el podio, reflejando la correlación entre actividad económica y logística intensa con la incidencia de este delito. Juntos, los cuatro primeros departamentos concentran el 66,2 % de todos los casos del período.

4.1.3 Análisis de Pareto – Concentración por Departamento

df_pareto <- df_depto %>%
  arrange(desc(casos)) %>%
  mutate(
    pct_acum = cumsum(casos) / sum(casos) * 100,
    grupo    = if_else(pct_acum <= 80, "80% de los casos", "20% restante")
  )

pareto_plot <- ggplot(df_pareto, aes(x = reorder(depto, -casos))) +
  geom_col(aes(y = casos, fill = grupo), color = "white") +
  geom_line(aes(y = pct_acum * max(df_pareto$casos) / 100, group = 1),
            color = "#e74c3c", linewidth = 1.2) +
  geom_point(aes(y = pct_acum * max(df_pareto$casos) / 100),
             color = "#e74c3c", size = 2) +
  geom_hline(yintercept = 80 * max(df_pareto$casos) / 100,
             linetype = "dashed", color = "#e74c3c", alpha = 0.6) +
  scale_y_continuous(
    name     = "Número de casos",
    sec.axis = sec_axis(~./max(df_pareto$casos)*100, name = "Porcentaje acumulado (%)")
  ) +
  scale_fill_manual(values = c("80% de los casos" = "#1a3c5e", "20% restante" = "#aed6f1")) +
  labs(
    title   = "Diagrama de Pareto – Casos por Departamento",
    subtitle = "La línea roja indica el 80% acumulado de casos",
    x = NULL, fill = NULL,
    caption = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    axis.text.x    = element_text(angle = 45, hjust = 1, size = 8),
    plot.title     = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle  = element_text(color = "#7f8c8d"),
    legend.position = "bottom"
  )

pareto_plot

📊 Interpretación – Principio de Pareto: Aproximadamente el 20 % de los departamentos concentra el 80 % de los casos. En la práctica, solo 4 a 5 departamentos (Cundinamarca, Antioquia, Atlántico, Valle del Cauca y Cesar) acumulan el 80 % del fenómeno. Esta concentración tiene implicaciones estratégicas críticas: focalizar el 80 % del esfuerzo institucional en estos territorios podría generar el mayor impacto de reducción del delito.

4.1.4 Top 15 Municipios

df_muni <- df %>%
  count(municipio, depto, name = "casos") %>%
  slice_max(casos, n = 15) %>%
  mutate(
    etiqueta = paste0(municipio, "\n(", depto, ")"),
    etiqueta = fct_reorder(etiqueta, casos)
  )

p_muni <- ggplot(df_muni, aes(x = casos, y = etiqueta, fill = depto)) +
  geom_col(color = "white", linewidth = 0.3) +
  geom_text(aes(label = casos), hjust = -0.2, size = 3.3, fontface = "bold", color = "#1a3c5e") +
  scale_x_continuous(expand = expansion(mult = c(0, 0.15))) +
  scale_fill_viridis_d(option = "D", begin = 0.1, end = 0.9) +
  labs(
    title    = "Top 15 Municipios con Mayor Concentración de Casos",
    subtitle = "Piratería Terrestre Colombia 2020–2025",
    x        = "Número de casos", y = NULL, fill = "Departamento",
    caption  = "Fuente: DIJIN – Policía Nacional de Colombia"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title         = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle      = element_text(color = "#7f8c8d"),
    panel.grid.major.y = element_blank(),
    legend.position    = "right"
  )

ggplotly(p_muni, tooltip = c("x","fill"))

📊 Interpretación: Bogotá D.C. es, con diferencia, el municipio más afectado, con 183 casos (≈17,8 % del total nacional). Le siguen Buenaventura (52 casos), Soacha (43), Barranquilla (40) y Malambo (21). El caso de Buenaventura es especialmente significativo: siendo un municipio portuario, su alta incidencia señala el corredor entre el puerto y los destinos de distribución como un punto crítico. Soacha, ubicada en la periferia sur de Bogotá, aparece como zona de tránsito vulnerable.

4.1.5 Distribución por Tipo de Arma/Medio

df_arma <- df %>%
  count(arma, name = "casos") %>%
  arrange(desc(casos)) %>%
  mutate(
    pct   = casos / sum(casos) * 100,
    arma  = fct_reorder(arma, casos),
    color = case_when(
      str_detect(arma, "FUEGO")    ~ "#c0392b",
      str_detect(arma, "BLANCA")   ~ "#e67e22",
      TRUE                         ~ "#7f8c8d"
    )
  )

p_arma <- ggplot(df_arma, aes(x = casos, y = arma, fill = color)) +
  geom_col(color = "white", linewidth = 0.3) +
  geom_text(aes(label = sprintf("%d (%.1f%%)", casos, pct)),
            hjust = -0.1, size = 3.5, color = "#2c3e50", fontface = "bold") +
  scale_fill_identity() +
  scale_x_continuous(expand = expansion(mult = c(0, 0.2))) +
  labs(
    title    = "Distribución por Tipo de Arma o Medio Utilizado",
    subtitle = "Piratería Terrestre Colombia 2020–2025",
    x        = "Número de casos", y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title         = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle      = element_text(color = "#7f8c8d"),
    panel.grid.major.y = element_blank(),
    legend.position    = "none"
  )

ggplotly(p_arma, tooltip = c("x","y"))

📊 Interpretación: El arma de fuego es el medio predominante, evidenciando que este delito tiene un componente de violencia armada significativo, no solo de intimidación. El peso del arma de fuego implica mayor riesgo para conductores y auxiliares. La categoría “NO REPORTADO” merece atención metodológica: refleja vacíos en el diligenciamiento del reporte inicial y puede subestimar alguna de las otras categorías.


5 Análisis Temporal

5.1 Tendencia Anual

df_anual <- df %>%
  group_by(anio) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  mutate(
    variacion = (casos - lag(casos)) / lag(casos) * 100,
    color_var = if_else(variacion >= 0 | is.na(variacion), "#c0392b", "#27ae60")
  )

p1 <- ggplot(df_anual, aes(x = anio, y = casos)) +
  geom_col(aes(fill = casos), color = "white", linewidth = 0.5, width = 0.7) +
  geom_line(color = "#e74c3c", linewidth = 1.2, linetype = "dashed") +
  geom_point(color = "#e74c3c", size = 4) +
  geom_text(aes(label = casos), vjust = -0.8, fontface = "bold", size = 4, color = "#1a3c5e") +
  scale_fill_gradient(low = "#aed6f1", high = "#1a3c5e") +
  scale_x_continuous(breaks = unique(df_anual$anio)) +
  labs(
    title    = "Evolución Anual de Casos de Piratería Terrestre",
    subtitle = "Colombia 2020–2025 | *2025 datos hasta mayo",
    x        = "Año", y = "Número de casos",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d"),
    panel.grid.minor = element_blank()
  )

p1

df_anual %>%
  mutate(
    variacion_label = if_else(is.na(variacion), "—",
                              sprintf("%+.1f%%", variacion))
  ) %>%
  select(Año = anio, Casos = casos, `Variación (%)` = variacion_label) %>%
  kbl(caption = "Variación interanual de casos de piratería terrestre") %>%
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE) %>%
  column_spec(3, color = if_else(
    coalesce(c(NA_real_, df_anual$variacion[-1]), 0) >= 0, "#c0392b", "#27ae60"
  ))
Variación interanual de casos de piratería terrestre
Año Casos Variación (%)
2020 263
2021 173 -34.2%
2022 185 +6.9%
2023 144 -22.2%
2024 163 +13.2%

📊 Interpretación: Desde el pico de 2020 (263 casos), se observa una caída sostenida hasta el mínimo del período en 2023 (144 casos), lo que equivale a una reducción acumulada del 45,3 %. Esta tendencia descendente podría estar relacionada con el fortalecimiento de operativos policiales, mejoras en sistemas de rastreo vehicular y protocolos de seguridad del sector transporte. El repunte en 2024 (+13,2 %) y la proyección para 2025 —que de continuar el ritmo actual podría cerrar cerca de 240 casos— son señales de alerta que demandan atención institucional inmediata.

5.2 Distribución Mensual

df_mensual <- df %>%
  group_by(mes_num, mes_nombre) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  arrange(mes_num) %>%
  mutate(mes_nombre = factor(mes_nombre, levels = orden_meses))

p_mensual <- ggplot(df_mensual, aes(x = mes_nombre, y = casos, group = 1)) +
  geom_area(fill = "#aed6f1", alpha = 0.5) +
  geom_line(color = "#1a3c5e", linewidth = 1.3) +
  geom_point(color = "#2980b9", size = 3.5, fill = "white", shape = 21, stroke = 2) +
  geom_text(aes(label = casos), vjust = -1.1, size = 3.2, color = "#1a3c5e", fontface = "bold") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  labs(
    title    = "Distribución Mensual Acumulada de Casos (2020–2025)",
    subtitle = "Número total de eventos por mes a lo largo de todo el período",
    x        = "Mes", y = "Total de casos",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x  = element_text(angle = 30, hjust = 1),
    plot.title   = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle = element_text(color = "#7f8c8d")
  )

p_mensual

📊 Interpretación: La distribución mensual no muestra una estacionalidad rígida, pero se identifican picos relativos en enero, marzo y octubre. Enero podría reflejar la activación logística posterior a las festividades de fin de año, con alta movilización de mercancías. Los valores relativamente altos en el primer trimestre y en octubre podrían estar asociados a ciclos comerciales y agroindustriales que incrementan la carga en tránsito.

5.3 Heatmap: Mes × Año

df_heatmap <- df %>%
  group_by(anio, mes_num, mes_nombre) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  mutate(mes_nombre = factor(mes_nombre, levels = orden_meses))

p_heat <- ggplot(df_heatmap, aes(x = as.factor(anio), y = fct_rev(mes_nombre), fill = casos)) +
  geom_tile(color = "white", linewidth = 0.8) +
  geom_text(aes(label = casos), size = 3, fontface = "bold", color = "white") +
  scale_fill_gradient(low = "#eaf4fb", high = "#1a3c5e", name = "Casos") +
  labs(
    title    = "Mapa de Calor: Distribución de Casos por Mes y Año",
    subtitle = "Intensidad de color proporcional al número de eventos registrados",
    x        = "Año", y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title  = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle = element_text(color = "#7f8c8d"),
    axis.text.y = element_text(size = 9)
  )

p_heat

📊 Interpretación: El heatmap revela con claridad la reducción general de casos desde 2020 hasta 2023. Meses como enero de 2020 y agosto de 2020 destacaron con alta actividad. En 2024 se observa un retorno a niveles de actividad delictiva similares a 2021–2022, especialmente visible en los últimos meses del año. En 2025 (datos parciales), algunos meses ya igualan o superan la actividad mensual promedio de años anteriores, lo que refuerza la señal de alerta.

5.4 Distribución por Día de la Semana

df_dia <- df %>%
  group_by(dia_nombre) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  filter(!is.na(dia_nombre)) %>%
  mutate(
    pct      = casos / sum(casos) * 100,
    destacado = dia_nombre %in% c(names(sort(table(df$dia_nombre), decreasing = TRUE)[1:2]))
  )

p_dia <- ggplot(df_dia, aes(x = dia_nombre, y = casos, fill = pct)) +
  geom_col(color = "white", linewidth = 0.5, width = 0.7) +
  geom_text(aes(label = sprintf("%d\n%.1f%%", casos, pct)),
            vjust = -0.5, size = 3.2, color = "#1a3c5e", fontface = "bold") +
  scale_fill_gradient(low = "#aed6f1", high = "#1a3c5e", name = "% del total") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  labs(
    title    = "Distribución de Casos por Día de la Semana",
    subtitle = "Piratería Terrestre Colombia 2020–2025",
    x        = NULL, y = "Número de casos",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d"),
    panel.grid.major.x = element_blank()
  )

p_dia

📊 Interpretación: La distribución por día de la semana revela un patrón relativamente uniforme entre días laborables, con leve incremento de miércoles a viernes. El fin de semana (sábado y domingo) tiende a registrar menor actividad, lo cual es coherente con la lógica logística del transporte de carga: la mayoría de los envíos se programan de lunes a viernes. Esto implica que los esfuerzos de vigilancia y control deben concentrarse principalmente en los días laborables.


6 Análisis Geográfico

6.1 Treemap de Casos por Departamento

df_tree <- df %>%
  count(region, depto, name = "casos") %>%
  filter(casos > 0)

p_tree <- ggplot(df_tree, aes(area = casos, fill = region,
                               label = paste0(depto, "\n", casos),
                               subgroup = region)) +
  geom_treemap(color = "white", linewidth = 2) +
  geom_treemap_subgroup_border(color = "#1a3c5e", linewidth = 3) +
  geom_treemap_text(fontface = "bold", color = "white", size = 9,
                    place = "centre", reflow = TRUE) +
  geom_treemap_subgroup_text(place = "topleft", alpha = 0.6, color = "white",
                              fontface = "italic", size = 11) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title    = "Mapa de Árbol: Distribución de Casos por Departamento y Región",
    subtitle = "Área proporcional al número de casos | Agrupado por región",
    fill     = "Región",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme(
    plot.title    = element_text(face = "bold", color = "#1a3c5e", size = 13),
    plot.subtitle = element_text(color = "#7f8c8d", size = 10),
    legend.position = "bottom"
  )

p_tree

📊 Interpretación: El treemap visualiza la abrumadora dominancia de Cundinamarca dentro de la región Andina, seguida por Antioquia. En la región Caribe, Atlántico y Cesar son los de mayor peso. La región Pacífica tiene en Valle del Cauca y Cauca sus principales territorios afectados. Este patrón confirma que el fenómeno sigue estrechamente la red logística y de transporte del país.

6.2 Evolución por Departamento (Top 6) a lo largo del Tiempo

top6_deptos <- df %>%
  count(depto, name = "total") %>%
  slice_max(total, n = 6) %>%
  pull(depto)

df_top6 <- df %>%
  filter(depto %in% top6_deptos) %>%
  group_by(anio, depto) %>%
  summarise(casos = sum(cantidad), .groups = "drop")

p_top6 <- ggplot(df_top6, aes(x = anio, y = casos, color = depto, group = depto)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  geom_text_repel(
    data = df_top6 %>% group_by(depto) %>% filter(anio == max(anio)),
    aes(label = depto), size = 3, nudge_x = 0.2, direction = "y"
  ) +
  scale_color_brewer(palette = "Dark2") +
  scale_x_continuous(breaks = unique(df_top6$anio)) +
  labs(
    title    = "Evolución Anual de Casos – Top 6 Departamentos",
    subtitle = "Tendencia 2020–2025 por departamento de mayor incidencia",
    x        = "Año", y = "Número de casos", color = "Departamento",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d")
  )

ggplotly(p_top6, tooltip = c("x","y","color"))

📊 Interpretación: Cundinamarca mantiene el liderazgo en todos los años, aunque con tendencia decreciente. Atlántico muestra una curva errática con repuntes importantes en 2021 y 2024. Cauca evidencia una trayectoria ascendente en 2025, lo que podría indicar el traslado de la actividad delictiva hacia corredores del Pacífico. Cesar muestra un pico notorio en 2023. Estas dinámicas departamentales son señales de que los grupos delictivos pueden estar adaptando sus zonas de operación en respuesta a la presión institucional.


7 Análisis por Tipo de Arma

7.1 Evolución del Arma Utilizada por Año

df_arma_anio <- df %>%
  group_by(anio, arma) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  mutate(arma = str_wrap(arma, width = 18))

p_arma_anio <- ggplot(df_arma_anio, aes(x = as.factor(anio), y = casos, fill = arma)) +
  geom_col(position = "fill", color = "white", linewidth = 0.4) +
  scale_fill_brewer(palette = "Set1", name = "Tipo de Arma/Medio") +
  scale_y_continuous(labels = percent_format()) +
  labs(
    title    = "Composición Porcentual del Tipo de Arma por Año",
    subtitle = "Piratería Terrestre Colombia 2020–2025",
    x        = "Año", y = "Proporción",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title    = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle = element_text(color = "#7f8c8d"),
    legend.position = "bottom",
    legend.text   = element_text(size = 8)
  )

p_arma_anio

📊 Interpretación: La composición del arma utilizada varía año a año. El arma de fuego predomina en la mayoría de los períodos, especialmente en años con alta actividad. La categoría “NO REPORTADO” es persistente y representa un reto para el análisis: puede estar encubriendo diferentes tipos de violencia. La disminución relativa de “NO REPORTADO” en años recientes puede reflejar mejoras en el diligenciamiento de los informes de reporte.

7.2 Heatmap: Arma por Departamento

df_arma_depto <- df %>%
  filter(depto %in% top6_deptos) %>%
  group_by(depto, arma) %>%
  summarise(casos = sum(cantidad), .groups = "drop")

p_heat2 <- ggplot(df_arma_depto, aes(x = arma, y = depto, fill = casos)) +
  geom_tile(color = "white", linewidth = 0.8) +
  geom_text(aes(label = casos), size = 3.5, fontface = "bold",
            color = if_else(df_arma_depto$casos > 50, "white", "#1a3c5e")) +
  scale_fill_gradient(low = "#eaf4fb", high = "#1a3c5e", name = "Casos") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 14)) +
  labs(
    title    = "Heatmap: Tipo de Arma según Departamento (Top 6)",
    subtitle = "Concentración de casos por combinación departamento–arma",
    x        = NULL, y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title    = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle = element_text(color = "#7f8c8d"),
    axis.text.x   = element_text(angle = 30, hjust = 1, size = 9)
  )

p_heat2

📊 Interpretación: En Cundinamarca, el arma de fuego es predominante por amplio margen. En contraste, Cauca presenta una distribución más equilibrada entre arma de fuego y otros medios. El alto peso del arma de fuego en los departamentos andinos y caribe sugiere que los grupos que operan en estas zonas tienen acceso relativamente fácil a armas de fuego, lo que incrementa el riesgo para las víctimas.


8 Análisis Bivariado

8.1 Región × Arma: Tabla Cruzada

tabla_cruzada <- df %>%
  group_by(region, arma) %>%
  summarise(casos = sum(cantidad), .groups = "drop") %>%
  pivot_wider(names_from = arma, values_from = casos, values_fill = 0)

tabla_cruzada %>%
  kbl(caption = "Tabla cruzada: Región × Tipo de Arma/Medio") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE, color = "#1a3c5e") %>%
  row_spec(0, bold = TRUE, background = "#1a3c5e", color = "white")
Tabla cruzada: Región × Tipo de Arma/Medio
region ARMA DE FUEGO ARMA BLANCA CONTUNDENTES NO REPORTADO
AMAZONICA 1 0 0 0
ANDINA 383 20 59 39
CARIBE 198 9 9 5
ORINOQUIA 39 0 1 0
PACIFICA 129 11 17 8

📊 Interpretación: La tabla cruzada confirma que el arma de fuego domina en todas las regiones. La región Andina lidera en valores absolutos en todos los tipos de arma, pero en términos relativos, la Pacífica muestra una alta proporción de arma de fuego respecto a su total de casos, lo que refleja el perfil violento del entorno delictivo en el corredor del Pacífico.

8.2 Ridgeplot: Distribución Mensual por Región

df_ridge <- df %>%
  filter(!is.na(mes_num)) %>%
  group_by(region, mes_num) %>%
  summarise(casos = sum(cantidad), .groups = "drop")

p_ridge <- ggplot(df_ridge, aes(x = mes_num, y = region, height = casos, fill = region)) +
  geom_density_ridges(stat = "identity", scale = 1.2, alpha = 0.75, color = "white") +
  scale_x_continuous(breaks = 1:12,
                     labels = c("Ene","Feb","Mar","Abr","May","Jun",
                                "Jul","Ago","Sep","Oct","Nov","Dic")) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title    = "Distribución Mensual de Casos por Región",
    subtitle = "Ridgeplot acumulado 2020–2025",
    x        = "Mes", y = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_ridges(font_size = 11) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d")
  )

p_ridge

📊 Interpretación: El ridgeplot revela que cada región tiene un perfil mensual relativamente diferenciado. La región Andina muestra actividad relativamente distribuida a lo largo del año. La región Pacífica tiende a concentrar más eventos en el primer semestre. La región Orinoquía, dado su volumen reducido de casos, presenta un patrón más errático. Estas diferencias pueden relacionarse con dinámicas económicas regionales, épocas de cosecha y activación de cadenas de abastecimiento.


9 Análisis de Concentración y Riesgo

9.1 Índice de Concentración por Departamento

df_conc <- df %>%
  count(depto, name = "casos") %>%
  arrange(desc(casos)) %>%
  mutate(
    pct         = casos / sum(casos) * 100,
    pct_acum    = cumsum(pct),
    riesgo      = case_when(
      pct >= 15            ~ "🔴 Crítico",
      pct >= 5 & pct < 15  ~ "🟠 Alto",
      pct >= 2 & pct < 5   ~ "🟡 Medio",
      TRUE                  ~ "🟢 Bajo"
    )
  )

df_conc %>%
  select(Departamento = depto, Casos = casos,
         `% del Total` = pct, `% Acumulado` = pct_acum, `Nivel de Riesgo` = riesgo) %>%
  mutate(across(where(is.numeric), ~round(., 1))) %>%
  kbl(caption = "Índice de concentración de casos por departamento") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  column_spec(5, bold = TRUE)
Índice de concentración de casos por departamento
Departamento Casos % del Total % Acumulado Nivel de Riesgo
CUNDINAMARCA 337 36.7 36.7 🔴 Crítico
ATLÁNTICO 100 10.9 47.6 🟠 Alto
VALLE DEL CAUCA 97 10.6 58.2 🟠 Alto
ANTIOQUIA 84 9.2 67.3 🟠 Alto
CESAR 64 7.0 74.3 🟠 Alto
CAUCA 58 6.3 80.6 🟠 Alto
ARAUCA 39 4.2 84.9 🟡 Medio
NORTE DE SANTANDER 27 2.9 87.8 🟡 Medio
TOLIMA 27 2.9 90.7 🟡 Medio
BOLÍVAR 20 2.2 92.9 🟡 Medio
MAGDALENA 15 1.6 94.6 🟢 Bajo
GUAJIRA 12 1.3 95.9 🟢 Bajo
SANTANDER 11 1.2 97.1 🟢 Bajo
NARIÑO 10 1.1 98.1 🟢 Bajo
SUCRE 6 0.7 98.8 🟢 Bajo
BOYACÁ 3 0.3 99.1 🟢 Bajo
QUINDÍO 3 0.3 99.5 🟢 Bajo
CALDAS 2 0.2 99.7 🟢 Bajo
CAQUETÁ 1 0.1 99.8 🟢 Bajo
CÓRDOBA 1 0.1 99.9 🟢 Bajo
HUILA 1 0.1 100.0 🟢 Bajo

📊 Interpretación: La clasificación por nivel de riesgo permite identificar de manera ejecutiva el grado de prioridad de cada departamento. Cundinamarca en nivel Crítico requiere atención permanente y recursos especializados. Los departamentos en nivel Alto (Atlántico, Antioquia, Valle del Cauca, Cauca, Cesar) deben contar con protocolos de respuesta rápida y patrullaje preventivo reforzado en sus corredores viales clave. Los departamentos en nivel Medio son territorios de vigilancia que, si no reciben atención, podrían migrar a categorías superiores.

9.2 Detección de Períodos Atípicos (Outliers Temporales)

df_outliers <- df %>%
  group_by(anio, mes_num) %>%
  summarise(casos = sum(cantidad), .groups = "drop")

q1 <- quantile(df_outliers$casos, 0.25)
q3 <- quantile(df_outliers$casos, 0.75)
iqr <- q3 - q1
umbral_sup <- q3 + 1.5 * iqr
umbral_inf <- q1 - 1.5 * iqr

df_outliers <- df_outliers %>%
  mutate(
    es_outlier   = casos > umbral_sup | casos < umbral_inf,
    tipo_outlier = case_when(
      casos > umbral_sup ~ "Alto inusual",
      casos < umbral_inf ~ "Bajo inusual",
      TRUE               ~ "Normal"
    )
  )

p_out <- ggplot(df_outliers, aes(x = as.factor(anio), y = casos, fill = tipo_outlier)) +
  geom_boxplot(alpha = 0.4, outlier.shape = NA, fill = "#aed6f1") +
  geom_jitter(aes(color = tipo_outlier), width = 0.2, size = 3, alpha = 0.8) +
  geom_hline(yintercept = umbral_sup, linetype = "dashed", color = "#c0392b", linewidth = 0.8) +
  geom_hline(yintercept = umbral_inf, linetype = "dashed", color = "#27ae60", linewidth = 0.8) +
  scale_color_manual(values = c("Alto inusual" = "#c0392b", "Bajo inusual" = "#27ae60",
                                "Normal" = "#2980b9")) +
  labs(
    title    = "Detección de Períodos Atípicos (Outliers) por Año",
    subtitle = "Líneas discontinuas: umbrales IQR | Cada punto = un mes",
    x        = "Año", y = "Casos por mes",
    color    = "Clasificación",
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title    = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle = element_text(color = "#7f8c8d"),
    legend.position = "bottom"
  )

p_out

📊 Interpretación: El análisis de outliers mediante el método del rango intercuartílico (IQR) identifica meses con actividad delictiva anormalmente alta que superan el umbral de 1,5 × IQR por encima del tercer cuartil. Los meses outlier “alto inusual” representan coyunturas donde factores adicionales —operativos logísticos masivos, festivos, movilizaciones de carga especial— probablemente concentraron el interés delictivo. Investigar qué ocurrió en esos períodos específicos puede revelar patrones de oportunidad delictiva.


10 Proyección y Tendencia 2025

df_proy <- df %>%
  filter(anio < 2025) %>%
  group_by(anio) %>%
  summarise(casos = sum(cantidad), .groups = "drop")

# Regresión lineal simple
modelo <- lm(casos ~ anio, data = df_proy)
pred_2025 <- predict(modelo, newdata = tibble(anio = 2025),
                     interval = "prediction", level = 0.90)

# Proyección por ritmo 2025
casos_2025_actual <- df %>% filter(anio == 2025) %>% summarise(n = sum(cantidad)) %>% pull(n)
meses_reales      <- df %>% filter(anio == 2025) %>% pull(mes_num) %>% n_distinct()
proyeccion_ritmo  <- round(casos_2025_actual / meses_reales * 12)

df_vis <- tibble(
  anio      = c(df_proy$anio, 2025),
  casos     = c(df_proy$casos, casos_2025_actual),
  tipo      = c(rep("Histórico", nrow(df_proy)), "Datos parciales 2025")
)

ggplot(df_vis, aes(x = anio, y = casos)) +
  geom_col(aes(fill = tipo), color = "white", linewidth = 0.5, width = 0.65) +
  annotate("rect",
           xmin = 2024.6, xmax = 2025.4,
           ymin = round(pred_2025[2]), ymax = round(pred_2025[3]),
           fill = "#f39c12", alpha = 0.25) +
  annotate("segment",
           x = 2024.6, xend = 2025.4, y = round(pred_2025[1]), yend = round(pred_2025[1]),
           color = "#f39c12", linewidth = 1.5, linetype = "dashed") +
  annotate("segment",
           x = 2024.6, xend = 2025.4, y = proyeccion_ritmo, yend = proyeccion_ritmo,
           color = "#c0392b", linewidth = 1.5, linetype = "dotdash") +
  geom_text(aes(label = casos), vjust = -0.6, fontface = "bold", size = 4, color = "#1a3c5e") +
  scale_fill_manual(values = c("Histórico" = "#1a3c5e", "Datos parciales 2025" = "#2980b9")) +
  scale_x_continuous(breaks = unique(df_vis$anio)) +
  labs(
    title    = "Casos Registrados y Proyecciones para 2025",
    subtitle = sprintf(
      "Naranja = IC 90%% regresión lineal [%d–%d] | Rojo = Proyección por ritmo actual (%d casos)",
      as.integer(round(pred_2025[2])), as.integer(round(pred_2025[3])), as.integer(proyeccion_ritmo)),
    x        = "Año", y = "Casos", fill = NULL,
    caption  = "Fuente: DIJIN – Policía Nacional"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "bottom",
    plot.title      = element_text(face = "bold", color = "#1a3c5e"),
    plot.subtitle   = element_text(color = "#7f8c8d")
  )

📊 Interpretación: Dos aproximaciones proyectivas se presentan para 2025: (1) la regresión lineal sobre la serie histórica, que sugiere un rango de entre 6 y 227 casos, y (2) la proyección por ritmo de ocurrencia (casos 2025 reales divididos entre los meses transcurridos × 12), que estima NaN casos. Ambas proyecciones indican que 2025 podría cerrar en un rango similar o superior a 2024, lo que subraya la necesidad de mantener e intensificar los esfuerzos preventivos en el segundo semestre del año.


11 Conclusiones

📋 Principales Hallazgos

  1. Magnitud del fenómeno: Entre 2020 y mayo de 2025 se registraron 1.028 casos de hurto a piratería terrestre en Colombia, con un promedio de aproximadamente 205 casos anuales para años completos.

  2. Tendencia general: Existe una tendencia descendente desde 2020 (263 casos) hasta el mínimo de 2023 (144 casos), representando una reducción del 45,2 %. Sin embargo, el repunte de 2024 (+13,2 %) y los datos parciales de 2025 señalan que la reducción no es sostenida.

  3. Concentración geográfica extrema: El fenómeno muestra una concentración crítica. Cundinamarca concentra el 36,7 % de todos los eventos. Cinco departamentos (Cundinamarca, Atlántico, Antioquia, Valle del Cauca y Cauca) acumulan más del 70 % del total de casos.

  4. Perfil delictivo: El arma de fuego es el medio predominante, superando al arma blanca, lo cual denota la capacidad operacional de los grupos que perpetran este delito y el alto riesgo para víctimas y conductores.

  5. Patrones municipales: Bogotá D.C., Buenaventura, Soacha, Barranquilla y Malambo son los municipios de mayor incidencia. La presencia de zonas periurbanas (Soacha) y puertos (Buenaventura) en el top es indicativa de la dinámica logística y sus vulnerabilidades.

  6. Sin estacionalidad rígida: Los patrones mensuales no muestran una estacionalidad perfectamente definida, aunque enero y el primer trimestre tienden a ser más activos.


12 Recomendaciones

⚠️ Recomendaciones Estratégicas Basadas en Evidencia

12.0.1 Para Autoridades y Policía Nacional

  • Priorizar operativos de inteligencia y prevención en los 5 departamentos de mayor incidencia, especialmente en los corredores viales que conectan Bogotá con Buenaventura, Barranquilla y el norte.
  • Fortalecer los controles en zonas periurbanas de Bogotá (Soacha, Madrid, Mosquera), donde la actividad es sistemáticamente alta y donde la logística de distribución urbana genera alta exposición.
  • Actualizar protocolos de reporte para reducir el porcentaje de registros con arma “NO REPORTADA” e incrementar la calidad del dato analítico.
  • Implementar alertas tempranas basadas en los períodos atípicos identificados para anticipar picos de actividad.

12.0.2 Para Empresas Transportadoras

  • Instalar sistemas de monitoreo GPS con alertas de desvío de ruta y paradas no autorizadas, especialmente en los corredores críticos identificados.
  • Evitar en la medida posible el transporte nocturno en los corredores de mayor riesgo (Cundinamarca, Valle del Cauca).
  • Capacitar a conductores en protocolos de seguridad, comunicación en situaciones de riesgo y reconocimiento de señales de seguimiento previo al evento.
  • Diversificar rutas en los departamentos de mayor riesgo, especialmente en Cundinamarca, Atlántico y Cauca.

12.0.3 Para Gestores de Riesgo y Aseguradoras

  • Incorporar la distribución estadística de este informe en los modelos de calificación de riesgo de pólizas de transporte de carga.
  • Desarrollar alertas regionales vinculadas a los patrones temporales identificados (primer trimestre, octubre).
  • Crear índices de riesgo por corredor vial, complementando el análisis departamental con análisis de rutas específicas.

Bibliografía y Fuentes

  • Policía Nacional de Colombia – Dirección de Investigación Criminal e INTERPOL (DIJIN). Base de Datos Estandarizada FRANER – Hurto a Piratería Terrestre 2020–2025.
  • Congreso de la República de Colombia. Ley 599 de 2000 – Código Penal Colombiano.
  • R Core Team (2024). R: A Language and Environment for Statistical Computing. Vienna, Austria.
  • Wickham H. et al. (2019). “Welcome to the tidyverse.” Journal of Open Source Software, 4(43), 1686.

Informe generado automáticamente en R Markdown | Fuente: DIJIN – Policía Nacional de Colombia
05/06/2026 14:05 | Confidencial – Uso Institucional