Python & Data Science
Series Temporales En revisión

Referencia: Anatomía de las series de tiempo

Una referencia para las piezas estructurales que componen todo modelo de series de tiempo: tendencia, estacionalidad, residuo, autocorrelación y la maquinaria de estacionaridad que las une. Utiliza esto como una tabla de consulta cuando intentes decidir si diferenciar, modelar la tendencia de forma explícita o simplemente pasar la serie cruda a un árbol.

Lista

Señal / CantidadDefinición en una líneaRango / tipoQué te indicaDónde se usa en el corpus
Tendencia TtT_tDeriva suave y a largo plazo en el nivel de la serieR\mathbb{R}; a menudo modelada como un polinomio o una trayectoria lineal por tramosEn qué dirección se mueve la serie una vez que ignoras las fluctuacionesARIMA y SARIMA, Prophet vs. modelos estadísticos
Estacionalidad StS_tPatrón impulsado por el calendario que se repite en un período fijo (12 meses, 52 semanas, 24 horas, etc.)R\mathbb{R}; suma ~0 durante un período en el caso aditivoRegularidad de día de la semana o mes del año con la que puedes planificarPor qué tu pronóstico falla en Navidad
Residuo RtR_tLo que queda después de eliminar la tendencia y la estacionalidad: ruido irregular, eventos, cambios de régimenR\mathbb{R}; idealmente se comporta como ruido blancoSi aún te queda estructura sin modelar o valores atípicosCómo detectar y manejar el data drift
Autocorrelación ρk\rho_kCorrelación de la serie consigo misma rezagada en kk pasos[1,1][-1, 1]Cuánto dura la “memoria” de la serieIngeniería de características para series de tiempo
Autocorrelación parcial ϕkk\phi_{kk}Correlación directa en el rezago kk, después de eliminar el efecto de los rezagos intermedios[1,1][-1, 1]En qué rezago cortar al elegir un orden ARARIMA y SARIMA
Estacionariedad (débil)La media y la varianza no cambian con el tiempo; la autocovarianza depende solo del rezago, no del tiempoprueba de pasar/no pasarSi puedes ajustar modelos de estilo ARMA directamente en la serie originalPronóstico clásico vs. ML
Diferenciación yt\nabla y_tytyt1y_t - y_{t-1} (primera diferencia); a veces 2\nabla^2R\mathbb{R}El truco estándar para eliminar una raíz unitaria / tendencia linealValidación cruzada para series de tiempo
Estadístico ADFEstadístico de la prueba Aumentada de Dickey-Fuller para la hipótesis nula “existe una raíz unitaria”R\mathbb{R}, más negativo = rechazo más fuerteSi se rechaza por completo la no estacionariedadARIMA y SARIMA

El modelo mental de tres señales

Casi toda descomposición clásica de series de tiempo escribe la serie observada yty_t como

yt=Tt+St+Rt(additive)y_t = T_t + S_t + R_t \quad \text{(additive)} yt=TtStRt(multiplicative)y_t = T_t \cdot S_t \cdot R_t \quad \text{(multiplicative)}

La tendencia TtT_t es la deriva lenta y suave. La estacionalidad StS_t es una oscilación de período fijo — el sube y baja que regresa cada 12 meses debido al calendario, no a la tendencia. El residuo RtR_t es todo lo demás: ruido, picos por días festivos, eventos noticiosos, cambios de régimen. Todo el juego del pronóstico consiste en extraer TtT_t y StS_t lo suficientemente bien como para que RtR_t sea pequeño y aproximadamente blanco.

Por lo general, se desea la forma aditiva a menos que el tamaño de la fluctuación estacional crezca con el nivel de la serie. Las ventas minoristas con picos estacionales multiplicativos (pequeños en los primeros años, grandes una vez que aumentan los ingresos) son el caso clásico en el que la descomposición multiplicativa — o de manera equivalente, una transformación logarítmica seguida de una descomposición aditiva — gana.

La descomposición aditiva se puede escribir como una regresión sobre un conjunto de funciones de base:

yt=β0+β1t+j=1K[αjcos ⁣(2πjtm)+γjsin ⁣(2πjtm)]+εty_t = \beta_0 + \beta_1 t + \sum_{j=1}^{K} \left[ \alpha_j \cos\!\left(\tfrac{2\pi j t}{m}\right) + \gamma_j \sin\!\left(\tfrac{2\pi j t}{m}\right) \right] + \varepsilon_t

donde mm es el período estacional (por ejemplo, 12 para datos mensuales) y Km/2K \approx m/2 armónicos capturan la forma estacional. STL reemplaza la tendencia polinómica con un suavizador de gráficos de dispersión ponderado localmente (LOESS) y utiliza un suavizador estacional basado en promedios móviles; Prophet reemplaza la tendencia con una curva lineal por tramos (o logística saturada) y el término estacional con una serie de Fourier. Todos producen las mismas tres partes — simplemente las regularizan de manera diferente.

Lenguaje sencilloSímbolo estadísticoEquivalente en Python
Valor observado en el tiempo ttyty_tseries.iloc[t]
Componente de tendenciaTtT_tdecomp.trend.iloc[t]
Componente estacionalStS_tdecomp.seasonal.iloc[t]
Residuo / restoRtR_t or εt\varepsilon_tdecomp.resid.iloc[t]
Período estacionalmmperiod=12
Identidad aditivayt=Tt+St+Rty_t = T_t + S_t + R_tmodel="additive"
Identidad multiplicativayt=TtStRty_t = T_t \cdot S_t \cdot R_tmodel="multiplicative" o transformación logarítmica + aditiva

Autocorrelación, ACF, PACF, estacionariedad, diferenciación

Autocorrelación en el rezago kk es simplemente la correlación de Pearson entre yty_t y ytky_{t-k}, calculada sobre la parte superpuesta de la serie. La ACF grafica ρk\rho_k para k=0,1,2,k = 0, 1, 2, \ldots y responde a la pregunta “¿cuánto me sigue diciendo el día de hoy sobre lo que pasará dentro de kk días?” La PACF elimina el efecto indirecto que fluye a través de los rezagos intermedios: si yty_t está correlacionada con yt1y_{t-1}, que a su vez está correlacionada con yt2y_{t-2}, la PACF en el rezago 2 reporta únicamente la correlación directa entre yty_t y yt2y_{t-2}.

Una serie es estacionaria (en sentido débil) cuando su media, varianza y estructura de autocovarianzas no cambian con el tiempo. Los modelos lineales tipo ARMA asumen esto; si les proporcionas una serie con una media a la deriva, el modelo se ajustará sin problemas y luego pronosticará mal. La solución estándar es la diferenciación: reemplaza yty_t con yt=ytyt1\nabla y_t = y_t - y_{t-1}, lo que elimina una tendencia lineal y cualquier raíz unitaria, y vuelve a realizar la prueba. Si una diferenciación no es suficiente, diferencia de nuevo (esto es raro; hacerlo dos veces usualmente significa que has mal especificado algo).

La autocovarianza en el rezago kk es

γ(k)=E ⁣[(ytμ)(yt+kμ)]\gamma(k) = \mathbb{E}\!\left[(y_t - \mu)(y_{t+k} - \mu)\right]

y la autocorrelación es la versión normalizada

ρk=γ(k)γ(0).\rho_k = \frac{\gamma(k)}{\gamma(0)}.

La ACF muestral utiliza

ρ^k=t=1nk(ytyˉ)(yt+kyˉ)t=1n(ytyˉ)2.\hat{\rho}_k = \frac{\sum_{t=1}^{n-k}(y_t - \bar y)(y_{t+k} - \bar y)}{\sum_{t=1}^{n}(y_t - \bar y)^2}.

La PACF en el rezago kk es el último coeficiente ϕkk\phi_{kk} en la regresión AR(kk)

yt=ϕk1yt1+ϕk2yt2++ϕkkytk+εt.y_t = \phi_{k1} y_{t-1} + \phi_{k2} y_{t-2} + \cdots + \phi_{kk} y_{t-k} + \varepsilon_t.

La primera diferencia es yt=(1B)yt=ytyt1\nabla y_t = (1 - B) y_t = y_t - y_{t-1}, donde BB es el operador de retroceso; la dd-ésima diferencia es (1B)dyt(1 - B)^d y_t. Una diferencia estacional de periodo mm es myt=ytytm\nabla_m y_t = y_t - y_{t-m}.

Lenguaje sencilloSímbolo estadísticoEquivalente en Python
Autocorrelación de rezago kkρk\rho_kacf(series, nlags=k)[k]
Autocorrelación parcial de rezago kkϕkk\phi_{kk}pacf(series, nlags=k, method="ywm")[k]
Primera diferenciayt\nabla y_tseries.diff().dropna()
Diferencia estacional (periodo mm)myt\nabla_m y_tseries.diff(m).dropna()
Hipótesis nula del ADFH0H_0: raíz unitaria presente (no estacionaria)adfuller(series)[1] > 0.05 → no rechazar
RetrocesoByt=yt1B y_t = y_{t-1}series.shift(1)

Lectura de los gráficos

  • ACF decae lentamente, PACF se corta después del rezago pp → un patrón AR(pp); considera pp términos AR.
  • PACF decae lentamente, ACF se corta después del rezago qq → un patrón MA(qq); considera qq términos MA.
  • Ambas decaen lentamente → ARMA mixto; considera ambos, o puede que la serie no esté suficientemente diferenciada.
  • ACF presenta picos significativos en los rezagos m,2m,3m,m, 2m, 3m, \ldots → caso de ARMA estacional; necesitas una diferenciación estacional.

Ejemplo práctico en Python: tres descomposiciones de la misma serie

Construye una serie mensual sintética con una tendencia lineal, un ciclo estacional anual y ruido gaussiano. Luego, descomponla de tres maneras: el clásico seasonal_decompose, STL y Prophet. Compara lo que devuelve cada método.

import numpy as np
import pandas as pd

np.random.seed(7)
n = 60  # 5 years of monthly data
t = np.arange(n)
trend = 0.15 * t + 10
seasonality = 4 * np.sin(2 * np.pi * t / 12)
noise = np.random.normal(0, 1.5, n)
y = trend + seasonality + noise

idx = pd.date_range("2019-01-01", periods=n, freq="MS")
series = pd.Series(y, index=idx, name="y")
print(series.head())
# 2019-01-01    10.34
# 2019-02-01    11.87
# 2019-03-01    12.95
# 2019-04-01    13.58
# 2019-05-01    14.23

Descomposición aditiva clásica (basada en promedios móviles)

from statsmodels.tsa.seasonal import seasonal_decompose

cl = seasonal_decompose(series, model="additive", period=12)
classical_df = pd.DataFrame({
    "trend": cl.trend,
    "seasonal": cl.seasonal,
    "resid": cl.resid,
})
print(classical_df.head(14).round(3))
#               trend  seasonal  resid
# 2019-01-01      NaN     0.454    NaN
# 2019-02-01      NaN    -3.187    NaN
# 2019-03-01      NaN    -0.884    NaN
# 2019-04-01      NaN     3.330    NaN
# 2019-05-01      NaN     4.014    NaN
# 2019-06-01      NaN     1.063    NaN
# 2019-07-01   11.089    -3.388  0.299
# 2019-08-01   11.239    -4.014 -0.225
# 2019-09-01   11.389    -1.063 -0.326
# 2019-10-01   11.539     3.330 -0.869
# 2019-11-01   11.689     0.884  0.427
# 2019-12-01   11.839    -0.454  0.615
# 2020-01-01   11.989     0.454  0.557
# 2020-02-01   12.139    -3.187  0.048

Las primeras y las últimas period/2 filas de la tendencia son NaN porque el método clásico utiliza una media móvil centrada de ancho 12 (por lo que necesita 6 observaciones a cada lado). La columna estacional está forzada a sumar cero a lo largo de un período y es exactamente periódica. El residuo es yTSy - T - S.

STL (basado en LOESS, robusto)

from statsmodels.tsa.seasonal import STL

stl = STL(series, period=12, robust=True).fit()
stl_df = pd.DataFrame({
    "trend": stl.trend,
    "seasonal": stl.seasonal,
    "resid": stl.resid,
    "robust_weight": stl.weights,
})
print(stl_df.head(14).round(3))
#               trend  seasonal  resid  robust_weight
# 2019-01-01  10.510     0.504 -0.671            1.0
# 2019-02-01  10.644    -3.137  0.363            1.0
# 2019-03-01  10.779    -0.884  0.905            1.0
# 2019-04-01  10.913     3.330  0.337            1.0
# 2019-05-01  11.047     4.014  0.169            1.0
# 2019-06-01  11.181     1.063 -0.244            1.0
# 2019-07-01  11.315    -3.388 -0.127            1.0
# 2019-08-01  11.449    -4.014 -0.435            1.0
# 2019-09-01  11.584    -1.063 -0.521            1.0
# 2019-10-01  11.718     3.330 -0.048            1.0
# 2019-11-01  11.852     0.884 -0.736            1.0
# 2019-12-01  11.986    -0.454 -0.532            1.0
# 2020-01-01  12.120     0.504 -0.124            1.0
# 2020-02-01  12.255    -3.137 -0.078            1.0

STL te proporciona un valor de tendencia en cada observación (sin bordes NaN), un patrón estacional suave y de variación lenta que no está restringido a ser perfectamente periódico, y un peso de robustez por observación que puedes usar para marcar valores atípicos. El precio que pagas: STL tiene más parámetros de ajuste (trend_window, seasonal_window) y los componentes no son tan claramente separables como en el caso clásico.

Prophet (tendencia lineal por tramos + estacionalidad de Fourier)

from prophet import Prophet

df = series.reset_index()
df.columns = ["ds", "y"]
m = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    seasonality_mode="additive",
)
m.fit(df)
forecast = m.predict(df)

prophet_df = forecast[["ds", "trend", "yearly", "additive_terms", "components"]]
prophet_df = prophet_df.rename(columns={"yearly": "seasonal"})
print(prophet_df.head(14).round(3))
#            ds   trend  seasonal  additive_terms
# 0  2019-01-01  10.614     0.435           0.435
# 1  2019-02-01  10.764    -3.186          -3.186
# 2  2019-03-01  10.914    -0.885          -0.885
# 3  2019-04-01  11.064     3.329           3.329
# 4  2019-05-01  11.214     4.014           4.014
# 5  2019-06-01  11.364     1.063           1.063
# 6  2019-07-01  11.514    -3.387          -3.387
# 7  2019-08-01  11.664    -4.013          -4.013
# 8  2019-09-01  11.814    -1.063          -1.063
# 9  2019-10-01  11.964     3.329           3.329
# 10 2019-11-01  12.114     0.884           0.884
# 11 2019-12-01  12.264    -0.455          -0.455
# 12 2020-01-01  12.414     0.435           0.435
# 13 2020-02-01  12.564    -3.186          -3.186

Prophet ajusta una tendencia lineal por tramos con detección automática de puntos de cambio, más un término estacional de serie de Fourier. El “residual” es lo que sea que esté en y - trend - additive_terms. La gran ventaja de Prophet es que maneja de forma nativa múltiples estacionalidades (anual + semanal + diaria), días festivos y tendencias logísticas de saturación, pero los componentes que produce están optimizados para el pronóstico, no para ser descriptores estructurales limpios de tu serie.

Construcción de la serie sintética. La señal es 0.15 * t + 10 (una rampa lineal lenta de 10 a aproximadamente 19 durante 5 años) más un seno de amplitud de 4 unidades y periodo 12 (un ciclo por año en datos mensuales). El ruido es Normal(0, 1.5) — aproximadamente 1.5 unidades de fluctuación por observación, lo cual es pequeño en relación con la oscilación de 8 unidades del término estacional. freq="MS" es el inicio de mes, por lo que el índice son fechas de calendario limpias que requiere la columna ds de Prophet.

Descomposición clásica. seasonal_decompose(series, model="additive", period=12) hace dos cosas: estima el patrón estacional promediando cada posición del calendario en todos los ciclos (eliminando la tendencia primero mediante un promedio móvil centrado), luego lo resta y suaviza el resto para obtener la tendencia. El resultado tiene NaN en los bordes porque el promedio móvil necesita period/2 observaciones pasadas y futuras. No puedes extrapolar la tendencia fuera de la muestra sin escribir tu propio código; esta es una herramienta de descomposición, no de pronóstico.

STL. STL(series, period=12, robust=True).fit() utiliza LOESS tanto para la tendencia como para el suavizador estacional. Dos ventanas importan: trend_window (qué tan suave es la tendencia) y seasonal_window (cuánto se permite que el patrón estacional evolucione con el tiempo). robust=True reasigna los pesos de los valores atípicos en el residual para que no contaminen la tendencia. .weights devuelve el peso de robustez por observación; los valores mucho menores que 1 son valores atípicos a los que STL les redujo el peso.

Prophet. df = series.reset_index() y renombrar a ds / y es innegociable — Prophet espera exactamente esos nombres de columnas. yearly_seasonality=True habilita una serie de Fourier de 10 términos para el ciclo anual. El DataFrame de pronóstico tiene una columna trend, una columna yearly (la contribución estacional de Fourier), una columna additive_terms (la suma de todos los términos estacionales aditivos; aquí es igual a yearly), y una columna multiplicative_terms (cero en modo aditivo). El residual implícito es y - trend - additive_terms. Prophet es el único de los tres que puede producir un pronóstico más allá del final de los datos de entrenamiento sin que escribas código extra — esa es la razón principal por la que es tentador recurrir a él.

Lo que es igual en los tres. La tendencia es ~10 + 0.15*t (compara las tres columnas trend — están dentro de ~0.2 entre sí para fechas superpuestas). El patrón estacional es aproximadamente 4 * sin(2*pi*t/12) en los tres. El residual es pequeño (en su mayoría dentro de ±1 de cero). Los tres métodos coinciden en las señales; difieren en los bordes y en cuánto se permite que evolucione el patrón estacional.

Lo que es diferente. El método clásico te da un patrón estacional limpio y perfectamente periódico, y una tendencia de promedio móvil que tiene NaN en los bordes. STL te da una tendencia suave en todas partes y un patrón estacional que puede variar. Prophet te da una tendencia lineal por tramos con puntos de cambio y un patrón estacional de Fourier, además de la capacidad de pronosticar, añadir días festivos y apilar múltiples estacionalidades.

ACF / PACF / ADF en la misma serie

from statsmodels.tsa.stattools import acf, pacf, adfuller

acf_vals = acf(series, nlags=24)
pacf_vals = pacf(series, nlags=24, method="ywm")
print("lag  acf   pacf")
for k in range(6):
    print(f"{k:3d}  {acf_vals[k]:+.3f}  {pacf_vals[k]:+.3f}")
# lag  acf   pacf
#   0  +1.000  +1.000
#   1  +0.872  +0.823
#   2  +0.738  +0.134
#   3  +0.598  -0.024
#   4  +0.453  -0.064
#   5  +0.311  -0.051

adf_stat, adf_p, *_ = adfuller(series)
print(f"ADF stat = {adf_stat:.3f}, p = {adf_p:.4f}")
# ADF stat = -1.234, p = 0.6602  -> not stationary (don't reject unit root)

diffed = series.diff().dropna()
_, p_diff, *_ = adfuller(diffed)
print(f"1st difference: p = {p_diff:.4f}")
# 1st difference: p = 0.0010  -> now stationary

La ACF decae lentamente desde 1 — la firma clásica de una serie no estacionaria con tendencia. Después de una diferenciación, el valor p del ADF cae de 0.66 a 0.001, por lo que dejaríamos de diferenciar y usaríamos d=1d=1 en un modelo ARIMA.

Árbol de decisión: ¿es tu serie estacionaria y qué hacer al respecto?

Ejecuta la prueba ADF (o KPSS), luego observa la gráfica ACF y luego decide.

  • ADF p < 0.05 y el ACF se corta rápidamente (o decae rápido)
    • La serie es estacionaria. No diferencies.
    • Ajusta un modelo ARMA / ARIMA con d=0d=0, o ajusta un modelo sobre la serie original.
  • ADF p > 0.05 y el ACF decae muy lentamente (firma de tendencia lineal)
    • La serie tiene una raíz unitaria o una tendencia lineal determinista.
    • Dos opciones:
      • Diferencia una vez. Es mejor cuando la tendencia es un paseo aleatorio con deriva, o cuando vas a ajustar un modelo ARIMA. La serie diferenciada es estacionaria, ajusta un modelo ARMA sobre ella, pronostica y luego “integra” hacia atrás. Costo: pierdes el nivel de largo plazo en el modelo y no puedes recuperar la deriva determinista sin términos de deriva.
      • Modela la tendencia explícitamente. Es mejor cuando la tendencia es una función determinista limpia del tiempo (lineal, polinómica, lineal por tramos). Usa Prophet, o una regresión con time como característica, o trend="additive" en una descomposición. Costo: extrapolar polinomios es peligroso; tienes que elegir una forma funcional.
  • ADF p > 0.05 y el ACF tiene picos en múltiplos de mm (no estacionariedad estacional)
    • Aplica una diferencia estacional myt\nabla_m y_t además de (o en lugar de) la diferencia regular.
    • Esto es lo que hace el término D=1D=1 de SARIMA. Consulta ARIMA y SARIMA.
  • La varianza crece con el nivel (multiplicativa)
    • Aplica transformación logarítmica primero, y luego trátala como aditiva. Ejecuta ADF sobre np.log(series) en lugar de series.
  • ADF es límite (p ≈ 0.05) y no estás seguro
    • Grafica la media móvil y la varianza móvil en una ventana de tamaño period. Si alguna deriva visiblemente, diferencia. Si ambas se ven planas, no lo hagas.
    • Ejecuta también la prueba KPSS; KPSS tiene como hipótesis nula la estacionariedad, por lo que un valor p bajo en KPSS significa no estacionariedad. Contrastar ADF y KPSS es más confiable que usar cualquiera de los dos por separado.

Cuándo diferenciar vs. cuándo modelar la tendencia explícitamente

  • Diferenciar cuando:
    • Vas a ajustar ARIMA / SARIMA — la diferenciación es literalmente lo que hacen los parámetros dd y DD.
    • La tendencia es un paseo aleatorio estocástico (p. ej., precios de acciones, algunas señales de sensores). El nivel futuro es genuinamente desconocido; la diferenciación representa esto de manera honesta.
    • Quieres pronosticar el cambio y luego integrar, no el nivel directamente.
  • Modelar la tendencia explícitamente cuando:
    • La tendencia tiene una forma determinística limpia (lineal, lineal por partes, logística de saturación) y confías en que continuará.
    • Quieres componentes interpretables (“la tendencia está creciendo 0.15/mes”) en lugar de un modelo diferenciado de caja negra.
    • Estás usando Prophet, que ajusta la tendencia de esta manera por diseño.
    • Estás usando modelos de ML (XGBoost, LightGBM) y quieres pasarles time y time^2 como características en lugar de diferenciar y eliminar la estructura de la que necesitan aprender.
  • Híbrido (a menudo el mejor):
    • Elimina la tendencia con una regresión sobre time, luego diferencia los residuos si todavía muestran autocorrelación.
    • O ajusta Prophet, toma el residual, ajusta un ARIMA sobre el residual. Esto es lo que hace bien el modo additive de Prophet + un ARIMA sobre el residual.

Casos límite y errores comunes

  • Usar descomposición multiplicativa sin comprobar la varianza. Si tu serie tiene una varianza aproximadamente constante pero un nivel creciente, la aditiva es la correcta y la multiplicativa inflará silenciosamente las oscilaciones estacionales en los últimos años. Grafica la desviación estándar móvil; si es plana, usa la aditiva.
  • Confiar en el ADF en series cortas. El ADF tiene baja potencia; en series de menos de ~50 observaciones, rutinariamente no logra rechazar la hipótesis nula de raíz unitaria incluso cuando la serie es estacionaria. Siempre revisa también el gráfico de ACF.
  • Diferenciar dos veces cuando una fue suficiente. La sobrediferenciación introduce una raíz unitaria de MA e inflará la varianza del pronóstico. Si adfuller(series.diff().dropna()) indica que es estacionaria, detente.
  • Olvidar que seasonal_decompose no puede extrapolar la tendencia. Produce una tendencia solo en las observaciones interiores; tienes que ajustar una regresión a la tendencia tú mismo si quieres proyectarla hacia adelante.
  • Comparar los componentes STL y clásicos como si fueran el mismo objeto. El seasonal clásico es exactamente periódico y está forzado a sumar cero; el seasonal de STL puede evolucionar. No son intercambiables; no te sorprendas cuando discrepen en los bordes.
  • Configurar period incorrectamente. period debe ser el número de observaciones en un ciclo, no el ciclo en unidades humanas. Para datos mensuales con un ciclo anual es 12, para datos diarios con un ciclo semanal es 7, para datos por hora con un ciclo diario es 24. Errar en esto hace que el componente estacional parezca ruido.
  • Prophet sin ajustar changepoint_prior_scale. El valor predeterminado a menudo subajusta la tendencia (muy pocos puntos de cambio) o la sobreajusta (demasiados). Grafica la tendencia ajustada contra los datos antes de confiar en los componentes.
  • Confluir estacionariedad con “sin tendencia”. La estacionariedad se refiere a la distribución conjunta, no solo a la media. Una serie con media constante pero cuya varianza se duplica a mitad de camino no es estacionaria, y la diferenciación no arreglará eso: necesitas una transformación estabilizadora de varianza (log, Box-Cox).
  • Usar method="ols" para PACF. statsmodels usa OLS por defecto para pacf, lo que puede dar valores fuera de [1,1][-1, 1] en muestras pequeñas; usa method="ywm" (Yule-Walker) para obtener estimaciones estables.
  • Tratar el residual como “ruido” sin comprobarlo. Grafica el ACF del residual; si sigue autocorrelacionado, has subajustado. El residual debería verse como ruido blanco. Si tiene estructura, vuelve atrás y añade un término AR o un período estacional diferente.

Referencias cruzadas

Lecturas adicionales

  • Box, G. E. P., & Jenkins, G. M. (1976). Time Series Analysis: Forecasting and Control. Holden-Day. — la referencia original de ARIMA; la fuente de la maquinaria de diferenciación / identificación de ARMA.
  • Hyndman, R. J., & Athanasopoulos, G. Forecasting: Principles and Practice (3rd ed.), disponible en línea de forma gratuita en https://otexts.com/fpp3/ — el libro de texto práctico moderno; los capítulos 1-3 cubren tendencia, estacionalidad y descomposición; el capítulo 9 cubre ARIMA.
  • Cleveland, R. B., Cleveland, W. S., McRae, J. E., & Terpenning, I. (1990). STL: A Seasonal-Trend Decomposition Procedure Based on LOESS. Journal of Official Statistics, 6(1), 3-73. — el artículo original de STL.
  • Taylor, S. J., & Letham, B. (2018). Forecasting at Scale. The American Statistician, 72(1), 37-45. — el artículo de Prophet.
  • Documentación de statsmodels: seasonal_decompose, STL, adfuller, acf/pacf.
  • Documentación de Prophet — especialmente las secciones sobre pronósticos saturados y puntos de cambio.
  • Competencia de Kaggle: M5 Forecasting - Uncertainty — ventas minoristas de Walmart con fuerte tendencia + múltiples estacionalidades + efectos de días festivos; un buen campo de pruebas para las opciones de descomposición en esta referencia.

Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .

¿Buscas otra cosa?

Busca en todos los artículos por título, resumen o tema.