1. Introducción

Los datos utilizados en esta serie temporal provienen del portal de Datos Abiertos de Colombia y corresponden a registros del Instituto Nacional de Medicina Legal y Ciencias Forenses (Bogotá, D.C.). La información recoge el número de casos reportados de violencia intrafamiliar en el país; sin embargo, para este estudio se seleccionaron únicamente los casos correspondientes a la ciudad de Bogotá. El análisis de esta serie resulta relevante debido al impacto social y de salud pública que tiene la violencia intrafamiliar, así como la necesidad de comprender su comportamiento en el tiempo.

Analizar la evolución temporal de la violencia intrafamiliar permite identificar tendencias, patrones estacionales y posibles cambios en la dinámica del fenómeno. Esta información es crucial para orientar estrategias de intervención, diseñar políticas públicas y fortalecer acciones de prevención social.

Las preguntas que guían este análisis son:

  1. ¿En qué meses se registra la mayor concentración de casos?

  2. ¿La violencia intrafamiliar en Bogotá aumenta, disminuye o se mantiene estable a lo largo del tiempo?

Responder estas preguntas permite evaluar la necesidad de campañas preventivas, comprender mejor la magnitud del problema en la ciudad y contribuir a la protección de la salud física, mental y social de las personas.

La frecuencia de los datos analizados es mensual, y el periodo temporal abarca nueve años, desde 2015 hasta 2024.


2. Preparación y visualización de los datos

data1 <- read_excel("C:/Users/USUARIO/Downloads/Violencia_intrafamiliar.xlsx")
glimpse(data1)
## Rows: 236,840
## Columns: 37
## $ id                                            <dbl> 1, 2, 3, 4, 5, 6, 7, 8, …
## $ ano_del_hecho                                 <dbl> 2015, 2015, 2015, 2015, …
## $ fecha                                         <dttm> 2015-12-02, 2015-03-03,…
## $ sexo_de_la_victima                            <chr> "Hombre", "Hombre", "Hom…
## $ grupo_de_edad_quinquenal                      <chr> "(10 a 14)", "(00 a 04)"…
## $ grupo_5r_menor_de_edad                        <chr> "a) Menor de Edad (&lt;1…
## $ grupo_de_edad_judicial                        <chr> "(10 a 13)", "(00 a 04)"…
## $ ciclo_vital                                   <chr> "(12 a 17) Adolescencia"…
## $ paisnacimiento                                <chr> "Colombia", "Colombia", …
## $ escolaridad                                   <chr> "Básica primaria", "No a…
## $ estado_civil                                  <chr> "Soltero (a)", "No aplic…
## $ tipo_de_discapacidad                          <chr> "Ninguna", "Ninguna", "N…
## $ pertenencia_etnica                            <chr> "Sin información", "Sin …
## $ orientacion_sexual                            <chr> "No Sabe / No Informa", …
## $ identidad_de_genero                           <chr> "No Sabe / No Informa", …
## $ transgenero                                   <chr> "No Sabe / No Informa", …
## $ pertenencia_grupal                            <chr> "Sin información", "Sin …
## $ mes_del_hecho                                 <dbl> 12, 3, 6, 1, 5, 3, 4, 10…
## $ dia_del_hecho                                 <dbl> 2, 3, 4, 6, 2, 5, 2, 4, …
## $ rango_de_hora_del_hecho_x_3_horas             <chr> "(18:00 a 20:59)", "(18:…
## $ codigo_dane_municipio                         <dbl> 11001, 25754, 25754, 540…
## $ municipio_del_hecho_dane                      <chr> "BogotAI, D.C.", "Soacha…
## $ departamento_del_hecho_dane                   <chr> "BogotAI, D.C.", "Cundin…
## $ cod_dane_depa                                 <dbl> 11, 25, 25, 54, 11, 50, …
## $ localidad_del_hecho                           <chr> "Rafael Uribe Uribe", "S…
## $ zona_del_hecho                                <chr> "Cabecera municipal", "C…
## $ escenario_del_hecho                           <chr> "Calle (Autopista", "Viv…
## $ actividad_durante_el_hecho                    <chr> "Actividades de desplaza…
## $ circunstancia_del_hecho_detallada             <chr> "Violencia contra niños,…
## $ contexto_del_hecho                            <chr> "3 Lesiones no Fatales c…
## $ mecanismo_causal_de_la_lesion_no_fatal        <chr> "Abrasivo", "Contundente…
## $ diagnostico_topografico_de_la_lesion_no_fatal <chr> "Trauma de miembros", "T…
## $ sexo_del_agresor                              <chr> "Hombre", "Mujer", "Muje…
## $ presunto_agresor_detallado                    <chr> "Padre", "Madre", "Otros…
## $ factor_desencadenante_de_la_agresion          <chr> "Intolerancia, machismo"…
## $ dias_de_incapacidad_medicolegal               <chr> "1 a 30", "1 a 30", "Sin…
## $ pueblo_indigena                               <chr> "No había sido implement…

Para trabajar con los datos, se realizó una transformación en la columna de fecha: el mes, que estaba en formato de texto (string), fue convertido a valor numérico. Posteriormente, se integraron el año, el mes y el día en una sola estructura.

data1 <- data1 |>
  select(
     
      fecha,
      codigo_dane_municipio,
      municipio_del_hecho_dane,
      localidad_del_hecho,
     )|>
  rename(
    
    codDaneMuni = codigo_dane_municipio,
    localidad = localidad_del_hecho,
    municipio = municipio_del_hecho_dane
  )


data2 <- data1 |>
  mutate(
    fecha = as.Date(fecha)
  ) |>
  filter(codDaneMuni == "11001")


bogotatotal <- data2 |>
  mutate(mes = yearmonth(fecha))


bogotatotal <- bogotatotal |>
  group_by(mes) |>
  summarise(casostotales = n(), .groups = "drop")


bogotatotal <- bogotatotal |>
  as_tsibble(index = mes)

glimpse(bogotatotal)
## Rows: 120
## Columns: 2
## $ mes          <mth> 2015 ene., 2015 feb., 2015 mar., 2015 abr., 2015 may., 20…
## $ casostotales <int> 466, 575, 582, 532, 584, 515, 570, 603, 576, 571, 522, 47…
bogotatotal |> interval()
## <interval[1]>
## [1] 1M
class(bogotatotal)
## [1] "tbl_ts"     "tbl_df"     "tbl"        "data.frame"
autoplot(bogotatotal, casostotales) +
  labs(
    title = "Serie temporal de casos de violencia intrafamiliar en Bogotá",
    x = "Año",
    y = "Número de casos"
  )

La serie temporal muestra múltiples cambios en su dinámica, un periodo inicial con tendencia creciente (2015–2019), seguido de un quiebre en 2020 que reduce drásticamente el nivel de los casos posteriormente (2020 -2024) la serie muestra fluctuaciones sin recuperar la tendencia previa

bogotatotal |>
  gg_season(casostotales) +
  ggtitle("Violencia intrafamiliar en Bogotá")+
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold")
  )

Aquí podemos observar un ciclo marcado por fases de crecimiento y disminución que se repiten a lo largo del tiempo, aunque no con una duración exacta ni constante.En varios periodos se identifican etapas de valores bajos, seguidas por una fase de incremento sostenido que culmina en un punto máximo. Posteriormente, la serie muestra una fase de descenso, que se prolonga hasta alcanzar un nuevo mínimo, antes de iniciar nuevamente un proceso de recuperación.

-Estacionalidad

gg_subseries(bogotatotal, casostotales) +
  labs(
    title = "Subseries estacionales",
    y = "Número de casos",
    x = "Mes"
  )

En cuanto a la estacionalidad, se observa que los meses de mayo, agosto y septiembre tienden a concentrar los niveles más altos de violencia intrafamiliar, mientras que enero y noviembre registran consistentemente los valores más bajos. Este patrón se repite año tras año, lo que evidencia un comportamiento estacional bien definido. Además, destaca el año 2019, que presenta los niveles más elevados dentro de toda la serie, alcanzando los picos máximos de incidencia.

3. Análisis exploratorio de la serie temporal

Al analizar la serie temporal de casos de violencia intrafamiliar en Bogotá, se identificó una tendencia ascendente a lo largo del periodo analizado. Se observa estacionalidad, con picos recurrentes en determinados meses del año. Además, la serie presenta fluctuaciones cíclicas de varios meses, donde la serie sube y baja gradualmente sin un patrón fijo. Además, se observan variaciones irregulares mes a mes que puede representar ruido.

bogotatotal |> ACF(casostotales, lag_max = 12) |> autoplot()+
  ggtitle("Violencia intrafamiliar en Bogotá con 12 lag")+
  theme( plot.title = element_text(hjust = 0.5, size = 15))  # hjust  Centra el titulo

Al graficar nuestra serie utilizando los gráficos de autocorrelación (ACF) con 12 rezagos, se observa que la serie no corresponde a ruido blanco, ya que la mayoría de las barras se encuentran fuera de los límites de significancia. Esto evidencia que existe autocorrelación entre los datos, dado que incluso al analizar hasta 12 períodos (lags), muchas barras permanecen fuera de los límites establecidos.

Además, se aprecia una disminución gradual de la altura de las barras, lo que indica dependencia a corto plazo: si un mes presenta un valor alto, es probable que los meses inmediatamente siguientes también registren valores elevados. La serie también muestra una estacionalidad marcada, ya que presenta un patrón repetitivo de aumento, disminución y estabilización a lo largo del tiempo.

En conjunto, estos hallazgos sugieren que el nivel de violencia intrafamiliar en un mes está significativamente correlacionado con los niveles de violencia de los meses anteriores.

bogotatotal |> PACF(casostotales, lag_max = 12) |> autoplot()+
  ggtitle("Violencia intrafamiliar en Bogotá PACF")+
  theme( plot.title = element_text(hjust = 0.5, size = 15))  # hjust  Centra el titulo

El gráfico de la Función de Autocorrelación Parcial (PACF) de la serie de Violencia Intrafamiliar en Bogotá muestra un coeficiente de correlación muy alto y significativo en el rezago 1 (cercano a 0.75)), seguido de una caída drástica en los rezagos subsiguientes.La forma en que se comporta la serie hoy no es la misma en que se comportará mañana o cómo se comportó ayer

Como se observa en el diagrama de ACF, la serie presenta una disminución gradual, lo que indica que los valores de la violencia intrafamiliar hasta 12 rezagos (lags) tienen una fuerte influencia en el valor actual. Esto ocurre porque los cambios se van acumulando. Por esta razón, la serie no es estacionaria, ya que su promedio no se mantiene constante a lo largo del tiempo

4. Transformaciones y diferenciación

hist(
  bogotatotal$casostotales,
  main = "Histograma de Casos violencia intrafamiliar en Bogotá",  # Título del gráfico
  xlab = "Número de Casos",                      # Etiqueta del eje X
  ylab = "Frecuencia",                           # Etiqueta del eje Y
  col = "grey",                              # Color de las barras
  border = "black"                              # Color del borde de las barras
)

# Sintaxis: shapiro.test(vector_de_datos)
prueba_shapiro <- shapiro.test(bogotatotal$casostotales)

# Ver el resultado
print(prueba_shapiro)
## 
##  Shapiro-Wilk normality test
## 
## data:  bogotatotal$casostotales
## W = 0.97873, p-value = 0.05427
lambda <- BoxCox.lambda(bogotatotal$casostotales)
lambda
## [1] 0.976456
bogotatotaltransf <- bogotatotal  |>
  mutate(
    boxcox_casos = BoxCox(casostotales, lambda)
  )  


bogotatotaltransf <- bogotatotaltransf |>
  mutate(
    sqrt_casos = sqrt(casostotales),
    log_casos  = log(casostotales),
    inv_casos  = 1 / casostotales
  )

print(bogotatotaltransf)
## # A tsibble: 120 x 6 [1M]
##          mes casostotales boxcox_casos sqrt_casos log_casos inv_casos
##        <mth>        <int>        <dbl>      <dbl>     <dbl>     <dbl>
##  1 2015 ene.          466         412.       21.6      6.14   0.00215
##  2 2015 feb.          575         506.       24.0      6.35   0.00174
##  3 2015 mar.          582         512.       24.1      6.37   0.00172
##  4 2015 abr.          532         469.       23.1      6.28   0.00188
##  5 2015 may.          584         514.       24.2      6.37   0.00171
##  6 2015 jun.          515         454.       22.7      6.24   0.00194
##  7 2015 jul.          570         502.       23.9      6.35   0.00175
##  8 2015 ago.          603         530.       24.6      6.40   0.00166
##  9 2015 sep.          576         507.       24        6.36   0.00174
## 10 2015 oct.          571         503.       23.9      6.35   0.00175
## # ℹ 110 more rows
serie_ts <- ts(bogotatotal$casostotales, frequency = 12)
plot(serie_ts, main = "Serie original")

log_serie_ts <- log(serie_ts)

plot(log_serie_ts, main = "Serie Logarítmica (Varianza Estabilizada)")

# 2. Diferenciación simple (d=1) a la serie logarítmica

log_diff1 <- diff(log_serie_ts, differences = 1)

# Comprobación visual (debe oscilar alrededor de cero, sin tendencia):
plot(log_diff1, main = "Serie Logarítmica Diferenciada Simple")

En este gráfico se observa que, al aplicar la transformación logarítmica seguida de la diferenciación simple (d = 1) la serie comienza a oscilar alrededor de cero. La línea horizontal indica que ya no existe una tendencia creciente o decreciente evidente. Esto refleja que la media de la serie se ha estabilizado, corrigiendo la no estacionariedad causada por la tendencia

# Crear columna de índice por fila
bogotatotal_long <- bogotatotaltransf %>%
  mutate(id = row_number()) %>%
  pivot_longer(
    cols = c(sqrt_casos, boxcox_casos, log_casos, inv_casos),
    names_to = "transformacion",
    values_to = "valor"
  )

# Graficar facetas en una sola figura
ggplot(bogotatotal_long, aes(x = id, y = valor)) +
  geom_line(color = "steelblue") +
  facet_wrap(~transformacion, scales = "free_y") +
  labs(
    x = "Tiempo",
    y = "Valor transformado",
    title = "Comparación de transformaciones de la serie de casos"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    strip.text = element_text(face = "bold"),
    plot.title = element_text(hjust = 0.5)
  )

El análisis visual de las distintas transformaciones indica que la transformación mediante logaritmo natural es la que proporciona un ajuste más adecuado de la varianza, al lograr que la amplitud de los datos se mantenga de manera más constante.

5. Descomposición de la serie temporal

# Descomposición de series temporales


# STL: descomposición temporal usando un suavizador
dcmp <- bogotatotal |>
  model(stl = STL(casostotales))

# Extraer componentes
comp <- components(dcmp)

# Graficar componentes descompuestos
comp |> autoplot()

El gráfico de Descomposición STL divide la serie original (casostotales) en tres componentes principales los cuales son:

-Tendencia

La línea de tendencia muestra un crecimiento desde 2015 hasta finales de 2018, seguido de una caída drástica (posiblemente asociada con el inicio de la pandemia en 2020) y luego una recuperación suave a partir de 2021

-Estacionalidad

Se muestra un patrón repetitivo de picos y valles a lo largo de cada año (cada 12 meses). La magnitud de estas fluctuaciones parece ser relativamente constante (oscila principalmente entre -40 y 40)

-Residuo. Los residuos son lo que queda después de remover la tendencia y la estacionalidad. Se ve como una serie que oscila aleatoriamente alrededor de cero

Esto confirma la No Estacionariedad de la serie original (casostotales), causada principalmente por la Tendencia identificada en la descomposición STL.

6. Suavizamiento y Promedios Móviles

ui <- fluidPage(
  
  titlePanel("Media móvil interactiva – bogotatotal"),
  
  fluidRow(
    column(4,
           sliderInput("k",
                       "Orden de la Media Móvil (impar)",
                       min = 3, max = 25, value = 5, step = 2)
    ),
    
    column(8,
           plotOutput("maPlot")
    )
  )
)

server <- function(input, output, session) {
  
  output$maPlot <- renderPlot({
    
    k <- as.integer(input$k)
    
    df <- bogotatotal |>
      mutate(
        MA = slide_dbl(
          casostotales,
          mean,
          .before = floor(k/2),
          .after  = floor(k/2),
          .complete = TRUE
        )
      )
    
    df |>
      autoplot(casostotales, colour = "blue") +
      geom_line(aes(y = MA), colour = "red", linewidth = 1.2) +
      labs(
        title = paste("Media móvil de orden", k),
        x = "Mes",
        y = "Casos Totales"
      )
  })
}

shinyApp(ui, server)
Shiny applications not supported in static R Markdown documents
weights_12 <- 1:12 

bogotatotal_wma12 <- bogotatotal |>
  mutate(
    # La longitud del vector de pesos (12) define la longitud de la ventana (k=12).
    # Usaremos .before = 11 para que la ventana sea de 12 (11 anteriores + el actual).
    WMA12 = slide_dbl(
      casostotales,
      ~ weighted.mean(.x, w = weights_12), 
      .before = 11, # Necesita 11 periodos anteriores para una ventana total de 12.
      .complete = TRUE
    )
  )
# Código R para graficar la WMA(12)
library(ggplot2)
library(tidyr)

bogotatotal_wma12 |>
  select(mes, casostotales, WMA12) |>
  pivot_longer(-mes, names_to = "Tipo", values_to = "Casos") |>
  filter(!is.na(Casos)) |> # Eliminar los valores NA iniciales de la MM
  ggplot(aes(x = mes, y = Casos, color = Tipo)) +
  geom_line(size = 1) +
  labs(
    title = "Serie Original vs. Media Móvil Ponderada (WMA) de Orden 12",
    x = "Tiempo",
    y = "Número de Casos"
  ) +
  scale_color_manual(values = c("casostotales" = "blue", "WMA12" = "red"))

No aplique los modelos de suavizamiento Holt-Winters, debido a que la serie de Violencia Intrafamiliar en Bogotá presenta una estructura compleja de tendencia no lineal y estacionalidad).

Los modelos de suavizamiento cumplen la función de visualizar la tendencia y eliminar el ruido y la estacionalidad . El Suavizamiento Exponencial Simple es inapropiado porque ignora la tendencia y la estacionalidad, y aunque el modelo de Holt-Winters sí modela explícitamente ambos componentes, solo ofrece pronósticos fiables a corto plazo

7. Evaluación y conclusiones

En resumen, la serie sobre violencia intrafamiliar en Bogotá muestra una tendencia cambiante a lo largo del tiempo, y su media varía de un año a otro. Además, presenta estacionalidad reflejada en un patrón de picos y valles que se repite periódicamente. También muestra una varianza no constante, lo que indica que la dispersión de los datos varía en distintos periodos

En conclusión, los meses de mayo, agosto y septiembre concentran los niveles más altos de violencia intrafamiliar en Bogotá. A lo largo del tiempo, la serie no se mantiene estable, sino que presenta un comportamiento variable y dinámico: se observa un aumento sostenido de casos entre 2015 y 2018, seguido de una caída abrupta alrededor de 2020, que marca un punto de quiebre. Posteriormente, los casos muestran una recuperación con una tendencia más estable, aunque acompañada de fluctuaciones periódicas que reflejan una marcada estacionalidad anual

La serie presenta un punto de quiebre estructural claro alrededor de 2020 (posiblemente debido a la pandemia), con una caída abrupta seguida de una tendencia variable. como recomendacion seria bueno incorporar Variables Exógenas las cuales permitan entender mejor y explicar la serie no solo por su historial sino por causas externas que impulsen la violencia intrafamiliar

8. Referencias

La serie de tiempo analizada corresponde a los “Casos Totales de Violencia Intrafamiliar en Bogotá” https://www.datos.gov.co/Justicia-y-Derecho/Violencia-intrafamiliar-Colombia-a-os-2015-a-2024-/ers2-kerr/about_data

Brockwell, P. J., & Davis, R. A. (2006). Introducción al Análisis de Series de Tiempo. Editorial Reverté.