1. Resumen Ejecutivo:

El presente informe analiza la interrelación entre los delitos sexuales, la violencia intrafamiliar y los feminicidios en Colombia durante 2024 y 2025, con el objetivo de identificar patrones de asociación y proponer vías para una comprensión causal más profunda. Utilizando una metodología robusta de ciencia de datos en Python, que incluyó la consolidación, limpieza y estandarización de diversas bases de datos, se aplicó un análisis de correlación de Spearman.

Hallazgos Clave: Fuerte Correlación Positiva entre Delitos Sexuales y Violencia Intrafamiliar (0.765): Se observa una marcada co-ocurrencia de estos dos tipos de delitos,

Correlación Moderada y Positiva de Feminicidios con Otros Crímenes (Delitos Sexuales: 0.606; Violencia Intrafamiliar: 0.530):

Tras un riguroso filtrado de los datos de feminicidios, se evidencia que las áreas con mayor incidencia de delitos sexuales y violencia intrafamiliar también tienden a registrar más feminicidios. Este hallazgo valida la idea de un “continuo de violencia de género” y subraya la importancia de un preprocesamiento de datos preciso.

Tendencia Negativa Marginal_ con el Año: Todos los tipos de crímenes muestran correlaciones negativas muy débiles con el año (entre -0.067 y -0.161), indicando una ligera disminución de incidentes entre 2024 y 2025, aunque esta tendencia debe interpretarse con cautela debido al corto marco temporal.  

Conclusiones y Recomendaciones: Los delitos de violencia de género contra mujeres están profundamente interconectados, lo que requiere estrategias de prevención y atención integrales que aborden sus raíces comunes.

La correlación, si bien no implica causalidad, señala áreas críticas para la intervención. Para futuras investigaciones, se recomienda explorar la causalidad mediante modelos de regresión múltiple (Poisson/Negativa Binomial), análisis de series de tiempo (Causalidad de Granger con más datos), diseños cuasi-experimentales (DiD, RDD) y Modelado de Ecuaciones Estructurales (SEM), complementados con investigación cualitativa para entender los mecanismos subyacentes. Se propone una estrategia dual utilizando Python para el análisis profundo y R para visualizaciones profesionales.

2. Introducción

El presente informe analiza de forma exhaustiva la interrelación y correlación entre los delitos sexuales, la violencia intrafamiliar y los feminicidios en Colombia, abarcando los años 2024 y 2025.Utilizando una base de datos integrada de diversas fuentes por parte de la policia Nacional,este estudio se enfoca en identificar patrones de asociación y dependencia estadística entre estos fenómenos de violencia de género.

A lo largo del documento, se presentan hallazgos descriptivos, visualizaciones claves y análisis de correlación de Spearman que permiten comprender mejor cómo la frecuencia y distribución de estos delitos se relacionan entre sí y evolucionan temporalmente. Se destacarán las correlaciones significativas, como la fuerte relación entre los delitos sexuales y la violencia intrafamiliar, y cómo estas dinámicas impactan en la ocurrencia de feminicidios. El objetivo es proporcionar insights cruciales para futuras investigaciones y el desarrollo de estrategias de prevención y atención más efectivas, reconociendo la complejidad de la violencia de género y su naturaleza interconectada.

3. Pregunta problema central:

¿Cómo influyen los delitos sexuales y la violencia intrafamiliar en la ocurrencia de feminicidios en Colombia entre 2024 y 2025, y qué factores agregados modulan estas dinámicas de violencia de género?

4. Objetivos del informe

4.1 Objetivo General:

Analizar la interrelación entre los delitos sexuales, la violencia intrafamiliar y los feminicidios en Colombia para los años 2024 y 2025, e identificar los factores agregados que influyen en estas dinámicas de violencia de género.

4.2 Objetivos especificos:

1. Establecer la Correlación Positiva Fuerte: Determinar si existe una correlación positiva fuerte entre la incidencia de delitos sexuales y la violencia intrafamiliar contra mujeres a nivel municipal/departamental, para identificar factores comunes subyacentes.

2.Evaluar la Influencia en Feminicidios: Investigar si los feminicidios muestran una correlación positiva moderada con los delitos sexuales y la violencia intrafamiliar, lo que indicaría que la prevalencia de formas menos letales de violencia de género es un indicador de riesgo y factor influyente para la ocurrencia de feminicidios.

3.Analizar la Estabilidad Temporal: Determinar si la incidencia de los delitos de violencia de género (delitos sexuales, violencia intrafamiliar y feminicidios) muestra una tendencia relativamente estable o una ligera disminución entre 2024 y 2025.

5. Limitaciones del proyecto:

1.Marco Temporal Limitado: El análisis se restringe a un período de dos años (2024-2025). Esto limita la capacidad de establecer tendencias a largo plazo o de inferir patrones estacionales o cíclicos robustos.

2.Correlación vs. Causalidad: Es fundamental recordar que el presente estudio se basa en el análisis de correlación, la cual indica la existencia de asociaciones entre variables, pero no establece relaciones causales directas. Para inferir causalidad, se requerirán metodologías adicionales y datos más complejos.

3.Definición de Feminicidio: Aunque se realizó un filtrado riguroso, la definición y el reporte de feminicidios pueden variar, lo que podría afectar la comparabilidad y la interpretación.

4.Imputación de Día del hecho: La columna ‘Dia del hecho’ en la fuente de datos de feminicidios contenía nombres de días de la semana (ejemplo., ‘lunes’, ‘martes’) y fue imputada a un valor numérico genérico (1) durante el preprocesamiento para la creación de la columna de fecha. Esto significa que se perdió la información específica del día de la semana, lo que impide un análisis temporal detallado por día.

6.Metodología Utilizada (Resumen del Proceso de Análisis de Datos)

El proceso de análisis de datos se estructuró en diez fases clave, siguiendo una metodología robusta de ciencia de datos:

1.Carga y Consolidación de Datos: Integración de cinco archivos Excel de delitos sexuales, violencia intrafamiliar y feminicidios (2024-2025) en un df_master único. Se añadieron columnas Year y Crime_Type, y se estandarizó la columna ‘Manera de Muerte’ para consistencia.

2.Inspección y Limpieza Inicial: Revisión de df_master para identificar y tratar valores nulos en ‘DEPARTAMENTO’, ‘MUNICIPIO’, ‘FECHA HECHO’, ‘CODIGO DANE’ y ‘CANTIDAD’ mediante imputación por ‘Desconocido’,. Los tipos de datos se ajustaron según correspondiera.

3.Unificación de Nombres de Localidades: Aplicación de una función robusta para estandarizar ‘DEPARTAMENTO’ y ‘MUNICIPIO’ (remoción de tildes, conversión a mayúsculas, corrección de errores). La columna ‘GENERO’ también se estandarizó.

4.Filtrado Específico para Violencia de Género: df_master fue filtrado para incluir solo registros de ‘GENERO’=‘FEMENINO’. Para ‘FEMENICIDIOS’, se aplicó un filtro adicional restringiendo a ‘Manera de Muerte’ = ‘1 Presuntos Homicidios’.

5.Feature Engineering para Correlación: Creación de df_features agrupando el df_master filtrado por DEPARTAMENTO, MUNICIPIO, Year y GENERO. La columna Crime_Type se pivotó para generar columnas numéricas de conteo de incidentes, rellenando nulos con ceros.

6.Visualización y Estrategias de Outliers: Generación de histogramas, diagramas de caja y scatter plots para las columnas numéricas de df_features. Se identificaron distribuciones asimétricas y outliers significativos, los cuales se decidieron retener como datos legítimos, considerando transformaciones o métodos robustos para futuras modelizaciones.

7.Validación de Normalidad: Pruebas de Shapiro-Wilk para todas las columnas numéricas de df_features. Los p-valores de 0.0000 confirmaron que ninguna columna sigue una distribución normal.

8.Estandarización y Normalización: Aplicación de StandardScaler y MinMaxScaler a las columnas numéricas. Se aclaró que, para la correlación de Spearman, estas transformaciones no eran estrictamente necesarias ya que opera sobre los rangos. Determinación del Método de Correlación Apropiado

9.(Correlación de Spearman): Basado en la ausencia de normalidad en las distribuciones de los datos, la presencia de outliers y la naturaleza ordinal de la columna Year (con solo dos valores), se seleccionó el coeficiente de correlación de Spearman como el método más adecuado. Este método no paramétrico es robusto ante estas características, midiendo la fuerza y dirección de una relación monótona en lugar de lineal.

10.Generación y Visualización de la Matriz de Correlación: Cálculo de la matriz de correlación de Spearman para las columnas numéricas (DELITOS_SEXUALES, FEMENICIDIOS, VIOLENCIA_INTRAFAMILIAR, Year) en df_features y su visualización mediante un mapa de calor (heatmap).

7. Librerías utilizadas

Para garantizar un análisis ordenado, limpio y reproducible, se utilizaron las siguientes librerías:

tidyverse: Conjunto esencial para manipulación avanzada de datos y visualización.

dplyr: Herramientas para filtrar, ordenar, seleccionar columnas y transformar datos.

tidyr: Funciones para reorganizar y limpiar estructuras tabulares.

readr: Lectura eficiente de archivos de texto.

readxl: Importación directa de archivos Excel sin necesidad de software adicional.

here: Administración segura de rutas internas del proyecto.

kableExtra: Mejora la presentación de tablas para informes profesionales.

knitr: Motor encargado de renderizar el documento con control del formato y ejecución de código.

ggplot2:es una librería de visualización de datos en R que sigue el principio de “Gramática de Gráficos”

8. Análisis de Normalidad: Prueba de Shapiro-Wilk

8.1. Carga de datos

library(readr)
library(dplyr)
library(kableExtra)

# Cargar datos
datos <- read_csv("BD_CORRELACION.csv")

# Identificar variables numéricas
variables_numericas <- datos %>%
  select(where(is.numeric)) %>%
  names()

cat("Variables numéricas identificadas: ", length(variables_numericas))
## Variables numéricas identificadas:  7
cat(paste("\n- ", variables_numericas, collapse = ""))
## 
## -  Year
## -  DELITOS_SEXUALES
## -  FEMENICIDIOS
## -  VIOLENCIA_INTRAFAMILIAR
## -  DELITOS_SEXUALES_log_transformed
## -  FEMENICIDIOS_log_transformed
## -  VIOLENCIA_INTRAFAMILIAR_log_transformed
resultados_shapiro <- data.frame()

for (var in variables_numericas) {
  valores <- na.omit(datos[[var]])
  n <- length(valores)
  
  if (n >= 3) {
    prueba <- shapiro.test(valores)
    
    resultados_shapiro <- rbind(
      resultados_shapiro,
      data.frame(
        Variable = var,
        n = n,
        W = round(prueba$statistic, 4),
        `p-valor` = round(prueba$p.value, 6),
        Normalidad = ifelse(prueba$p.value > 0.05, "SÍ", "NO"),
        stringsAsFactors = FALSE
      )
    )
  }
}
Resultados de la prueba de Shapiro-Wilk
Variable n W p.valor Normalidad
W Year 2211 0.6366 0 NO
W1 DELITOS_SEXUALES 2211 0.0519 0 NO
W2 FEMENICIDIOS 2211 0.1602 0 NO
W3 VIOLENCIA_INTRAFAMILIAR 2211 0.0458 0 NO
W4 DELITOS_SEXUALES_log_transformed 2211 0.9465 0 NO
W5 FEMENICIDIOS_log_transformed 2211 0.8800 0 NO
W6 VIOLENCIA_INTRAFAMILIAR_log_transformed 2211 0.9544 0 NO

8.2 Interpretación estadística de la normalidad

En esta sección se presenta la interpretación de la prueba de normalidad aplicada a las variables del estudio, con base en el test Shapiro–Wilk.

Hipótesis de la prueba

H₀ (Hipótesis nula): La variable sigue una distribución normal.

Esto significa que asumimos inicialmente que los datos tienen una forma de campana (Gauss), sin asimetrías fuertes.

H₁ (Hipótesis alternativa): La variable NO sigue una distribución normal.

Esta hipótesis afirma que la variable presenta asimetrías, colas largas o comportamientos que se alejan de una distribución normal.

Criterio de decisión (α = 0.05)

Si p > 0.05 → No se rechaza H₀ → La variable puede considerarse normal.

Si p ≤ 0.05 → Se rechaza H₀ y se acepta H₁ → La variable es NO normal.

Resultados de normalidad

La prueba de Shapiro–Wilk arrojó los siguientes resultados:

Year: p = 0 → NO normal

DELITOS_SEXUALES: p = 0 → NO normal

FEMENICIDIOS: p = 0 → NO normal

VIOLENCIA_INTRAFAMILIAR: p = 0 → NO normal

Todas las variables presentan valores de p ≤ 0.05, por lo cual se rechaza H₀ en todos los casos.

Conclusión:

Dado que ninguna de las variables sigue una distribución normal, se concluye lo siguiente:

No es adecuado utilizar correlación de Pearson, ya que esta requiere normalidad en los datos.

En su lugar, se debe emplear la correlación de* Spearman, porque:

No exige normalidad,

Funciona con datos asimétricos o con distribuciones sesgadas,

Usa rangos en vez de valores directos, lo cual es más robusto.

7. Graficas

1. Histograma para Delitos sexuales comparativa normal y log1p

library(ggplot2)
library(dplyr)
library(readr)

# Instalar gridExtra si no está instalado
if (!require(gridExtra)) {
  install.packages("gridExtra")
  library(gridExtra)
}

# Tu base de datos
# correlacion <- read_csv("BD_CORRELACION.csv")

# Asegurar que la columna log-transformada exista
if(!"DELITOS_SEXUALES_log_transformed" %in% names(correlacion)) {
  correlacion <- correlacion %>%
    mutate(DELITOS_SEXUALES_log_transformed = log1p(DELITOS_SEXUALES))
}

# Histograma original
p1 <- ggplot(correlacion, aes(x = DELITOS_SEXUALES)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black") +
  geom_density(color = "red", size = 1) +
  ggtitle("Distribución Original de DELITOS_SEXUALES") +
  xlab("DELITOS_SEXUALES") +
  ylab("Densidad") +
  theme_minimal()

# Histograma transformado log1p
p2 <- ggplot(correlacion, aes(x = DELITOS_SEXUALES_log_transformed)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "lightgreen", color = "black") +
  geom_density(color = "blue", size = 1) +
  ggtitle("Distribución Transformada (log1p) de DELITOS_SEXUALES") +
  xlab("DELITOS_SEXUALES_log_transformed") +
  ylab("Densidad") +
  theme_minimal()

# Mostrar los 2 gráficos lado a lado
grid.arrange(p1, p2, ncol = 2)

cat("Histogramas generados exitosamente.\n")
## Histogramas generados exitosamente.

1.1 Análisis: DELITOS_SEXUALES (Original vs. Transformado)

1. Histograma Original (Valores Reales):

Lo que muestra: La gran mayoría de los registros de delitos sexuales se concentran en valores muy bajos (cercanos a cero). Es como una ‘montaña’ de datos densamente agrupada al inicio del gráfico, con una larga ‘planicie’ que se extiende hacia la derecha para mostrar unos pocos casos con muchísimos incidentes. Problema: Debido a la enorme diferencia entre la mayoría de los casos y esos pocos valores extremos, es muy difícil ver con claridad la distribución de la mayoría de los delitos (los de baja frecuencia). Los valores extremos ‘comprimen’ la visualización de los datos más comunes.

2. Histograma Log-Transformado:

Lo que muestra: Al aplicar la transformación logarítmica, la distribución se ‘estira’. La ‘montaña’ de datos concentrados se expande y se vuelve mucho más equilibrada, formando ahora una figura más parecida a una ‘campana’ simétrica. Los valores extremos ya no dominan la escala del gráfico.

Ventaja: Permite ver con gran claridad la variabilidad y los patrones de la mayoría de los incidentes, revelando detalles que antes estaban ocultos o eran difíciles de percibir debido al sesgo.

3. ¿Por qué es la mejor práctica en proyectos reales?

Claridad para todos: Hace que los gráficos sean mucho más fáciles de entender para cualquier persona, sea o no experta, al mostrar la realidad de la distribución de forma más equitativa.

Análisis futuro: Prepara los datos para usar modelos estadísticos y de Machine Learning más avanzados que funcionan mejor con distribuciones equilibradas, lo que es esencial para la robustez y validez del análisis.

Manejo inteligente de datos: Suaviza el impacto visual y analítico de los valores muy altos sin eliminarlos, manteniendo toda la información importante para el análisis.

En resumen: Aunque nuestra forma de medir la correlación (Spearman) funciona bien con los datos originales, *la transformación logarítmica es clave para mejorar radicalmente la visualización y comprensión de los datos, y para tenerlos listos para cualquier análisis futuro en un entorno profesional.

1.2 Tabla profesional de outliers para delitos sexuales

# ===============================
# TABLA PROFESIONAL DE OUTLIERS PARA DELITOS SEXUALES
# ===============================

# Cálculo estadísticos IQR
Q1 <- quantile(correlacion$DELITOS_SEXUALES, 0.25, na.rm = TRUE)
Q3 <- quantile(correlacion$DELITOS_SEXUALES, 0.75, na.rm = TRUE)
IQR_value <- Q3 - Q1

lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

# Conteo de outliers
outliers_count <- correlacion %>%
  filter(DELITOS_SEXUALES < lower_bound |
         DELITOS_SEXUALES > upper_bound) %>%
  nrow()

total_registros <- nrow(correlacion)

# Tabla resumen
tabla_outliers <- tibble(
  `Q1 (25%)` = round(Q1, 2),
  `Q3 (75%)` = round(Q3, 2),
  `IQR` = round(IQR_value, 2),
  `Límite Inferior` = round(lower_bound, 2),
  `Límite Superior` = round(upper_bound, 2),
  `N° Outliers` = outliers_count,
  `Total Registros` = total_registros
)

# ===============================
# TABLA VISUAL PROFESIONAL 
# ===============================

tabla_outliers %>%
  kbl(
    caption = "Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Delitos Sexuales",
    align = c("c","c","c","c","c","c","c"),
    col.names = c("Q1", "Q3", "IQR", "Límite Inferior", 
                  "Límite Superior", "N° Outliers", "Total Registros")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  column_spec(1, bold = TRUE, background = "#f0f0f0") %>%          # Primera columna
  column_spec(2:7, background = "#f9f9f9") %>%                      # Resto de columnas
  row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>% # Encabezado
  add_header_above(c(" " = 1, "Estadísticos del Diagrama de Bigotes (Método IQR)" = 6))
Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Delitos Sexuales
Estadísticos del Diagrama de Bigotes (Método IQR)
Q1 Q3 IQR Límite Inferior Límite Superior N° Outliers Total Registros
2 11 9 -11.5 24.5 227 2211

1.3 Grafica Diagrama de caja y Bigotes de Delitos Sexuales

library(ggplot2)

ggplot(correlacion, aes(y = DELITOS_SEXUALES)) +
  geom_boxplot(
    fill = "#E69F00",             # Color anaranjado profesional
    color = "black",              # Bordes negros
    alpha = 0.8,                  # Transparencia elegante
    outlier.color = "#D55E00",    # Color fuerte para outliers
    outlier.size = 3,             # Tamaño para verlos claramente
    outlier.alpha = 0.8           # Más visibles
  ) +
  coord_flip() +                  #  Gráfica horizontal
  labs(
    title = "Diagrama de Caja y Bigotes de Delitos Sexuales",
    subtitle = "Visualización de valores atípicos (outliers)",
    x = NULL,
    y = "Número de Delitos Sexuales"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    plot.subtitle = element_text(hjust = 0.5),
    axis.title.y = element_text(face = "bold")
  )

1.4 Análisis de Datos Atipicos del Diagrama de Caja y Bigotes de Delitos Sexuales

Q1 (Cuartil 1): 2.0 incidentes

Significado: Esto nos dice que el 25% de todas las combinaciones de (Departamento, Municipio, Año) registraron 2 o menos incidentes de delitos sexuales. La mayoría de los datos están concentrados en valores muy bajos.

Q3 (Cuartil 3): 11.0 incidentes

Significado: Esto significa que el 75% de las combinaciones de (Departamento, Municipio, Año) registraron 11 o menos incidentes de delitos sexuales. Es decir, tres cuartas partes de los datos tienen un número relativamente bajo de incidentes. IQR (Rango Intercuartílico): 9.0 incidentes

Significado: El IQR es la diferencia entre Q3 y Q1 (11.0 - 2.0 = 9.0). este valor Representa el rango donde se encuentra el 50% central de los datos. Un IQR relativamente pequeño indica que la mayoría de tus datos están muy juntos.

Límite Inferior (Lower Bound): -11.5

Significado: Este es el punto por debajo del cual un valor se consideraría un outlier. En el contexto de conteos de delitos, un valor negativo no tiene sentido (no puedes tener -11.5 delitos), lo que reafirma que los outliers en tus datos solo se darán por el extremo superior. Límite Superior (Upper Bound): 24.5 incidentes

Significado: Este es el punto clave. Cualquier registro de DELITOS_SEXUALES que tenga más de 24.5 incidentes se considera un valor atípico (outlier), según la regla estándar del IQR (Q3 + 1.5 * IQR). Número de Outliers: 227 registros

Significado: Esta es la cuantificación de los valores atípicos. Hay 227 registros únicos (combinaciones de Departamento, Municipio, Año) en tu base de datos donde se reportaron más de 24.5 incidentes de delitos sexuales. Estos son los puntos que se ‘salen’ de lo común y que se ven como puntos individuales dispersos en el diagrama de caja. :: ## 2. Histograma para Violencia Intrafamiliar comparativa normal y log1

library(ggplot2)
library(dplyr)
library(readr)
library(gridExtra) # Cargar gridExtra para mostrar mùltiples gráficos

# 'correlacion' ya ha sido enviado desde Python

# Asegurar que la columna log-transformada exista en el DataFrame de R
# (ya fue creada en Python, pero si se recreara el DF de R, se haría aquí)
if(!"VIOLENCIA_INTRAFAMILIAR_log_transformed" %in% names(correlacion)) {
  correlacion <- correlacion %>%
    mutate(VIOLENCIA_INTRAFAMILIAR_log_transformed = log1p(VIOLENCIA_INTRAFAMILIAR))
}

# Histograma original de VIOLENCIA_INTRAFAMILIAR
p1 <- ggplot(correlacion, aes(x = VIOLENCIA_INTRAFAMILIAR)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "skyblue", color = "black") +
  geom_density(color = "red", linewidth = 1) +
  ggtitle("Distribución Original de VIOLENCIA_INTRAFAMILIAR") +
  xlab("VIOLENCIA_INTRAFAMILIAR") +
  ylab("Densidad") +
  theme_minimal()

# Histograma transformado log1p de VIOLENCIA_INTRAFAMILIAR
p2 <- ggplot(correlacion, aes(x = VIOLENCIA_INTRAFAMILIAR_log_transformed)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightgreen", color = "black") +
  geom_density(color = "blue", linewidth = 1) +
  ggtitle("Distribución Transformada (log1p) de VIOLENCIA_INTRAFAMILIAR") +
  xlab("VIOLENCIA_INTRAFAMILIAR_log_transformed") +
  ylab("Densidad") +
  theme_minimal()

# Mostrar los 2 gráficos lado a lado
grid.arrange(p1, p2, ncol = 2)

cat("Histogramas de VIOLENCIA_INTRAFAMILIAR generados exitosamente en R.")
## Histogramas de VIOLENCIA_INTRAFAMILIAR generados exitosamente en R.

2.2 Tabla profesional de outliers para Violencia intrafamiliar

# ===============================
# TABLA PROFESIONAL DE OUTLIERS PARA VIOLENCIA INTRAFAMILIAR
# ===============================

# Cálculo estadísticos IQR
Q1 <- quantile(correlacion$VIOLENCIA_INTRAFAMILIAR, 0.25, na.rm = TRUE)
Q3 <- quantile(correlacion$VIOLENCIA_INTRAFAMILIAR, 0.75, na.rm = TRUE)
IQR_value <- Q3 - Q1

lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

# Conteo de outliers
outliers_count <- correlacion %>%
  filter(VIOLENCIA_INTRAFAMILIAR < lower_bound |
         VIOLENCIA_INTRAFAMILIAR > upper_bound) %>%
  nrow()

total_registros <- nrow(correlacion)

# Tabla resumen
tabla_outliers <- tibble(
  `Q1 (25%)` = round(Q1, 2),
  `Q3 (75%)` = round(Q3, 2),
  `IQR` = round(IQR_value, 2),
  `Límite Inferior` = round(lower_bound, 2),
  `Límite Superior` = round(upper_bound, 2),
  `N° Outliers` = outliers_count,
  `Total Registros` = total_registros
)

# ===============================
# TABLA VISUAL PROFESIONAL (MISMO ESTILO QUE LA TUYA)
# ===============================

tabla_outliers %>%
  kbl(
    caption = "Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Violencia Intrafamiliar",
    align = c("c","c","c","c","c","c","c"),
    col.names = c("Q1", "Q3", "IQR", "Límite Inferior", 
                  "Límite Superior", "N° Outliers", "Total Registros")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  column_spec(1, bold = TRUE, background = "#f0f0f0") %>%
  column_spec(2:7, background = "#f9f9f9") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>%
  add_header_above(c(" " = 1, "Estadísticos del Diagrama de Bigotes (Método IQR)" = 6))
Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Violencia Intrafamiliar
Estadísticos del Diagrama de Bigotes (Método IQR)
Q1 Q3 IQR Límite Inferior Límite Superior N° Outliers Total Registros
4 25 21 -27.5 56.5 266 2211

2.3 Grafica Diagrama de caja y Bigotes de Delitos Sexuales

library(ggplot2)

ggplot(correlacion, aes(y = VIOLENCIA_INTRAFAMILIAR)) +
  geom_boxplot(
    fill = "#E69F00",             # Color anaranjado profesional
    color = "black",              # Bordes negros
    alpha = 0.8,                  # Transparencia elegante
    outlier.color = "#D55E00",    # Color fuerte para outliers
    outlier.size = 3,             # Tamaño para verlos claramente
    outlier.alpha = 0.8           # Más visibles
  ) +
  coord_flip() +                  # 👉 Gráfica horizontal
  labs(
    title = "Diagrama de Caja y Bigotes de Violencia Intrafamiliar",
    subtitle = "Visualización de valores atípicos (outliers)",
    x = NULL,
    y = "Número de Casos de Violencia Intrafamiliar"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    plot.subtitle = element_text(hjust = 0.5),
    axis.title.y = element_text(face = "bold")
  )

2.4 Análisis Delitos Sexuales Vs Violencia Intrfamiliar( Enfoque en Outliers)

En esencia, el patrón general de las distribuciones para DELITOS_SEXUALES y VIOLENCIA_INTRAFAMILIAR es muy similar: ambos son datos de conteo con una marcada asimetría positiva (sesgo a la derecha)

y una alta concentración de incidentes en valores bajos, lo que resulta en numerosos valores atípicos (outliers). Sin embargo, la diferencia

fundamental radica en la magnitud y frecuencia de estos outliers, lo cual se resume así:

1. Contexto General de la Distribución: o Ambas presentan una caja muy estrecha cerca de cero en el diagrama de caja, indicando que la mayoría de los registros tienen valores muy bajos. o Ambas tienen una larga cola de outliers extendiéndose hacia la derecha.

2. Diferencias Clave en los Outliers (Cuantificación): o Rango Intercuartílico (IQR):

DELITOS_SEXUALES: IQR de 9.0 (Q1: 2.0, Q3: 11.0)

VIOLENCIA_INTRAFAMILIAR:

IQR de 21.0 (Q1: 4.0, Q3: 25.0)

Implicación: La VIOLENCIA_INTRAFAMILIAR muestra una mayor dispersión en el 50% central de sus datos antes de llegar a los outliers. Es decir, sus incidentes ‘típicos’ o más frecuentes ya son más variados y a menudo más altos que los de DELITOS_SEXUALES. o Límite Superior para Outliers:

DELITOS_SEXUALES: Outlier si > 24.5 incidentes VIOLENCIA_INTRAFAMILIAR: Outlier si > 56.5 incidentes

Implicación: requiere un número mucho más alto de incidentes de violencia intrafamiliar para ser considerado un outlier.

Esto sugiere que losniveles base o ‘normales’ de VIOLENCIA_INTRAFAMILIAR son, en general, más elevados que los de DELITOS_SEXUALES. o Número Total de Outliers:

DELITOS_SEXUALES: 227 outliers VIOLENCIA_INTRAFAMILIAR: 266 outliers Implicación:

VIOLENCIA_INTRAFAMILIAR tiene un número ligeramente mayor de registros clasificados como atípicos, a pesar de que su umbral para ser considerado outlier es también mucho más alto. Esto indica una mayor frecuencia general de incidentes muy altos en VIOLENCIA_INTRAFAMILIAR.

En resumen: Ambos delitos presentan patrones de distribución similares (sesgados con outliers). Sin embargo, la violencia intrafamiliar se caracteriza por una mayor incidencia general, una mayor variabilidad en sus rangos centrales y umbrales de outliers más elevados, lo que sugiere que es un fenómeno más extendido y con picos de intensidad más altos que los delitos sexuales en los datos agregados.

3.Histograma para Femenicidios comparativa normal y log1p

library(ggplot2)
library(dplyr)
library(gridExtra)

# Crear columna log-transformada SI NO existe
if(!"FEMENICIDIOS_log_transformed" %in% names(correlacion)) {
  correlacion <- correlacion %>%
    mutate(FEMENICIDIOS_log_transformed = log1p(FEMENICIDIOS))
}

# Histograma original de FEMENICIDIOS
p1 <- ggplot(correlacion, aes(x = FEMENICIDIOS)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30,
                 fill = "skyblue", color = "black") +
  geom_density(color = "red", linewidth = 1) +
  ggtitle("Distribución Original de FEMENICIDIOS") +
  xlab("FEMENICIDIOS") +
  ylab("Densidad") +
  theme_minimal()

# Histograma log-transformado
p2 <- ggplot(correlacion, aes(x = FEMENICIDIOS_log_transformed)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30,
                 fill = "lightgreen", color = "black") +
  geom_density(color = "blue", linewidth = 1) +
  ggtitle("Distribución Transformada (log1p) de FEMENICIDIOS") +
  xlab("FEMENICIDIOS_log_transformed") +
  ylab("Densidad") +
  theme_minimal()

# Mostrar dos gráficos lado a lado
grid.arrange(p1, p2, ncol = 2)

3.1 Tabla profesional de outliers para Femenicidios

# ===============================
# TABLA PROFESIONAL DE OUTLIERS PARA FEMENICIDIOS
# ===============================

# Cálculo estadísticos IQR
Q1 <- quantile(correlacion$FEMENICIDIOS, 0.25, na.rm = TRUE)
Q3 <- quantile(correlacion$FEMENICIDIOS, 0.75, na.rm = TRUE)
IQR_value <- Q3 - Q1

lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

# Conteo de outliers
outliers_count <- correlacion %>%
  filter(FEMENICIDIOS < lower_bound |
         FEMENICIDIOS > upper_bound) %>%
  nrow()

total_registros <- nrow(correlacion)

# Tabla resumen
tabla_outliers <- tibble(
  `Q1 (25%)` = round(Q1, 2),
  `Q3 (75%)` = round(Q3, 2),
  `IQR` = round(IQR_value, 2),
  `Límite Inferior` = round(lower_bound, 2),
  `Límite Superior` = round(upper_bound, 2),
  `N° Outliers` = outliers_count,
  `Total Registros` = total_registros
)

# ===============================
# TABLA VISUAL PROFESIONAL (MISMO ESTILO QUE LA TUYA)
# ===============================

tabla_outliers %>%
  kbl(
    caption = "Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Femenicidios",
    align = c("c","c","c","c","c","c","c"),
    col.names = c("Q1", "Q3", "IQR", "Límite Inferior", 
                  "Límite Superior", "N° Outliers", "Total Registros")
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  column_spec(1, bold = TRUE, background = "#f0f0f0") %>%
  column_spec(2:7, background = "#f9f9f9") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2c3e50") %>%
  add_header_above(c(" " = 1, "Estadísticos del Diagrama de Bigotes (Método IQR)" = 6))
Resumen Estadístico para Identificación de Valores Atípicos (IQR) — Femenicidios
Estadísticos del Diagrama de Bigotes (Método IQR)
Q1 Q3 IQR Límite Inferior Límite Superior N° Outliers Total Registros
0 6 6 -9 15 253 2211
library(ggplot2)

ggplot(correlacion, aes(y = FEMENICIDIOS)) +
  geom_boxplot(
    fill = "#E69F00",             # Color anaranjado profesional
    color = "black",              # Bordes negros
    alpha = 0.8,                  # Transparencia elegante
    outlier.color = "#D55E00",    # Color fuerte para outliers
    outlier.size = 3,             # Tamaño para verlos claramente
    outlier.alpha = 0.8           # Más visibles
  ) +
  coord_flip() +                  # Gráfica horizontal
  labs(
    title = "Diagrama de Caja y Bigotes de Femenicidios",
    subtitle = "Visualización de valores atípicos (outliers)",
    x = NULL,
    y = "Número de Femenicidios"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    plot.subtitle = element_text(hjust = 0.5),
    axis.title.y = element_text(face = "bold")
  )

3.3 Análisis: FEMENICIDIOS (Histograma y Diagrama de Caja)

El análisis conjunto del histograma y el diagrama de caja de FEMENICIDIOS revela una distribución altamente asimétrica positiva (sesgada a la derecha), característica de datos de conteo con baja frecuencia general, pero con picos importantes.

1. Observaciones Clave de las Gráficas:

Concentración Extrema en Valores Bajos: Tanto el histograma como el diagrama de caja muestran una densidad abrumadora de registros en cero o valores muy cercanos a cero. El diagrama de caja, con su ‘caja’ principal extremadamente estrecha y ubicada en el punto cero, confirma que la inmensa mayoría de las combinaciones de (Departamento, Municipio, Año) registran muy pocos o ningún feminicidio.

Valores Atípicos (Outliers): Ambos gráficos evidencian la presencia de numerosos valores atípicos extendiéndose hacia la derecha. Estos puntos representan los casos donde la incidencia de feminicidios es inusualmente alta en comparación con la norma general, aunque sus números absolutos puedan parecer bajos respecto a otros delitos.

2. Cuantificación y Diferencias Clave:

Cuartiles (Q1: 0.0, Q3: 6.0) e IQR (6.0): El Rango Intercuartílico de 6.0 indica que el 50% central de los datos de feminicidios está concentrado en un rango muy estrecho de incidentes. Este IQR es significativamente menor que el de DELITOS_SEXUALES (9.0) y VIOLENCIA_INTRAFAMILIAR (21.0),

confirmando que los feminicidios son eventos más raros a nivel agregado.

Límite Superior para Outliers (15.0 incidentes): Un registro se considera atípico si supera los 15.0feminicidios. Este umbral es considerablemente menor que el de DELITOS_SEXUALES (24.5) y VIOLENCIA_INTRAFAMILIAR (56.5), lo cual es lógico: un número menor de feminicidios ya es excepcional debido a su menor frecuencia base.

Número Total de Outliers (253): A pesar de este umbral más bajo, se identificaron 253 valores atípicos. Este número es comparable con los 227 de DELITOS_SEXUALES y los 266 de VIOLENCIA_INTRAFAMILIAR.

Esto es crucial: significa que, aunque los feminicidios son menos frecuentes, hay muchas localidades que registran ‘picos’ de incidentes que son atípicos para su propia escala, destacando focos de alta concentración de este crimen.

3. Impacto de la Transformación Logarítmica:

La aplicación de una transformación logarítmica (como np.log1p) la cual se realizo en pytom a la distribución original de FEMENICIDIOS es esencial para la visualización. Convierte la distribución extremadamente sesgada en una más simétrica y parecida a una campana, permitiendo una mejor apreciación de la variabilidad entre los conteos bajos y moderados de feminicidios, que de otra manera quedarían ocultos por el sesgo extremo del cero.

En resumen: FEMENICIDIOS comparte la naturaleza sesgada de los otros delitos, . Sin embargo, la persistencia de un número significativo de outliers (253) resalta la importancia de identificar y entender las particularidades de las localidades donde este crimen es más prevalente. La transformación logarítmica es clave para desvelar los patrones ocultos en esta distribución tan concentrada.

4. Grafica de Correlación De Spearman

library(ggplot2)
library(reshape2)
library(readr)

# --- PASO 2: Cargar los datos ---
# Asegúrate de que el archivo 'BD_CORRELACION.csv' está en tu directorio de trabajo.
correlacion <- read_csv("BD_CORRELACION.csv")

# --- PASO 3: Crear el Mapa de Calor de Correlación ---

# Selección de variables en el mismo orden que la imagen
numerical_cols <- c(
  "DELITOS_SEXUALES",
  "FEMENICIDIOS",
  "VIOLENCIA_INTRAFAMILIAR",
  "Year"
)

# **CAMBIO CLAVE:** Usamos el objeto 'correlacion' en lugar de 'datos'
datos_num <- correlacion[, numerical_cols]

# Matriz de correlación de Spearman
cor_spearman <- cor(datos_num, method = "spearman", use = "complete.obs")

# Redondeamos solo para mostrar (como en seaborn)
cor_spearman_round <- round(cor_spearman, 2)

# Convertimos la matriz a un formato largo para ggplot2
cor_melt <- melt(cor_spearman_round)

# Generar el Heatmap con el estilo solicitado
ggplot(cor_melt, aes(Var2, Var1, fill = value)) +
  geom_tile(color = "white", linewidth = 1) +   # Bordes blancos como en seaborn
  scale_fill_gradient2(
    low = "#4575b4",   # Azul para correlaciones negativas
    mid = "white",     # Blanco para correlación cercana a cero
    high = "#d73027",  # Rojo para correlaciones positivas
    midpoint = 0,
    limits = c(-1, 1)
  ) +
  geom_text(aes(label = sprintf("%.2f", value)),
            color = "black", size = 5, fontface = "bold") + # Muestra los valores
  labs(
    title = "Matriz de Correlación de Spearman",
    x = "Crime_Type",
    y = "Crime_Type"
  ) +
  theme_minimal(base_size = 15) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid = element_blank(),
    axis.title.x = element_text(face = "bold"),
    axis.title.y = element_text(face = "bold")
  )

5.Análisis tecnico de la matriz de correlación De Spearman:

La matriz de correlación de Spearman nos permite cuantificar la fuerza y dirección de la relación monótona entre las variables, es decir, si tienden a aumentar o disminuir juntas de forma consistente, sin asumir una relación lineal o distribución normal.

DELITOS_SEXUALES vs. VIOLENCIA_INTRAFAMILIAR (0.76): Se observa una correlación positiva fuerte. Esto indica que, en las distintas combinaciones de Departamento/Municipio/Año, un rango más alto en la incidencia de delitos sexuales está consistentemente asociado con un rango más alto en la incidencia de violencia intrafamiliar. Sugiere la presencia de factores socioeconómicos, culturales o estructurales que inciden de manera similar en ambos fenómenos.

FEMENICIDIOS vs. DELITOS_SEXUALES (0.61): Existe una correlación positiva moderada a fuerte. Este hallazgo es crucial, ya que indica que las áreas con mayor prevalencia de delitos sexuales también tienden a experimentar un mayor número de feminicidios. Este resultado, especialmente tras el riguroso filtrado de feminicidios por homicidio, es consistente con la teoría del ‘continuo abuso de violencia de género’, donde una forma de violencia puede ser precursora o estar asociada a otra más extrema.

FEMENICIDIOS vs. VIOLENCIA_INTRAFAMILIAR (0.53): Se registra una correlación positiva moderada. Similar al caso anterior, esto sugiere que una mayor incidencia de violencia intrafamiliar también se relaciona con un aumento en los feminicidios, reforzando la interconexión de estas formas de violencia de género.

Delitos vs. Year (entre -0.07 y -0.16): Todas las correlaciones de los delitos con la variable Year son negativas pero muy débiles. Esto indica una tendencia marginalmente decreciente en la incidencia de estos crímenes entre 2024 y 2025. Sin embargo, dada la corta ventana temporal de solo dos años y la baja magnitud de los coeficientes, no podemos inferir una tendencia robusta a largo plazo.

5.Gráfico Scatter Plot:Delitos Sexuales vs Violencia Intrafamiliar

library(ggplot2)

ggplot(correlacion, aes(x = DELITOS_SEXUALES, y = VIOLENCIA_INTRAFAMILIAR)) +
  geom_point(alpha = 0.6, color = "skyblue") +
  ggtitle("Scatter Plot: DELITOS_SEXUALES vs VIOLENCIA_INTRAFAMILIAR") +
  xlab("DELITOS_SEXUALES (Cantidad de Incidentes)") +
  ylab("VIOLENCIA_INTRAFAMILIAR (Cantidad de Incidentes)") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    panel.grid.major = element_line()
  )

5.1 Analísis scatter plot delitos sexuales vs violencia intrafamiliar

En este análisis se describe cómo:

El gráfico muestra una fuerte concentración de puntos en valores bajos** para ambos delitos. Existe una clara tendencia ascendente, donde al aumentar los delitos sexuales, también lo hace la violencia intrafamiliar. La dispersión en valores altos indica que, aunque la relación es clara, no es perfectamente lineal.

Este análisis está en fuerte concordancia con el coeficiente de correlación de Spearman de 0.76,** lo que valida visual y estadísticamente esta relación monótona fuerte. Sugiere que estos delitos no son aislados, sino que comparten causas raíz o patrones que deben abordarse de manera integrada en las políticas públicas.

¿Necesitas que lo revise o amplíe algún punto en particular?

6. Grafica Delitos sexuales por rango de edades años 2024-2025:

# ================================
# Cargar librerías
# ================================
library(dplyr)
library(tidyr)
library(ggplot2)
library(readr)

# ================================
# Cargar la base
# ================================
BS_MASTER <- read_csv("BS_MASTER.csv")

# ================================
# Paso 1: Filtrar datos
# ================================
# CORRECCIÓN IMPORTANTE:
# Para DELITOS SEXUALES, solo deben contarse mujeres.
df_non_femicides_female <- BS_MASTER %>%
  filter(
    Crime_Type == "DELITOS_SEXUALES",
    GENERO == "FEMENINO"
  )

# ⚠ Se quita el filtro de FEMENICIDIOS porque este código
# es EXCLUSIVO para DELITOS SEXUALES.
df_filtered_for_analysis <- df_non_femicides_female

# ================================
# Paso 2: Agrupar por edad
# ================================
df_grouped_age <- df_filtered_for_analysis %>%
  group_by(DEPARTAMENTO, MUNICIPIO, Year, GENERO, Age_Group, Crime_Type) %>%
  summarise(CANTIDAD = sum(CANTIDAD), .groups = "drop")

df_features_age <- df_grouped_age %>%
  pivot_wider(
    names_from = Crime_Type,
    values_from = CANTIDAD,
    values_fill = 0
  )

# ================================
#  Eliminar NA y “Desconocido”
# ================================
df_features_age <- df_features_age %>%
  filter(!is.na(Age_Group), Age_Group != "Desconocido")

# ================================
# Paso 3: Resumir delitos sexuales por edad y año
# ================================
df_sexual_offenses_age_grouped <- df_features_age %>%
  select(Age_Group, Year, DELITOS_SEXUALES) %>%
  group_by(Age_Group, Year) %>%
  summarise(DELITOS_SEXUALES = sum(DELITOS_SEXUALES), .groups = "drop")

# ================================
#  Eliminar valores 0
# ================================
df_sexual_offenses_age_grouped <- df_sexual_offenses_age_grouped %>%
  filter(DELITOS_SEXUALES > 0)

# ================================
# Paso 4: Ordenar grupos de edad
# ================================
standard_age_categories <- c(
  "Niñez (0-11)",
  "Adolescencia (12-17)",
  "Juventud (18-26)",
  "Adultez (27-59)",
  "Mayor de 60"
)

df_sexual_offenses_age_grouped$Age_Group <- factor(
  df_sexual_offenses_age_grouped$Age_Group,
  levels = standard_age_categories
)

# ================================
# Nueva paleta pastel profesional
# ================================
paleta_profesional <- c(
  "#F4C2C2",  # rosado suave
  "#C4D7E0",  # azul suave
  "#F7E5C1",  # crema suave
  "#C5E8B7",  # verde suave
  "#D4C4FC"   # lavanda suave
)

# ================================
# PASO 5: GRÁFICO DE TOTALES
# ================================
ggplot(df_sexual_offenses_age_grouped,
       aes(x = Age_Group, y = DELITOS_SEXUALES, fill = factor(Year))) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = DELITOS_SEXUALES),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.8,
    fontface = "bold",      # ← NEGRITA
    color = "black"
  ) +
  scale_fill_manual(values = paleta_profesional) +
  labs(
    title = "Total de DELITOS SEXUALES por Grupo de Edad y Año (2024-2025)",
    x = "Grupo de Edad",
    y = "Total de Incidentes",
    fill = "Año"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(face = "bold", size = 14)
  )

# ================================
# Paso 6: Calcular porcentajes
# ================================
df_percent <- df_sexual_offenses_age_grouped %>%
  group_by(Year) %>%
  mutate(Total_Year = sum(DELITOS_SEXUALES)) %>%
  ungroup() %>%
  mutate(Percentage = round((DELITOS_SEXUALES / Total_Year) * 100, 1))

# ================================
# PASO 7: GRÁFICO DE PORCENTAJES
# ================================
ggplot(df_percent,
       aes(x = Age_Group, y = Percentage, fill = factor(Year))) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = paste0(Percentage, "%")),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.8,
    fontface = "bold",     # ← NEGRITA
    color = "black"
  ) +
  scale_fill_manual(values = paleta_profesional) +
  labs(
    title = "Porcentaje de DELITOS SEXUALES por Grupo de Edad y Año (2024-2025)",
    x = "Grupo de Edad",
    y = "Porcentaje (%)",
    fill = "Año"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(face = "bold", size = 14)
  )

6.1 Análisis integrado de Delitos Sexuales años 2024-2025:

Basado estrictamente en los valores numéricos y porcentuales mostrados en las dos gráficas.

El análisis de los Delitos Sexuales por grupo de edad para los años 2024 y 2025 evidencia cambios importantes tanto en los valores absolutos como en la participación porcentual de cada grupo etario.

En 2024, los grupos de mayor reporte fueron la Adultez (27–59) con 10,173 casos (40.2%), seguida por Adolescencia (12–17) con 7,802 casos (30.8%) y luego Niñez (0–11) con 7,331 casos (29%). Esto muestra que en 2024 los tres grupos de edad mantienen una distribución relativamente equilibrada, aunque con mayor concentración en la población adulta.

*Para 2025, la distribución cambia de forma notable. La Adultez (27–59) aumenta de manera considerable hasta 13,939 casos, representando 69.6% del total del año, consolidándose como el grupo con mayor incidencia. En contraste, los grupos de Niñez (0–11) y Adolescencia (12–17) presentan cifras más bajas, con 2,710 casos (13.5%) y 3,377 casos (16.9%), respectivamente. Esto indica que para 2025 la carga de casos se desplaza significativamente hacia la población adulta, reduciendo proporcionalmente la participación de los menores de edad.

En conjunto, los datos muestran que mientras en 2024 los Delitos Sexuales estaban distribuidos de forma más similar entre los grupos etarios, en 2025 la concentración se inclina marcadamente hacia la adultez, que no solo incrementa su magnitud absoluta sino también su aporte porcentual frente al total anual

7. Gráfica Violencia intrafamiliar por rango de edades años 2024-2025

# ================================
# Cargar librerías
# ================================
library(dplyr)
library(tidyr)
library(ggplot2)
library(readr)

# ================================
# Cargar la base
# ================================
BS_MASTER <- read_csv("BS_MASTER.csv")

# ================================
# Paso 1: Filtrar datos CORRECTAMENTE
# ================================
# ✔ Solo casos de VIOLENCIA_INTRAFAMILIAR en mujeres
df_vif_female <- BS_MASTER %>%
  filter(
    Crime_Type == "VIOLENCIA_INTRAFAMILIAR",
    GENERO == "FEMENINO"
  )

# ================================
# Paso 2: Agrupar por edad
# ================================
df_grouped_age <- df_vif_female %>%
  group_by(DEPARTAMENTO, MUNICIPIO, Year, GENERO, Age_Group, Crime_Type) %>%
  summarise(CANTIDAD = sum(CANTIDAD), .groups = "drop")

df_features_age <- df_grouped_age %>%
  pivot_wider(
    names_from = Crime_Type,
    values_from = CANTIDAD,
    values_fill = 0
  )

# ================================
# Eliminar NA y “Desconocido”
# ================================
df_features_age <- df_features_age %>%
  filter(!is.na(Age_Group), Age_Group != "Desconocido")

# ================================
# Paso 3: Resumir por edad y año
# ================================
df_vif_age_grouped <- df_features_age %>%
  select(Age_Group, Year, VIOLENCIA_INTRAFAMILIAR) %>%
  group_by(Age_Group, Year) %>%
  summarise(VIOLENCIA_INTRAFAMILIAR = sum(VIOLENCIA_INTRAFAMILIAR), .groups = "drop")

#  Eliminar valores 0
df_vif_age_grouped <- df_vif_age_grouped %>%
  filter(VIOLENCIA_INTRAFAMILIAR > 0)

# ================================
# Ordenar grupos de edad
# ================================
standard_age_categories <- c(
  "Niñez (0-11)",
  "Adolescencia (12-17)",
  "Juventud (18-26)",
  "Adultez (27-59)",
  "Mayor de 60"
)

df_vif_age_grouped$Age_Group <- factor(
  df_vif_age_grouped$Age_Group,
  levels = standard_age_categories
)

# ================================
# Paleta Pastel Profesional
# ================================
paleta_profesional <- c(
  "#F4C2C2",  # rosado suave
  "#C4D7E0",  # azul suave
  "#F7E5C1",  # crema suave
  "#C5E8B7",  # verde suave
  "#D4C4FC"   # lavanda suave
)

# ================================
# PASO 4: GRAFICO DE TOTALES
# ================================
ggplot(df_vif_age_grouped,
       aes(x = Age_Group, y = VIOLENCIA_INTRAFAMILIAR, fill = factor(Year))) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = VIOLENCIA_INTRAFAMILIAR),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.8,
    fontface = "bold",
    color = "black"
  ) +
  scale_fill_manual(values = paleta_profesional) +
  labs(
    title = "Total de VIOLENCIA INTRAFAMILIAR por Grupo de Edad y Año (2024-2025)",
    x = "Grupo de Edad",
    y = "Total de Incidentes",
    fill = "Año"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "top",
    plot.title = element_text(face = "bold", size = 14, hjust = 0),  # ← TÍTULO A LA IZQUIERDA
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

# ================================
# Paso 5: Calcular porcentajes
# ================================
df_percent_vif <- df_vif_age_grouped %>%
  group_by(Year) %>%
  mutate(Total_Year = sum(VIOLENCIA_INTRAFAMILIAR)) %>%
  ungroup() %>%
  mutate(Percentage = round((VIOLENCIA_INTRAFAMILIAR / Total_Year) * 100, 1))

# ================================
# PASO 6: GRÁFICO DE PORCENTAJES
# ================================
ggplot(df_percent_vif,
       aes(x = Age_Group, y = Percentage, fill = factor(Year))) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = paste0(Percentage, "%")),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.8,
    fontface = "bold",
    color = "black"
  ) +
  scale_fill_manual(values = paleta_profesional) +
  labs(
    title = "Porcentaje de VIOLENCIA INTRAFAMILIAR por Grupo de Edad y Año (2024-2025)",
    x = "Grupo de Edad",
    y = "Porcentaje (%)",
    fill = "Año"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "top",
    plot.title = element_text(face = "bold", size = 14, hjust = 0),  # ← TÍTULO A LA IZQUIERDA
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

7.1 Análisis integrado de Violencia intrafamiliar por rango de edades años 2024-2025

El análisis de los casos de Violencia Intrafamiliar por grupo de edad para los años 2024 y 2025 muestra una concentración marcada en la población adulta, con diferencias importantes entre ambos años tanto en cifras absolutas como en su participación porcentual.

En 2024, el grupo de Adultez (27–59) registra la mayor cantidad de incidentes con 90,774 casos, lo que equivale al 90% del total anual, lo que evidencia una concentración muy marcada en este segmento. Los grupos de Niñez (0–11) y Adolescencia (12–17) registran cifras considerablemente menores, con 5,485 casos (5.4%) y 4,622 casos (4.6%), respectivamente. Aunque ambos grupos presentan participación baja, mantienen un aporte similar y proporcionalmente reducido frente al peso dominante del grupo adulto.

Para 2025, se observa una disminución general en los valores absolutos, pero se mantiene el mismo patrón de concentración. La Adultez (27–59) reporta 74,635 casos, equivalente al 93.4% del total anual, mostrando incluso un incremento porcentual respecto al año anterior, pese a la reducción numérica. Por su parte, la Niñez (0–11) registra 3,043 casos (3.8%), y la Adolescencia (12–17) reporta 2,263 casos (2.8%),** ambas cifras inferiores a las de 2024 tanto en número como en proporción.

En conjunto, los datos de ambas gráficas reflejan que en 2024 y 2025 la Violencia Intrafamiliar se concentra de manera abrumadora en la población adulta. Aunque en 2025 disminuyen los casos totales, aumenta la proporción que recae en este grupo, mientras que la participación de la niñez y la adolescencia se reduce aún más. Esto evidencia un comportamiento consistente donde la adultez no solo mantiene sino que refuerza su predominio dentro de la distribución anual de incidentes.

7. Gráfica feminicidios por rango de edades años 2024-2025:

7.1 Análisis integrado de Femenicidios por rango de edades años 2024-2025

El análisis de los feminicidios por grupo de edad para los años 2024 y 2025 revela patrones claros tanto en la magnitud de los casos reportados como en su distribución porcentual entre los diferentes rangos etarios.

Año 2024

En 2024, el grupo con mayor número de feminicidios es la Adultez (27–59), con 529 casos, lo que corresponde al 52% del total anual. Este grupo concentra más de la mitad de los hechos reportados.

Le sigue el grupo Juventud (18–26) con 316 casos, equivalente al 31.1%,** constituyéndose como el segundo rango etario con mayor incidencia.

Los grupos de menor afectación en 2024 son:

Mayor de 60 años, con 80 casos (7.9%)

Adolescencia (12–17), con 58 casos (5.7%)

Niñez (0–11) con 34 casos (3.3%)

Esto muestra que en 2024 la mayor concentración de casos se encuentra en mujeres adultas y jóvenes, con una participación porcentual significativamente menor de niñas, adolescentes y mujeres mayores.

Año 2025

Para 2025, la distribución mantiene una estructura similar, aunque con variaciones en los valores absolutos.

El grupo de Adultez (27–59) permanece como el más afectado, con 251 casos, representando el 47.1% del total anual. Aunque el porcentaje disminuye respecto a 2024, sigue siendo el rango predominante.

En segundo lugar se ubica nuevamente la Juventud (18–26) con 169 casos, lo que equivale al 31.7%. Esto indica una estabilidad en la proporción del grupo juvenil entre ambos años.

Los demás grupos registran niveles inferiores:

Mayor de 60 años: 50 casos (9.4%)

Adolescencia (12–17): 49 casos (9.2%)

Niñez (0–11): 14 casos (2.6%)

En comparación con 2024, se observa una reducción generalizada de casos en todos los grupos, aunque la estructura de distribución porcentual se mantiene relativamente estable.

Conclusión

Los datos muestran que tanto en 2024 como en 2025 los feminicidios afectan principalmente a mujeres adultas (27–59) y jóvenes (18–26), que en conjunto representan más del 80% de los casos en ambos años. Aunque en 2025 se evidencian descensos numéricos en todos los grupos, la concentración por edad se mantiene similar, reafirmando que la mayor incidencia se presenta en mujeres en edades adultas y de mayor exposición social. Los grupos de niñez, adolescencia y adultos mayores continúan siendo los menos afectados en términos absolutos y porcentuales.