Saltar al contenido

# series-de-tiempo-con-python

Series de Tiempo con Python

Volver a la portada del curso
Lectura (Markdown)

Modelos de Suavizamiento Exponencial

Sección 3 · Análisis Estadístico de Series de Tiempo

Modelos de suavizamiento exponencial

Para pronosticar los pedidos de PyShop hay dos ideas extremas. Una es repetir el último valor: diciembre de 2024 tuvo 8,911 pedidos, así que cada mes de 2025 tendría 8,911. La otra es usar el promedio de toda la historia: 5,814 por mes. La primera olvida todo el pasado y la segunda le da el mismo peso a enero de 2022 que a diciembre de 2024. El suavizamiento exponencial queda en medio: promedia toda la historia, pero con pesos que decrecen de forma exponencial hacia atrás. Es una familia de tres modelos que se van sumando piezas.

Suavizamiento exponencial simple (SES)

SES mantiene un nivel $\ell_t$ que se actualiza con cada observación nueva:

$$\ell_t = \alpha\, y_t + (1 - \alpha)\, \ell_{t-1}$$

El pronóstico para cualquier mes futuro es el último nivel: una línea plana. El parámetro $\alpha$, entre 0 y 1, decide cuánto pesa el dato más reciente. Con $\alpha$ cerca de 0 el nivel cambia despacio y recuerda mucho pasado; cerca de 1 sigue al último valor. Entrenando con 2022-2024, el primer pronóstico de enero de 2025 cambia mucho según $\alpha$:

$\alpha$Pronóstico de enero 2025
0.16,475
0.58,290
0.98,895

Si se deja que statsmodels estime $\alpha$, elige 1.0: el modelo se convierte en «repetir el último valor» y da el mismo error que ese ingenuo. SES está pensado para series sin tendencia ni estacionalidad, y la de PyShop tiene ambas.

Holt: nivel más tendencia

Holt agrega una pendiente $b_t$, suavizada con un segundo parámetro $\beta$. El pronóstico deja de ser plano: es el nivel más $h$ veces la pendiente, $\hat{y}_{t+h} = \ell_t + h\, b_t$. En PyShop esto empeora las cosas: el último dato de entrenamiento es diciembre, el mes más alto, y Holt proyecta una recta que sigue subiendo desde ahí: 9,018 pedidos en enero de 2025 y 10,192 en diciembre, cuando el enero real fue 5,831.

Holt-Winters: nivel, tendencia y estacionalidad

Holt-Winters agrega un componente estacional $s_t$ con periodo $m = 12$ y un tercer parámetro $\gamma$. Hay dos versiones, igual que en la descomposición: la aditiva suma a cada mes una cantidad fija y la multiplicativa lo multiplica por un factor. La multiplicativa conviene cuando la estacionalidad crece con el nivel, que es el caso de PyShop: noviembre vende alrededor de 40 % más que un mes promedio en todos los años.

from statsmodels.tsa.holtwinters import ExponentialSmoothing

m = generar_pedidos().asfreq("D").interpolate().resample("MS").sum()
tr, te = m[:"2024-12"], m["2025-01":]

hw = ExponentialSmoothing(tr, trend="add", seasonal="mul",
                          seasonal_periods=12).fit()
pred = hw.forecast(12)
mape = ((te - pred).abs() / te).mean() * 100
for k in ["smoothing_level", "smoothing_trend", "smoothing_seasonal"]:
    print(k, round(float(hw.params[k]), 3))
print(pred.round().astype(int).tail(2).tolist(), round(mape, 1))
# smoothing_level 0.469 / smoothing_trend 0.218 / smoothing_seasonal 0.0
# [10338, 10018] 3.4

fit() estima $\alpha = 0.469$, $\beta = 0.218$ y $\gamma = 0.0$. Que $\gamma$ sea 0 significa que los factores estacionales no cambian durante el entrenamiento: el patrón del año es estable. El modelo pronostica 10,338 pedidos para noviembre de 2025 y 10,018 para diciembre; los reales fueron 10,866 y 10,424.

¿Cuánto mejora? La tabla contra los ingenuos

Todos los modelos se entrenan con 2022-2024 y se evalúan en los 12 meses de 2025. El MAPE es el error absoluto promedio en porcentaje del valor real:

ModeloMAE (pedidos)MAPE
Naive (último valor)1,95428.0 %
Media histórica1,75520.6 %
Naive estacional (mismo mes del año anterior)1,17415.5 %
SES ($\alpha$ estimado = 1.0)1,95428.0 %
Holt2,23932.9 %
Holt-Winters aditivo3665.2 %
Holt-Winters multiplicativo2673.4 %

El naive estacional es el piso a vencer: con 15.5 % ya captura la estacionalidad sin ningún parámetro. SES y Holt ni siquiera lo alcanzan, porque ignoran que noviembre y diciembre son distintos. Holt-Winters baja el error a la tercera parte, y la versión multiplicativa gana a la aditiva porque el pico de noviembre crece con el negocio.

Trampas comunes

  • Usar SES o Holt con datos estacionales. El error queda por encima del naive estacional.
  • Olvidar seasonal_periods. Para datos mensuales con ciclo anual es 12; para diarios con ciclo semanal, 7.
  • Evaluar con los mismos datos del ajuste. El error se mide en 2025, que el modelo no vio.
  • No comparar contra un ingenuo. Un MAPE de 10 % suena bien, pero no lo es si el naive estacional da 9 %.

El notebook suavizamiento-exponencial ajusta los cinco modelos y grafica sus pronósticos sobre 2025. Cuando un modelo no supere al naive estacional, descártalo antes de ajustar sus parámetros.

Recursos