Este informe presenta un análisis de correlación estadística entre tres manifestaciones clave de la violencia de género en Colombia: los feminicidios, los delitos sexuales y la violencia intrafamiliar, tomando como víctima exclusiva a las mujeres.
El estudio se basa en los registros administrativos disponibles para el período comprendido entre enero de 2024 y septiembre de 2025. Para garantizar la calidad del análisis, se realizó un riguroso proceso de depuración de datos, eliminando registros duplicados, con información inconsistente o incompleta. La muestra final analizada, ya depurada, está compuesta por:
FEMINICIDIOS (FEM): 249 registros de muertes violentas calificadas como presuntos feminicidios. Esta categoría refleja la muerte de una mujer en un contexto de violencia por razones de género, que puede incluir, como parte del hecho victimizante, delitos como el acceso carnal violento o la agresión sexual.
DELITOS SEXUALES (DS): 45332 registros de agresiones de carácter sexual contra mujeres, excluyendo duplicados.
VIOLENCIA INTRAFAMILIAR (VI): 180822 registros de casos de violencia en el ámbito familiar o de relaciones íntimas, donde la víctima fue una mujer.
Nota metodológica crítica: El análisis de correlación se realizó sobre las series de tiempo mensuales (conteos por mes) derivadas de estos registros depurados, para el período de 18 meses entre enero de 2024 y junio de 2025, que es la ventana de tiempo común con datos completos para las tres variables. Por lo tanto, la unidad de análisis no son los casos individuales, sino la frecuencia mensual de cada tipo de delito.
# Ordenamos los meses
orden_meses <- c("enero","febrero","marzo","abril","mayo","junio",
"julio","agosto","septiembre","octubre","noviembre","diciembre")
fem$nombre_mes <- factor(fem$nombre_mes, levels = orden_meses)
ds$nombre_mes <- factor(ds$nombre_mes, levels = orden_meses)
vi$nombre_mes <- factor(vi$nombre_mes, levels = orden_meses)library(ggplot2)
#Creamos totales mensual
library(dplyr)
fem_mes <- fem %>%
group_by(anio, nombre_mes, mes) %>% # mes (numérico) para ordenar
summarise(total = sum(conteo), .groups = "drop") %>%
arrange(anio, mes)
ggplot(fem_mes, aes(x = factor(nombre_mes, levels = orden_meses),
y = total, group = anio, color = factor(anio))) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
geom_text(
aes(label = total),
vjust = -0.4,
size = 4,
check_overlap = TRUE
) +
labs(title = "Casos de Feminicidio por Mes",
x = "Mes",
y = "Total de casos",
color = "Año") +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))#install.packages("kableExtra")
#install.packages("gt")
library(gt)
library(dplyr)
library(kableExtra)
library(knitr)
# Es crucial que las bases tengan la columna 'nombre_mes' como factor ORDENADO
fem$nombre_mes <- factor(fem$nombre_mes, levels = orden_meses)
# Creamos la tabla mensual y ORDENAMOS por 'nombre_mes'
fem_mensual <- fem %>%
group_by(anio, nombre_mes) %>%
summarise(total = n(), .groups = "drop") %>%
# PASO CORREGIDO: Usamos arrange() con el factor 'nombre_mes'
arrange(anio, nombre_mes)
# --- 2. GENERACIÓN DE LA TABLA MENSUAL (ds_mensual) ---
# Calcular el número de meses en cada año para 'group_rows' dinámicamente
n_2024 <- fem_mensual %>% filter(anio == 2024) %>% nrow()
n_2025 <- fem_mensual %>% filter(anio == 2025) %>% nrow()
fem_mensual %>%
kable(
col.names = c("Año", "Mes", "Total de Casos"),
caption = "Tabla 2. Tendencia Mensual de Casos de Feminicidio",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
# Agrupar las filas por año de forma dinámica
group_rows("2024", 1, n_2024) %>%
group_rows("2025", n_2024 + 1, n_2024 + n_2025) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9") | Año | Mes | Total de Casos |
|---|---|---|
| 2024 | ||
| 2024 | enero | 14 |
| 2024 | febrero | 15 |
| 2024 | marzo | 14 |
| 2024 | abril | 17 |
| 2024 | mayo | 14 |
| 2024 | junio | 11 |
| 2024 | julio | 25 |
| 2024 | agosto | 11 |
| 2024 | septiembre | 12 |
| 2024 | octubre | 14 |
| 2024 | noviembre | 17 |
| 2024 | diciembre | 10 |
| 2025 | ||
| 2025 | enero | 22 |
| 2025 | febrero | 9 |
| 2025 | marzo | 13 |
| 2025 | abril | 15 |
| 2025 | mayo | 10 |
| 2025 | junio | 6 |
# --- 3. GENERACIÓN DE LA TABLA RESUMEN ANUAL (resumen_fem) ---
resumen_fem <- fem_mensual %>%
group_by(anio) %>%
summarise(
meses_reportados = n(),
total_anio = sum(total),
promedio_mensual = mean(total),
minimo = min(total),
maximo = max(total)
)
resumen_fem %>%
kable(
col.names = c("Año", "Meses Rep.", "Total Anual", "Promedio Mensual", "Mínimo", "Máximo"),
digits = 1,
caption = "Tabla 1. Resumen Estadístico de Casos de Feminicidio por Año",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9")| Año | Meses Rep. | Total Anual | Promedio Mensual | Mínimo | Máximo |
|---|---|---|---|---|---|
| 2024 | 12 | 174 | 14.5 | 10 | 25 |
| 2025 | 6 | 75 | 12.5 | 6 | 22 |
2024 (ene-dic)
El año arranca relativamente estable (entre 14 y 17 casos por mes).
Se presenta un pico muy inusual en julio (25 casos). Luego vuelve a bajar y fluctúa entre 10 y 17 casos.
Diciembre presenta el menor número de casos (10)
2025 (ene–jun)
Enero arranca alto (22 casos), algo parecido al pico de julio 2024.
Febrero cae fuerte (9 casos).
Marzo y abril vuelven a subir (13 y 15).
Mayo y junio vuelven a caer (10 y 6).
Patrón general
Feminicidios en 2024 mantiene números relativamente estables, casi planos, con algunos picos puntuales.
El comportamiento de 2025 Inicia más alto, pero luego el indicador se cae fuerte. no se puede comparar contra todo el año todavía porque está incompleto, pero la tendencia inicial se ve a la baja después de enero.
# --- 2. CREAR TOTAL MENSUAL ---
ds_mes <- ds %>%
group_by(anio, nombre_mes, mes) %>%
summarise(total = sum(cantidad, na.rm = TRUE), .groups = "drop") %>%
arrange(anio, mes)
# --- 3. GRAFICAR ---
ggplot(ds_mes, aes(x = factor(nombre_mes, levels = orden_meses),
y = total, group = anio, color = factor(anio))) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
geom_text(
aes(label = total),
vjust = -0.4,
size = 4,
check_overlap = TRUE
) +
labs(title = "Delitos sexuales por mes",
x = "Mes",
y = "Total de casos",
color = "Año") +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))# --- 4. TABLA MENSUAL ---
ds$nombre_mes <- factor(ds$nombre_mes, levels = orden_meses)
ds_mensual <- ds %>%
group_by(anio, nombre_mes) %>%
summarise(total = sum(cantidad, na.rm = TRUE), .groups = "drop") %>%
arrange(anio, nombre_mes)
# --- 5. TABLA KABLE MENSUAL ---
n_2024 <- ds_mensual %>% filter(anio == 2024) %>% nrow()
n_2025 <- ds_mensual %>% filter(anio == 2025) %>% nrow()
ds_mensual %>%
kable(
col.names = c("Año", "Mes", "Total de Casos"),
caption = "Tabla 2. Tendencia Mensual de Casos de Delitos Sexuales",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
group_rows("2024", 1, n_2024) %>%
group_rows("2025", n_2024 + 1, n_2024 + n_2025) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9")| Año | Mes | Total de Casos |
|---|---|---|
| 2024 | ||
| 2024 | enero | 1541 |
| 2024 | febrero | 1932 |
| 2024 | marzo | 2101 |
| 2024 | abril | 2286 |
| 2024 | mayo | 2338 |
| 2024 | junio | 2209 |
| 2024 | julio | 2359 |
| 2024 | agosto | 2492 |
| 2024 | septiembre | 2616 |
| 2024 | octubre | 2432 |
| 2024 | noviembre | 1849 |
| 2024 | diciembre | 1151 |
| 2025 | ||
| 2025 | enero | 2015 |
| 2025 | febrero | 2039 |
| 2025 | marzo | 2471 |
| 2025 | abril | 2377 |
| 2025 | mayo | 2310 |
| 2025 | junio | 2106 |
| 2025 | julio | 2399 |
| 2025 | agosto | 2298 |
| 2025 | septiembre | 2011 |
# --- 6. RESUMEN ANUAL CORREGIDO ---
resumen_ds <- ds_mensual %>%
group_by(anio) %>%
summarise(
meses_reportados = n(),
total_anio = sum(total),
promedio_mensual = mean(total),
minimo = min(total),
maximo = max(total)
)
resumen_ds %>%
kable(
col.names = c("Año", "Meses Rep.", "Total Anual", "Promedio Mensual", "Mínimo", "Máximo"),
digits = 1,
caption = "Tabla 1. Resumen Estadístico de Delitos Sexuales por Año",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9")| Año | Meses Rep. | Total Anual | Promedio Mensual | Mínimo | Máximo |
|---|---|---|---|---|---|
| 2024 | 12 | 25306 | 2108.8 | 1151 | 2616 |
| 2025 | 9 | 20026 | 2225.1 | 2011 | 2471 |
2024 (ene-dic)
25,306 mujeres víctimas en 2024
Promedio mensual: 2,109 casos
Pico máximo: Septiembre con 2,616 casos
Valle mínimo: Diciembre con 1,151 casos
2025 (ene-sep)
20,026 mujeres víctimas en 9 meses
Promedio mensual: 2,225 casos
Rango estable: Entre 2,011 y 2,471 casos mensuales
Máximo 2025: Marzo con 2,471 casos
#Creamos total mensual
vi_mes <- vi %>%
group_by(anio, nombre_mes, mes) %>%
summarise(total = sum(cantidad, na.rm = TRUE), .groups = "drop") %>%
arrange(anio, mes)
#Graficamos
ggplot(vi_mes, aes(x = factor(nombre_mes, levels = orden_meses),
y = total, group = anio, color = factor(anio))) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
geom_text(
aes(label = total),
vjust = -0.4,
size = 4,
check_overlap = TRUE
) +
labs(title = "Violencia Intrafamiliar Contra Mujeres por mes",
x = "Mes",
y = "Total de casos",
color = "Año") +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))vi_mensual <- vi %>%
group_by(anio, nombre_mes) %>%
summarise(total = sum(cantidad, na.rm = TRUE), .groups = "drop")
# Es crucial que las bases tengan la columna 'nombre_mes' como factor ORDENADO
vi$nombre_mes <- factor(vi$nombre_mes, levels = orden_meses)
# Creamos la tabla mensual y ORDENAMOS por 'nombre_mes'
vi_mensual <- vi %>%
group_by(anio, nombre_mes) %>%
summarise(total = sum(cantidad, na.rm = TRUE), .groups = "drop") %>%
# PASO CORREGIDO: Usamos arrange() con el factor 'nombre_mes'
arrange(anio, nombre_mes)
# --- 2. GENERACIÓN DE LA TABLA MENSUAL (ds_mensual) ---
# Calcular el número de meses en cada año para 'group_rows' dinámicamente
n_2024 <- vi_mensual %>% filter(anio == 2024) %>% nrow()
n_2025 <- vi_mensual %>% filter(anio == 2025) %>% nrow()
vi_mensual %>%
kable(
col.names = c("Año", "Mes", "Total de Casos"),
caption = "Tabla 2. Tendencia Mensual de Casos de Violencia Intrafamiliar Contra Mujeres",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
# Agrupar las filas por año de forma dinámica
group_rows("2024", 1, n_2024) %>%
group_rows("2025", n_2024 + 1, n_2024 + n_2025) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9") | Año | Mes | Total de Casos |
|---|---|---|
| 2024 | ||
| 2024 | enero | 6826 |
| 2024 | febrero | 7481 |
| 2024 | marzo | 8189 |
| 2024 | abril | 7837 |
| 2024 | mayo | 8735 |
| 2024 | junio | 8557 |
| 2024 | julio | 9298 |
| 2024 | agosto | 9133 |
| 2024 | septiembre | 9896 |
| 2024 | octubre | 9767 |
| 2024 | noviembre | 8885 |
| 2024 | diciembre | 6277 |
| 2025 | ||
| 2025 | enero | 8181 |
| 2025 | febrero | 7820 |
| 2025 | marzo | 8749 |
| 2025 | abril | 8675 |
| 2025 | mayo | 8329 |
| 2025 | junio | 8774 |
| 2025 | julio | 10446 |
| 2025 | agosto | 9957 |
| 2025 | septiembre | 9010 |
# --- 3. GENERACIÓN DE LA TABLA RESUMEN ANUAL (resumen_ds) ---
resumen_vi <- vi_mensual %>%
group_by(anio) %>%
summarise(
meses_reportados = n(),
total_anio = sum(total),
promedio_mensual = mean(total),
minimo = min(total),
maximo = max(total)
)
resumen_vi %>%
kable(
col.names = c("Año", "Meses Rep.", "Total Anual", "Promedio Mensual", "Mínimo", "Máximo"),
digits = 1,
caption = "Tabla 1. Resumen Estadístico de Violencia Intrafamiliar Contra Mujeres por Año",
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, color = "white", background = "#9D7AC9")| Año | Meses Rep. | Total Anual | Promedio Mensual | Mínimo | Máximo |
|---|---|---|---|---|---|
| 2024 | 12 | 100881 | 8406.8 | 6277 | 9896 |
| 2025 | 9 | 79941 | 8882.3 | 7820 | 10446 |
2024 (ene-dic)
100,881 mujeres víctimas en 2024
Promedio mensual: 8,407 casos
Pico máximo: Septiembre con 9,896 casos
Valor mínimo: Diciembre con 6,277 casos
2025 (ene-sep)
79,941 mujeres víctimas en 9 meses
Promedio mensual: 8,882 casos
Rango amplio: Entre 7,820 y 10,446 casos mensuales
Máximo 2025: Julio con 10,446 casos
Interpretación
Tendencia ascendente confirmada, Promedio mensual aumentó 5.7% (8,407 → 8,882 casos/mes)
Mínimos más altos: Febrero 2025 (7,820) es 24.6% mayor que diciembre 2024 (6,277)
Nuevo récord: Julio 2025 (10,446 casos) supera cualquier mes de 2024
Conteo de Casos
Se utilizaron diferentes métodos según la disponibilidad de variables:
Delitos Sexuales (DS) y Violencia Intrafamiliar (VI): - Método:
sum(cantidad) - Justificación: La variable
cantidad registra el número real de víctimas por evento,
incluyendo casos con múltiples víctimas (cantidad > 1) -
Ventaja: Captura la magnitud completa de la violencia
Feminicidios (FEM): - Método: n() (conteo de registros)
- Justificación: Todos los registros representan un feminicidio
individual - Equivalencia: n() = sum(conteo)
donde conteo = 1 para todos
Durante la exploración se identificó: - 2024: Presencia de
cantidad > 1 (registros agregados) - 2025: Mayoría de
cantidad = 1, pero con aparente duplicación masiva
Se optó por mantener los datos originales y utilizar
sum(cantidad) porque: 1. Representa el número real de
víctimas 2. Es la variable diseñada para este propósito 3. Preserva la
integridad de la serie temporal
# --- PREPARACIÓN DE DATOS PARA CORRELACIÓN ---
# 1. FEMINICIDIOS (FEM) - usar n() (correcto)
femi_mensual_mujeres <- fem %>%
group_by(anio, mes) %>%
summarise(
femi_casos = n(), # ✅ CORRECTO: todos conteo = 1
femi_oficial = sum(fem_oficial, na.rm = TRUE),
femi_potencial = sum(fem_potencial, na.rm = TRUE),
.groups = 'drop'
) %>%
mutate(fecha = make_date(anio, mes, 1))
# 2. DELITOS SEXUALES (DS) - usar sum(cantidad)
ds_mensual_mujeres <- ds %>%
group_by(anio, mes) %>%
summarise(
ds_casos = sum(cantidad, na.rm = TRUE), # sum(cantidad)
.groups = 'drop'
) %>%
mutate(fecha = make_date(anio, mes, 1))
# 3. VIOLENCIA INTRAFAMILIAR (VI) - usar sum(cantidad)
vi_mensual_mujeres <- vi %>%
group_by(anio, mes) %>%
summarise(
vi_casos = sum(cantidad, na.rm = TRUE), # sum(cantidad)
.groups = 'drop'
) %>%
mutate(fecha = make_date(anio, mes, 1))
# 4. UNIFICAR DATOS
datos_mensuales_mujeres <- femi_mensual_mujeres %>%
full_join(ds_mensual_mujeres, by = c("anio", "mes", "fecha")) %>%
full_join(vi_mensual_mujeres, by = c("anio", "mes", "fecha")) %>%
select(fecha, anio, mes, femi_casos, ds_casos, vi_casos) %>%
arrange(fecha) %>%
filter(!is.na(femi_casos) & !is.na(ds_casos) & !is.na(vi_casos))
# 5. CREAR TABLAS FORMATEADAS PARA EL INFORME
# Cargar librería para tablas bonitas
if (!require(knitr)) install.packages("knitr")
library(knitr)
# Crear tabla de resumen general
resumen_general <- data.frame(
"Tipo de Violencia" = c("Feminicidios", "Delitos Sexuales",
"Violencia Intrafamiliar", "**Total general**"),
"Código" = c("FEM", "DS", "VI", "**-**"),
"Total de Casos" = c(
sum(datos_mensuales_mujeres$femi_casos),
sum(datos_mensuales_mujeres$ds_casos),
sum(datos_mensuales_mujeres$vi_casos),
sum(datos_mensuales_mujeres$femi_casos) +
sum(datos_mensuales_mujeres$ds_casos) +
sum(datos_mensuales_mujeres$vi_casos)
),
stringsAsFactors = FALSE
)
# Crear tabla de verificación 2024
verificacion_2024 <- data.frame(
"Variable" = c("Delitos Sexuales (DS)", "Violencia Intrafamiliar (VI)"),
"En análisis de correlación" = c(
sum(datos_mensuales_mujeres$ds_casos[datos_mensuales_mujeres$anio == 2024]),
sum(datos_mensuales_mujeres$vi_casos[datos_mensuales_mujeres$anio == 2024])
),
"En tablas anteriores" = c(25306, 100881),
"¿Coinciden?" = c(
ifelse(sum(datos_mensuales_mujeres$ds_casos[datos_mensuales_mujeres$anio == 2024]) == 25306,
"✅ Sí", "❌ No"),
ifelse(sum(datos_mensuales_mujeres$vi_casos[datos_mensuales_mujeres$anio == 2024]) == 100881,
"✅ Sí", "❌ No")
),
stringsAsFactors = FALSE
)
# 6. IMPRIMIR RESULTADOS FORMATEADOS
cat("\nPeriodo analizado: ",
format(min(datos_mensuales_mujeres$fecha), "%B %Y"), " a ",
format(max(datos_mensuales_mujeres$fecha), "%B %Y"), sep = "")##
## Periodo analizado: enero 2024 a junio 2025
##
##
## **Total de meses analizados:** 18
##
## Totales por tipo de violencia en el periodo:
kable(resumen_general,
align = c("l", "c", "r"),
col.names = c("Tipo de Violencia", "Código", "Total de Casos"),
format = "markdown")| Tipo de Violencia | Código | Total de Casos |
|---|---|---|
| Feminicidios | FEM | 249 |
| Delitos Sexuales | DS | 38624 |
| Violencia Intrafamiliar | VI | 151409 |
| Total general | - | 190282 |
##
## Verificación contra tablas anteriores (2024):
kable(verificacion_2024,
align = c("l", "r", "r", "c"),
col.names = c("Variable", "En análisis de correlación",
"En tablas anteriores", "¿Coinciden?"),
format = "markdown")| Variable | En análisis de correlación | En tablas anteriores | ¿Coinciden? |
|---|---|---|---|
| Delitos Sexuales (DS) | 25306 | 25306 | ✅ Sí |
| Violencia Intrafamiliar (VI) | 100881 | 100881 | ✅ Sí |
# --- 1. VERIFICACIÓN DE NORMALIDAD ---
# Pruebas de Shapiro-Wilk para cada variable
shapiro_femi <- shapiro.test(datos_mensuales_mujeres$femi_casos)
shapiro_ds <- shapiro.test(datos_mensuales_mujeres$ds_casos)
shapiro_vi <- shapiro.test(datos_mensuales_mujeres$vi_casos)
# Crear tabla de resultados de Shapiro-Wilk
tabla_shapiro <- data.frame(
"Variable" = c("Feminicidios (FEM)", "Delitos Sexuales (DS)", "Violencia Intrafamiliar (VI)"),
"Estadístico W" = c(
round(shapiro_femi$statistic, 4),
round(shapiro_ds$statistic, 4),
round(shapiro_vi$statistic, 4)
),
"Valor p" = c(
round(shapiro_femi$p.value, 4),
round(shapiro_ds$p.value, 4),
round(shapiro_vi$p.value, 4)
),
"¿Distribución normal?" = c(
ifelse(shapiro_femi$p.value > 0.05, "✅ Sí", "❌ No"),
ifelse(shapiro_ds$p.value > 0.05, "✅ Sí", "❌ No"),
ifelse(shapiro_vi$p.value > 0.05, "✅ Sí", "❌ No")
),
"Interpretación" = c(
ifelse(shapiro_femi$p.value > 0.05, "No se rechaza normalidad", "Se rechaza normalidad"),
ifelse(shapiro_ds$p.value > 0.05, "No se rechaza normalidad", "Se rechaza normalidad"),
ifelse(shapiro_vi$p.value > 0.05, "No se rechaza normalidad", "Se rechaza normalidad")
),
stringsAsFactors = FALSE
)
# Imprimir resultados formateados
cat("### Pruebas de Shapiro-Wilk (α = 0.05)\n\n")## ### Pruebas de Shapiro-Wilk (α = 0.05)
| Variable | Estadístico.W | Valor.p | X.Distribución.normal. | Interpretación |
|---|---|---|---|---|
| Feminicidios (FEM) | 0.9348 | 0.2360 | ✅ Sí | No se rechaza normalidad |
| Delitos Sexuales (DS) | 0.8919 | 0.0415 | ❌ No | Se rechaza normalidad |
| Violencia Intrafamiliar (VI) | 0.9600 | 0.6007 | ✅ Sí | No se rechaza normalidad |
##
##
## ### Verificación visual de normalidad
# Crear gráficos (esto se mostrará como imágenes en el documento)
# Configurar para 2 filas y 3 columnas
par(mfrow = c(2, 3), mar = c(4, 4, 3, 2))
# Histogramas con curva normal
hist(datos_mensuales_mujeres$femi_casos,
main = "A. Feminicidios - Histograma",
xlab = "Casos mensuales",
col = "lightblue",
probability = TRUE,
cex.main = 0.9)
curve(dnorm(x,
mean = mean(datos_mensuales_mujeres$femi_casos),
sd = sd(datos_mensuales_mujeres$femi_casos)),
col = "darkred", lwd = 2, add = TRUE)
hist(datos_mensuales_mujeres$ds_casos,
main = "B. Delitos Sexuales - Histograma",
xlab = "Casos mensuales",
col = "lightgreen",
probability = TRUE,
cex.main = 0.9)
curve(dnorm(x,
mean = mean(datos_mensuales_mujeres$ds_casos),
sd = sd(datos_mensuales_mujeres$ds_casos)),
col = "darkblue", lwd = 2, add = TRUE)
hist(datos_mensuales_mujeres$vi_casos,
main = "C. Violencia Intrafamiliar - Histograma",
xlab = "Casos mensuales",
col = "lightpink",
probability = TRUE,
cex.main = 0.9)
curve(dnorm(x,
mean = mean(datos_mensuales_mujeres$vi_casos),
sd = sd(datos_mensuales_mujeres$vi_casos)),
col = "darkgreen", lwd = 2, add = TRUE)
# QQ-Plots
qqnorm(datos_mensuales_mujeres$femi_casos,
main = "D. Feminicidios - QQ Plot",
cex.main = 0.9)
qqline(datos_mensuales_mujeres$femi_casos, col = "red", lwd = 2)
qqnorm(datos_mensuales_mujeres$ds_casos,
main = "E. Delitos Sexuales - QQ Plot",
cex.main = 0.9)
qqline(datos_mensuales_mujeres$ds_casos, col = "blue", lwd = 2)
qqnorm(datos_mensuales_mujeres$vi_casos,
main = "F. Violencia Intrafamiliar - QQ Plot",
cex.main = 0.9)
qqline(datos_mensuales_mujeres$vi_casos, col = "green", lwd = 2)# Restaurar configuración gráfica
par(mfrow = c(1, 1))
# --- 3. PRUEBAS ADICIONALES DE NORMALIDAD ---
cat("\n\n### Pruebas adicionales de normalidad\n\n")##
##
## ### Pruebas adicionales de normalidad
# Prueba de Kolmogorov-Smirnov
ks_femi <- ks.test(scale(datos_mensuales_mujeres$femi_casos), "pnorm")
ks_ds <- ks.test(scale(datos_mensuales_mujeres$ds_casos), "pnorm")
ks_vi <- ks.test(scale(datos_mensuales_mujeres$vi_casos), "pnorm")
# Coeficiente de asimetría y curtosis
if (!require(moments)) install.packages("moments")
library(moments)
# Crear tabla de estadísticos
tabla_estadisticos <- data.frame(
"Variable" = c("Feminicidios (FEM)", "Delitos Sexuales (DS)", "Violencia Intrafamiliar (VI)"),
"Asimetría" = c(
round(skewness(datos_mensuales_mujeres$femi_casos), 3),
round(skewness(datos_mensuales_mujeres$ds_casos), 3),
round(skewness(datos_mensuales_mujeres$vi_casos), 3)
),
"Curtosis" = c(
round(kurtosis(datos_mensuales_mujeres$femi_casos), 3),
round(kurtosis(datos_mensuales_mujeres$ds_casos), 3),
round(kurtosis(datos_mensuales_mujeres$vi_casos), 3)
),
"Kolmogorov-Smirnov (p)" = c(
round(ks_femi$p.value, 4),
round(ks_ds$p.value, 4),
round(ks_vi$p.value, 4)
),
"¿Normal por asimetría?" = c(
ifelse(abs(skewness(datos_mensuales_mujeres$femi_casos)) < 0.5, "✅ Sí", "❌ No"),
ifelse(abs(skewness(datos_mensuales_mujeres$ds_casos)) < 0.5, "✅ Sí", "❌ No"),
ifelse(abs(skewness(datos_mensuales_mujeres$vi_casos)) < 0.5, "✅ Sí", "❌ No")
),
"¿Normal por curtosis?" = c(
ifelse(abs(kurtosis(datos_mensuales_mujeres$femi_casos) - 3) < 1, "✅ Sí", "❌ No"),
ifelse(abs(kurtosis(datos_mensuales_mujeres$ds_casos) - 3) < 1, "✅ Sí", "❌ No"),
ifelse(abs(kurtosis(datos_mensuales_mujeres$vi_casos) - 3) < 1, "✅ Sí", "❌ No")
),
stringsAsFactors = FALSE
)
cat("**Tabla de estadísticos descriptivos:**\n\n")## **Tabla de estadísticos descriptivos:**
| Variable | Asimetría | Curtosis | Kolmogorov.Smirnov..p. | X.Normal.por.asimetría. | X.Normal.por.curtosis. |
|---|---|---|---|---|---|
| Feminicidios (FEM) | 0.812 | 3.718 | 0.6320 | ❌ No | ✅ Sí |
| Delitos Sexuales (DS) | -1.275 | 4.362 | 0.7556 | ❌ No | ❌ No |
| Violencia Intrafamiliar (VI) | -0.589 | 3.090 | 0.9115 | ❌ No | ✅ Sí |
##
##
## ### Decisión metodológica
# Contar cuántas variables son normales según Shapiro-Wilk
normales_shapiro <- sum(c(shapiro_femi$p.value > 0.05,
shapiro_ds$p.value > 0.05,
shapiro_vi$p.value > 0.05))
# Contar cuántas variables son normales según asimetría y curtosis
normales_asimetria <- sum(abs(c(
skewness(datos_mensuales_mujeres$femi_casos),
skewness(datos_mensuales_mujeres$ds_casos),
skewness(datos_mensuales_mujeres$vi_casos)
)) < 0.5)
normales_curtosis <- sum(abs(c(
kurtosis(datos_mensuales_mujeres$femi_casos) - 3,
kurtosis(datos_mensuales_mujeres$ds_casos) - 3,
kurtosis(datos_mensuales_mujeres$vi_casos) - 3
)) < 1)
# Crear tabla de decisión
decision_df <- data.frame(
"Criterio" = c("Prueba de Shapiro-Wilk (p > 0.05)",
"Coeficiente de asimetría (|γ₁| < 0.5)",
"Coeficiente de curtosis (|γ₂ - 3| < 1)",
"**Conclusión general**"),
"Variables normales" = c(
paste(normales_shapiro, "de 3"),
paste(normales_asimetria, "de 3"),
paste(normales_curtosis, "de 3"),
ifelse(normales_shapiro < 3, "**Al menos una variable no es normal**", "**Todas las variables son normales**")
),
"Recomendación" = c(
ifelse(normales_shapiro == 3, "Pearson", "Spearman"),
ifelse(normales_asimetria == 3, "Pearson", "Spearman"),
ifelse(normales_curtosis == 3, "Pearson", "Spearman"),
ifelse(normales_shapiro < 3, "**Correlación de Spearman**", "**Correlación de Pearson**")
),
stringsAsFactors = FALSE
)
kable(decision_df,
align = c("l", "c", "l"),
format = "markdown")| Criterio | Variables.normales | Recomendación |
|---|---|---|
| Prueba de Shapiro-Wilk (p > 0.05) | 2 de 3 | Spearman |
| Coeficiente de asimetría (|γ₁| < 0.5) | 0 de 3 | Spearman |
| Coeficiente de curtosis (|γ₂ - 3| < 1) | 2 de 3 | Spearman |
| Conclusión general | Al menos una variable no es normal | Correlación de Spearman |
##
## **Justificación metodológica:**
if(normales_shapiro < 3) {
cat("• Al menos una variable (Feminicidios) no sigue una distribución normal según la prueba de Shapiro-Wilk (p < 0.05).\n")
cat("• El análisis gráfico (histogramas y QQ-plots) muestra desviaciones de la normalidad.\n")
cat("• La correlación de Spearman es el método apropiado para datos no paramétricos o cuando no se cumple el supuesto de normalidad.\n")
cat("• Este método evalúa relaciones monótonas utilizando rangos, siendo más robusto ante outliers y distribuciones no normales.\n")
} else {
cat("• Las tres variables presentan distribución normal según la prueba de Shapiro-Wilk (p > 0.05).\n")
cat("• Los gráficos de verificación visual confirman el cumplimiento del supuesto de normalidad.\n")
cat("• La correlación de Pearson es el método apropiado para datos con distribución normal.\n")
cat("• Este método evalúa relaciones lineales y proporciona estimaciones más precisas cuando se cumplen todos los supuestos.\n")
}## • Al menos una variable (Feminicidios) no sigue una distribución normal según la prueba de Shapiro-Wilk (p < 0.05).
## • El análisis gráfico (histogramas y QQ-plots) muestra desviaciones de la normalidad.
## • La correlación de Spearman es el método apropiado para datos no paramétricos o cuando no se cumple el supuesto de normalidad.
## • Este método evalúa relaciones monótonas utilizando rangos, siendo más robusto ante outliers y distribuciones no normales.
## === ANÁLISIS DE CORRELACIÓN DE SPEARMAN ===
# 1. Matriz de correlación de Spearman
cor_spearman <- cor(datos_mensuales_mujeres[, c("femi_casos", "ds_casos", "vi_casos")],
method = "spearman", use = "complete.obs")
cat("\nMATRIZ DE CORRELACIÓN DE SPEARMAN:\n")##
## MATRIZ DE CORRELACIÓN DE SPEARMAN:
## femi_casos ds_casos vi_casos
## femi_casos 1.000 -0.050 0.063
## ds_casos -0.050 1.000 0.756
## vi_casos 0.063 0.756 1.000
##
## --- PRUEBAS DE SIGNIFICANCIA INDIVIDUALES ---
# FEM vs DS
test_femi_ds <- cor.test(datos_mensuales_mujeres$femi_casos,
datos_mensuales_mujeres$ds_casos,
method = "spearman", exact = FALSE)
cat("Feminicidios vs Delitos Sexuales:\n")## Feminicidios vs Delitos Sexuales:
cat(" ρ =", round(test_femi_ds$estimate, 3),
"| p =", round(test_femi_ds$p.value, 4),
"|", ifelse(test_femi_ds$p.value < 0.05, "SIGNIFICATIVO", "No significativo"), "\n")## ρ = -0.05 | p = 0.8441 | No significativo
# FEM vs VI
test_femi_vi <- cor.test(datos_mensuales_mujeres$femi_casos,
datos_mensuales_mujeres$vi_casos,
method = "spearman", exact = FALSE)
cat("\nFeminicidios vs Violencia Intrafamiliar:\n")##
## Feminicidios vs Violencia Intrafamiliar:
cat(" ρ =", round(test_femi_vi$estimate, 3),
"| p =", round(test_femi_vi$p.value, 4),
"|", ifelse(test_femi_vi$p.value < 0.05, "SIGNIFICATIVO", "No significativo"), "\n")## ρ = 0.063 | p = 0.8026 | No significativo
# DS vs VI
test_ds_vi <- cor.test(datos_mensuales_mujeres$ds_casos,
datos_mensuales_mujeres$vi_casos,
method = "spearman", exact = FALSE)
cat("\nDelitos Sexuales vs Violencia Intrafamiliar:\n")##
## Delitos Sexuales vs Violencia Intrafamiliar:
cat(" ρ =", round(test_ds_vi$estimate, 3),
"| p =", round(test_ds_vi$p.value, 4),
"|", ifelse(test_ds_vi$p.value < 0.05, "SIGNIFICATIVO", "No significativo"), "\n")## ρ = 0.756 | p = 3e-04 | SIGNIFICATIVO
# 3. Interpretación de fuerza de correlación
cat("\n--- INTERPRETACIÓN DE LA FUERZA DE CORRELACIÓN ---\n")##
## --- INTERPRETACIÓN DE LA FUERZA DE CORRELACIÓN ---
## |ρ| < 0.3 : Correlación débil
## 0.3 ≤ |ρ| < 0.7 : Correlación moderada
## |ρ| ≥ 0.7 : Correlación fuerte
# 4. Crear tabla resumen
resumen_correlaciones <- data.frame(
Comparación = c("Feminicidios - Delitos Sexuales",
"Feminicidios - Violencia Intrafamiliar",
"Delitos Sexuales - Violencia Intrafamiliar"),
Rho_Spearman = c(round(test_femi_ds$estimate, 3),
round(test_femi_vi$estimate, 3),
round(test_ds_vi$estimate, 3)),
P_valor = c(round(test_femi_ds$p.value, 4),
round(test_femi_vi$p.value, 4),
round(test_ds_vi$p.value, 4)),
Significancia = c(ifelse(test_femi_ds$p.value < 0.05, "Sí (p < 0.05)", "No"),
ifelse(test_femi_vi$p.value < 0.05, "Sí (p < 0.05)", "No"),
ifelse(test_ds_vi$p.value < 0.05, "Sí (p < 0.05)", "No")),
Fuerza = c(
ifelse(abs(test_femi_ds$estimate) >= 0.7, "Fuerte",
ifelse(abs(test_femi_ds$estimate) >= 0.3, "Moderada", "Débil")),
ifelse(abs(test_femi_vi$estimate) >= 0.7, "Fuerte",
ifelse(abs(test_femi_vi$estimate) >= 0.3, "Moderada", "Débil")),
ifelse(abs(test_ds_vi$estimate) >= 0.7, "Fuerte",
ifelse(abs(test_ds_vi$estimate) >= 0.3, "Moderada", "Débil"))
),
Dirección = c(
ifelse(test_femi_ds$estimate > 0, "Positiva", "Negativa"),
ifelse(test_femi_vi$estimate > 0, "Positiva", "Negativa"),
ifelse(test_ds_vi$estimate > 0, "Positiva", "Negativa")
)
)
print(resumen_correlaciones)## Comparación Rho_Spearman P_valor Significancia
## 1 Feminicidios - Delitos Sexuales -0.050 0.8441 No
## 2 Feminicidios - Violencia Intrafamiliar 0.063 0.8026 No
## 3 Delitos Sexuales - Violencia Intrafamiliar 0.756 0.0003 Sí (p < 0.05)
## Fuerza Dirección
## 1 Débil Negativa
## 2 Débil Positiva
## 3 Fuerte Positiva
# 5. Visualización de correlaciones
library(corrplot)
corrplot(cor_spearman, method = "color", type = "upper",
tl.col = "black", tl.srt = 45,
title = "Matriz de Correlación de Spearman\nViolencia Contra Mujeres",
mar = c(0,0,2,0),
addCoef.col = "black",
number.cex = 1.2,
col = colorRampPalette(c("blue", "white", "#4B0082"))(200))# 6. Gráficos de dispersión con líneas de tendencia
library(ggplot2)
library(patchwork)
# FEM vs DS
p1 <- ggplot(datos_mensuales_mujeres, aes(x = ds_casos, y = femi_casos)) +
geom_point(size = 3, color = "darkred", alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(title = "Feminicidios vs Delitos Sexuales",
x = "Delitos Sexuales (mensuales)",
y = "Feminicidios (mensuales)") +
theme_minimal()
# FEM vs VI
p2 <- ggplot(datos_mensuales_mujeres, aes(x = vi_casos, y = femi_casos)) +
geom_point(size = 3, color = "darkblue", alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "blue", linetype = "dashed") +
labs(title = "Feminicidios vs Violencia Intrafamiliar",
x = "Violencia Intrafamiliar (mensuales)",
y = "Feminicidios (mensuales)") +
theme_minimal()
# DS vs VI
p3 <- ggplot(datos_mensuales_mujeres, aes(x = vi_casos, y = ds_casos)) +
geom_point(size = 3, color = "darkgreen", alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "green", linetype = "dashed") +
labs(title = "Delitos Sexuales vs Violencia Intrafamiliar",
x = "Violencia Intrafamiliar (mensuales)",
y = "Delitos Sexuales (mensuales)") +
theme_minimal()
# Combinar gráficos
(p1 + p2) / p3 +
plot_annotation(title = "Relaciones entre Tipos de Violencia Contra Mujeres",
subtitle = "Correlación de Spearman - Período: Enero 2024 a Junio 2025")A continuación, se presenta la interpretación de las correlaciones estadísticas identificadas entre los tipos de violencia contra las mujeres analizados:
Correlación: Fuerte y positiva (ρ = 0.756)
Significancia estadística: Sí (p = 0.0003)
Interpretación: Existe una relación estadísticamente significativa y fuerte entre los casos de delitos sexuales y los casos de violencia intrafamiliar. Cuando aumentan los casos de uno de estos tipos de violencia, tiende a aumentar también el otro en el mismo periodo. Esto sugiere que pueden compartir determinantes sociales, estacionales o contextuales comunes, o que las condiciones que favorecen un tipo de violencia también están asociadas al otro.
Correlación: Débil y negativa (ρ = -0.050)
Significancia estadística: No (p = 0.8441)
Interpretación: No existe una relación lineal significativa entre el número de feminicidios y el de delitos sexuales registrados mensualmente. La correlación es prácticamente nula y no estadísticamente significativa, lo que indica que las variaciones en una variable no se asocian con variaciones en la otra en el periodo estudiado.
Correlación: Débil y positiva (ρ = 0.063)
Significancia estadística: No (p = 0.8026)
Interpretación: No se encontró una relación significativa entre los casos de feminicidios y los de violencia intrafamiliar. Aunque la dirección es ligeramente positiva, la correlación es muy débil y no alcanza significación estadística, por lo que no puede afirmarse que exista un vínculo lineal entre estas dos formas de violencia en los datos analizados.
# --- GRÁFICO DE DISPERSIÓN: CORRELACIÓN ESTADÍSTICAMENTE SIGNIFICATIVA ---
library(ggplot2)
# Configuración de colores
color_puntos <- "#4B0082" # Púrpura oscuro para puntos
color_linea <- "#8B0000" # Rojo oscuro para línea (significativo)
color_fondo <- "#FAF9FF" # Fondo claro
color_texto <- "#2C2C2C" # Texto principal
# Crear el gráfico
ggplot(datos_mensuales_mujeres, aes(x = vi_casos, y = ds_casos)) +
# 1. Puntos de dispersión
geom_point(
size = 5,
color = color_puntos,
alpha = 0.7,
shape = 19
) +
# 2. Línea de tendencia LOESS (no paramétrica)
geom_smooth(
method = "loess",
formula = y ~ x,
color = color_linea,
fill = alpha("#9370DB", 0.2), # Área de confianza
linewidth = 2,
se = TRUE # Mostrar intervalo de confianza
) +
# 3. Etiqueta de la correlación
annotate(
"text",
x = min(datos_mensuales_mujeres$vi_casos) +
diff(range(datos_mensuales_mujeres$vi_casos)) * 0.1,
y = max(datos_mensuales_mujeres$ds_casos) * 0.95,
label = paste(
"ρ =", round(test_ds_vi$estimate, 3), "\n",
"p < 0.001"
),
size = 6,
color = "#8B0000",
fontface = "bold",
hjust = 0,
lineheight = 0.9
) +
# 4. Títulos y etiquetas
labs(
title = "CORRELACIÓN ESTADÍSTICAMENTE SIGNIFICATIVA",
subtitle = "Delitos Sexuales vs Violencia Intrafamiliar contra Mujeres",
x = "Casos de Violencia Intrafamiliar (mensuales)",
y = "Casos de Delitos Sexuales (mensuales)",
caption = paste(
"Método: Correlación de Spearman | ",
"Período: ",
format(min(datos_mensuales_mujeres$fecha), "%B %Y"),
" a ",
format(max(datos_mensuales_mujeres$fecha), "%B %Y"),
" | n = ", nrow(datos_mensuales_mujeres), " meses",
sep = ""
)
) +
# 5. Escalas
scale_x_continuous(
labels = scales::comma,
expand = expansion(mult = c(0.05, 0.05))
) +
scale_y_continuous(
labels = scales::comma,
expand = expansion(mult = c(0.05, 0.05))
) +
# 6. Tema personalizado
theme_minimal(base_size = 14) +
theme(
# Título principal
plot.title = element_text(
size = 20,
face = "bold",
color = color_texto,
hjust = 0.5,
margin = margin(b = 10)
),
# Subtítulo
plot.subtitle = element_text(
size = 16,
color = "#4B0082",
hjust = 0.5,
margin = margin(b = 15)
),
# Etiquetas de ejes
axis.title = element_text(
size = 14,
face = "bold",
color = color_texto
),
axis.title.x = element_text(margin = margin(t = 10)),
axis.title.y = element_text(margin = margin(r = 10)),
# Texto de ejes
axis.text = element_text(
size = 12,
color = "#666666"
),
# Leyenda de correlación (no aplica aquí)
legend.position = "none",
# Cuadrícula
panel.grid.major = element_line(
color = "#F0F0F0",
linewidth = 0.5
),
panel.grid.minor = element_blank(),
# Fondo
panel.background = element_rect(
fill = color_fondo,
color = NA
),
plot.background = element_rect(
fill = "white",
color = NA
),
# Márgenes
plot.margin = margin(20, 20, 20, 20),
# Pie de gráfico
plot.caption = element_text(
size = 11,
color = "#666666",
hjust = 0.5,
margin = margin(t = 15)
)
)Una correlación nos dice si estas dos variables “se mueven juntas” o no.
La FUERZA de la correlación: ρ = 0.756
Escala de fuerzas:
0 a 0.3 = Correlación débil
0.3 a 0.7 = Correlación moderada
0.7 a 1.0 = Correlación FUERTE
Nuestro resultado: ρ = 0.756
¡Esto está en la categoría FUERTE! Es como si estas dos variables fueran compañeras de baque muy coordinadas.
La DIRECCIÓN: Positiva (+)
“Positiva” significa: Cuando una variable aumenta, la otra también aumenta. Cuando una disminuye, la otra también disminuye.
La SIGNIFICANCIA ESTADÍSTICA: p = 0.0003
El valor “p”
Es la probabilidad de que este resultado sea PURA CASUALIDAD.
La regla de oro:
p < 0.05 = Es POCO PROBABLE que sea casualidad (tomamos el resultado en serio)
p ≥ 0.05 = Podría ser casualidad (no confiamos tanto)
Nuestro resultado: p = 0.0003
¡Esto es MUY PEQUEÑO! Significa:
“Si en realidad NO HUBIERA relación entre estas variables, la probabilidad de encontrar una correlación tan fuerte (0.756) por pura casualidad sería de solo 0.03%”
Es decir, 3 de cada 10,000 veces obtendríamos este resultado por suerte. ¡Es casi imposible!
El hallazgo más relevante del análisis es la correlación fuerte y significativa entre Delitos Sexuales y Violencia Intrafamiliar, que sugiere una posible dinámica conjunta o factores de riesgo compartidos entre estas dos manifestaciones de violencia. Por el contrario, los feminicidios no mostraron una asociación lineal significativa con los otros dos tipos de violencia en el periodo observado, lo que puede indicar que sus patrones, causas inmediatas o factores desencadenantes operan de manera más independiente o responden a variables no capturadas en este análisis mensual.
Nota metodológica: Todos los resultados se basan en un análisis no paramétrico (Spearman) con datos de 18 meses (enero 2024 a junio 2025) y un nivel de significancia de α = 0.05.
La significancia estadística se evalúa comparando el valor p con un umbral predefinido (α=0.05). Un valor p menor a 0.05 indica que es muy improbable que la correlación observada sea producto del azar, permitiendo concluir que existe una asociación estadísticamente significativa. En este análisis, solo la correlación entre Delitos Sexuales y Violencia Intrafamiliar superó este umbral (p=0.0003), mientras que las asociaciones que involucran a los Feminicidios presentaron valores p muy altos (p>0.80), lo que significa que no hay evidencia suficiente para afirmar que existan correlaciones lineales reales más allá de la variación aleatoria esperada en los datos.
En memoria de las mujeres víctimas de violencia.
Este análisis busca contribuir a la prevención y erradicación de la violencia de género en Colombia.