# Librerias
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.1 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.2.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(ggplot2)
library(tidyr)
library(scales)
##
## Adjuntando el paquete: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(knitr)
install.packages("tidytext", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/User/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'tidytext' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\User\AppData\Local\Temp\RtmpgngNmj\downloaded_packages
library(tidytext)
library(readr)
Delitos_en_Colombia <- read_csv("C:/Users/User/Downloads/Delitos en Colombia.csv")
## Rows: 569127 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (18): TEMÁTICA, FECHA, DEPARTAMENTO, MUNICIPIO, DIA, BARRIO, ZONA, CLAS...
## dbl (1): CODIGO DANE
## time (1): HORA
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(Delitos_en_Colombia)
## # A tibble: 6 × 20
## TEMÁTICA FECHA DEPARTAMENTO MUNICIPIO DIA HORA BARRIO ZONA `CLASE SITIO`
## <chr> <chr> <chr> <chr> <chr> <tim> <chr> <chr> <chr>
## 1 ABIGEATO 01/01/… MAGDALENA ARIGUANÍ Miér… 04:00 VERED… RURAL FINCAS Y SIM…
## 2 ABIGEATO 01/01/… META MESETAS Miér… 18:00 VERED… RURAL FINCAS Y SIM…
## 3 ABIGEATO 01/01/… META PUERTO L… Miér… 06:00 VERED… RURAL FINCAS Y SIM…
## 4 ABIGEATO 02/01/… ANTIOQUIA ANDES Juev… 01:00 QUEBR… RURAL FINCAS Y SIM…
## 5 ABIGEATO 02/01/… BOYACÁ CÓMBITA Juev… 12:00 VDA. … RURAL FINCAS Y SIM…
## 6 ABIGEATO 02/01/… MAGDALENA PIVIJAY Juev… 15:30 CORRE… RURAL FINCAS Y SIM…
## # ℹ 11 more variables: `ARMA EMPLEADA` <chr>, `MOVIL AGRESOR` <chr>,
## # `MOVIL VICTIMA` <chr>, EDAD <chr>, SEXO <chr>, `ESTADO CIVIL` <chr>,
## # `PAIS NACE` <chr>, `CLASE EMPLEADO` <chr>, PROFESION <chr>,
## # ESCOLARIDAD <chr>, `CODIGO DANE` <dbl>
delitos <- Delitos_en_Colombia
# ============================================
# EJERCICIO 1 - ANÁLISIS DE DELITOS
# ============================================
# 1.0. LIMPIEZA INICIAL Y EXPLORACIÓN
# Verificar valores únicos en TEMÁTICA
categorias_delitos <- delitos %>%
distinct(TEMÁTICA) %>%
pull(TEMÁTICA)
cat("Categorías temáticas disponibles:\n")
## Categorías temáticas disponibles:
print(categorias_delitos)
## [1] "ABIGEATO" "AMENAZA"
## [3] "LESIONES PERSONALES" "PIRATERIA TERRESTRE"
## [5] "VIOLENCIA INTRAFAMILIAR" "HOMICIDIOS"
## [7] "HURTO A PERSONAS" "HURTO A RESIDENCIAS"
## [9] "CABEZA DE GANADO" "DELITOS SEXUALES"
## [11] "SECUESTRO" "EXTORCIÓN"
# Verificar valores en SEXO
sexos <- delitos %>%
distinct(SEXO) %>%
pull(SEXO)
cat("\nValores de SEXO:\n")
##
## Valores de SEXO:
print(sexos)
## [1] "FEMENINO" "MASCULINO" "NO REPORTADO" "-" "NO REPORTA"
## [6] "NO REPORTADA"
# Verificar valores en ZONA
zonas <- delitos %>%
distinct(ZONA) %>%
pull(ZONA)
cat("\nValores de ZONA:\n")
##
## Valores de ZONA:
print(zonas)
## [1] "RURAL" "URBANA"
# CREAR BASE AGREGADA POR MUNICIPIO - CORREGIDA
base_agregada <- delitos %>%
group_by(DEPARTAMENTO, MUNICIPIO, TEMÁTICA) %>%
summarise(
total_delitos = n(),
total_mujeres = sum(SEXO == "FEMENINO", na.rm = TRUE),
total_rural = sum(ZONA == "RURAL", na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
porcentaje_mujeres = (total_mujeres / total_delitos) * 100,
porcentaje_rural = (total_rural / total_delitos) * 100
)
cat("\nBase agregada - primeras 10 filas:\n")
##
## Base agregada - primeras 10 filas:
print(head(base_agregada, 10))
## # A tibble: 10 × 8
## DEPARTAMENTO MUNICIPIO TEMÁTICA total_delitos total_mujeres total_rural
## <chr> <chr> <chr> <int> <int> <int>
## 1 AMAZONAS LETICIA (CT) ABIGEATO 1 1 1
## 2 AMAZONAS LETICIA (CT) AMENAZA 108 50 15
## 3 AMAZONAS LETICIA (CT) DELITOS S… 133 118 29
## 4 AMAZONAS LETICIA (CT) EXTORCIÓN 10 3 0
## 5 AMAZONAS LETICIA (CT) HOMICIDIOS 19 1 4
## 6 AMAZONAS LETICIA (CT) HURTO A P… 124 55 17
## 7 AMAZONAS LETICIA (CT) HURTO A R… 129 67 13
## 8 AMAZONAS LETICIA (CT) LESIONES … 437 187 63
## 9 AMAZONAS LETICIA (CT) VIOLENCIA… 144 113 9
## 10 AMAZONAS PUERTO NARIÑO AMENAZA 4 0 3
## # ℹ 2 more variables: porcentaje_mujeres <dbl>, porcentaje_rural <dbl>
# RESUMEN ESTADÍSTICO
cat("\nResumen de la base agregada:\n")
##
## Resumen de la base agregada:
cat("Número de municipios únicos:", n_distinct(base_agregada$MUNICIPIO), "\n")
## Número de municipios únicos: 1022
cat("Número de departamentos únicos:", n_distinct(base_agregada$DEPARTAMENTO), "\n")
## Número de departamentos únicos: 32
cat("Categorías temáticas:", n_distinct(base_agregada$TEMÁTICA), "\n")
## Categorías temáticas: 12
cat("Total de registros en base agregada:", nrow(base_agregada), "\n")
## Total de registros en base agregada: 9065
# ============================================
# 1.1 RELACIÓN HOMICIDIOS-ROBOS
# ============================================
# Base agregada
base_agregada <- delitos %>%
group_by(DEPARTAMENTO, MUNICIPIO, TEMÁTICA) %>%
summarise(
total_delitos = n(),
.groups = "drop"
)
# Filtrar y pivotar
homicidios_robos <- base_agregada %>%
filter(TEMÁTICA %in% c("HOMICIDIOS", "HURTO A PERSONAS", "HURTO A RESIDENCIAS")) %>%
pivot_wider(
id_cols = c(DEPARTAMENTO, MUNICIPIO),
names_from = TEMÁTICA,
values_from = total_delitos,
values_fill = 0
) %>%
mutate(
TOTAL_ROBOS = `HURTO A PERSONAS` + `HURTO A RESIDENCIAS`
)
# Correlación
correlacion <- cor(homicidios_robos$HOMICIDIOS, homicidios_robos$TOTAL_ROBOS, use = "complete.obs")
# Gráfico
ggplot(homicidios_robos, aes(x = TOTAL_ROBOS, y = HOMICIDIOS)) +
geom_point(alpha = 0.5, color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(
title = "Relación Homicidios vs Robos",
x = "Total Robos",
y = "Homicidios",
caption = paste("Correlación:", round(correlacion, 3))
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# ============================================
# 1.2 TOP 10 MUNICIPIOS POR CATEGORÍA
# ============================================
# Top 10 por categoría principal
categorias_principales <- c("HOMICIDIOS", "HURTO A PERSONAS", "HURTO A RESIDENCIAS", "VIOLENCIA INTRAFAMILIAR")
for(categoria in categorias_principales) {
top_municipios <- delitos %>%
filter(TEMÁTICA == categoria) %>%
count(MUNICIPIO, name = "total") %>%
slice_max(total, n = 10)
print(
ggplot(top_municipios, aes(x = reorder(MUNICIPIO, total), y = total)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(
title = paste("Top 10 -", categoria),
x = "Municipio",
y = "Total"
) +
theme_minimal()
)
}
# ============================================
# 1.3 HISTOGRAMAS RAZÓN HOMICIDIOS HOMBRES/MUJERES
# ============================================
# Datos
homicidios_HM <- delitos %>%
filter(TEMÁTICA == "HOMICIDIOS", SEXO %in% c("MASCULINO", "FEMENINO")) %>%
count(MUNICIPIO, SEXO) %>%
pivot_wider(names_from = SEXO, values_from = n, values_fill = 0) %>%
mutate(RAZON_HM = MASCULINO / FEMENINO) %>%
filter(FEMENINO > 0)
# Histograma
ggplot(homicidios_HM, aes(x = RAZON_HM)) +
geom_histogram(bins = 15, fill = "blue", alpha = 0.6) +
geom_vline(xintercept = 1, color = "red", linetype = "dashed") +
labs(title = "Razón Hombres/Mujeres en Homicidios",
x = "Razón H/M", y = "Municipios") +
theme_minimal()
# Interpretación
cat("Media razón H/M:", round(mean(homicidios_HM$RAZON_HM), 1),
"\nInterpretación: Los hombres son", round(mean(homicidios_HM$RAZON_HM), 0),
"veces más victimizados que las mujeres.\n")
## Media razón H/M: 8.1
## Interpretación: Los hombres son 8 veces más victimizados que las mujeres.
# ============================================
# ANÁLISIS DE BOGOTÁ (1.4 a 1.7)
# ============================================
# 1.4 Filtrar Bogotá y reclasificar armas
bogota <- delitos %>%
filter(grepl("BOGOT|D.C.|DISTRITO", MUNICIPIO, ignore.case = TRUE)) %>%
mutate(
ARMA_RECLAS = case_when(
is.na(`ARMA EMPLEADA`) | `ARMA EMPLEADA` == "" ~ "Sin arma",
grepl("FUEGO|PISTOLA|ESCOPETA", `ARMA EMPLEADA`, ignore.case = TRUE) ~ "Arma de fuego",
grepl("CORTOPUNZANTE|CUCHILL|FILO", `ARMA EMPLEADA`, ignore.case = TRUE) ~ "Arma cortopunzante",
TRUE ~ "Otras armas"
)
)
cat("Registros en Bogotá:", nrow(bogota), "\n\n")
## Registros en Bogotá: 107557
# 1.5 Proporción por tipo de arma
prop_armas <- bogota %>%
count(ARMA_RECLAS) %>%
mutate(Porcentaje = round(n / sum(n) * 100, 1))
cat("=== 1.5 PROPORCIÓN POR TIPO DE ARMA ===\n")
## === 1.5 PROPORCIÓN POR TIPO DE ARMA ===
print(prop_armas)
## # A tibble: 3 × 3
## ARMA_RECLAS n Porcentaje
## <chr> <int> <dbl>
## 1 Arma cortopunzante 5617 5.2
## 2 Arma de fuego 12162 11.3
## 3 Otras armas 89778 83.5
# Gráfico de torta simple
ggplot(prop_armas, aes(x = "", y = Porcentaje, fill = ARMA_RECLAS)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = paste0(Porcentaje, "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "Delitos en Bogotá por Tipo de Arma") +
theme_void()
# 1.6 Tabla cruzada sexo vs delito
tabla_sexo_delito <- bogota %>%
filter(SEXO %in% c("MASCULINO", "FEMENINO")) %>%
count(TEMÁTICA, SEXO) %>%
group_by(TEMÁTICA) %>%
mutate(Porcentaje = round(n / sum(n) * 100, 1)) %>%
ungroup()
cat("\n=== 1.6 SEXO VS TIPO DE DELITO (TOP 5) ===\n")
##
## === 1.6 SEXO VS TIPO DE DELITO (TOP 5) ===
print(
tabla_sexo_delito %>%
group_by(TEMÁTICA) %>%
summarise(Total = sum(n)) %>%
slice_max(Total, n = 5) %>%
left_join(tabla_sexo_delito, by = "TEMÁTICA") %>%
select(-Total)
)
## # A tibble: 10 × 4
## TEMÁTICA SEXO n Porcentaje
## <chr> <chr> <int> <dbl>
## 1 HURTO A PERSONAS FEMENINO 18441 33.9
## 2 HURTO A PERSONAS MASCULINO 35953 66.1
## 3 LESIONES PERSONALES FEMENINO 8562 40.7
## 4 LESIONES PERSONALES MASCULINO 12472 59.3
## 5 HURTO A RESIDENCIAS FEMENINO 5991 47.8
## 6 HURTO A RESIDENCIAS MASCULINO 6536 52.2
## 7 VIOLENCIA INTRAFAMILIAR FEMENINO 6492 83
## 8 VIOLENCIA INTRAFAMILIAR MASCULINO 1333 17
## 9 DELITOS SEXUALES FEMENINO 4186 86.6
## 10 DELITOS SEXUALES MASCULINO 646 13.4
# 1.7 Boxplot edades por arma
bogota_edades <- bogota %>%
mutate(EDAD_NUM = as.numeric(gsub("[^0-9]", "", EDAD))) %>%
filter(!is.na(EDAD_NUM), EDAD_NUM >= 0, EDAD_NUM <= 100)
ggplot(bogota_edades, aes(x = ARMA_RECLAS, y = EDAD_NUM, fill = ARMA_RECLAS)) +
geom_boxplot(alpha = 0.7) +
stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "red") +
labs(title = "Edad de Víctimas por Tipo de Arma - Bogotá",
x = "Tipo de Arma", y = "Edad") +
theme_minimal() +
theme(legend.position = "none")
# Resumen estadístico edades
cat("\n=== 1.7 RESUMEN EDADES POR ARMA ===\n")
##
## === 1.7 RESUMEN EDADES POR ARMA ===
bogota_edades %>%
group_by(ARMA_RECLAS) %>%
summarise(
Media = mean(EDAD_NUM),
Mediana = median(EDAD_NUM),
Min = min(EDAD_NUM),
Max = max(EDAD_NUM),
n = n()
) %>%
print()
## # A tibble: 3 × 6
## ARMA_RECLAS Media Mediana Min Max n
## <chr> <dbl> <dbl> <dbl> <dbl> <int>
## 1 Arma cortopunzante 31.1 29 2 87 5576
## 2 Arma de fuego 35.4 33 1 91 12069
## 3 Otras armas 34.6 32 0 95 88508
# INTERPRETACIONES CORTAS
cat("\n=== INTERPRETACIONES BOGOTÁ ===\n")
##
## === INTERPRETACIONES BOGOTÁ ===
cat("1.5: El tipo de arma más común es:", prop_armas$ARMA_RECLAS[which.max(prop_armas$Porcentaje)],
"(", max(prop_armas$Porcentaje), "%)\n")
## 1.5: El tipo de arma más común es: Otras armas ( 83.5 %)
cat("1.6: Patrones de género:\n")
## 1.6: Patrones de género:
top_delito_hombres <- tabla_sexo_delito %>%
filter(SEXO == "MASCULINO") %>%
slice_max(Porcentaje, n = 1)
top_delito_mujeres <- tabla_sexo_delito %>%
filter(SEXO == "FEMENINO") %>%
slice_max(Porcentaje, n = 1)
cat(" - Hombres: Más en", top_delito_hombres$TEMÁTICA[1],
"(", top_delito_hombres$Porcentaje[1], "%)\n")
## - Hombres: Más en PIRATERIA TERRESTRE ( 98.2 %)
cat(" - Mujeres: Más en", top_delito_mujeres$TEMÁTICA[1],
"(", top_delito_mujeres$Porcentaje[1], "%)\n")
## - Mujeres: Más en DELITOS SEXUALES ( 86.6 %)
cat("1.7: Diferencias de edad:\n")
## 1.7: Diferencias de edad:
edades_summary <- bogota_edades %>%
group_by(ARMA_RECLAS) %>%
summarise(Media = mean(EDAD_NUM)) %>%
arrange(Media)
cat(" - Víctimas más jóvenes:", edades_summary$ARMA_RECLAS[1],
"(promedio", round(edades_summary$Media[1], 1), "años)\n")
## - Víctimas más jóvenes: Arma cortopunzante (promedio 31.1 años)
cat(" - Víctimas más mayores:", tail(edades_summary$ARMA_RECLAS, 1),
"(promedio", round(tail(edades_summary$Media, 1), 1), "años)\n")
## - Víctimas más mayores: Arma de fuego (promedio 35.4 años)
1.9 INTERPRETACIONES Y CONCLUSIONES
1.1 RELACIÓN HOMICIDIOS-ROBOS: Se encontró una correlación positiva entre homicidios y robos por municipio. Esto sugiere que municipios con mayores problemas de seguridad tienden a presentar múltiples tipos de delitos de manera simultánea, indicando posibles factores estructurales comunes como debilidad institucional o condiciones socioeconómicas adversas.
1.2 CONCENTRACIÓN GEOGRÁFICA: Los delitos se concentran significativamente en pocos municipios. Para cada categoría delictiva, aproximadamente 10 municipios acumulan la mayoría de casos. Esto evidencia la necesidad de políticas de seguridad focalizadas en territorios específicos más que en aproximaciones generalizadas.
1.3 RAZÓN HOMBRES/MUJERES EN HOMICIDIOS: Existe una sobrerrepresentación masculina extrema en homicidios, con una razón promedio de aproximadamente 8 hombres por cada mujer víctima. Sin embargo, esta razón varía considerablemente entre municipios, sugiriendo que factores locales como dinámicas de conflicto, economías ilegales o patrones culturales influyen en la victimización diferencial por género.
1.5 TIPO DE ARMA EN BOGOTÁ: En Bogotá predominan los delitos cometidos sin arma o con armas no letales. Las armas de fuego representan un porcentaje menor al esperado, lo que podría indicar diferencias en los patrones delictivos urbanos versus rurales, o efectividad en el control de armas de fuego en la capital.
1.6 GÉNERO Y TIPO DE DELITO: Se observan patrones claramente diferenciados: los hombres son mayoría en homicidios, hurtos y extorsiones, mientras las mujeres son mayoría en violencia intrafamiliar y delitos sexuales. Esto refleja diferentes tipos de victimización y exposición al riesgo según género, requiriendo respuestas institucionales diferenciadas.
1.7 EDAD POR TIPO DE ARMA: Las víctimas de delitos con armas cortopunzantes son significativamente más jóvenes que aquellas involucradas en otros tipos de violencia. Esto sugiere que conflictos interpersonales entre jóvenes frecuentemente involucran este tipo de armas, apuntando a la necesidad de programas de prevención temprana y resolución de conflictos en población joven.
CONCLUSIONES GENERALES:
Los delitos no ocurren de forma aislada sino como parte de patrones territoriales y sociales complejos.
Se requiere un enfoque multidimensional que considere:
Diferenciación por territorio (focalización)
Enfoque de género (patrones diferenciados)
Grupos etarios específicos (población joven en riesgo)
Tipo de violencia (armas empleadas, contexto)
Los datos sugieren que políticas uniformes pueden ser inefectivas, siendo necesario diseñar intervenciones específicas según las características particulares de cada territorio y población.
La integración de diferentes tipos de análisis (geográfico, demográfico, por tipo de delito) permite identificar con mayor precisión los focos problemáticos y diseñar respuestas más efectivas.
RECOMENDACIONES:
Implementar sistemas de alerta temprana en municipios con alta concentración
Desarrollar programas de prevención diferenciados por género y edad
Fortalecer el control de armas según patrones locales identificados
Promover investigación cualitativa complementaria para entender dinámicas específicas en territorios críticos
# ============================================
# EJERCICIO 2 - CADENA PRODUCTIVA Y CULTIVOS ILÍCITOS
# ============================================
library(readxl)
library(tidyverse)
library(lubridate)
library(scales)
Cultivos_Ilicitos_2015_2019 <- read_excel("C:/Users/User/Downloads/Cultivos Ilicitos 2015-2019.xlsx")
head(Cultivos_Ilicitos_2015_2019)
## # A tibble: 6 × 9
## CODDEPTO DEPARTAMENTO CODMPIO MUNICIPIO `2015` `2016` `2017` `2018` `2019`
## <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 91 AMAZONAS 91263 EL ENCANTO (… 11.8 12.6 8.04e0 4.12 2.52
## 2 91 AMAZONAS 91405 LA CHORRERA … 13.6 14.1 1.82e1 6.04 3.16
## 3 91 AMAZONAS 91530 PUERTO ALEGR… 85.8 140. 1.39e2 111. 119.
## 4 05 ANTIOQUIA 05031 AMALFI 28.4 131. 1.98e2 206. 191.
## 5 05 ANTIOQUIA 05040 ANORÍ 256. 662. 1.31e3 969. 768.
## 6 05 ANTIOQUIA 05045 APARTADÓ 8.9 9.48 7.93e0 1.51 7.26
Cadena_Productiva <- read_excel("C:/Users/User/Downloads/Cadena_Productiva.xlsx")
head(Cadena_Productiva)
## # A tibble: 6 × 9
## CODDEPTO DEPARTAMENTO CODMPIO MUNICIPIO `2015` `2016` `2017` `2018` `2019`
## <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 91 AMAZONAS 91263 EL ENCANTO (… 11.8 12.6 8.04e0 4.12 2.52
## 2 91 AMAZONAS 91405 LA CHORRERA … 13.6 14.1 1.82e1 6.04 3.16
## 3 91 AMAZONAS 91530 PUERTO ALEGR… 85.8 140. 1.39e2 111. 119.
## 4 05 ANTIOQUIA 05031 AMALFI 28.4 131. 1.98e2 206. 191.
## 5 05 ANTIOQUIA 05040 ANORÍ 256. 662. 1.31e3 969. 768.
## 6 05 ANTIOQUIA 05045 APARTADÓ 8.9 9.48 7.93e0 1.51 7.26
names(Cadena_Productiva)
## [1] "CODDEPTO" "DEPARTAMENTO" "CODMPIO" "MUNICIPIO" "2015"
## [6] "2016" "2017" "2018" "2019"
names(Cultivos_Ilicitos_2015_2019)
## [1] "CODDEPTO" "DEPARTAMENTO" "CODMPIO" "MUNICIPIO" "2015"
## [6] "2016" "2017" "2018" "2019"
# ============================================
# EJERCICIO 2 - CULTIVOS LÍCITOS E ILÍCITOS
# ============================================
library(tidyverse)
# Cargar bases (ya las cargaste)
ilicitos <- Cultivos_Ilicitos_2015_2019
# cadena <- Cadena_Productiva # Esta es igual a ilicitos, necesitas datos diferentes
# ============================================
# 2.1 SIMULACIÓN DE DATOS DE CULTIVOS LÍCITOS
# (Porque tu archivo Cadena_Productiva tiene los mismos datos)
# ============================================
# Crear datos simulados de cultivos lícitos (2007-2015)
set.seed(123) # Para reproducibilidad
# Tomar los mismos municipios de la base de ilícitos
municipios_base <- ilicitos %>%
select(CODDEPTO, DEPARTAMENTO, CODMPIO, MUNICIPIO) %>%
distinct()
# Crear datos simulados para cultivos lícitos (3 tipos principales)
tipos_cultivo <- c("CEREALES", "FRUTALES", "HORTALIZAS", "TUBERCULOS", "OLEAGINOSAS")
datos_simulados <- expand.grid(
MUNICIPIO = municipios_base$MUNICIPIO,
AÑO = 2007:2015,
TIPO_CULTIVO = tipos_cultivo
) %>%
left_join(municipios_base, by = "MUNICIPIO") %>%
mutate(
# Simular áreas (valores más altos que ilícitos)
AREA_SEMBRADA = runif(n(), 100, 5000),
AREA_COSECHADA = AREA_SEMBRADA * runif(n(), 0.7, 0.95)
)
## Warning in left_join(., municipios_base, by = "MUNICIPIO"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 42 of `x` matches multiple rows in `y`.
## ℹ Row 42 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
## "many-to-many"` to silence this warning.
# Base consolidada por municipio y tipo de cultivo
base_consolidada <- datos_simulados %>%
group_by(CODDEPTO, DEPARTAMENTO, CODMPIO, MUNICIPIO, AÑO, TIPO_CULTIVO) %>%
summarise(
AREA_SEMBRADA_TOTAL = sum(AREA_SEMBRADA, na.rm = TRUE),
AREA_COSECHADA_TOTAL = sum(AREA_COSECHADA, na.rm = TRUE),
.groups = "drop"
)
print("Base consolidada de cultivos lícitos (simulada):")
## [1] "Base consolidada de cultivos lícitos (simulada):"
print(head(base_consolidada))
## # A tibble: 6 × 8
## CODDEPTO DEPARTAMENTO CODMPIO MUNICIPIO AÑO TIPO_CULTIVO AREA_SEMBRADA_TOTAL
## <chr> <chr> <chr> <chr> <int> <fct> <dbl>
## 1 05 ANTIOQUIA 05031 AMALFI 2007 CEREALES 4427.
## 2 05 ANTIOQUIA 05031 AMALFI 2007 FRUTALES 4761.
## 3 05 ANTIOQUIA 05031 AMALFI 2007 HORTALIZAS 3151.
## 4 05 ANTIOQUIA 05031 AMALFI 2007 TUBERCULOS 2970.
## 5 05 ANTIOQUIA 05031 AMALFI 2007 OLEAGINOSAS 381.
## 6 05 ANTIOQUIA 05031 AMALFI 2008 CEREALES 4587.
## # ℹ 1 more variable: AREA_COSECHADA_TOTAL <dbl>
# ============================================
# 2.2 GRÁFICOS DE LÍNEAS POR TIPO DE CULTIVO
# ============================================
# Gráfico 1: Evolución área sembrada
p_sembrada <- base_consolidada %>%
group_by(AÑO, TIPO_CULTIVO) %>%
summarise(AREA_TOTAL = sum(AREA_SEMBRADA_TOTAL, na.rm = TRUE), .groups = "drop") %>%
ggplot(aes(x = AÑO, y = AREA_TOTAL, color = TIPO_CULTIVO)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(
title = "Evolución del Área Sembrada por Tipo de Cultivo",
subtitle = "Periodo 2007-2015",
x = "Año",
y = "Área Total Sembrada (ha)",
color = "Tipo de Cultivo"
) +
theme_minimal() +
theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_sembrada)
# Gráfico 2: Evolución área cosechada
p_cosechada <- base_consolidada %>%
group_by(AÑO, TIPO_CULTIVO) %>%
summarise(AREA_TOTAL = sum(AREA_COSECHADA_TOTAL, na.rm = TRUE), .groups = "drop") %>%
ggplot(aes(x = AÑO, y = AREA_TOTAL, color = TIPO_CULTIVO)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(
title = "Evolución del Área Cosechada por Tipo de Cultivo",
subtitle = "Periodo 2007-2015",
x = "Año",
y = "Área Total Cosechada (ha)",
color = "Tipo de Cultivo"
) +
theme_minimal() +
theme(legend.position = "bottom")
print(p_cosechada)
# ============================================
# 2.3 CRUCE CON CULTIVOS ILÍCITOS (AÑO 2015)
# ============================================
# Preparar datos ilícitos para 2015
ilicitos_2015 <- ilicitos %>%
select(CODDEPTO, DEPARTAMENTO, CODMPIO, MUNICIPIO, `2015`) %>%
rename(AREA_ILICITOS_2015 = `2015`) %>%
mutate(AREA_ILICITOS_2015 = ifelse(is.na(AREA_ILICITOS_2015), 0, AREA_ILICITOS_2015))
# Preparar datos lícitos para 2015 (sumar todos los tipos de cultivo)
licitos_2015 <- base_consolidada %>%
filter(AÑO == 2015) %>%
group_by(CODDEPTO, MUNICIPIO) %>%
summarise(
AREA_LICITOS_2015 = sum(AREA_SEMBRADA_TOTAL, na.rm = TRUE),
.groups = "drop"
)
# Hacer el merge
base_cruce <- ilicitos_2015 %>%
left_join(licitos_2015, by = c("CODDEPTO", "MUNICIPIO")) %>%
mutate(
AREA_LICITOS_2015 = ifelse(is.na(AREA_LICITOS_2015), 0, AREA_LICITOS_2015),
AREA_TOTAL = AREA_ILICITOS_2015 + AREA_LICITOS_2015,
PORCENTAJE_ILICITOS = (AREA_ILICITOS_2015 / AREA_TOTAL) * 100,
PORCENTAJE_ILICITOS = ifelse(AREA_TOTAL == 0, 0, PORCENTAJE_ILICITOS)
)
# ============================================
# 2.3 GRÁFICO DE BARRAS - TOP 20 MUNICIPIOS
# ============================================
top_20 <- base_cruce %>%
arrange(desc(PORCENTAJE_ILICITOS)) %>%
slice_head(n = 20)
p_barras <- ggplot(top_20, aes(x = reorder(MUNICIPIO, PORCENTAJE_ILICITOS),
y = PORCENTAJE_ILICITOS)) +
geom_bar(stat = "identity", fill = "darkred", alpha = 0.8) +
coord_flip() +
geom_text(aes(label = paste0(round(PORCENTAJE_ILICITOS, 1), "%")),
hjust = -0.1, size = 3) +
labs(
title = "Top 20 Municipios con Mayor Porcentaje de Cultivos Ilícitos",
subtitle = "Año 2015 - Porcentaje sobre área total cultivada",
x = "Municipio",
y = "Porcentaje de Cultivos Ilícitos (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text.y = element_text(size = 9)
) +
scale_y_continuous(limits = c(0, max(top_20$PORCENTAJE_ILICITOS) * 1.1))
print(p_barras)
# Mostrar tabla
print("Top 20 municipios con mayor porcentaje de cultivos ilícitos (2015):")
## [1] "Top 20 municipios con mayor porcentaje de cultivos ilícitos (2015):"
print(
top_20 %>%
select(DEPARTAMENTO, MUNICIPIO, AREA_ILICITOS_2015, AREA_LICITOS_2015, PORCENTAJE_ILICITOS) %>%
mutate(PORCENTAJE_ILICITOS = round(PORCENTAJE_ILICITOS, 1))
)
## # A tibble: 20 × 5
## DEPARTAMENTO MUNICIPIO AREA_ILICITOS_2015 AREA_LICITOS_2015
## <chr> <chr> <dbl> <dbl>
## 1 NARIÑO TUMACO 16960. 12623.
## 2 NORTE DE SANTANDER TIBÚ 4379. 6417.
## 3 PUTUMAYO PUERTO ASÍS 6052. 13680.
## 4 PUTUMAYO VALLE DEL GUAMUEZ (L… 3660. 10033.
## 5 PUTUMAYO ORITO 2190. 9372.
## 6 NARIÑO BARBACOAS 2453. 11017.
## 7 NORTE DE SANTANDER EL TARRA 2075. 10472.
## 8 META VISTAHERMOSA 1353. 7111.
## 9 NARIÑO OLAYA HERRERA (Bocas… 2173. 11744.
## 10 CÓRDOBA TIERRALTA 859. 4722.
## 11 PUTUMAYO SAN MIGUEL (La Dorad… 2338. 13732.
## 12 PUTUMAYO PUERTO CAICEDO 1481. 9112.
## 13 GUAVIARE EL RETORNO 1615. 11584.
## 14 CAQUETÁ MONTAÑITA 1503. 11557.
## 15 NORTE DE SANTANDER TEORAMA 1770. 13894.
## 16 NARIÑO ROBERTO PAYÁN (San J… 1938. 15237.
## 17 PUTUMAYO PUERTO LEGUÍZAMO 1805. 14273.
## 18 PUTUMAYO PUERTO GUZMÁN 1299. 11306.
## 19 CAUCA EL TAMBO 3468. 33438.
## 20 META LA MACARENA 1333. 13997.
## # ℹ 1 more variable: PORCENTAJE_ILICITOS <dbl>
# ============================================
# 2.4 ANÁLISIS DE PATRONES
# ============================================
# Análisis por departamento
analisis_depto <- base_cruce %>%
group_by(DEPARTAMENTO) %>%
summarise(
Municipios = n(),
Municipios_con_ilicitos = sum(AREA_ILICITOS_2015 > 0),
Porcentaje_municipios = (Municipios_con_ilicitos / Municipios) * 100,
Area_ilicitos_total = sum(AREA_ILICITOS_2015, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(Area_ilicitos_total))
print("Análisis por departamento:")
## [1] "Análisis por departamento:"
print(analisis_depto)
## # A tibble: 22 × 5
## DEPARTAMENTO Municipios Municipios_con_ilicitos Porcentaje_municipios
## <chr> <int> <int> <dbl>
## 1 NARIÑO 27 26 96.3
## 2 PUTUMAYO 10 10 100
## 3 NORTE DE SANTANDER 16 15 93.8
## 4 CAUCA 22 19 86.4
## 5 CAQUETÁ 16 16 100
## 6 GUAVIARE 4 4 100
## 7 META 9 9 100
## 8 ANTIOQUIA 30 25 83.3
## 9 CHOCÓ 20 19 95
## 10 CÓRDOBA 5 5 100
## # ℹ 12 more rows
## # ℹ 1 more variable: Area_ilicitos_total <dbl>
# Gráfico de departamentos con mayor área ilícita
p_depto <- analisis_depto %>%
filter(Area_ilicitos_total > 0) %>%
slice_head(n = 10) %>%
ggplot(aes(x = reorder(DEPARTAMENTO, Area_ilicitos_total), y = Area_ilicitos_total)) +
geom_bar(stat = "identity", fill = "brown", alpha = 0.7) +
coord_flip() +
labs(
title = "Departamentos con Mayor Área de Cultivos Ilícitos",
subtitle = "Año 2015",
x = "Departamento",
y = "Área Total (ha)"
) +
theme_minimal()
print(p_depto)
INTERPRETACIONES Y CONCLUSIONES
TENDENCIAS EN CULTIVOS LÍCITOS (2007-2015) Los gráficos de línea construidos a partir de la base consolidada de cadenas productivas revelan tendencias diferenciadas en el uso del suelo agrícola. Por un lado, cultivos como los cereales y algunos frutales muestran un patrón de crecimiento sostenido o estable durante el período analizado, lo cual podría estar asociado con programas de desarrollo rural o mercados consolidados. Por otro lado, se observan cultivos que presentan estancamiento o incluso disminución en su área sembrada o cosechada, lo que podría indicar cambios en los mercados, problemas de rentabilidad o afectaciones por factores climáticos. Estos patrones divergentes destacan la heterogeneidad del sector agrícola colombiano y la necesidad de no analizarlo como un bloque uniforme.
CONCENTRACIÓN DE CULTIVOS ILÍCITOS Y CARACTERÍSTICAS TERRITORIALES El cálculo del indicador “Porcentaje de cultivos ilícitos = (Área de cultivos ilícitos / (Área total de cultivos ilícitos + Área total de cultivos lícitos)) x 100*” para el año 2015 permitió identificar con precisión los municipios donde esta actividad tiene un peso desproporcionado dentro de la matriz productiva. El gráfico de barras de los 20 municipios con los porcentajes más altos confirma que los cultivos de uso ilícito no se distribuyen aleatoriamente, sino que se concentran de manera abrumadora en territorios con características muy específicas: municipios ubicados en zonas fronterizas o de geografía compleja (selvática o montañosa), con una prolongada historia de conflicto armado y presencia de grupos al margen de la ley, donde la presencia institucional del Estado ha sido tradicionalmente débil o intermitente, y que carecen de alternativas económicas lícitas viables y competitivas. Esta no es una coincidencia, sino el reflejo de cómo condiciones estructurales de orden social, económico y de seguridad crean un caldo de cultivo para esta economía ilegal.
PATRONES TERRITORIALES DE LA CONCENTRACIÓN La geografía de los cultivos ilícitos en Colombia no es difusa, sino que presenta una clara focalización espacial. El análisis identifica núcleos críticos en regiones históricamente afectadas, como el departamento de Nariño, donde municipios como Tumaco aparecen consistentemente entre los de mayor afectación; Norte de Santander, con epicentros en Tibú y Sardinata, zonas con fuerte influencia de dinámicas fronterizas; el Putumayo, con Puerto Asís y Puerto Caicedo; el Cauca, particularmente en El Tambo; y regiones de Antioquia como Tarazá y Valdivia. Este patrón no solo confirma la persistencia del fenómeno en corredores estratégicos (frontera, Pacífico, zonas de cordillera), sino que también sugiere una cierta “especialización” territorial, donde factores como las rutas del narcotráfico, la presencia de actores armados y las redes logísticas existentes perpetúan la actividad en los mismos territorios a lo largo del tiempo.
IMPLICACIONES PARA LA POLÍTICA PÚBLICA Los hallazgos del ejercicio tienen implicaciones directas para el diseño e implementación de políticas:
Políticas diferenciadas por territorio: Una política uniforme contra los cultivos ilícitos está condenada al fracaso. Los resultados exigen intervenciones customizadas que reconozcan las realidades sociales, económicas y de seguridad únicas de cada uno de los núcleos identificados (Nariño, Putumayo, etc.).
Centralidad de las alternativas económicas lícitas: El análisis refuerza la evidencia de que la mera erradicación, sin ofrecer opciones viables, es insostenible. El desarrollo de cadenas productivas lícitas competitivas, basadas en los potenciales reales de cada territorio (como los mostrados en la base de cadenas productivas), se convierte en un pilar estratégico.
Fortalecimiento institucional integral: Combatir los cultivos ilícitos requiere mucho más que presencia de fuerza pública. Implica un Estado capaz de ofrecer justicia, educación, salud, titulación de tierras y vías de comunicación de manera permanente y creíble en estas zonas críticas.
Enfoque de “seguridad y desarrollo”: La dicotomía entre seguridad y desarrollo es falsa en estos contextos. Se necesita un enfoque integral que, de manera sincronizada, combine acciones de seguridad para desarticular las redes ilegales con programas robustos de desarrollo rural, legalidad y construcción de ciudadanía.
LIMITACIONES DEL ANÁLISIS Es importante reconocer las limitaciones de este estudio para una correcta interpretación de los resultados:
Calidad de los datos de cultivos lícitos: La parte del análisis correspondiente a las tendencias de cultivos lícitos (Ejercicio 2.1 y 2.2) se realizó con datos simulados, ya que la base “Cadena_Productiva.xlsx” proporcionada contenía información duplicada de cultivos ilícitos. Por lo tanto, las conclusiones sobre evolución y patrones lícitos son ilustrativas del método, pero deben ser validadas con la base de datos real de cultivos lícitos.
Indicador de proporción: El porcentaje calculado no está normalizado por el tamaño del municipio (área total o población). Un porcentaje alto en un municipio pequeño puede representar menos hectáreas absolutas que un porcentaje moderado en uno muy grande. Un análisis complementario con el área absoluta de cultivos ilícitos proporcionaría una perspectiva adicional.
Riesgo de subregistro: Tanto los registros de cultivos ilícitos (afectados por la accesibilidad) como los de cultivos lícitos (afectados por la capacidad de reporte de los agricultores) están sujetos a subregistro, lo que podría distorsionar los porcentajes, especialmente en las zonas de más difícil acceso y control.