1 Carga de librerías y configuración

library(pacman)
p_load(dplyr, ggplot2, lubridate, stringr, tidyr, readxl, scales, plotly, writexl, shiny, shinydashboard)

# Establecer directorio de trabajo
dir <- dirname(rstudioapi::getActiveDocumentContext()$path)
setwd(dir)

2 Carga de datos

delitos <- list.files(pattern = "delitos_denunciados_20.*\\.csv") %>%
  lapply(read.csv) %>%
  bind_rows()

# Eliminar columnas duplicadas por nombre
delitos <- delitos[, !duplicated(names(delitos))]

# Renombrar solo si 'fecha_descarga' existe y 'Fecha_descarga' no existe
if ("fecha_descarga" %in% names(delitos) && !"Fecha_descarga" %in% names(delitos)) {
  delitos <- delitos %>% rename(Fecha_descarga = fecha_descarga)
}

3 Limpieza de datos

delitos_limpios <- delitos %>%
  select(
    anio = anio_denuncia,
    departamento = dpto_pjfs,
    delito = generico,
    subdelito = subgenerico,
    cantidad
  ) %>%
  filter(!is.na(anio) & !is.na(departamento) & !is.na(delito) & !is.na(subdelito)) %>%
  mutate(departamento = str_trim(str_to_upper(departamento)))

poblacion <- read_excel("poblacion_departamental_2018_2023.xlsx") %>%
  rename(departamento = Departamento) %>%
  mutate(departamento = str_trim(str_to_upper(departamento))) %>%
  pivot_longer(cols = `2018`:`2023`, names_to = "anio", values_to = "poblacion") %>%
  mutate(anio = as.integer(anio))

# Unión de datasets
df_joined <- delitos_limpios %>%
  left_join(poblacion, by = c("departamento", "anio"))

4 Análisis General de Delitos

🔍 A lo largo de los años 2018–2023, el Perú ha enfrentado un panorama complejo en cuanto a criminalidad. Este gráfico presenta la evolución de las denuncias totales por año, reflejando el comportamiento agregado delictivo a nivel nacional.

df_joined %>%
  group_by(anio) %>%
  summarise(total = sum(cantidad), .groups = "drop") %>%
  ggplot(aes(anio, total)) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color = "darkred", size = 2) +
  labs(title = "Delitos denunciados por año", x = "Año", y = "Total") +
  theme_minimal()

📌 ¿Qué tipos de delitos se denuncian más en el país? Este gráfico nos permite observar cuáles subdelitos son los más frecuentes entre 2018 y 2023, con énfasis en los de mayor impacto social.

df_joined %>%
  group_by(subdelito) %>%
  summarise(total = sum(cantidad), .groups = "drop") %>%
  slice_max(total, n = 10) %>%
  ggplot(aes(x = reorder(subdelito, total), y = total, fill = subdelito)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Top 10 subdelitos (2018–2023)", x = "Subdelito", y = "Total") +
  theme_minimal()

📍 El siguiente gráfico revela los departamentos con mayores cantidades de delitos denunciados. Esto permite identificar focos territoriales del crimen y orientar estrategias de prevención.

df_joined %>%
  group_by(departamento) %>%
  summarise(total = sum(cantidad), .groups = "drop") %>%
  ggplot(aes(x = reorder(departamento, total), y = total, fill = departamento)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Delitos por departamento", x = "Departamento", y = "Total") +
  theme_minimal()

5 Análisis de Extorsión (2019–2023)

⚠️ Entre 2019 y 2023, el delito de extorsión ha presentado un crecimiento preocupante. Este gráfico muestra su evolución anual, evidenciando una tendencia creciente que merece atención urgente.

df_joined %>%
  filter(subdelito == "EXTORSION") %>%
  group_by(anio) %>%
  summarise(total = sum(cantidad), .groups = "drop") %>%
  ggplot(aes(anio, total)) +
  geom_line(color = "purple") +
  geom_point(color = "black") +
  labs(title = "Evolución del delito de extorsión (2019–2023)", x = "Año", y = "Total") +
  theme_minimal()

🏴‍☠️ Este gráfico identifica las regiones más golpeadas por la extorsión, calculando la tasa por cada 100,000 habitantes. Permite dimensionar el impacto real más allá de los números absolutos.

tasa_extorsion <- df_joined %>%
  filter(subdelito == "EXTORSION", anio %in% 2019:2023, !is.na(poblacion), poblacion > 0) %>%
  group_by(departamento) %>%
  summarise(
    total_extorsiones = sum(cantidad),
    poblacion_promedio = mean(poblacion),
    tasa_100k = (total_extorsiones / poblacion_promedio) * 100000,
    .groups = "drop"
  ) %>%
  slice_max(tasa_100k, n = 10)

ggplot(tasa_extorsion, aes(x = reorder(departamento, tasa_100k), y = tasa_100k, fill = departamento)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Top 10 regiones con mayor tasa de extorsión (por 100,000 hab.)",
       x = "Departamento", y = "Tasa por 100,000 habitantes") +
  theme_minimal()

6 Conclusión

El análisis muestra un crecimiento sostenido de las denuncias por delitos a nivel nacional. Particularmente, el delito de extorsión presenta un comportamiento creciente entre 2019 y 2023, afectando gravemente a regiones como La Libertad, Piura y Lima, tanto en volumen como en tasa por cada 100,000 habitantes.

Estos hallazgos permiten direccionar mejor las políticas de seguridad ciudadana.


👉 Este análisis busca ir más allá de las cifras con datos reales, se espera aportar a una conversación pública más informada, y a decisiones de política más efectivas.

📌 Autor del análisis: Luis Aguilar Contreras
📊 Fuente de datos: Ministerio Público del Perú e INEI