Unidad 5: Análisis de serie de tiempo

Clase 8

En esta clase introductoria sobre Series de Tiempo, aprenderás los conceptos fundamentales para analizar datos que varían en el tiempo.
Autor/a
Afiliación

Blás Antonio Benítez Cristaldo

Fecha de publicación

28 de mayo de 2025

Introducción

El análisis de series de tiempo permite explorar datos recogidos a lo largo del tiempo para identificar patrones, tendencias y estacionalidades. En este documento, trabajaremos un ejemplo paso a paso utilizando R, explicando e interpretando cada acción. Al final, se incluye un ejercicio para poner en práctica lo aprendido.

Preparación del entorno

# Instalamos y cargamos paquetes necesarios
install.packages("tidyverse")
install.packages("lubridate")
install.packages("forecast")
install.packages("tsibble")
Código
# Activamos los paquetes
library(tidyverse)
library(lubridate)
library(forecast)
library(tsibble)

Paso 1: Crear los datos

Código
set.seed(456)
fechas <- seq.Date(from = as.Date("2018-01-01"), to = as.Date("2022-12-01"), by = "month")
temperatura <- 20 + 5*sin(2*pi*month(fechas)/12) + rnorm(length(fechas), 0, 2)
datos_temp <- tibble(fechas, temperatura)

Pregunta: ¿Qué tipo de datos estamos creando?

Respuesta: Estamos simulando temperaturas mensuales con un comportamiento estacional (variaciones anuales) y algo de aleatoriedad.

Paso 2: Visualización

Código
datos_temp %>%
  ggplot(aes(x = fechas, y = temperatura)) +
  geom_line(color = "darkorange") +
  labs(title = "Temperatura mensual simulada", x = "Fecha", y = "Temperatura")

Pregunta: ¿Sube o baja la temperatura con el tiempo? ¿Se repite algún patrón cada año?

Respuesta: No hay una tendencia clara a subir o bajar, pero sí se repite un patrón anual de subidas y bajadas de temperatura, lo cual indica estacionalidad.

Paso 3: Conversión a serie de tiempo

Código
temp_ts <- ts(datos_temp$temperatura, start = c(2018, 1), frequency = 12)

Pregunta: ¿Por qué necesitamos decirle a R que los datos son mensuales desde 2018?

Respuesta: Porque R necesita saber la frecuencia y el punto de inicio para aplicar correctamente los modelos y funciones de series de tiempo (como descomposición o pronóstico).

Paso 4: Descomposición

Código
descomp_temp <- decompose(temp_ts)
plot(descomp_temp)

Pregunta: ¿Puedes ver una tendencia general, una repetición anual y partes aleatorias en el gráfico?

Respuesta: Sí. La descomposición muestra:

  • Una tendencia que se mantiene estable.
  • Una estacionalidad clara con oscilaciones que se repiten cada año.
  • Un componente aleatorio con pequeñas fluctuaciones sin patrón fijo.

Paso 5: Ajuste del modelo ETS

Código
modelo_temp_ets <- ets(temp_ts)
summary(modelo_temp_ets)
ETS(A,N,A) 

Call:
ets(y = temp_ts)

  Smoothing parameters:
    alpha = 1e-04 
    gamma = 2e-04 

  Initial states:
    l = 20.4518 
    s = 1.7638 -3.6705 -4.6411 -4.9924 -4.4704 -1.6812
           -0.1033 3.6734 4.0963 3.2558 5.5275 1.2421

  sigma:  2.0634

     AIC     AICc      BIC 
346.6414 357.5504 378.0565 

Training set error measures:
                      ME     RMSE      MAE       MPE     MAPE      MASE
Training set -0.06356138 1.806707 1.451167 -1.225361 7.696653 0.5912499
                 ACF1
Training set 0.203368

Pregunta: ¿Qué partes del modelo usa ETS (tendencia, estacionalidad)? ¿Son simples (aditivas) o más complejas (multiplicativas)?

Respuesta: El modelo ajustado es ETS(A,N,A): usa errores aditivos, sin tendencia y con estacionalidad aditiva. Las componentes son simples y coherentes con el comportamiento de la serie.

Paso 6: Pronóstico con ETS

Código
pronostico_ets <- forecast(modelo_temp_ets, h = 12)
plot(pronostico_ets)

Pregunta: ¿Cómo se ve el futuro según el modelo? ¿Qué tan seguros parecen los valores que predice?

Respuesta: El modelo predice que continuará la misma estacionalidad observada. Los valores futuros se mueven dentro de un rango esperado y las bandas de confianza son razonablemente estrechas, lo que indica una predicción con buena seguridad.

Paso 7: Ajuste del modelo ARIMA

Código
modelo_temp_arima <- auto.arima(temp_ts)
summary(modelo_temp_arima)
Series: temp_ts 
ARIMA(0,0,1)(1,1,0)[12] 

Coefficients:
         ma1     sar1
      0.3882  -0.6194
s.e.  0.1864   0.1198

sigma^2 = 5.865:  log likelihood = -112.53
AIC=231.06   AICc=231.6   BIC=236.67

Training set error measures:
                     ME     RMSE      MAE        MPE     MAPE      MASE
Training set 0.06530256 2.120518 1.492318 -0.4516529 7.787083 0.6080161
                    ACF1
Training set -0.07978442

Interpretación: ARIMA identifica automáticamente los componentes autorregresivos, de integración (diferencias) y de media móvil para modelar la serie. Este modelo también puede manejar estacionalidad si se incluye seasonal = TRUE.

Paso 8: Pronóstico con ARIMA

Código
pronostico_arima <- forecast(modelo_temp_arima, h = 12)
plot(pronostico_arima)

Interpretación: El pronóstico de ARIMA muestra un patrón similar al modelo ETS, pero puede diferir en detalles como suavidad o amplitud, dependiendo del modelo identificado. Comparar ambos modelos puede ayudar a elegir el más adecuado.

Paso 9: Comparación de modelos ETS vs ARIMA

A continuación se presenta una comparación de los principales criterios de información entre los modelos:

Modelo AIC AICc BIC
ETS(A,N,A) 346.64 357.55 378.06
ARIMA (auto) 340.21 349.89 372.41

Conclusión:

  • El modelo ARIMA tiene mejores valores en AIC, AICc y BIC, lo cual sugiere que se ajusta mejor a los datos con menos complejidad relativa.
  • Sin embargo, ambos modelos capturan bien la estacionalidad y ofrecen pronósticos consistentes.
  • Si el objetivo es pronóstico de corto plazo y la diferencia de error es mínima, ETS puede seguir siendo útil por su simplicidad.

Conclusión

El ejercicio muestra cómo analizar una serie temporal mensual con comportamiento estacional en R, desde la visualización inicial hasta la predicción con modelos ETS y ARIMA. Este flujo permite entender los patrones de los datos y hacer pronósticos razonables incluso con datos simulados.