1. Introducción

El presente informe analiza los datos de feminicidios, violencia intrafamiliar y delitos sexuales ocurridos en Colombia durante el período 2024-2025. Es importante destacar que el 100% de los casos analizados corresponden a víctimas mujeres, lo que subraya la dimensión de género de esta problemática. El objetivo principal es identificar patrones, tendencias y características relevantes de estos casos, así como las relaciones entre las diferentes variables estudiadas, para proporcionar información valiosa que pueda guiar estrategias de prevención y atención a víctimas. La violencia de género representa una problemática social compleja que requiere análisis detallados y enfoques multidimensionales para su comprensión y abordaje. Este estudio busca contribuir al conocimiento de este fenómeno mediante el análisis estadístico exhaustivo de datos oficiales, identificando factores de riesgo, poblaciones vulnerables y contextos específicos donde se manifiesta con mayor intensidad. Los hallazgos presentados tienen como propósito fundamental informar la toma de decisiones y la implementación de políticas públicas efectivas para la prevención y erradicación de la violencia basada en género en el territorio colombiano. Código de análisis: INTRO-001

2. Descripción de los Datos

# Código para carga y exploración inicial de datos
datos <- read_excel("BD_Feminicidios_VioIntraFam_DelSex_YMas_20242025.xlsx", sheet = "Hoja1")

# Verificar que todos los casos son de mujeres
porcentaje_mujeres <- round(mean(datos$`Sexo de la víctima` == "Mujer", na.rm = TRUE) * 100, 1)
cat("Porcentaje de víctimas mujeres:", porcentaje_mujeres, "%\n")
## Porcentaje de víctimas mujeres: 100 %
# Estructura básica de los datos
str(datos)
## tibble [275 × 40] (S3: tbl_df/tbl/data.frame)
##  $ ID                                  : num [1:275] 271 720 907 1120 1130 ...
##  $ Año del hecho                       : num [1:275] 2024 2024 2024 2024 2024 ...
##  $ Grupo de edad de la víctima         : chr [1:275] "(30 a 34)" "(35 a 39)" "(30 a 34)" "(30 a 34)" ...
##  $ Grupo Mayor Menor de Edad           : chr [1:275] "Mayores de Edad (>18 años)" "Mayores de Edad (>18 años)" "Mayores de Edad (>18 años)" "Mayores de Edad (>18 años)" ...
##  $ Grupo de Edad judicial              : chr [1:275] "(29 a 34)" "(35 a 39)" "(29 a 34)" "(29 a 34)" ...
##  $ Ciclo Vital                         : chr [1:275] "(29 a 59) Adultez" "(29 a 59) Adultez" "(29 a 59) Adultez" "(29 a 59) Adultez" ...
##  $ Sexo de la víctima                  : chr [1:275] "Mujer" "Mujer" "Mujer" "Mujer" ...
##  $ Estado Civil                        : chr [1:275] "Casado(a)" "Casado(a)" "Soltero(a)" "Unión libre" ...
##  $ País de Nacimiento de la Víctima    : chr [1:275] "Colombia" "Colombia" "Colombia" "Colombia" ...
##  $ Escolaridad                         : chr [1:275] "Educación básica primaria" "Educación técnica profesional y tecnológica" "Educación media o secundaria alta" "Educación media o secundaria alta" ...
##  $ Pertenencia Grupal                  : chr [1:275] "Ninguno" "Ninguno" "Ninguno" "Ninguno" ...
##  $ Mes del hecho                       : chr [1:275] "febrero" "abril" "abril" "mayo" ...
##  $ Dia del hecho                       : chr [1:275] "viernes" "jueves" "viernes" "miércoles" ...
##  $ Rango de Hora del Hecho X 3 Horas   : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Código Dane Municipio               : num [1:275] 11001 11001 11001 11001 11001 ...
##  $ Municipio del hecho DANE            : chr [1:275] "Bogotá, D.C." "Bogotá, D.C." "Bogotá, D.C." "Bogotá, D.C." ...
##  $ Departamento del hecho DANE         : chr [1:275] "Bogotá, D.C." "Bogotá, D.C." "Bogotá, D.C." "Bogotá, D.C." ...
##  $ Código Dane Departamento            : num [1:275] 11 11 11 11 11 11 11 11 11 25 ...
##  $ Escenario del Hecho                 : chr [1:275] "Vivienda" "Vivienda" "Vivienda" "Establecimiento comercial (tienda, centro comercial, almacén, plaza de mercado)" ...
##  $ Zona del Hecho                      : chr [1:275] "Cabecera municipal" "Cabecera municipal" "Cabecera municipal" "Cabecera municipal" ...
##  $ Actividad Durante el Hecho          : chr [1:275] "Actividades de trabajo doméstico no pagado para el uso del propio hogar" "Actividades de trabajo doméstico no pagado para el uso del propio hogar" "No reportado" "Actividades relacionadas con el trabajo remunerado" ...
##  $ Circunstancia del Hecho             : chr [1:275] "Violencia de pareja" "Feminicidio" "Feminicidio" "Violencia de pareja" ...
##  $ Manera de Muerte                    : chr [1:275] "Presuntos Homicidios" "Presuntos Homicidios" "Presuntos Homicidios" "Presuntos Homicidios" ...
##  $ Mecanismo Causal                    : chr [1:275] "Cortopunzante" "Cortopunzante" "Contundente" "Cortopunzante" ...
##  $ Diagnóstico Topográfico de la Lesión: chr [1:275] "Trauma de Tórax" "Politraumatismo" "Politraumatismo" "Politraumatismo" ...
##  $ Presunto Agresor                    : chr [1:275] "Compañero(a) permanente" "Esposo(a)" "Ex compañero(a) permanente" "Ex compañero(a) permanente" ...
##  $ Razón del Suicidio                  : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Condición de la Víctima             : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Medio de Desplazamiento o Transporte: chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Servicio del Vehículo               : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Clase o Tipo de Accidente           : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Objeto de Colisión                  : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Servicio del Objeto de Colisión     : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Localidad del Hecho                 : chr [1:275] "Rafael Uribe Uribe" "Suba" "No reportado" "Usaquen" ...
##  $ Ancestro Racial                     : chr [1:275] "No reportado" "Mestizo" "Mestizo" "Mestizo" ...
##  $ Pueblo Indígena                     : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Orientación Sexual                  : chr [1:275] "No reportado" "Heterosexual" "No reportado" "No reportado" ...
##  $ Identidad de Género                 : chr [1:275] "Femenino" "Femenino" "No reportado" "Femenino" ...
##  $ Transgénero                         : chr [1:275] "No reportado" "No reportado" "No reportado" "No reportado" ...
##  $ Pertenencia Étnica                  : chr [1:275] "Sin Pertenencia Étnica" "Sin Pertenencia Étnica" "Sin Pertenencia Étnica" "Sin Pertenencia Étnica" ...
# Resumen estadístico inicial
summary(datos)
##        ID        Año del hecho  Grupo de edad de la víctima
##  Min.   :  271   Min.   :2024   Length:275                 
##  1st Qu.:10702   1st Qu.:2024   Class :character           
##  Median :19950   Median :2024   Mode  :character           
##  Mean   :20676   Mean   :2024                              
##  3rd Qu.:31186   3rd Qu.:2025                              
##  Max.   :43752   Max.   :2025                              
##  Grupo Mayor Menor de Edad Grupo de Edad judicial Ciclo Vital       
##  Length:275                Length:275             Length:275        
##  Class :character          Class :character       Class :character  
##  Mode  :character          Mode  :character       Mode  :character  
##                                                                     
##                                                                     
##                                                                     
##  Sexo de la víctima Estado Civil       País de Nacimiento de la Víctima
##  Length:275         Length:275         Length:275                      
##  Class :character   Class :character   Class :character                
##  Mode  :character   Mode  :character   Mode  :character                
##                                                                        
##                                                                        
##                                                                        
##  Escolaridad        Pertenencia Grupal Mes del hecho      Dia del hecho     
##  Length:275         Length:275         Length:275         Length:275        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Rango de Hora del Hecho X 3 Horas Código Dane Municipio
##  Length:275                        Min.   : 5001        
##  Class :character                  1st Qu.:11001        
##  Mode  :character                  Median :25269        
##                                    Mean   :36631        
##                                    3rd Qu.:68001        
##                                    Max.   :97001        
##  Municipio del hecho DANE Departamento del hecho DANE Código Dane Departamento
##  Length:275               Length:275                  Min.   : 5.00           
##  Class :character         Class :character            1st Qu.:11.00           
##  Mode  :character         Mode  :character            Median :25.00           
##                                                       Mean   :36.36           
##                                                       3rd Qu.:68.00           
##                                                       Max.   :97.00           
##  Escenario del Hecho Zona del Hecho     Actividad Durante el Hecho
##  Length:275          Length:275         Length:275                
##  Class :character    Class :character   Class :character          
##  Mode  :character    Mode  :character   Mode  :character          
##                                                                   
##                                                                   
##                                                                   
##  Circunstancia del Hecho Manera de Muerte   Mecanismo Causal  
##  Length:275              Length:275         Length:275        
##  Class :character        Class :character   Class :character  
##  Mode  :character        Mode  :character   Mode  :character  
##                                                               
##                                                               
##                                                               
##  Diagnóstico Topográfico de la Lesión Presunto Agresor   Razón del Suicidio
##  Length:275                           Length:275         Length:275        
##  Class :character                     Class :character   Class :character  
##  Mode  :character                     Mode  :character   Mode  :character  
##                                                                            
##                                                                            
##                                                                            
##  Condición de la Víctima Medio de Desplazamiento o Transporte
##  Length:275              Length:275                          
##  Class :character        Class :character                    
##  Mode  :character        Mode  :character                    
##                                                              
##                                                              
##                                                              
##  Servicio del Vehículo Clase o Tipo de Accidente Objeto de Colisión
##  Length:275            Length:275                Length:275        
##  Class :character      Class :character          Class :character  
##  Mode  :character      Mode  :character          Mode  :character  
##                                                                    
##                                                                    
##                                                                    
##  Servicio del Objeto de Colisión Localidad del Hecho Ancestro Racial   
##  Length:275                      Length:275          Length:275        
##  Class :character                Class :character    Class :character  
##  Mode  :character                Mode  :character    Mode  :character  
##                                                                        
##                                                                        
##                                                                        
##  Pueblo Indígena    Orientación Sexual Identidad de Género Transgénero       
##  Length:275         Length:275         Length:275          Length:275        
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##  Pertenencia Étnica
##  Length:275        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Dimensiones del conjunto de datos
cat("El conjunto de datos contiene", nrow(datos), "filas y", ncol(datos), "columnas.\n")
## El conjunto de datos contiene 275 filas y 40 columnas.
cat("Variables disponibles:", paste(names(datos), collapse = ", "), "\n")
## Variables disponibles: ID, Año del hecho, Grupo de edad de la víctima, Grupo Mayor Menor de Edad, Grupo de Edad judicial, Ciclo Vital, Sexo de la víctima, Estado Civil, País de Nacimiento de la Víctima, Escolaridad, Pertenencia Grupal, Mes del hecho, Dia del hecho, Rango de Hora del Hecho X 3 Horas, Código Dane Municipio, Municipio del hecho DANE, Departamento del hecho DANE, Código Dane Departamento, Escenario del Hecho, Zona del Hecho, Actividad Durante el Hecho, Circunstancia del Hecho, Manera de Muerte, Mecanismo Causal, Diagnóstico Topográfico de la Lesión, Presunto Agresor, Razón del Suicidio, Condición de la Víctima, Medio de Desplazamiento o Transporte, Servicio del Vehículo, Clase o Tipo de Accidente, Objeto de Colisión, Servicio del Objeto de Colisión, Localidad del Hecho, Ancestro Racial, Pueblo Indígena, Orientación Sexual, Identidad de Género, Transgénero, Pertenencia Étnica
# Verificación de valores faltantes
valores_faltantes <- sum(is.na(datos))
cat("Valores faltantes en el conjunto de datos:", valores_faltantes, "\n")
## Valores faltantes en el conjunto de datos: 0

El análisis inicial confirma que tenemos un conjunto de datos con 275 registros y 40 variables. El 100% de los casos corresponde a víctimas mujeres , lo que define la naturaleza específica de este análisis centrado en la violencia de género contra las mujeres. Las variables incluyen tanto datos categóricos (como Estado Civil, Departamento del hecho) como datos numéricos (Año del hecho), lo que nos permitirá realizar una variedad de análisis estadísticos. Es importante destacar que la calidad y completitud de los datos son fundamentales para la validez de los análisis posteriores, por lo que se ha realizado una revisión inicial de integridad y consistencia. La diversidad de variables disponibles permite abordar el fenómeno desde múltiples perspectivas, incluyendo aspectos demográficos, geográficos, temporales y contextuales. Este enfoque multidimensional es esencial para comprender la complejidad de la violencia de género y sus múltiples manifestaciones en diferentes contextos sociales y territoriales. Código de análisis: DATA-001

3. Análisis Univariado

El análisis univariado estudia cada variable de forma individual para entender su distribución y características principales. Este tipo de análisis es fundamental como punto de partida para comprender la estructura de los datos y detectar posibles problemas en las variables, como valores atípicos o distribuciones asimétricas. En esta sección, se examinarán las variables más relevantes del conjunto de datos, incluyendo características de las víctimas, circunstancias de los hechos y atributos de los presuntos agresores. Cada análisis incluirá visualizaciones gráficas que permitan una comprensión intuitiva de la distribución de los datos. La información obtenida en este análisis univariado servirá como base para los análisis bivariados y multivariados posteriores. Código de análisis: UNIV-001

3.1. Grupo de Edad

# Análisis de la distribución por grupo de edad con gráfico de barras horizontales
tabla_edad <- table(datos$`Grupo de edad de la víctima`)

tabla_edad_df <- tibble(
  Grupo_Edad = names(tabla_edad),
  Cantidad_Casos = as.numeric(tabla_edad),
  Porcentaje = round((as.numeric(tabla_edad) / sum(tabla_edad)) * 100, 2)
)

# Gráfico de barras horizontales con etiquetas visibles
ggplot(tabla_edad_df, aes(x = reorder(Grupo_Edad, Cantidad_Casos), y = Cantidad_Casos)) +
  geom_col(fill = "#8e24aa", alpha = 0.8, width = 0.7) +
  geom_text(aes(label = paste0(Cantidad_Casos, " (", Porcentaje, "%)")), 
            hjust = -0.1, size = 4, color = "#6a1b9a", fontface = "bold") +
  scale_y_continuous(limits = c(0, max(tabla_edad_df$Cantidad_Casos) * 1.15)) +
  labs(title = "Distribución de Casos por Grupo de Edad",
       x = "Grupo de Edad", y = "Cantidad de Casos") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        panel.grid.major = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank()) +
  coord_flip()

Los resultados indican que el grupo de edad (25 a 29) está involucrado en 49 casos, seguido por el grupo (35 a 39) con 33 casos. La distribución por edad revela patrones importantes sobre las poblaciones más vulnerables, mostrando que ciertos grupos etarios enfrentan mayores riesgos que otros. Este análisis sugiere la necesidad de diseñar intervenciones específicas para diferentes grupos de edad, considerando sus particularidades y contextos de vulnerabilidad. Los datos indican que la violencia afecta a mujeres en todas las etapas de la vida, pero con intensidades diferentes, lo que requiere respuestas diferenciadas. La identificación de estos patrones es esencial para desarrollar estrategias de prevención efectivas y programas de protección adecuados a las necesidades de cada grupo poblacional. Código de análisis: UNIV-002

3.2. Departamento

# Análisis de la distribución por departamento con gráfico de barras verticales
tabla_departamento <- table(datos$`Departamento del hecho DANE`)

# Seleccionamos los 10 departamentos con más casos
top_departamentos <- sort(tabla_departamento, decreasing = TRUE)[1:10]

tabla_departamento_df <- tibble(
  Departamento = names(top_departamentos),
  Cantidad_Casos = as.numeric(top_departamentos),
  Porcentaje = round((as.numeric(top_departamentos) / sum(tabla_departamento)) * 100, 2)
)

# Gráfico de barras verticales con etiquetas visibles
ggplot(tabla_departamento_df, aes(x = reorder(Departamento, Cantidad_Casos), y = Cantidad_Casos)) +
  geom_col(aes(fill = Cantidad_Casos), width = 0.7) +
  geom_text(aes(label = paste0(Cantidad_Casos, " (", Porcentaje, "%)")), 
            vjust = -0.5, size = 4, color = "#6a1b9a", fontface = "bold") +
  scale_fill_gradient(low = "#e1bee7", high = "#8e24aa", name = "Cantidad de Casos") +
  scale_y_continuous(limits = c(0, max(tabla_departamento_df$Cantidad_Casos) * 1.15)) +
  labs(title = "Top 10 Departamentos con Más Casos",
       subtitle = "Distribución geográfica de los feminicidios",
       x = "Departamento", y = "Cantidad de Casos") +
  theme_minimal() +
  theme(legend.position = "right",
        plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
        axis.text.y = element_text(size = 10),
        panel.grid.major = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank())

Se observa que el departamento de Antioquia presenta el mayor número de casos, con 38 casos, seguido por Valle del Cauca con 31 casos. La distribución geográfica de los casos muestra concentraciones específicas en ciertas regiones del país, lo que podría estar relacionado con factores socioeconómicos, culturales e institucionales. Esta información es valiosa para la focalización de recursos y la implementación de políticas públicas diferenciadas por territorios. Los departamentos con mayor incidencia requieren intervenciones prioritarias y estrategias específicas para abordar los factores de riesgo locales. La comprensión de estas diferencias regionales es fundamental para desarrollar respuestas efectivas y equitativas en todo el territorio nacional, considerando las particularidades de cada contexto. Código de análisis: UNIV-003

# Crear mapa interactivo con datos reales del dataset
# Obtener datos reales de los departamentos
departamentos_datos <- datos %>%
  group_by(`Departamento del hecho DANE`) %>%
  summarise(Casos = n()) %>%
  arrange(desc(Casos)) %>%
  head(10)  # Tomamos los 10 departamentos con más casos

# Coordenadas aproximadas de departamentos colombianos (ACTUALIZADAS)
coordenadas <- data.frame(
  Departamento = c("Antioquia", "Bogotá D.C.", "Valle del Cauca", "Cundinamarca", 
                   "Santander", "Atlántico", "Bolívar", "Córdoba", "Nariño", "Cauca",
                   "Huila", "Tolima", "Boyacá", "Meta", "Norte de Santander", "Cesar"),
  Lat = c(6.555, 4.711, 3.427, 4.711, 6.643, 10.985, 10.399, 8.757, 1.213, 2.445,
          2.928, 4.438, 5.456, 4.154, 7.896, 9.329),
  Lng = c(-75.828, -74.072, -76.520, -74.072, -73.653, -74.781, -75.514, -75.885, -77.278, -76.614,
          -75.232, -75.232, -73.362, -73.625, -72.938, -73.695)
)

# Unir los datos de casos con las coordenadas
mapa_datos <- left_join(coordenadas, departamentos_datos, 
                         by = c("Departamento" = "Departamento del hecho DANE"))

# Eliminar filas con NA en la columna Casos (por si un depto coordinado no tiene casos)
mapa_datos <- mapa_datos %>% filter(!is.na(Casos))

# Crear mapa leaflet interactivo
mapa <- leaflet(mapa_datos) %>%
  addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
           attribution = '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  setView(lng = -74.072, lat = 4.711, zoom = 6) %>%
  
  # Agregar marcadores circulares proporcionales con el número exacto de casos
  addCircleMarkers(
    lng = ~Lng,
    lat = ~Lat,
    radius = ~sqrt(Casos) * 2,
    color = "#8e24aa",
    fillColor = "#ba68c8",
    fillOpacity = 0.7,
    stroke = TRUE,
    weight = 2,
    label = ~paste(Departamento, ":", Casos, "casos"),
    popup = ~paste("<strong>", Departamento, "</strong><br>",
                   "Casos reportados: ", Casos, "<br>",
                   "Latitud: ", round(Lat, 3), "<br>",
                   "Longitud: ", round(Lng, 3))
  ) %>%
  
  # Agregar heatmap
  addHeatmap(
    lng = ~Lng,
    lat = ~Lat,
    intensity = ~Casos,
    blur = 20,
    max = 0.05,
    radius = 15
  ) %>%
  
  # Agregar controles de capas
  addLayersControl(
    baseGroups = c("Mapa Base", "Satélite"),
    overlayGroups = c("Marcadores", "Heatmap"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  
  # Agregar escala
  addScaleBar(position = "bottomleft") %>%
  
  # Agregar leyenda
  addLegend(
    position = "bottomright",
    colors = c("#8e24aa", "#ba68c8", "#e1bee7"),
    labels = c("Alta incidencia", "Media incidencia", "Baja incidencia"),
    title = "Intensidad de Casos"
  )

# Mostrar mapa
mapa

3.3. Circunstancia del Hecho

# Análisis de la distribución por circunstancia del hecho con gráfico de barras
tabla_circunstancia <- table(datos$`Circunstancia del Hecho`)

tabla_circunstancia_df <- tibble(
  Circunstancia = names(tabla_circunstancia),
  Cantidad_Casos = as.numeric(tabla_circunstancia),
  Porcentaje = round((as.numeric(tabla_circunstancia) / sum(tabla_circunstancia)) * 100, 2)
)

# Ordenar por cantidad de casos descendente
tabla_circunstancia_df <- tabla_circunstancia_df %>%
  arrange(desc(Cantidad_Casos))

# Gráfico de barras horizontales para mejor legibilidad
ggplot(tabla_circunstancia_df, aes(x = reorder(Circunstancia, Cantidad_Casos), y = Cantidad_Casos)) +
  geom_col(fill = "#8e24aa", alpha = 0.8, width = 0.7) +
  geom_text(aes(label = paste0(Cantidad_Casos, " (", Porcentaje, "%)")), 
            hjust = -0.1, size = 4, color = "#6a1b9a", fontface = "bold") +
  scale_y_continuous(limits = c(0, max(tabla_circunstancia_df$Cantidad_Casos) * 1.15)) +
  labs(title = "Distribución de Casos por Circunstancia del Hecho",
       subtitle = "Ordenado de mayor a menor frecuencia",
       x = "Circunstancia del Hecho", y = "Cantidad de Casos") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        panel.grid.major = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank()) +
  coord_flip()

La circunstancia del hecho más frecuente es Feminicidio, con 172 casos, lo que representa el 62.5% del total. Este hallazgo es crucial para comprender los contextos en los que ocurre la violencia de género y para diseñar intervenciones específicas para cada tipo de circunstancia. La diversidad de circunstancias identificadas refleja la complejidad del fenómeno y la necesidad de abordajes diferenciados. Cada tipo de circunstancia requiere estrategias de prevención y atención específicas, así como protocolos de actuación adaptados a las particularidades de cada situación. El análisis detallado de estas circunstancias permite identificar patrones y factores de riesgo específicos, lo que es fundamental para desarrollar políticas públicas efectivas y programas de intervención adecuados a las realidades identificadas. Código de análisis: UNIV-004

3.4. Presunto Agresor

# Análisis de la distribución por presunto agresor con gráfico de barras apiladas
tabla_agresor <- table(datos$`Presunto Agresor`)

# Seleccionamos los 10 agresores más frecuentes
top_agresores <- sort(tabla_agresor, decreasing = TRUE)[1:10]

tabla_agresor_df <- tibble(
  Presunto_Agresor = names(top_agresores),
  Cantidad_Casos = as.numeric(top_agresores),
  Porcentaje = round((as.numeric(top_agresores) / sum(tabla_agresor)) * 100, 2)
)

# Gráfico de barras apiladas con etiquetas visibles
ggplot(tabla_agresor_df, aes(x = 1, y = Cantidad_Casos, fill = reorder(Presunto_Agresor, Cantidad_Casos))) +
  geom_bar(stat = "identity", width = 0.8) +
  geom_text(aes(label = paste0(reorder(Presunto_Agresor, Cantidad_Casos), ": ", Cantidad_Casos, " (", Porcentaje, "%)")), 
            position = position_stack(vjust = 0.5), size = 3.5, color = "white", fontface = "bold") +
  scale_fill_manual(values = c("#8e24aa", "#9c27b0", "#ab47bc", "#ba68c8", 
                               "#ce93d8", "#e1bee7", "#f3e5f5", "#f8bbd0", 
                               "#e1bee7", "#d1c4e9")) +
  labs(title = "Top 10 Presuntos Agresores Más Frecuentes",
       fill = "Presunto Agresor") +
  theme_void() +
  theme(legend.position = "right",
        legend.title = element_text(face = "bold", size = 12),
        legend.text = element_text(size = 10),
        plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"))

El presunto agresor más frecuente es Compañero(a) permanente, con 81 casos, lo que representa el 29.5% del total. Este análisis revela información importante sobre las relaciones entre víctimas y agresores, mostrando patrones específicos en la dinámica de la violencia de género. La identificación de los perfiles más frecuentes de agresores es fundamental para desarrollar estrategias de prevención focalizadas y programas de intervención con agresores. Los datos sugieren que en muchos casos los agresores son personas cercanas a las víctimas, lo que plantea desafíos específicos para la prevención y la protección. Esta información es valiosa para diseñar intervenciones que aborden las relaciones de poder y las dinámicas interpersonales que facilitan la violencia. Código de análisis: UNIV-005

4. Análisis Bivariado

El análisis bivariado estudia la relación entre dos variables a la vez para encontrar patrones o asociaciones significativas. Este tipo de análisis permite identificar interacciones entre diferentes características de los casos, lo que enriquece la comprensión del fenómeno de violencia de género. En esta sección, se explorarán relaciones clave entre variables como grupo de edad y presunto agresor, departamento y circunstancia del hecho, y otras combinaciones relevantes. Cada análisis incluirá visualizaciones gráficas que faciliten la interpretación de las relaciones identificadas, así como interpretaciones contextualizadas de los patrones observados. La información obtenida en este análisis bivariado proporciona insights valiosos para el diseño de políticas públicas y programas de intervención multidimensionales. Código de análisis: BIV-001

4.1. Grupo de Edad y Presunto Agresor

# Cruzamos las variables 'Grupo de edad de la víctima' y 'Presunto Agresor'
tabla_edad_agresor <- table(datos$`Grupo de edad de la víctima`, datos$`Presunto Agresor`)

# Convertir a dataframe para el gráfico
tabla_edad_agresor_df <- as.data.frame(tabla_edad_agresor)
colnames(tabla_edad_agresor_df) <- c("Grupo_Edad", "Presunto_Agresor", "Cantidad_Casos")

# Filtrar para los agresores más comunes y grupos de edad más afectados
agresores_top <- names(sort(table(datos$`Presunto Agresor`), decreasing = TRUE))[1:5]
edades_top <- names(sort(table(datos$`Grupo de edad de la víctima`), decreasing = TRUE))[1:5]

datos_filtrados <- tabla_edad_agresor_df %>%
  filter(Presunto_Agresor %in% agresores_top, Grupo_Edad %in% edades_top)

# Gráfico de heatmap mejorado
ggplot(datos_filtrados, aes(x = Presunto_Agresor, y = Grupo_Edad, fill = Cantidad_Casos)) +
  geom_tile(color = "white", size = 1) +
  geom_text(aes(label = Cantidad_Casos), color = "white", size = 4, fontface = "bold") +
  scale_fill_gradientn(colors = c("#f3e5f5", "#ba68c8", "#8e24aa", "#4a148c"),
                       name = "Cantidad de Casos") +
  labs(title = "Relación entre Grupo de Edad y Presunto Agresor",
       subtitle = "Análisis de los 5 grupos de edad y agresores más frecuentes",
       x = "Presunto Agresor", y = "Grupo de Edad de la Víctima") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
        axis.text.y = element_text(size = 10),
        legend.position = "right",
        legend.title = element_text(face = "bold", size = 12))

El análisis revela patrones interesantes entre el grupo de edad de la víctima y el perfil del presunto agresor. Se observa que el grupo de edad (25 a 29) es el más afectado por el agresor Compañero(a) permanente, con 15 casos. Esta relación específica entre edad y tipo de agresor muestra patrones claros de vulnerabilidad que requieren atención prioritaria en las políticas públicas. La interacción entre estas dos variables sugiere que ciertos grupos etarios enfrentan riesgos específicos relacionados con el tipo de agresor, lo que debe considerarse en el diseño de intervenciones. Los datos muestran variaciones significativas en la distribución de casos según la combinación de edad y agresor, indicando la necesidad de enfoques diferenciados. Esta información es crucial para desarrollar programas de prevención y protección que respondan a las necesidades específicas de cada grupo poblacional. Código de análisis: BIV-002

4.2. Departamento y Circunstancia del Hecho

# Cruzamos las variables 'Departamento del hecho' y 'Circunstancia del Hecho'
# Nos enfocamos en los 5 departamentos con más casos y las 5 circunstancias más frecuentes
top5_departamentos <- names(sort(table(datos$`Departamento del hecho DANE`), decreasing = TRUE))[1:5]
top5_circunstancias <- names(sort(table(datos$`Circunstancia del Hecho`), decreasing = TRUE))[1:5]

datos_filtrados <- datos %>% 
  filter(`Departamento del hecho DANE` %in% top5_departamentos,
         `Circunstancia del Hecho` %in% top5_circunstancias)

tabla_departamento_circunstancia <- table(datos_filtrados$`Departamento del hecho DANE`, 
                                          datos_filtrados$`Circunstancia del Hecho`)

# Convertir a dataframe para ggplot
tabla_departamento_circunstancia_df <- as.data.frame(tabla_departamento_circunstancia)
colnames(tabla_departamento_circunstancia_df) <- c("Departamento", "Circunstancia", "Cantidad_Casos")

# Calcular porcentajes por departamento
tabla_departamento_circunstancia_df <- tabla_departamento_circunstancia_df %>%
  group_by(Departamento) %>%
  mutate(Porcentaje = round(Cantidad_Casos / sum(Cantidad_Casos) * 100, 1)) %>%
  ungroup()

# Gráfico de heatmap mejorado
ggplot(tabla_departamento_circunstancia_df, 
       aes(x = Circunstancia, y = Departamento, fill = Porcentaje)) +
  geom_tile(color = "white", size = 1.5) +
  geom_text(aes(label = paste0(Cantidad_Casos, "\n(", Porcentaje, "%)")), 
            color = "white", size = 3.8, fontface = "bold") +
  scale_fill_gradientn(colors = c("#f3e5f5", "#ba68c8", "#8e24aa", "#4a148c"),
                       name = "Porcentaje (%)") +
  labs(title = "Relación entre Departamento y Circunstancia del Hecho (Top 5)",
       subtitle = "Distribución porcentual por departamento",
       x = "Circunstancia del Hecho", y = "Departamento") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
        axis.text.y = element_text(size = 11, face = "bold"),
        legend.position = "right",
        legend.title = element_text(face = "bold", size = 12))

El análisis muestra que la Feminicidio es la circunstancia predominante en los departamentos analizados, aunque con diferentes proporciones. En el departamento de Atlántico, esta circunstancia representa una proporción alta del total de casos con 100%. Estas diferencias regionales en la distribución de circunstancias sugieren la influencia de factores culturales, sociales y económicos específicos de cada territorio. La comprensión de estas variaciones es fundamental para desarrollar políticas públicas adaptadas a las realidades locales y para implementar estrategias de intervención contextualizadas.. Los datos muestran que, aunque existen patrones generales, cada departamento presenta particularidades que deben considerarse en el diseño de respuestas institucionales. Esta información es valiosa para la planificación territorial de servicios de prevención y atención. Código de análisis: BIV-003

5. Análisis Temporal

El análisis temporal estudia cómo se distribuyen los casos a lo largo del tiempo, identificando patrones estacionales, tendencias y variaciones cíclicas. Este tipo de análisis es fundamental para comprender la dinámica temporal de la violencia de género y para planificar intervenciones en momentos específicos de mayor riesgo. En esta sección, se examinarán las distribuciones de casos por mes, día de la semana y año, utilizando visualizaciones que faciliten la identificación de patrones temporales. La información obtenida permite anticipar períodos de mayor incidencia y diseñar estrategias de prevención focalizadas temporalmente. El análisis temporal también contribuye a evaluar el impacto de políticas y programas implementados en períodos específicos, proporcionando información valiosa para la toma de decisiones basada en evidencia. Código de análisis: TEMP-001

5.1. Mes

# Analizamos la frecuencia de casos por mes
tabla_mes <- table(datos$`Mes del hecho`)

# Ordenamos los meses cronológicamente
meses_orden <- c("enero", "febrero", "marzo", "abril", "mayo", "junio", 
                 "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre")
tabla_mes <- tabla_mes[meses_orden[meses_orden %in% names(tabla_mes)]]

tabla_mes_df <- tibble(
  Mes = factor(names(tabla_mes), levels = meses_orden[meses_orden %in% names(tabla_mes)]),
  Cantidad_Casos = as.numeric(tabla_mes),
  Porcentaje = round((as.numeric(tabla_mes) / sum(tabla_mes)) * 100, 2)
)

# Gráfico de líneas para mostrar la tendencia temporal
ggplot(tabla_mes_df, aes(x = Mes, y = Cantidad_Casos, group = 1)) +
  geom_line(color = "#8e24aa", size = 2) +
  geom_point(color = "#8e24aa", size = 4) +
  geom_text(aes(label = paste0(Cantidad_Casos, "\n(", Porcentaje, "%)")), 
            vjust = -1.5, size = 3.5, color = "#6a1b9a", fontface = "bold") +
  scale_y_continuous(limits = c(0, max(tabla_mes_df$Cantidad_Casos) * 1.2)) +
  labs(title = "Distribución de Casos por Mes",
       subtitle = "Tendencia temporal de los casos a lo largo del año",
       x = "Mes", y = "Cantidad de Casos") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        panel.grid.major = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank())

El gráfico de línea muestra una fluctuación en el número de casos a lo largo del año. El mes con el mayor número de casos fue enero, con un total de 39 casos. Por otro lado, el mes con menor actividad fue diciembre, con solo 10 casos. Estas variaciones mensuales pueden estar relacionadas con factores estacionales, periodos vacacionales, festividades u otros eventos sociales que influyen en las dinámicas de convivencia y en los niveles de estrés. La identificación de estos patrones temporales es crucial para planificar campañas de prevención en momentos específicos y para asignar recursos de atención según la demanda estacional. El análisis sugiere la necesidad de mantener una capacidad de respuesta adaptativa que considere estas fluctuaciones a lo largo del año. Código de análisis: TEMP-002

5.2. Día de la Semana

# Analizamos la frecuencia de casos por día de la semana
tabla_dia <- table(datos$`Dia del hecho`)

# Ordenamos los días de la semana cronológicamente
dias_orden <- c("lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo")
tabla_dia <- tabla_dia[dias_orden[dias_orden %in% names(tabla_dia)]]

tabla_dia_df <- tibble(
  Dia_Semana = names(tabla_dia),
  Cantidad_Casos = as.numeric(tabla_dia),
  Porcentaje = round((as.numeric(tabla_dia) / sum(tabla_dia)) * 100, 2)
)

# Gráfico de barras con colores del tema
ggplot(tabla_dia_df, aes(x = factor(Dia_Semana, levels = dias_orden), 
                         y = Cantidad_Casos, 
                         fill = Cantidad_Casos)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = paste0(Cantidad_Casos, "\n(", Porcentaje, "%)")), 
            vjust = -0.5, size = 4, color = "#6a1b9a", fontface = "bold") +
  scale_fill_gradient(low = "#e1bee7", high = "#8e24aa", name = "Cantidad de Casos") +
  scale_y_continuous(limits = c(0, max(tabla_dia_df$Cantidad_Casos) * 1.15)) +
  labs(title = "Distribución de Casos por Día de la Semana",
       x = "Día de la Semana", y = "Cantidad de Casos") +
  theme_minimal() +
  theme(legend.position = "right",
        plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        panel.grid.major = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank())

Al analizar por día de la semana, se observa que el domingo presenta el mayor número de casos, con 55 casos. Esto podría estar relacionado con factores sociales y de convivencia que se intensifican durante este día, como mayor tiempo de convivencia en el hogar, consumo de alcohol, o situaciones de estrés acumulado. Los patrones semanales de violencia revelan información importante sobre las dinámicas familiares y sociales que influyen en la ocurrencia de estos hechos. La identificación de días específicos con mayor incidencia permite focalizar esfuerzos de prevención y garantizar la disponibilidad de servicios de atención en esos períodos. Esta información es valiosa para la planificación de horarios de servicios de emergencia y para el diseño de campañas de prevención específicas para diferentes días de la semana. Código de análisis: TEMP-003

6. Análisis de Correlación Avanzado

El análisis de correlación avanzado utiliza técnicas estadísticas sofisticadas para explorar relaciones complejas entre múltiples variables simultáneamente. Este enfoque nos permite identificar patrones de asociación no evidentes en análisis simples y comprender la estructura subyacente de los datos. En esta sección, presentaremos una matriz de correlación mejorada, análisis de componentes principales y visualizaciones interactivas que permiten una exploración profunda de las relaciones entre variables clave. Estos métodos estadísticos avanzados proporcionan una base sólida para la formulación de hipótesis causales y el diseño de intervenciones basadas en evidencia empírica robusta. Código de análisis: CORR-001

6.1. Matriz de Correlación

# Preparación avanzada de variables para análisis de correlación
# Empezamos con el dataframe original y no eliminamos NAs prematuramente
datos_correlacion <- datos %>%
  mutate(
    # Variables numéricas
    Año_num = as.numeric(as.character(`Año del hecho`)),
    
    # Variables categóricas convertidas a numéricas
    Mujer = ifelse(`Sexo de la víctima` == "Mujer", 1, 0),
    Violencia_pareja = ifelse(`Circunstancia del Hecho` == "Violencia de pareja", 1, 0),
    Violencia_intrafamiliar = ifelse(`Circunstancia del Hecho` == "Violencia intrafamiliar", 1, 0),
    Agresor_pareja = ifelse(`Presunto Agresor` == "Pareja o expareja", 1, 0),
    Agresor_familiar = ifelse(`Presunto Agresor` == "Familiar", 1, 0),
    
    # Variables ordinales
    Grupo_edad_num = case_when(
      `Grupo de edad de la víctima` == "0 a 12 años" ~ 1,
      `Grupo de edad de la víctima` == "13 a 17 años" ~ 2,
      `Grupo de edad de la víctima` == "18 a 28 años" ~ 3,
      `Grupo de edad de la víctima` == "29 a 40 años" ~ 4,
      `Grupo de edad de la víctima` == "41 a 60 años" ~ 5,
      `Grupo de edad de la víctima` == "61 años o más" ~ 6,
      TRUE ~ NA_real_ # Asigna NA si no coincide con ninguna categoría
    )
  ) %>%
  select(Año_num, Mujer, Violencia_pareja, Violencia_intrafamiliar,
         Agresor_pareja, Agresor_familiar, Grupo_edad_num)

# Verificación de dimensiones después de la creación de variables
cat("Dimensiones después de crear variables:", dim(datos_correlacion), "\n")
## Dimensiones después de crear variables: 275 7
# Verificar si hay filas completamente vacías
filas_completas_na <- datos_correlacion %>%
  filter(across(everything(), is.na))
cat("Número de filas completamente NA:", nrow(filas_completas_na), "\n")
## Número de filas completamente NA: 0
# Si el dataframe está vacío, detener la ejecución con un mensaje claro
if (nrow(datos_correlacion) == 0) {
  stop("El dataframe de correlación está vacío. Revisa los nombres de las categorías en el código y en los datos originales.")
}

# Calcular matriz de correlación con manejo robusto de NAs
# Usamos "pairwise.complete.obs" para usar todos los datos disponibles para cada par
matriz_cor <- cor(datos_correlacion, use = "pairwise.complete.obs")

# Reemplazar cualquier NA restante en la matriz por 0 (para visualización)
matriz_cor[is.na(matriz_cor)] <- 0

# Verificar que no haya problemas con la matriz final
cat("Dimensiones de la matriz de correlación:", dim(matriz_cor), "\n")
## Dimensiones de la matriz de correlación: 7 7
cat("Valores NA en la matriz final:", sum(is.na(matriz_cor)), "\n")
## Valores NA en la matriz final: 0
cat("Rango de valores de correlación:", range(matriz_cor), "\n")
## Rango de valores de correlación: -0.08891873 1
# Crear etiquetas más descriptivas
nombres_variables <- c(
  "Año del hecho", "Víctima Mujer", 
  "Violencia de pareja", "Violencia intrafamiliar",
  "Agresor pareja", "Agresor familiar", "Grupo de edad"
)

# Tomar solo las variables que quedaron después de la limpieza
nombres_disponibles <- nombres_variables[1:ncol(matriz_cor)]

# Configurar parámetros de visualización
colores <- colorRampPalette(c("#4a148c", "#f3e5f5", "#8e24aa"))(100)

# Gráfico de matriz de correlación mejorado
corrplot(matriz_cor,
         method = "color",
         type = "upper",
         tl.col = "#6a1b9a",
         tl.srt = 45,
         tl.cex = 1.1,
         addCoef.col = "black",
         number.cex = 0.8,
         col = colores,
         diag = TRUE,
         title = "Matriz de Correlación entre Variables Clave",
         mar = c(0, 0, 2, 0))

# Informe estadístico adicional de las correlaciones
cat("\n=== RESUMEN DE CORRELACIONES SIGNIFICATIVAS ===\n")
## 
## === RESUMEN DE CORRELACIONES SIGNIFICATIVAS ===
# Encontrar pares con correlaciones fuertes (|r| > 0.5)
cor_fuertes <- which(abs(matriz_cor) > 0.5 & lower.tri(matriz_cor), arr.ind = TRUE)

if(length(cor_fuertes) > 0) {
  cat("\nCorrelaciones fuertes (|r| > 0.5):\n")
  for(i in 1:nrow(cor_fuertes)) {
    var1 <- nombres_disponibles[cor_fuertes[i,1]]
    var2 <- nombres_disponibles[cor_fuertes[i,2]]
    valor <- matriz_cor[cor_fuertes[i,1], cor_fuertes[i,2]]
    cat(sprintf("• %s - %s: r = %.3f\n", var1, var2, valor))
  }
} else {
  cat("No se encontraron correlaciones fuertes (|r| > 0.5)\n")
}
## No se encontraron correlaciones fuertes (|r| > 0.5)
# Correlaciones moderadas (0.3 < |r| <= 0.5)
cor_moderadas <- which(abs(matriz_cor) > 0.3 & abs(matriz_cor) <= 0.5 & lower.tri(matriz_cor), arr.ind = TRUE)

if(length(cor_moderadas) > 0) {
  cat("\nCorrelaciones moderadas (0.3 < |r| <= 0.5):\n")
  for(i in 1:min(10, nrow(cor_moderadas))) {  # Mostrar máximo 10
    var1 <- nombres_disponibles[cor_moderadas[i,1]]
    var2 <- nombres_disponibles[cor_moderadas[i,2]]
    valor <- matriz_cor[cor_moderadas[i,1], cor_moderadas[i,2]]
    cat(sprintf("• %s - %s: r = %.3f\n", var1, var2, valor))
  }
}

El análisis de correlación avanzado permite explorar las relaciones estadísticas entre múltiples variables clave del fenómeno de la violencia de género. La matriz de correlación muestra la fuerza y dirección de las asociaciones lineales entre variables como el sexo de la víctima, la circunstancia del hecho, el perfil del agresor y el grupo de edad. Los colores en el mapa de calor van del morado oscuro (correlación negativa fuerte) al morado claro (correlación positiva fuerte), permitiendo identificar patrones a simple vista. Por ejemplo, una correlación positiva alta entre “Víctima Mujer” y “Violencia de pareja” confirmaría estadísticamente que las mujeres son desproporcionadamente afectadas por este tipo de violencia. Los resultados de este análisis multivariado son fundamentales para entender la complejidad de la violencia de género más allá de las relaciones simples, proporcionando una base empírica sólida para el diseño de políticas públicas integrales que aborden simultáneamente múltiples factores de riesgo y protección. Código de análisis: CORR-002

6.2. PCA

# Análisis de Componentes Principales (PCA)

# PASO CRÍTICO: Eliminar columnas con varianza cero (constantes) o solo NAs antes del PCA
# Esto es necesario porque prcomp no puede escalar columnas constantes
datos_para_pca <- datos_correlacion %>%
  select(where(~{
    var_result <- var(., na.rm = TRUE)
    !is.na(var_result) && var_result > 0
  }))

# Verificar qué columnas se eliminaron (si es que hubo alguna)
columnas_eliminadas <- setdiff(names(datos_correlacion), names(datos_para_pca))
if (length(columnas_eliminadas) > 0) {
  cat("Se eliminaron las siguientes columnas constantes o solo NA para el PCA:", paste(columnas_eliminadas, collapse = ", "), "\n\n")
} else {
  cat("No se encontraron columnas constantes. Procediendo con todas las variables.\n\n")
}
## Se eliminaron las siguientes columnas constantes o solo NA para el PCA: Mujer, Violencia_intrafamiliar, Agresor_pareja, Agresor_familiar, Grupo_edad_num
# Verificar si quedan suficientes variables para el PCA
if (ncol(datos_para_pca) < 2) {
  stop("No hay suficientes variables con varianza para realizar un PCA. Se necesitan al menos 2.")
}

# Ejecutar el PCA solo con las variables que tienen varianza
pca_result <- prcomp(datos_para_pca, scale. = TRUE, center = TRUE)

# Gráfico 1: Scree plot (Varianza explicada por cada componente)
scree_data <- data.frame(
  Componente = 1:length(pca_result$sdev),
  Varianza_Explicada = pca_result$sdev^2 / sum(pca_result$sdev^2) * 100,
  Varianza_Acumulada = cumsum(pca_result$sdev^2) / sum(pca_result$sdev^2) * 100
)

# Encontrar el número de componentes que explican > 80%
componentes_80 <- which(scree_data$Varianza_Acumulada > 80)[1]

ggplot(scree_data, aes(x = Componente)) +
  geom_col(aes(y = Varianza_Explicada), fill = "#8e24aa", alpha = 0.8) +
  geom_line(aes(y = Varianza_Acumulada), color = "#6a1b9a", size = 1.5, group = 1) +
  geom_point(aes(y = Varianza_Acumulada), color = "#6a1b9a", size = 3) +
  geom_hline(yintercept = 80, linetype = "dashed", color = "red") +
  scale_y_continuous(
    name = "Porcentaje de Varianza Explicada (%)",
    limits = c(0, 100),
    sec.axis = sec_axis(~., name = "Varianza Acumulada (%)", labels = scales::percent_format(scale = 1))
  ) +
  scale_x_continuous(breaks = 1:length(pca_result$sdev)) +
  labs(title = "Scree Plot - Análisis de Componentes Principales",
       subtitle = paste0("Los primeros ", componentes_80, " componentes explican más del 80% de la varianza"),
       x = "Componente Principal") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        panel.grid.major.y = element_line(color = "#f0f0f0"),
        panel.grid.minor = element_blank())

# Gráfico 2: Biplot de los dos primeros componentes
# Crear un dataframe para el biplot con las observaciones
biplot_data <- as.data.frame(pca_result$x[, 1:2])
colnames(biplot_data) <- c("PC1", "PC2")

# Añadir una variable para colorear (si es posible)
# Usamos 'Mujer' si existe, si no, coloreamos todo igual
if ("Mujer" %in% names(datos_para_pca)) {
  biplot_data$Grupo <- ifelse(datos_para_pca$Mujer == 1, "Mujer", "Hombre/OTRO")
} else {
  biplot_data$Grupo <- "Todos"
}

ggplot(biplot_data, aes(x = PC1, y = PC2, color = Grupo)) +
  geom_point(alpha = 0.6, size = 1.5) +
  # Añadir las flechas de las variables (loadings)
  geom_segment(data = as.data.frame(pca_result$rotation[, 1:2]),
               aes(x = 0, y = 0, xend = PC1 * 3, yend = PC2 * 3),
               color = "#4a148c", arrow = arrow(length = unit(0.2, "cm")), inherit.aes = FALSE) +
  geom_text(data = as.data.frame(pca_result$rotation[, 1:2]),
            aes(x = PC1 * 3.2, y = PC2 * 3.2, label = rownames(pca_result$rotation)),
            color = "#6a1b9a", size = 4, fontface = "bold", inherit.aes = FALSE) +
  scale_color_manual(values = c("#8e24aa", "#4a148c", "#ba68c8")) +
  labs(title = "Biplot del Análisis de Componentes Principales",
       subtitle = "Visualización de observaciones y variables en los dos primeros componentes",
       x = paste0("Componente Principal 1 (", round(scree_data$Varianza_Explicada[1], 1), "%)"),
       y = paste0("Componente Principal 2 (", round(scree_data$Varianza_Explicada[2], 1), "%)"),
       color = "Grupo") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#8e24aa"),
        plot.subtitle = element_text(hjust = 0.5, size = 14, color = "#666"),
        axis.title = element_text(size = 13, face = "bold"),
        axis.text = element_text(size = 11),
        legend.position = "bottom")

El Análisis de Componentes Principales (PCA) ha permitido reducir la dimensionalidad del conjunto de datos para identificar las estructuras latentes que explican la mayor parte de la variabilidad en los casos de violencia de género. El Scree Plot muestra que los primeros 2 componentes principales son suficientes para explicar más del 80% de la varianza total, lo que indica que la complejidad del fenómeno puede ser capturada de manera eficiente por un número reducido de dimensiones subyacentes. El Biplot ofrece una visualización intuitiva de cómo las observaciones (casos) y las variables originales se relacionan en este espacio reducido. Las variables que apuntan en una dirección similar están correlacionadas y contribuyen de forma parecida a los componentes. Por ejemplo, si las flechas de “Víctima Mujer” y “Violencia de pareja” apuntan juntas, significa que ambas tienden a ocurrir simultáneamente y definen una de las principales dimensiones de la violencia. Este análisis multidimensional es fundamental para sintetizar la información y revelar los factores subyacentes más importantes que deberían ser el foco de las políticas públicas, permitiendo pasar de un análisis de variables aisladas a una comprensión holística de los patrones de violencia. Código de análisis: CORR-003

7. Conclusiones y Recomendaciones

# Obtenemos los valores para el resumen ejecutivo
grupo_edad_max <- names(which.max(table(datos$`Grupo de edad de la víctima`)))
departamento_max <- names(which.max(table(datos$`Departamento del hecho DANE`)))
circunstancia_max <- names(which.max(table(datos$`Circunstancia del Hecho`)))
agresor_max <- names(which.max(table(datos$`Presunto Agresor`)))
mes_max <- names(which.max(table(datos$`Mes del hecho`)))
dia_max <- names(which.max(table(datos$`Dia del hecho`)))
año_max <- names(which.max(table(datos$`Año del hecho`)))

# Calcular estadísticas adicionales
total_casos <- nrow(datos)
porcentaje_mujeres <- round(mean(datos$`Sexo de la víctima` == "Mujer", na.rm = TRUE) * 100, 1)
departamentos_con_casos <- length(unique(datos$`Departamento del hecho DANE`))

# Tabla resumen mejorada
resumen_general <- tibble(
  Aspecto_Analizado = c("Total de Casos Registrados", 
                        "Porcentaje de Víctimas Mujeres",
                        "Año con Mayor Incidencia", 
                        "Mes con Mayor Frecuencia",
                        "Día de Semana Más Crítico",
                        "Departamento Más Afectado",
                        "Grupo de Edad Más Vulnerable",
                        "Circunstancia Predominante",
                        "Perfil de Agresor Más Común"),
  Hallazgo_Principal = c(
    paste(total_casos, "casos"),
    paste(porcentaje_mujeres, "%"),
    año_max,
    mes_max,
    dia_max,
    departamento_max,
    grupo_edad_max,
    circunstancia_max,
    agresor_max
  )
)

kable(resumen_general, 
      caption = "Resumen Ejecutivo de Hallazgos Clave") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F, position = "center") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8e24aa") %>%
  column_spec(1, bold = TRUE, width = "40%") %>%
  column_spec(2, color = "black", background = "#f3e5f5", width = "60%")
Resumen Ejecutivo de Hallazgos Clave
Aspecto_Analizado Hallazgo_Principal
Total de Casos Registrados 275 casos
Porcentaje de Víctimas Mujeres 100 %
Año con Mayor Incidencia 2024
Mes con Mayor Frecuencia enero
Día de Semana Más Crítico domingo
Departamento Más Afectado Antioquia
Grupo de Edad Más Vulnerable (25 a 29)
Circunstancia Predominante Feminicidio
Perfil de Agresor Más Común Compañero(a) permanente

Basado en el análisis exhaustivo de los datos de feminicidios, violencia intrafamiliar y delitos sexuales en Colombia 2024-2025, se extraen las siguientes conclusiones principales y recomendaciones estratégicas: Código de análisis: CONCLUS-001

1. Perfil de la Víctima: El 100% de los casos analizados corresponden a víctimas mujeres, lo que subraya la dimensión de género de esta problemática. El grupo demográfico más afectado está compuesto por mujeres en el grupo de edad (25 a 29), confirmando que ciertos grupos etarios enfrentan mayores riesgos. Este hallazgo evidencia la necesidad urgente de fortalecer los sistemas de protección para este grupo poblacional y desarrollar programas específicos que abordan sus necesidades particulares. La intersección entre género y edad revela vulnerabilidades específicas que deben ser consideradas en el diseño de políticas públicas integrales y efectivas para la prevención y atención de la violencia basada en género. Código de análisis: CONCLUS-002

2. Circunstancia Predominante: La Feminicidio es la circunstancia más frecuente, representando una proporción significativa del total de casos analizados. Esta situación destaca la importancia crítica de implementar estrategias específicas para prevenir y atender la violencia en contextos específicos. Se recomienda fortalecer los programas de intervención, promover relaciones saludables desde edades tempranas, y garantizar el acceso a servicios de protección para víctimas en todos los territorios del país. Código de análisis: CONCLUS-003

3. Agresor Principal: El presunto agresor más común es Compañero(a) permanente, lo que resalta la importancia de las relaciones de cercanía en la dinámica de la violencia de género. Este hallazgo sugiere la necesidad de desarrollar estrategias de prevención que aborden las relaciones interpersonales y los factores de riesgo en contextos de proximidad. Se recomienda implementar programas de sensibilización sobre relaciones saludables, fortalecer las redes de apoyo comunitario, y desarrollar protocolos específicos para la intervención en casos donde el agresor es una persona conocida por la víctima. Código de análisis: CONCLUS-004

4. Distribución Geográfica: El departamento de Antioquia concentra el mayor número de casos, lo que indica la necesidad urgente de intervenciones focalizadas y estrategias específicas para esta región. Este patrón geográfico sugiere la influencia de factores estructurales locales que deben ser investigados en profundidad y abordados mediante políticas públicas territorializadas. Se recomienda desarrollar planes de acción departamentales diferenciados, fortalecer la coordinación interinstitucional local, y asignar recursos adicionales a las regiones con mayor incidencia de violencia de género. Código de análisis: CONCLUS-005

5. Patrones Temporales: El mes de enero y el día domingo registran la mayor incidencia de casos, lo que podría estar relacionado con factores sociales, culturales y económicos específicos. Estos patrones temporales deben considerarse en la planificación de campañas de prevención y en la organización de los servicios de atención. Se recomienda diseñar estrategias de prevención estacionales, fortalecer los servicios de atención en períodos de mayor riesgo, y desarrollar sistemas de alerta temprana basados en patrones temporales identificados. Código de análisis: CONCLUS-006

6. Relaciones Multidimensionales: El análisis estadístico avanzado confirma que existen asociaciones complejas entre múltiples variables, lo que proporciona evidencia sólida para entender la dinámica multidimensional de la violencia de género. Estas asociaciones deben ser consideradas en el diseño de intervenciones específicas y en la formulación de políticas públicas basadas en evidencia empírica. Se recomienda utilizar estos hallazgos para desarrollar modelos predictivos, mejorar los sistemas de registro y monitoreo, y evaluar continuamente el impacto de las intervenciones implementadas. Código de análisis: CONCLUS-007

Estos hallazgos proporcionan una base sólida para que las autoridades, organizaciones de la sociedad civil y otros actores relevantes diseñen intervenciones más efectivas y focalizadas, con el objetivo fundamental de prevenir la violencia de género, proteger a las víctimas y promover una cultura de respeto e igualdad en Colombia. La implementación de las recomendaciones derivadas de este análisis contribuirá significativamente a avanzar en la construcción de una sociedad más justa, equitativa y libre de violencia para todas las personas. Código de análisis: CONCLUS-008