library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
library(knitr)
library(kableExtra)
library(forcats)
library(stringr)
library(maps)
library(viridis)
library(DT)
library(cowplot)
library(RColorBrewer)
library(DT)
c1_dark <- "#291C0E"
c2_mid <- "#6E473B"
c3_tan <- "#A78D78"
c4_beige <- "#BEB5A9"
c5_cream <- "#E1D4C2"
pal_2 <- c(c1_dark, c3_tan)
pal_5 <- c(c1_dark, c2_mid, c3_tan, c4_beige, c5_cream)
# Tema ggplot2 FORTIVA
theme_fortiva <- function(base_size = 12) {
theme_minimal(base_size = base_size) +
theme(
plot.background = element_rect(fill = "#FDFAF6", color = NA),
panel.background = element_rect(fill = "#FDFAF6", color = NA),
panel.grid.major = element_line(color = "#E1D4C2", linewidth = 0.35),
panel.grid.minor = element_blank(),
axis.text = element_text(color = c2_mid, size = 9.5),
axis.title = element_text(color = c1_dark, face = "bold", size = 10.5),
plot.title = element_text(color = c1_dark, face = "bold", size = 14,
margin = margin(b = 6)),
plot.subtitle = element_text(color = c2_mid, size = 10.5,
margin = margin(b = 10)),
plot.caption = element_text(color = c3_tan, size = 8.5, hjust = 1),
legend.background = element_rect(fill = "#FDFAF6", color = NA),
legend.key = element_rect(fill = "#FDFAF6", color = NA),
legend.title = element_text(color = c1_dark, face = "bold", size = 10),
legend.text = element_text(color = c2_mid, size = 9.5),
strip.background = element_rect(fill = c1_dark, color = NA),
strip.text = element_text(color = "white", face = "bold", size = 9.5),
plot.margin = margin(14, 14, 14, 14)
)
}
df_raw <- read_excel("BASEFINAL.xlsx", sheet = "BASEFINAL")
names(df_raw) <- iconv(names(df_raw), from = "UTF-8", to = "ASCII//TRANSLIT")
df <- df_raw %>%
rename(
arma = ARMAS_MEDIOS,
depto = DEPARTAMENTO,
municipio = MUNICIPIO,
fecha = FECHA_HECHO,
anio = ANO,
mes = MES,
dia = DIA,
cod_dane = CODIGO_DANE,
articulo = ARTICULO,
delito = DELITO,
cantidad = CANTIDAD
) %>%
mutate(
depto = str_to_title(str_trim(depto)),
municipio = str_to_title(str_trim(municipio)),
arma = str_to_title(str_trim(arma)),
delito_corto = case_when(
str_detect(delito, "COMERCIAL") ~ "Comercial",
str_detect(delito, "FINANCIER") ~ "Financiero",
TRUE ~ delito
),
mes_orden = factor(mes,
levels = c("ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO",
"JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"),
labels = c("Ene","Feb","Mar","Abr","May","Jun",
"Jul","Ago","Sep","Oct","Nov","Dic")
)
)
# Centroides de departamentos (para mapas de burbujas)
centroides <- data.frame(
depto = c("Amazonas","Antioquia","Arauca","Atlantico","Bolivar","Boyaca",
"Caldas","Caqueta","Casanare","Cauca","Cesar","Choco","Cordoba",
"Cundinamarca","Guainia","Guajira","Guaviare","Huila","Magdalena",
"Meta","Narino","Norte De Santander","Putumayo","Quindio",
"Risaralda","San Andres","Santander","Sucre","Tolima","Valle",
"Vaupes","Vichada"),
lon = c(-71.50,-75.50,-70.80,-74.95,-74.50,-72.90,-75.30,-74.00,
-72.00,-76.60,-73.50,-76.80,-75.90,-73.80,-68.50,-72.50,
-72.30,-75.50,-74.00,-73.00,-77.30,-72.80,-76.50,-75.70,
-75.90,-81.70,-73.10,-75.40,-75.20,-76.50,-70.50,-69.50),
lat = c(-1.50,6.70,6.90,10.90,8.70,5.50,5.30,1.00,5.50,2.40,
10.00,5.50,8.30,4.60,2.50,11.50,2.20,2.50,10.00,3.50,
1.30,7.90,0.50,4.50,5.00,12.50,6.70,9.30,3.80,3.90,
0.50,4.50)
)
# Contorno de Colombia desde 'maps'
colombia_outline <- map_data("world", region = "Colombia")
cat("Base cargada:", nrow(df), "registros |",
n_distinct(df$municipio), "municipios |",
n_distinct(df$depto), "departamentos\n")
## Base cargada: 238770 registros | 995 municipios | 32 departamentos
El presente informe corresponde al análisis exploratorio de datos desarrollado en R sobre los casos de hurto a entidades comerciales y financieras en Colombia durante el período 2020–2025. Este análisis hace parte del proyecto FORTIVA y tiene como propósito aplicar herramientas de programación y analítica de datos para transformar la información recolectada en resultados estadísticos y visuales que faciliten la comprensión del fenómeno estudiado.
Mediante el uso del lenguaje de programación R y herramientas de visualización de datos, se realizan consultas, depuración de información, análisis estadísticos y representaciones gráficas que permiten identificar tendencias, comportamientos y concentraciones geográficas relacionadas con los hechos registrados. El enfoque principal del análisis se centra en la exploración de variables asociadas a municipios, frecuencia de casos, evolución temporal y distribución territorial del delito.
Asimismo, este informe busca evidenciar cómo el análisis de datos puede contribuir al estudio de problemáticas de seguridad mediante la generación de información clara, organizada y visualmente comprensible. A través de técnicas de análisis exploratorio y visualización, se pretende facilitar la interpretación de los datos y apoyar la identificación de patrones relevantes dentro del conjunto de información analizado.
Finalmente, el desarrollo de este análisis en R permite fortalecer las competencias en programación para analítica de datos, integrando procesos de manipulación, exploración y representación de datos aplicados a un contexto real de estudio.
El análisis de grandes volúmenes de datos relacionados con hechos delictivos representa un desafío importante cuando no se cuenta con herramientas adecuadas para su procesamiento, organización e interpretación. En el caso de los registros de hurto a entidades comerciales y financieras en Colombia durante el período 2020–2025, existe una gran cantidad de información que requiere ser analizada de manera estructurada para identificar patrones, tendencias y comportamientos relevantes en diferentes municipios del país.
Aunque los datos contienen información valiosa, en muchos casos estos registros no son aprovechados de forma eficiente debido a la falta de procesos analíticos y visualizaciones que permitan comprender el comportamiento del fenómeno de manera clara y dinámica. Esto dificulta la identificación de municipios con mayor incidencia, variaciones temporales y posibles concentraciones geográficas del delito.
Frente a esta necesidad, surge la importancia de implementar herramientas de programación para analítica de datos, como el lenguaje R, que permitan realizar procesos de limpieza, exploración, análisis estadístico y visualización de información. A través de estas técnicas, es posible transformar los datos en información útil y comprensible para el análisis del comportamiento del hurto en entidades comerciales y financieras.
Por esta razón, el presente informe se enfoca en desarrollar un análisis exploratorio de datos en R, orientado al estudio de los registros de hurto en Colombia entre 2020 y 2025, utilizando consultas, gráficos y técnicas de visualización que permitan identificar tendencias y comportamientos relevantes, especialmente en los municipios con mayor afectación reportada.
Analizar las causas asociadas al hurto a entidades comerciales y financieras en Colombia durante el período 2020–2025, mediante la evaluación de su evolución temporal, concentración geográfica, modalidades delictivas y patrones estacionales, con el fin de identificar comportamientos delictivos y fortalecer la toma de decisiones en materia de seguridad a través del análisis de datos.
Evaluar la evolución temporal del hurto a entidades comerciales y financieras en Colombia entre los años 2020 y 2025, identificando incrementos, disminuciones y posibles variaciones significativas en los casos registrados.
Identificar los departamentos y municipios con mayor concentración de hurtos, analizando la distribución geográfica de estos delitos y las diferencias territoriales presentes en el país.
Analizar las modalidades utilizadas en el hurto a entidades comerciales y financieras, determinando los medios o mecanismos más frecuentes empleados en cada tipo de delito.
Examinar los patrones estacionales del hurto, identificando meses, días o períodos del año en los que se presenta una mayor incidencia de casos.
Comparar las características del hurto a entidades comerciales y financieras en aspectos como frecuencia, comportamiento geográfico, modalidades delictivas y tendencias temporales.
Implementar herramientas de analítica y visualización de datos mediante tecnologías como Power BI, Python y R para facilitar la interpretación de la información y apoyar la toma de decisiones basada en datos.
library(gt)
# Crea el dataframe con tus indicadores
tabla_kpi <- data.frame(
Indicador = c(
"Total de registros",
"Hurtos comerciales",
"Hurtos financieros",
"Municipios afectados",
"Departamentos",
"Columnas analizadas"
),
Cantidad = c(
238770,
238220,
550,
995,
32,
11
)
)
# Tabla estilizada
tabla_kpi %>%
gt() %>%
fmt_number(
columns = Cantidad,
decimals = 0,
sep_mark = ","
) %>%
cols_label(
Indicador = "Indicador",
Cantidad = "Cantidad"
) %>%
cols_align(align = "left", columns = Indicador) %>%
cols_align(align = "right", columns = Cantidad) %>%
tab_style(
style = list(
cell_fill(color = c1_dark),
cell_text(color = "white", weight = "bold", size = px(15))
),
locations = cells_column_labels()
) %>%
tab_style(
style = cell_text(color = c1_dark, size = px(14)),
locations = cells_body(columns = Indicador)
) %>%
tab_style(
style = cell_text(color = c1_dark, weight = "bold", size = px(14)),
locations = cells_body(columns = Cantidad)
) %>%
tab_style(
style = cell_borders(
sides = "bottom",
color = "#e0e0e0",
weight = px(1)
),
locations = cells_body()
) %>%
tab_style(
style = cell_fill(color = "#f7f9fc"),
locations = cells_body(rows = seq(1, nrow(tabla_kpi), by = 2))
) %>%
opt_table_font(font = "Inter, Arial, sans-serif") %>%
opt_stylize(style = 1) %>%
tab_options(
table.width = pct(55),
table.border.top.style = "hidden",
table.border.bottom.style = "hidden",
column_labels.border.top.width = px(0),
column_labels.border.bottom.width = px(0),
column_labels.background.color = c1_dark,
column_labels.border.lr.style = "hidden",
table_body.border.bottom.style = "hidden",
table.background.color = "white",
data_row.padding = px(12)
)
| Indicador | Cantidad |
|---|---|
| Total de registros | 238,770 |
| Hurtos comerciales | 238,220 |
| Hurtos financieros | 550 |
| Municipios afectados | 995 |
| Departamentos | 32 |
| Columnas analizadas | 11 |
# ── Datos por departamento
dep_total <- df %>%
group_by(depto) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
left_join(centroides, by = "depto") %>%
filter(!is.na(lon)) # excluir si no hay centroide
# Escala de colores por quintil
dep_total <- dep_total %>%
mutate(quintil = ntile(casos, 5))
ggplot() +
# Contorno del pais
geom_polygon(
data = colombia_outline,
aes(x = long, y = lat, group = group),
fill = "#F0EBE3", color = "#BEB5A9", linewidth = 0.4
) +
# Burbujas por departamento
geom_point(
data = dep_total,
aes(x = lon, y = lat, size = casos, fill = casos),
shape = 21, color = "white", stroke = 0.8, alpha = 0.88
) +
# Etiquetas solo top 8
geom_text(
data = dep_total %>% slice_max(casos, n = 8),
aes(x = lon, y = lat, label = paste0(depto, "\n", format(casos, big.mark=","))),
size = 2.8, fontface = "bold", color = "#291C0E",
vjust = -1.1, lineheight = 0.9
) +
scale_size_continuous(
range = c(3, 22),
name = "Casos",
labels = comma
) +
scale_fill_gradientn(
colors = c(c5_cream, c4_beige, c3_tan, c2_mid, c1_dark),
name = "Casos",
labels = comma
) +
coord_fixed(1.3,
xlim = c(-82, -66),
ylim = c(-4.5, 14)
) +
guides(
size = guide_legend(title = "Casos", override.aes = list(fill = c3_tan)),
fill = guide_colorbar(title = "Casos", barwidth = 0.7, barheight = 8)
) +
labs(
title = "Mapa de Intensidad del Hurto por Departamento",
subtitle = "Tamaño de la burbuja proporcional al total de casos 2020-2025",
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA",
x = NULL, y = NULL
) +
theme_fortiva() +
theme(
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
El mapa revela una concentración geográfica extremadamente desigual del hurto en Colombia durante 2020-2025. Cundinamarca lidera con 77.982 casos, representando el 32,7% del total nacional (238.770 casos), impulsado principalmente por Bogotá como epicentro urbano y económico del país. Le siguen Antioquia con 34.536 casos (14,5%) y Valle del Cauca con 23.329 casos (9,8%). Estos tres departamentos juntos acumulan el 56,9% del total nacional, dejando el 43,1% restante distribuido entre los otros 29 departamentos.
En un segundo nivel se ubican Atlántico (10.266), Santander (9.782) y Bolívar (7.919), todos con capitales de alta actividad comercial como Barranquilla, Bucaramanga y Cartagena. En el extremo opuesto, departamentos como Amazonas, Guainía, Vaupés y Vichada registran los valores más bajos del país, consistente con su baja densidad poblacional y escasa actividad económica formal.
# ── Top 20 municipios ─────────────────────────────────────────────────────────
top20_mun <- df %>%
group_by(municipio, delito_corto) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
group_by(municipio) %>%
mutate(total_mun = sum(casos)) %>%
ungroup() %>%
filter(municipio %in% (df %>%
group_by(municipio) %>% summarise(t = sum(cantidad)) %>%
slice_max(t, n = 20) %>% pull(municipio)
)) %>%
mutate(municipio = fct_reorder(municipio, total_mun))
ggplot(top20_mun, aes(x = municipio, y = casos, fill = delito_corto)) +
geom_col(width = 0.72, position = "stack") +
geom_text(
data = top20_mun %>% distinct(municipio, total_mun),
aes(x = municipio, y = total_mun,
label = format(total_mun, big.mark = ",")),
inherit.aes = FALSE,
hjust = -0.12, size = 3.2, color = c1_dark, fontface = "bold"
) +
scale_fill_manual(
values = c("Comercial" = c2_mid, "Financiero" = c3_tan),
name = "Tipo"
) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.14))) +
coord_flip() +
labs(
title = "Top 20 Municipios con Mayor Incidencia de Hurto",
subtitle = "Acumulado 2020-2025 | Por tipo de entidad",
x = NULL, y = "Total de Casos",
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
legend.position = "bottom",
axis.text.y = element_text(size = 10.5)
)
El ranking deja en evidencia la brecha abismal entre Bogotá y el resto del país. Bogotá acumula 64.874 casos, equivalentes al 27,2% del total nacional, siendo casi 3,4 veces el segundo municipio (Medellín con 18.978 casos). Los cinco primeros municipios Bogotá, Medellín, Cali, Barranquilla y Cartagena concentran el 46,7% de todos los hurtos del país, siendo todas capitales de departamento.
En el grupo intermedio se destacan Villavicencio (4.710), que supera a capitales más grandes como Bucaramanga (4.078) y Pereira (3.971), lo que sugiere una dinámica delictiva particular en los Llanos Orientales. Valledupar (3.918) y Neiva (3.801) también aparecen en posiciones altas pese a ser ciudades medianas, indicando una actividad comercial vulnerada de forma sostenida.
Respecto al tipo de delito, en todos los municipios el hurto a entidades comerciales domina abrumadoramente sobre el financiero. La barra de “Financiero” es apenas visible en la escala del gráfico, lo que refuerza que el hurto financiero es un fenómeno marginal en frecuencia, pero no en impacto por evento.
# ── Top 15 municipios ─────────────────────────────────────────────────────────
top15_names <- df %>%
group_by(municipio) %>%
summarise(total = sum(cantidad)) %>%
slice_max(total, n = 15) %>% pull(municipio)
heat_mun_anio <- df %>%
filter(municipio %in% top15_names) %>%
group_by(municipio, anio) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
# Ordenar municipios por total descendente
mutate(municipio = fct_reorder(municipio, casos, .fun = sum, .desc = TRUE))
ggplot(heat_mun_anio, aes(x = factor(anio), y = municipio, fill = casos)) +
geom_tile(color = "white", linewidth = 0.6) +
geom_text(
aes(label = format(casos, big.mark = ",")),
size = 3.1,
color = ifelse(heat_mun_anio$casos > 7000, "white", c1_dark)
) +
scale_fill_gradientn(
colors = c(c5_cream, c4_beige, c3_tan, c2_mid, c1_dark),
name = "Casos",
labels = comma
) +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, 0)) +
labs(
title = "Evolución Anual del Hurto por Municipio",
subtitle = "Top 15 municipios | 2020-2025 | Intensidad de color = número de casos",
x = "Año", y = NULL,
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
axis.text.y = element_text(size = 11, face = "bold"),
axis.text.x = element_text(size = 11),
legend.position = "right",
panel.grid = element_blank()
)
El heatmap permite leer la trayectoria individual de cada municipio a lo largo del tiempo. Bogotá registra los valores más altos y más oscuros en todo el mapa: 11.885 casos en 2020, con una caída a 10.481 en 2021, una recuperación en 2022 (11.623) y 2023 (11.681), y un descenso hacia 10.991 en 2024. Su comportamiento es el más estable del grupo, sin picos ni caídas dramáticas.
Medellín muestra la trayectoria más irregular: arranca en 4.382 casos en 2020, cae fuertemente a 3.065 en 2021, rebota a 3.951 en 2022 y luego desciende de forma sostenida hasta 2.623 en 2024, una reducción del 40,1% entre 2020 y 2024, la más pronunciada del grupo.
Cali presenta la tendencia bajista más consistente: de 3.635 en 2020 baja a 1.804 en 2024, una caída del 50,4%, la mayor de los ocho municipios analizados. Barranquilla también desciende (-26% entre 2020 y 2024), mientras que Villavicencio es el único con tendencia al alza: crece un 19,2% entre 2020 y 2024, pasando de 698 a 832 casos.
# ── Top 15 deptos
top15_dep <- df %>%
group_by(depto) %>% summarise(total = sum(cantidad)) %>%
slice_max(total, n = 15) %>% pull(depto)
heat_dep_mes <- df %>%
filter(depto %in% top15_dep) %>%
group_by(depto, mes_orden) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
mutate(depto = fct_reorder(depto, casos, .fun = sum, .desc = TRUE))
ggplot(heat_dep_mes, aes(x = mes_orden, y = depto, fill = casos)) +
geom_tile(color = "white", linewidth = 0.55) +
geom_text(
aes(label = format(casos, big.mark = ",")),
size = 2.7,
color = ifelse(heat_dep_mes$casos > 5500, "white", c1_dark)
) +
scale_fill_gradientn(
colors = c(c5_cream, c4_beige, c3_tan, c2_mid, c1_dark),
name = "Casos",
labels = comma
) +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, 0)) +
labs(
title = "Estacionalidad Mensual por Departamento",
subtitle = "Top 15 departamentos | Acumulado 2020-2025",
x = NULL, y = NULL,
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
axis.text.y = element_text(size = 10.5, face = "bold"),
axis.text.x = element_text(size = 10),
legend.position = "right",
panel.grid = element_blank()
)
El heatmap revela un patrón estacional consistente y homogéneo a nivel nacional. Enero y febrero son los meses más críticos en prácticamente todos los departamentos. En Cundinamarca, enero registra 7.658 casos y febrero 7.818, el mayor valor mensual de todo el mapa, lo que representa aproximadamente el 20% del total anual de ese departamento concentrado en solo dos meses.
Antioquia sigue el mismo patrón: enero con 3.350 y febrero con 3.223 casos, seguidos de un descenso gradual hacia el segundo semestre. Valle del Cauca replica la tendencia: pico en enero-febrero (2.307 y 2.313) y mínimo en diciembre (1.399). En todos los departamentos, diciembre es sistemáticamente el mes más bajo, con reducciones de entre el 30% y el 45% respecto al máximo mensual.
Una excepción relativa es Santander, cuyo patrón es más uniforme a lo largo del año, con menor diferencia entre el mes más alto (enero, 964) y el más bajo (diciembre, 535). Atlántico muestra mayor variabilidad proporcional: la diferencia entre enero (992) y diciembre (600) representa una caída del 39,5%.
# ── Heatmap municipio x mes ───────────────────────────────────────────────────
heat_mun_mes <- df %>%
filter(municipio %in% top15_names) %>%
group_by(municipio, mes_orden) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
mutate(municipio = fct_reorder(municipio, casos, .fun = sum, .desc = TRUE))
ggplot(heat_mun_mes, aes(x = mes_orden, y = municipio, fill = casos)) +
geom_tile(color = "white", linewidth = 0.55) +
geom_text(
aes(label = format(casos, big.mark = ",")),
size = 2.85,
color = ifelse(heat_mun_mes$casos > 5000, "white", c1_dark)
) +
scale_fill_gradientn(
colors = c(c5_cream, c4_beige, c3_tan, c2_mid, c1_dark),
name = "Casos",
labels = comma
) +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, 0)) +
labs(
title = "Hurto por Municipio y Mes",
subtitle = "Top 15 municipios | Acumulado 2020-2025 | Patrón estacional",
x = NULL, y = NULL,
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
axis.text.y = element_text(size = 10.5, face = "bold"),
axis.text.x = element_text(size = 10),
legend.position = "right",
panel.grid = element_blank()
)
Bogotá domina el mapa con los valores más altos en todos los meses. Su pico máximo es febrero con 6.485 casos, la celda más oscura del heatmap, seguido de enero (6.194) y marzo (5.855). Su mínimo es diciembre con 3.711 casos, un 42,8% menos que el máximo. La diferencia entre el mes más alto y el más bajo en Bogotá equivale a 2.774 casos: más que el total anual de muchos municipios del país.
Medellín sigue el mismo patrón estacional: enero lidera con 1.869 casos, mientras diciembre cierra con 1.048. Su patrón de verano (mayo-agosto) es relativamente sostenido, sin caídas bruscas en el segundo semestre.
Cali tiene su pico en febrero (1.559) y enero (1.525), con una caída gradual hasta diciembre (931). Barranquilla y Cartagena muestran el patrón más uniforme del grupo, con menor diferencia entre el mes máximo y el mínimo, sugiriendo que en la costa Caribe el comercio opera de forma más homogénea durante el año.
# ── Armas x municipio top 12 ─────────────────────────────────────────────────
top12_names <- top15_names[1:12]
heat_arma_mun <- df %>%
filter(municipio %in% top12_names) %>%
group_by(municipio, arma) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
group_by(municipio) %>%
mutate(pct = round(100 * casos / sum(casos), 1)) %>%
ungroup() %>%
mutate(municipio = fct_reorder(municipio, casos, .fun = sum, .desc = TRUE))
ggplot(heat_arma_mun, aes(x = municipio, y = fct_reorder(arma, casos, sum),
fill = pct)) +
geom_tile(color = "white", linewidth = 0.55) +
geom_text(
aes(label = paste0(pct, "%")),
size = 3,
color = ifelse(heat_arma_mun$pct > 45, "white", c1_dark)
) +
scale_fill_gradientn(
colors = c(c5_cream, c4_beige, c3_tan, c2_mid, c1_dark),
name = "% del\nmunicipio"
) +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, 0)) +
labs(
title = "Modalidad Delictiva por Municipio",
subtitle = "Porcentaje de cada medio sobre el total del municipio | 2020-2025",
x = NULL, y = NULL,
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
axis.text.x = element_text(angle = 30, hjust = 1, size = 10),
axis.text.y = element_text(size = 10.5),
legend.position = "right",
panel.grid = element_blank()
)
“Sin empleo de armas” es la modalidad predominante en absolutamente todos los municipios, pero con proporciones distintas: Bogotá lidera con el 79,6% de sus casos bajo esta modalidad, seguida de Villavicencio (76,9%), Bucaramanga (75,5%) y Valledupar (73,8%). En el extremo opuesto, Barranquilla tiene el porcentaje más bajo: 63,8%, lo que significa que el 36,2% de sus hurtos involucra algún tipo de arma o mecanismo, la mayor proporción de violencia instrumental del grupo.
El arma de fuego tiene su mayor incidencia relativa en Barranquilla (19,6%), muy por encima de Bogotá (8,7%) o Villavicencio (5,9%). Cartagena (12,2%) y Valledupar (12,6%) también superan el promedio en esta modalidad, lo que configura un perfil de mayor violencia en los hurtos de la costa Caribe.
Los contundentes tienen mayor peso relativo en Barranquilla (12,4%) y Valledupar (10,2%). Las palancas son más frecuentes en Villavicencio (6,5%), indicando mayor presencia de hurtos a establecimientos cerrados en esa ciudad.
# ── Participacion intra-departamental ─────────────────────────────────────────
# Top 8 deptos por total
top8_dep <- df %>%
group_by(depto) %>% summarise(t = sum(cantidad)) %>%
slice_max(t, n = 8) %>% pull(depto)
conc_dep <- df %>%
filter(depto %in% top8_dep) %>%
group_by(depto, municipio) %>%
summarise(casos = sum(cantidad), .groups = "drop") %>%
group_by(depto) %>%
mutate(
pct = round(100 * casos / sum(casos), 1),
total_d = sum(casos),
# Agrupar municipios < 3% en "Otros"
municipio_cat = ifelse(pct < 3, "Otros", municipio)
) %>%
group_by(depto, municipio_cat, total_d) %>%
summarise(pct = sum(pct), .groups = "drop") %>%
mutate(
depto = paste0(depto, "\n(", format(total_d, big.mark=","), " casos)"),
depto = fct_reorder(depto, total_d, .desc = TRUE)
)
# Paleta para municipios
n_mun_cat <- n_distinct(conc_dep$municipio_cat)
pal_mun <- c(
colorRampPalette(c(c1_dark, c2_mid, c3_tan, c4_beige))(n_mun_cat - 1),
"#DCDCDC" # gris para Otros
)
ggplot(conc_dep,
aes(x = depto, y = pct,
fill = fct_reorder(municipio_cat, pct, .desc = TRUE))) +
geom_col(position = "stack", width = 0.72, color = "white", linewidth = 0.3) +
geom_text(
data = conc_dep %>% filter(pct >= 5),
aes(label = paste0(municipio_cat, "\n", pct, "%")),
position = position_stack(vjust = 0.5),
size = 2.9, color = "white", fontface = "bold", lineheight = 0.9
) +
scale_fill_manual(values = pal_mun, name = "Municipio") +
scale_y_continuous(labels = function(x) paste0(x, "%"),
expand = c(0, 0)) +
labs(
title = "Concentración Municipal dentro de cada Departamento",
subtitle = "Participación porcentual de cada municipio | Top 8 departamentos",
x = NULL, y = "Porcentaje del departamento",
caption = "Fuente: Policia Nacional de Colombia | Proyecto FORTIVA"
) +
theme_fortiva() +
theme(
axis.text.x = element_text(size = 9.5, lineheight = 0.9),
legend.position = "none"
)
Cundinamarca presenta la mayor concentración: Bogotá absorbe el 83,2% de los 77.982 casos departamentales (64.874 casos), dejando solo el 16,8% distribuido entre los otros 116 municipios del departamento. Esto significa que el resto de Cundinamarca aporta apenas 13.108 casos en 5 años.
Antioquia tiene una distribución más equilibrada: Medellín concentra el 55% (18.978 de 34.536), pero municipios como Bello, Itagüí, Envigado y Rionegro tienen participaciones visibles, conformando un área metropolitana con múltiples núcleos de riesgo.
Valle del Cauca muestra que Cali representa el 66,2% (15.446 de 23.329), con Palmira, Buenaventura y otros municipios con participaciones notables. Atlántico (Barranquilla: 67%) y Bolívar (Cartagena: 67,3%) tienen concentraciones similares, con sus capitales dominando ampliamente.
Santander es el departamento más distribuido del grupo: Bucaramanga concentra solo el 41,7% (4.078 de 9.782), con Barrancabermeja, Girón, Floridablanca y otros municipios sumando participaciones significativas.
El análisis exploratorio de los casos de hurto a entidades comerciales y financieras en Colombia durante el período 2020-2025 permitió identificar patrones territoriales, temporales y delictivos relevantes mediante el uso de herramientas de programación y visualización en R. Los resultados evidenciaron una fuerte concentración del fenómeno en departamentos y ciudades con alta actividad económica, especialmente Bogotá, Medellín, Cali, Barranquilla y Cartagena, las cuales acumulan gran parte de los casos registrados a nivel nacional.
Asimismo, se identificaron comportamientos estacionales y variaciones entre municipios, destacándose los meses de enero y febrero como los de mayor incidencia delictiva. También se observó que la modalidad de hurto sin empleo de armas predomina en la mayoría de territorios, aunque algunas ciudades presentan mayores niveles de violencia asociada al uso de armas de fuego y otros mecanismos. De igual manera, el análisis mostró que en varios departamentos el delito se concentra principalmente en las capitales y áreas metropolitanas.
Finalmente, el desarrollo de este informe permitió aplicar técnicas de limpieza, exploración y análisis de datos en un contexto real, demostrando cómo la analítica de datos puede contribuir a la comprensión de problemáticas de seguridad y facilitar la identificación de patrones relevantes para futuros procesos de análisis y toma de decisiones.