SENA COLOMBO ALEMAN - SEDE TIC
# === LIMPIAR/ESTANDARIZAR NOMBRES: pasamos a snake_case (sin espacios ni tildes) ===
Libro1 <- Libro1 %>% janitor::clean_names()
VIOLENCIA_INTRAFAMILIAR_2024 <- VIOLENCIA_INTRAFAMILIAR_2024 %>% janitor::clean_names()
DELITOS_SEXUALES_2024 <- DELITOS_SEXUALES_2024 %>% janitor::clean_names()
# === NORMALIZAR FECHAS y crear 'periodo' (mes como fecha YYYY-MM-01) ===
# Asumiendo que en col_types pusiste "date", las columnas deberían venir como Date.
# Aun así aplicamos seguridad: si no son Date, intentamos parsear.
safe_date <- function(x) {
if(inherits(x, "Date") || inherits(x, "POSIXct")) return(as_date(x))
# intentamos formatos comunes
out <- suppressWarnings(lubridate::dmy(x))
nas <- is.na(out)
if(any(nas)) {
out2 <- suppressWarnings(lubridate::ymd(x))
out[nas] <- out2[nas]
}
out
}
# Aplicar y crear periodo = primer día del mes
Libro1 <- Libro1 %>%
mutate(fecha_hecho = safe_date(fecha_hecho),
periodo = floor_date(fecha_hecho, "month"),
departamento = tolower(departamento) %>% stringi::stri_trans_general("Latin-ASCII") %>% trimws())
VIOLENCIA_INTRAFAMILIAR_2024 <- VIOLENCIA_INTRAFAMILIAR_2024 %>%
mutate(fecha_hecho = safe_date(fecha_hecho),
periodo = floor_date(fecha_hecho, "month"),
departamento = tolower(departamento) %>% stringi::stri_trans_general("Latin-ASCII") %>% trimws())
DELITOS_SEXUALES_2024 <- DELITOS_SEXUALES_2024 %>%
mutate(fecha_hecho = safe_date(fecha_hecho),
periodo = floor_date(fecha_hecho, "month"),
departamento = tolower(departamento) %>% stringi::stri_trans_general("Latin-ASCII") %>% trimws())
# === Agregados por DEPARTAMENTO + MES (periodo) para 2024 ===
# Feminicidios 2024
FEM_mensual_dept <- Libro1 %>%
filter(year(periodo) == 2024) %>% # solo 2024
group_by(departamento, periodo) %>%
summarise(FEM = n(), .groups = "drop")
# Violencia intrafamiliar 2024
VIF_mensual_dept <- VIOLENCIA_INTRAFAMILIAR_2024 %>%
group_by(departamento, periodo) %>%
summarise(VIF = n(), .groups = "drop")
# Delitos sexuales 2024
VS_mensual_dept <- DELITOS_SEXUALES_2024 %>%
group_by(departamento, periodo) %>%
summarise(VS = n(), .groups = "drop")
# === Unir FEM + VIF + VS por departamento + periodo (solo 2024) ===
df_cor <- full_join(FEM_mensual_dept, VIF_mensual_dept, by = c("departamento", "periodo")) %>%
full_join(VS_mensual_dept, by = c("departamento", "periodo")) %>%
replace_na(list(FEM = 0L, VIF = 0L, VS = 0L)) # reemplaza NA por 0 en los contadores
# === Correlación simple entre VIF y FEM (todas las observaciones de dept+mes, 2024) ===
# Filtrar observaciones con datos válidos
df_valid <- df_cor %>% filter(!is.na(FEM), !is.na(VIF))
n_obs <- nrow(df_valid)
if(n_obs >= 3) {
cor_test <- cor.test(df_valid$FEM, df_valid$VIF, method = "pearson")
} else {
cat("No hay suficientes observaciones válidas para realizar cor.test().\n")
}
# === Modelo Poisson básico: FEM ~ VIF (2024) ===
# Comprobar que df_cor exista y tenga filas
if (exists("df_cor") && nrow(df_cor) > 0) {
# Filtrar solo FEM y VIF para 2024 si no lo hemos hecho antes
df_cor_2024 <- df_cor %>%
filter(lubridate::year(periodo) == 2024)
# comprobar que haya variación
if(length(unique(df_cor_2024$FEM)) > 1 && length(unique(df_cor_2024$VIF)) > 1) {
# Ajuste modelo Poisson
modelo_pois <- try(glm(FEM ~ VIF, family = poisson(link = "log"), data = df_cor_2024), silent = TRUE)
if (inherits(modelo_pois, "try-error")) {
} else {
# Calcular IRR manualmente
coefs <- coef(modelo_pois)
se <- sqrt(diag(vcov(modelo_pois)))
irr <- exp(coefs)
lower95 <- exp(coefs - 1.96 * se)
upper95 <- exp(coefs + 1.96 * se)
irr_tab <- data.frame(
term = names(coefs),
estimate = coefs,
irr = irr,
irr_lower95 = lower95,
irr_upper95 = upper95,
stringsAsFactors = FALSE
)
}
} else {
cat("No hay suficiente variación en FEM o VIF para ajustar el modelo Poisson.\n")
}
} else {
cat("df_cor no existe o está vacío; no se puede ajustar Poisson.\n")
}
# === Preparar datos ciclo vital para 2024 ===
FEM_tipo <- Libro1 %>%
filter(presunto_agresor %in% c(
"PAREJA / RELACIÓN AFECTIVA ACTUAL",
"EX PAREJA / RELACIÓN AFECTIVA PASADA",
"FAMILIARES"
)) %>%
filter(!is.na(ciclo_vital)) %>%
filter(lubridate::year(fecha_hecho) == 2024)
VIF_mujeres <- VIOLENCIA_INTRAFAMILIAR_2024 %>%
filter(sexo_de_la_victima == "MUJER") %>%
filter(!is.na(ciclo_vital))El presente informe analiza la relación entre los casos de Violencia
Intrafamiliar (VIF) contra mujeres y los Feminicidios (FEM) registrados
en Colombia durante el año 2024.
Para ello, se emplean los registros oficiales provenientes del
Observatorio Colombiano de Feminicidios y bases de datos institucionales
sobre violencia intrafamiliar.
Se realiza un análisis descriptivo, exploratorio y un modelo
estadístico de tipo Poisson, con el fin de evaluar si existe asociación
entre ambas variables.
Los resultados preliminares sugieren patrones temporales, diferencias
por ciclo vital y variaciones por día de la semana, además de una
correlación positiva entre VIF y FEM.
La violencia contra las mujeres constituye una de las problemáticas más persistentes y alarmantes en Colombia. Sus efectos trascienden lo individual y se extienden al ámbito social, institucional y comunitario, afectando la seguridad, la salud pública y el ejercicio pleno de los derechos humanos. Entre sus manifestaciones más graves se encuentra el feminicidio, expresión extrema de violencia basada en género que evidencia fallas estructurales en los sistemas de protección y en la respuesta del Estado. Paralelamente, la Violencia Intrafamiliar (VIF) continúa representando un escenario recurrente de riesgo, pues en muchos casos actúa como un antecedente o una señal temprana de agresiones de mayor severidad.
Ante esta realidad, se vuelve necesario comprender cómo se comportan estas violencias a lo largo del tiempo y qué patrones pueden identificarse a partir de los registros oficiales disponibles. Este informe se desarrolla con el propósito de analizar la relación entre los diferentes tipos de violencia ejercida contra las mujeres, examinar su distribución temporal y sociodemográfica, y explorar la posibilidad de establecer vínculos predictivos que contribuyan a la anticipación y prevención de casos más graves.
A través de herramientas descriptivas y técnicas de modelamiento estadístico, se busca ofrecer una lectura clara y fundamentada del comportamiento de la Violencia Intrafamiliar y los feminicidios en 2024. El objetivo final es aportar evidencia que permita fortalecer las estrategias institucionales, orientar la toma de decisiones y contribuir a una comprensión más profunda de la dinámica de estas violencias en el país. Si se analizan los datos con rigurosidad, resulta posible diseñar intervenciones más oportunas y efectivas que protejan la vida y la integridad de las mujeres.
La Policía Nacional es la entidad encargada de registrar las denuncias y reportes relacionados con la Violencia Intrafamiliar y los Delitos Sexuales. La información recolectada se origina en procedimientos policiales, llamadas de emergencia, denuncias ciudadanas y otros registros administrativos. Al tratarse de una fuente institucional primaria, estos datos ofrecen una visión directa del volumen de casos que ingresan al sistema formal de atención y que llegan al conocimiento de las autoridades.
La información referente a Violencia Letal contra las Mujeres (homicidios y feminicidios) se obtiene de esta plataforma oficial de acceso público. Los datos publicados son el resultado de un proceso de consolidación interinstitucional que integra aportes de entidades como:
Instituto Nacional de Medicina Legal y Ciencias Forenses (INMLCF)
Fiscalía General de la Nación
Policía Nacional de Colombia
Esta articulación institucional permite contar con un sistema de información más completo y coherente, facilitando el análisis de tendencias a nivel nacional desde una perspectiva unificada y verificable.
Para comprender la magnitud y el comportamiento de la violencia contra las mujeres durante el año 2024, resulta fundamental iniciar con un análisis descriptivo de los datos disponibles. Este apartado presenta una caracterización general de los casos registrados, examinando su distribución temporal, las variaciones mensuales, los grupos etarios más afectados y los patrones recurrentes en los distintos tipos de violencia. A través de esta descripción preliminar se establecen las bases necesarias para interpretar las tendencias observadas y avanzar posteriormente hacia modelos analíticos más complejos.
library(patchwork)
# Filtrar FEM 2024
FEM_tipo_2024 <- FEM_tipo %>%
filter(ano_del_hecho == 2024)
# Gráfico FEM
g1 <- ggplot(FEM_tipo_2024, aes(x = ciclo_vital)) +
geom_bar(fill = colores[1], color = "black", alpha = 0.8) +
geom_text(stat='count', aes(label=..count..),
position = position_stack(vjust=0.5), size=4) +
labs(title = "Ciclo vital de víctimas de FEM (2024)",
x = "Ciclo vital", y = "Número de casos") +
theme_minimal(base_size = 10)
# Gráfico VIF (ya es 2024)
g2 <- ggplot(VIF_mujeres, aes(x = ciclo_vital)) +
geom_bar(fill = colores[2], color = "black", alpha = 0.8) +
geom_text(stat='count', aes(label=..count..),
position = position_stack(vjust=0.5), size=4) +
labs(title = "Ciclo vital de víctimas de VIF (mujeres, 2024)",
x = "Ciclo vital", y = "Número de casos") +
theme_minimal(base_size = 10)
# Combinamos los gráficos verticalmente
g1 / g2El análisis de los feminicidios (FEM) registrados en 2024 muestra un total de 145 casos. La mayor proporción corresponde a la etapa de Adultez, con 87 casos (60%). La Juventud registra 41 casos (28.28%), mientras que las etapas de Adolescencia, Adulto Mayor, Infancia y Primera Infancia presentan cantidades iguales, con 6 casos cada una (4.14%). Estos valores indican que, dentro de los registros disponibles, los casos se concentran principalmente en mujeres adultas y jóvenes.
En cuanto a la Violencia Intrafamiliar (VIF) contra mujeres, se reportan 40,066 casos en total. La categoría de Adultos concentra la mayoría, con 35,712 casos (89.13%). Las categorías de Menores (2,165 casos; 5.40%) y Adolescentes (2,089 casos; 5.21%) presentan proporciones similares entre sí y muy inferiores a la población adulta. En los registros de VIF, la distribución por ciclo vital muestra una concentración significativamente mayor en mujeres adultas en comparación con lo observado en los feminicidios.
library(dplyr)
library(stringi)
library(ggplot2)
# ===============================
# 1) Normalizar texto (para evitar problemas con tildes y mayúsculas)
# ===============================
normalizar <- function(x) {
x2 <- tolower(as.character(x))
x2 <- trimws(x2)
x2 <- stringi::stri_trans_general(x2, "Latin-ASCII")
x2
}
# ===============================
# 2) Filtrar por año 2024 y agrupar por género
# ===============================
VIF_genero <- VIOLENCIA_INTRAFAMILIAR_2024 %>%
mutate(sexo_norm = normalizar(sexo_de_la_victima)) %>%
mutate(sexo_norm = case_when(
sexo_norm %in% c("mujer","femenino") ~ "MUJER",
sexo_norm %in% c("hombre","masculino") ~ "HOMBRE",
TRUE ~ "NO INFORMA"
)) %>%
count(sexo_norm, name = "casos") %>%
complete(sexo_norm = c("MUJER", "HOMBRE", "NO INFORMA"), fill = list(casos = 0))
# ===============================
# 3) Gráfico circular
# ===============================
ggplot(VIF_genero, aes(x = "", y = casos, fill = sexo_norm)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(
aes(label = paste0(sexo_norm, "\n", casos)),
position = position_stack(vjust = 0.5),
size = 4
) +
scale_fill_manual(
values = c(
"MUJER" = colores[1],
"HOMBRE" = colores[2],
"NO INFORMA" = colores[3]
)
) +
labs(
title = "Distribución de casos de Violencia Intrafamiliar por Género (2024)",
fill = "Género"
) +
theme_minimal(base_size = 14) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()
)La distribución de los casos de Violencia Intrafamiliar (VIF) por género en 2024 muestra una diferencia notable entre las víctimas. Del total de 57,697 casos registrados (40,566 mujeres, 16,308 hombres y 823 sin información), las mujeres representan 40,566 casos, equivalentes al 70.31%. Los hombres registran 16,308 casos (28.26%), mientras que la categoría No Informa concentra 823 casos (1.43%). Según estos datos, la mayor proporción de los registros corresponde a mujeres, seguida de los hombres y, en menor medida, de los casos sin información reportada.
library(dplyr)
library(lubridate)
library(plotly)
# ============================================
# 1. Preparar datos SOLO 2024
# ============================================
df_cor_2024 <- df_cor %>%
filter(year(periodo) == 2024)
# ============================================
# 2. Ajustar modelo Poisson sobre datos 2024
# ============================================
if (length(unique(df_cor_2024$FEM)) > 1 && length(unique(df_cor_2024$VIF)) > 1) {
modelo_pois <- glm(
FEM ~ VIF,
family = poisson(link = "log"),
data = df_cor_2024
)
} else {
stop("No hay suficiente variación para ajustar modelo.")
}
# ============================================
# 3. Predicción sobre los mismos meses 2024
# ============================================
df_cor_2024 <- df_cor_2024 %>%
mutate(pred_pois = predict(modelo_pois, type = "response"))
# ============================================
# 4. Agregar FEM observado vs predicho por mes
# ============================================
ajuste_periodo <- df_cor_2024 %>%
group_by(periodo) %>%
summarise(
obs = sum(FEM, na.rm = TRUE),
fit = sum(pred_pois, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
mes = format(periodo, "%b"),
etiqueta_obs = paste0(
"<b>Mes:</b> ", mes, "<br>",
"<b>Observado:</b> ", obs
),
etiqueta_fit = paste0(
"<b>Mes:</b> ", mes, "<br>",
"<b>Ajustado:</b> ", round(fit,1)
)
)
# ============================================
# 5. Gráfico interactivo
# ============================================
plot_ly() %>%
# Serie Observado (línea + puntos)
add_lines(
data = ajuste_periodo,
x = ~periodo,
y = ~obs,
name = "Observado",
line = list(color = colores[1], width = 3),
hoverinfo = "none"
) %>%
add_markers(
data = ajuste_periodo,
x = ~periodo,
y = ~obs,
text = ~etiqueta_obs,
hoverinfo = "text",
name = "Observado",
marker = list(size = 10, color = colores[1])
) %>%
# Serie Ajustado (línea discontinua + puntos)
add_lines(
data = ajuste_periodo,
x = ~periodo,
y = ~fit,
name = "Ajustado (Poisson)",
line = list(color = colores[2], width = 3, dash = "dash"),
hoverinfo = "none"
) %>%
add_markers(
data = ajuste_periodo,
x = ~periodo,
y = ~fit,
text = ~etiqueta_fit,
hoverinfo = "text",
name = "Ajustado (Poisson)",
marker = list(size = 8, color = colores[2])
) %>%
# Layout general
layout(
title = "Observado vs Ajustado (Modelo Poisson) — 2024",
xaxis = list(title = "Mes"),
yaxis = list(title = "Número de casos"),
legend = list(
orientation = "h",
x = 0.5,
y = -0.2,
xanchor = "center"
),
plot_bgcolor = "rgba(253,249,252,1)",
paper_bgcolor = "rgba(253,249,252,1)"
)Este gráfico presenta el número de Femicidios (FEM) observados mensualmente en 2024, contrastado con los valores predichos por un Modelo de Poisson que utiliza la Violencia Intrafamiliar como variable. A nivel general, la serie de FEM observados (línea sólida) y la serie predicha (línea discontinua) muestran una tendencia similar, aunque con fluctuaciones de magnitud. El pico de FEM observados ocurrió en julio con \(25\) casos, un valor significativamente superior a la predicción de \(17.3\) para ese mes. Otro aumento notable se vio en abril, con \(18\) casos observados versus \(15.1\) predichos. Por el contrario, en julio y diciembre, los valores observados (\(13\) y \(10\) respectivamente) cayeron por debajo de las predicciones (\(15.7\) y \(11.5\)). En meses como enero y febrero, la predicción (\(14.9\)) y la observación (\(15\)) estuvieron casi perfectamente alineadas. Esto sugiere que, si bien la Violencia Intrafamiliar es un predictor relevante, existen factores estacionales o coyunturales que provocan picos observados de femicidios que superan con creces lo esperado por el modelo base.
library(dplyr)
library(lubridate)
library(plotly)
# === 1. Filtrar solo 2024 y agregar datos por mes ===
df_plot <- df_cor %>%
filter(year(periodo) == 2024) %>%
group_by(periodo) %>%
summarise(
FEM = sum(FEM, na.rm = TRUE),
VIF = sum(VIF, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
mes = factor(format(periodo, "%b"),
levels = format(seq(as.Date("2024-01-01"),
as.Date("2024-12-01"), by = "month"), "%b")),
etiqueta = paste0(
"<b>Mes:</b> ", mes, "<br>",
"<b>VIF:</b> ", VIF, "<br>",
"<b>FEM:</b> ", FEM
)
)
# === 2. Modelo con banda de confianza ===
modelo <- lm(FEM ~ VIF, data = df_plot)
df_reg <- data.frame(
VIF = seq(min(df_plot$VIF), max(df_plot$VIF), length.out = 200)
)
predicciones <- predict(modelo, newdata = df_reg, interval = "confidence")
df_reg$pred <- predicciones[, "fit"]
df_reg$lower <- predicciones[, "lwr"]
df_reg$upper <- predicciones[, "upr"]
# === 3. Paleta oficial de Angelys aplicada a cada mes ===
colores <- c("#81638b", "#b695c0", "#dac9df", "#f7bfd8")
colores_meses <- rep(colores, length.out = length(levels(df_plot$mes)))
names(colores_meses) <- levels(df_plot$mes)
# === 4. Gráfico interactivo ===
plot_ly() %>%
# Banda de confianza
add_ribbons(
data = df_reg,
x = ~VIF,
ymin = ~lower,
ymax = ~upper,
line = list(color = "transparent"),
fillcolor = "rgba(129, 99, 139, 0.25)", # morado con transparencia
name = "Banda de confianza",
showlegend = TRUE
) %>%
# Línea de regresión
add_lines(
data = df_reg,
x = ~VIF,
y = ~pred,
line = list(color = colores[1], width = 3),
name = "Línea de tendencia"
) %>%
# Puntos con colores de tu paleta
add_trace(
data = df_plot,
x = ~VIF,
y = ~FEM,
type = "scatter",
mode = "markers",
marker = list(
size = 11,
color = colores_meses[df_plot$mes],
line = list(width = 1.5, color = "#333")
),
text = ~etiqueta,
hoverinfo = "text",
name = "Meses"
) %>%
# Layout general
layout(
title = "Relación entre Violencia Intrafamiliar y Feminicidios (2024)",
xaxis = list(title = "Casos de Violencia Intrafamiliar (Mujeres)"),
yaxis = list(title = "Casos de Feminicidios"),
legend = list(
orientation = "h",
x = 0.5,
y = -0.2,
xanchor = "center"
),
plot_bgcolor = "rgba(253, 249, 252, 1)",
paper_bgcolor = "rgba(253, 249, 252, 1)"
)Esta gráfica de dispersión representa la relación entre el número de casos mensuales de Violencia Intrafamiliar (VIF) contra mujeres (eje X) y el número de Femicidios (FEM) (eje Y) a lo largo de 2024. Se observa una tendencia general positiva, indicando que a medida que aumentan los casos de VIF, también tienden a aumentar los casos de FEM, lo que se refuerza con la banda de confianza sombreada que sigue esta inclinación ascendente. Sin embargo, existen meses que se desvían de la tendencia. El mes de julio es el más notable, ya que a pesar de tener un número alto de VIF (\(5,231\)), presenta el pico más alto de FEM (\(25\) casos), mostrando la mayor desviación hacia arriba de la línea de tendencia. Otros meses con altos casos de VIF, como septiembre (\(5,352\)) y agosto (\(5,243\)), registran un número significativamente menor de FEM (\(14\) y \(13\) respectivamente), cayendo por debajo de la tendencia esperada. En el extremo opuesto, diciembre presenta el menor registro de VIF (\(3,479\)) y de FEM (\(10\) casos), ajustándose bien al inicio de la curva de tendencia. Esta relación sugiere que, si bien la VIF es un factor asociado a los FEM, la ocurrencia de femicidios está sujeta a una alta variabilidad mensual y a factores adicionales que impulsan la violencia letal en ciertos periodos del año.
library(dplyr)
library(tidyr)
library(lubridate)
# ===========================================================
# CREAR df_long DE FORMA CORRECTA (SIN PERDER FEM)
# ===========================================================
df_long <- df_cor %>%
# Crear abreviatura del día (sin usar wday para evitar errores en knit)
mutate(
dia_label = weekdays(periodo), # "lunes", "martes", ...
dia_label = substr(dia_label, 1, 3) # "lun", "mar", "mié"
) %>%
# Seleccionar solo variables que realmente existen
select(periodo, dia_label, FEM, VIF) %>%
# Pasar a formato long exactamente con FEM y VIF
pivot_longer(
cols = c(FEM, VIF),
names_to = "variable",
values_to = "casos"
)
df_long %>%
group_by(variable) %>%
summarise(
min = min(casos, na.rm = TRUE),
max = max(casos, na.rm = TRUE),
promedio = mean(casos, na.rm = TRUE)
)library(dplyr)
library(lubridate)
library(plotly)
# ====================================================
# 1) Preparar datos para 2024
# ====================================================
df_plot <- df_cor %>%
filter(year(periodo) == 2024) %>%
mutate(
mes = factor(
format(periodo, "%b"),
levels = format(seq(as.Date("2024-01-01"),
as.Date("2024-12-01"), by = "month"), "%b")
),
etiqueta = paste0(
"<b>Mes:</b> ", mes, "<br>",
"<b>VIF:</b> ", VIF, "<br>",
"<b>FEM:</b> ", FEM
)
)
# ====================================================
# 2) MODELO DE REGRESIÓN + BANDA DE CONFIANZA
# ====================================================
modelo <- lm(FEM ~ VIF, data = df_plot)
df_reg <- data.frame(
VIF = seq(min(df_plot$VIF), max(df_plot$VIF), length.out = 200)
)
pred <- predict(modelo, newdata = df_reg, interval = "confidence")
df_reg$pred <- pred[, "fit"]
df_reg$lower <- pred[, "lwr"]
df_reg$upper <- pred[, "upr"]
# ====================================================
# 3) PALETA OFICIAL (sin leyenda de meses)
# ====================================================
colores_angelys <- c("#81638b", "#b695c0", "#dac9df", "#f7bfd8")
colores_meses <- rep(colores_angelys, length.out = nrow(df_plot))
# ====================================================
# 4) GRÁFICO INTERACTIVO FINAL (ESTILO EXCLUSIVO)
# ====================================================
plot_ly() %>%
# --- Banda de confianza ---
add_ribbons(
data = df_reg,
x = ~VIF,
ymin = ~lower,
ymax = ~upper,
line = list(color = "transparent"),
fillcolor = "rgba(129, 99, 139, 0.25)",
name = "Banda de confianza"
) %>%
# --- Línea de regresión ---
add_lines(
data = df_reg,
x = ~VIF,
y = ~pred,
line = list(color = colores_angelys[1], width = 3),
name = "Línea de tendencia"
) %>%
# --- Puntos individuales por mes ---
add_trace(
data = df_plot,
x = ~VIF,
y = ~FEM,
type = "scatter",
mode = "markers",
marker = list(
size = 11,
color = colores_meses,
line = list(width = 1.5, color = "#333")
),
text = ~etiqueta,
hoverinfo = "text",
name = "Meses",
showlegend = FALSE # ← SIN BARRA DE MESES
) %>%
# --- Layout general ---
layout(
title = list(
text = "Relación FEM (pareja/ex-pareja/familiares) vs VIF (mujeres) — Año 2024"
),
xaxis = list(title = "Casos de Violencia Intrafamiliar (mujeres) por mes"),
yaxis = list(title = "Casos de Feminicidios por mes"),
plot_bgcolor = "rgba(253, 249, 252, 1)",
paper_bgcolor = "rgba(253, 249, 252, 1)",
legend = list(
orientation = "h",
x = 0.5,
y = -0.15,
xanchor = "center"
)
)Este gráfico de dispersión examina la correlación mensual entre los Casos de Violencia Intrafamiliar (VIF) en mujeres (eje X) y un subconjunto específico de Femicidios (FEM), aquellos cometidos por la pareja, expareja o familiares (eje Y). Se observa una línea de tendencia positiva, lo que indica que, en general, a mayor número de casos de VIF reportados mensualmente, tiende a haber un ligero aumento en los femicidios cometidos dentro del ámbito familiar o de pareja. La mayoría de los puntos se agrupan en torno a la línea de tendencia, dentro de la banda de confianza, con casos de FEM que oscilan entre \(10\) y \(15\). Sin embargo, el mes de julio se presenta como un valor atípico, con \(21\) FEM (el pico máximo) a pesar de un nivel de \(3,627\) VIF que no es el más alto del año. Otros meses con una alta concentración de VIF, como agosto (\(3,681\) VIF), registraron solo \(8\) FEM, el mínimo del año. Esta variabilidad extrema, especialmente el pico de julio, subraya que la relación, aunque positiva, no es estrictamente lineal y sugiere que factores no capturados por el VIF agregado influyen drásticamente en la letalidad de la violencia de pareja/familiar.
library(dplyr)
library(tidyr)
library(plotly)
# ========= Pre-procesamiento (df_long ya viene listo de tu código) ========= #
df_plot <- df_long %>%
mutate(
tooltip = paste0(
"<b>Día:</b> ", dia_label, "<br>",
"<b>Variable:</b> ", variable, "<br>",
"<b>Casos:</b> ", casos
)
)
# ========= Separar FEM y VIF ========= #
df_FEM <- df_plot %>% filter(variable == "Feminicidios")
df_VIF <- df_plot %>% filter(variable == "VIF")
# ========= Heatmap FEM ========= #
p1 <- plot_ly(
data = df_FEM,
x = ~dia_label,
y = ~variable,
z = ~casos,
type = "heatmap",
colors = c(colores[3], colores[1]),
text = ~tooltip,
hoverinfo = "text",
showscale = TRUE,
colorbar = list(title = "FEM")
)
# ========= Heatmap VIF ========= #
p2 <- plot_ly(
data = df_VIF,
x = ~dia_label,
y = ~variable,
z = ~casos,
type = "heatmap",
colors = c(colores[3], colores[2]),
text = ~tooltip,
hoverinfo = "text",
showscale = TRUE,
colorbar = list(title = "VIF")
)
# ========= Combinar ambos ========= #
p_final <- subplot(
p1, p2,
nrows = 2,
shareX = TRUE,
titleY = TRUE
) %>%
layout(
title = "Distribución semanal: Feminicidios (tipos seleccionados) vs VIF (mujeres) — 2024",
xaxis = list(title = "Día de la semana"),
showlegend = FALSE,
margin = list(l = 60, r = 60, b = 60, t = 80)
)
p_finalEste gráfico de intensidad proporciona una vista detallada de cómo se distribuyen semanalmente los casos de Femicidios y Violencia Intrafamiliar (VIF) contra mujeres durante 2024. El patrón es muy claro en ambos tipos de violencia, mostrando un aumento significativo hacia el final de la semana. Los Femicidios (fila inferior) alcanzan su pico máximo el Domingo con \(30\) casos, lo que representa el número más alto de toda la semana. El día siguiente más alto es el Lunes (\(24\) casos), mientras que los días con menor incidencia son el Martes y el Viernes, ambos con \(15\) casos. En cuanto a la Violencia Intrafamiliar (VIF) (fila superior), también registra su mayor número de casos el Domingo (\(7,248\) casos). El siguiente pico de VIF se observa el Lunes (\(6,623\) casos), y el día con menor número de casos es el Viernes (\(5,010\) casos). La marcada coincidencia en el día pico (Domingo) para ambos tipos de violencia subraya que las dinámicas de fin de semana, potencialmente relacionadas con una mayor permanencia en el hogar o consumo de alcohol, representan el período de mayor riesgo y ocurrencia de violencia de género grave.