Saltar al contenido

# metodos-de-econometria-aplicada-con-python

Métodos de Econometría Aplicada con Python

Volver a la portada del curso
Lectura (Markdown)

Estacionalidad y Tendencia

Sección 4 · Modelos de Series Temporales

Estacionalidad y tendencia

Las ventas mensuales de Café Altura (datos simulados, miles de tazas de toda la cadena) pasan de 3338.7 mil tazas en 2014 a 7199.1 mil en 2023, y cada diciembre suben mientras cada mayo bajan. Un pronóstico que no separe esos dos movimientos confunde un diciembre normal con un cambio de rumbo. En esta lección distingues los tipos de tendencia y de estacionalidad, eliges cómo modelarlos y evitas las trampas más frecuentes. El notebook series-ventas-mensuales contiene todo el código.

1. Tendencia determinista o estocástica

Una tendencia determinista es una función fija del tiempo: la serie oscila alrededor de una recta (o curva) y siempre regresa a ella. Una tendencia estocástica es una raíz unitaria: cada choque se acumula y la serie no tiene un nivel al cual volver, como una caminata aleatoria con deriva.

La diferencia no es académica. Con tendencia determinista, el remedio es incluir el tiempo como regresor; con raíz unitaria, el remedio es diferenciar. Aplicar el remedio equivocado deja residuos con estructura o, en el otro sentido, introduce correlación artificial. Las dos pueden producir gráficas casi idénticas en diez años de datos, por eso se usa la prueba ADF (Dickey-Fuller aumentada), cuya hipótesis nula es que la serie tiene raíz unitaria. En las ventas de Café Altura el valor p es 0.998 en nivel y 0.964 en logaritmo: no se puede rechazar la raíz unitaria.

2. Estacionalidad aditiva o multiplicativa

En una serie aditiva, diciembre suma siempre la misma cantidad de tazas: $y_t = T_t + S_t + e_t$. En una multiplicativa, diciembre suma el mismo porcentaje: $y_t = T_t \times S_t \times e_t$. Cuando la serie crece, la oscilación estacional crece con ella, y eso es lo que pasa aquí: la distancia entre diciembre y mayo en 2023 es mucho mayor en tazas que en 2014.

El logaritmo convierte un modelo multiplicativo en aditivo:

$$\log y_t = \log T_t + \log S_t + \log e_t$$

Por eso el curso modela np.log(generar_mensual()). Los factores multiplicativos de seasonal_decompose lo cuantifican: diciembre 1.125 (12.5 % arriba de la tendencia), octubre 1.050, abril 0.926 y mayo 0.916 (8.4 % abajo).

3. seasonal_decompose contra STL

import numpy as np
from statsmodels.tsa.seasonal import STL, seasonal_decompose

s = generar_mensual()
clasica = seasonal_decompose(s, model="multiplicative", period=12)
print(clasica.seasonal.iloc[:12].round(3))

stl = STL(np.log(s), period=12, robust=True).fit()
var_r = stl.resid.var()
f_est = max(0, 1 - var_r / (stl.seasonal + stl.resid).var())
f_ten = max(0, 1 - var_r / (stl.trend + stl.resid).var())
print(round(f_est, 3), round(f_ten, 3))

La descomposición clásica usa una media móvil centrada para la tendencia y un patrón estacional idéntico todos los años; pierde seis meses en cada extremo. STL (descomposición estacional basada en LOESS) permite que la estacionalidad cambie lentamente y, con robust=True, resiste valores atípicos. Las fuerzas de cada componente, entre 0 y 1, resumen la descomposición: estacionalidad 0.752 y tendencia 0.985. La tendencia domina, pero la estacionalidad está lejos de ser despreciable.

4. Ajuste estacional: leer el mes sin el calendario

Dividir la serie entre su factor estacional da la serie desestacionalizada. Diciembre de 2023 vendió 719.5 mil tazas, más que noviembre (698.2). Desestacionalizadas, quedan en 639.8 y 671.0: diciembre fue en realidad un mes flojo. De mayo a diciembre de 2023 las ventas crudas suben 26.9 %; desestacionalizadas, solo 3.3 %. Así se evitan las celebraciones de diciembre y los sustos de mayo.

5. Diferencias estacionales

La diferencia estacional $\Delta_{12} \log y_t = \log y_t - \log y_{t-12}$ compara cada mes con el mismo mes del año anterior: elimina la estacionalidad y la mayor parte de la tendencia de un solo golpe. Su media es 0.085, el crecimiento anual típico en logaritmos (por eso el SARIMA del curso lleva constante). Los valores p de la ADF:

  • diferencia regular del log: 0.000
  • diferencia estacional del log: 0.019
  • ambas diferencias: 0.000

Con la diferencia estacional ya se rechaza la raíz unitaria al 5 %. Por eso el modelo elegido es SARIMA(1,0,0)(1,1,0,12): una sola diferencia, la estacional.

6. Alternativa: dummies de mes y tendencia

Si la tendencia fuera determinista, una regresión con el tiempo y una dummy por mes bastaría:

import pandas as pd
import statsmodels.formula.api as smf

d = pd.DataFrame({"y": np.log(s).values, "t": range(len(s)),
                  "mes": s.index.month})
m = smf.ols("y ~ t + C(mes)", data=d).fit()
print(m.params[["t", "C(mes)[T.12]", "C(mes)[T.5]"]].round(4))

La tendencia es 0.0073 por mes (9.1 % anual), diciembre está 0.105 arriba de enero en log y mayo 0.098 abajo; el $R^2$ es 0.985. Es fácil de explicar, pero sus residuos heredan la persistencia de la serie y sus intervalos de pronóstico son demasiado estrechos si la tendencia en realidad es estocástica. Sirve como referencia rápida, no como modelo de pronóstico final.

Trampas comunes

  • Diferenciar de más. Aplicar regular y estacional cuando basta una agrega una estructura MA artificial y empeora el pronóstico. Si la ADF ya rechaza con una diferencia, detente.
  • Confundir tendencia con raíz unitaria. Una serie con tendencia determinista no se rechaza en la ADF sin término de tendencia; revisa la especificación de la prueba.
  • Modelar en niveles una estacionalidad multiplicativa. Si la amplitud crece con el nivel, usa logaritmos.
  • Comparar meses crudos. Diciembre contra noviembre sin ajuste estacional es comparar el calendario, no el negocio.

Antes de elegir un modelo, grafica la serie, mide la fuerza de cada componente y decide con la ADF cuántas diferencias necesitas. Ese diagnóstico es lo que separa un pronóstico útil de una recta extendida.

Recursos