Introducción
Una vez comprendidos los modelos ARIMA, que se basan en la suposición de estacionariedad y requieren una cuidadosa selección de parámetros (p, d, q), surge la necesidad de contar con herramientas más flexibles y automatizadas. Especialmente cuando se trabaja con series temporales que presentan estacionalidades múltiples, festivos u otras irregularidades.
Facebook Prophet es un modelo desarrollado por el equipo de ingeniería de Meta (Facebook) diseñado específicamente para pronosticar series temporales de tipo empresarial: datos con fuertes efectos estacionales, tendencias a largo plazo y posibles interrupciones abruptas. A diferencia de ARIMA, Prophet adopta un enfoque aditivo.
Tema 1: El Modelo Aditivo de Prophet
1.1 Ecuación fundamental
Prophet descompone la serie temporal en tres componentes principales más un término de error:
- g(t): función de tendencia, modela cambios no periódicos a largo plazo
- s(t): cambios periódicos (estacionalidad semanal, anual, etc.)
- h(t): efectos de los días festivos, que pueden afectar uno o más días
- εₜ: término de error, representa variaciones no explicadas (se asume distribución normal)
1.2 Ventajas principales
- Maneja automáticamente los cambios de tendencia mediante detección de changepoints
- Incorpora fácilmente variables externas como días festivos
- No requiere un conocimiento estadístico profundo por parte del usuario
- Muy robusto ante datos faltantes y valores atípicos
- Produce intervalos de confianza de forma nativa
Tema 2: Changepoints — Detección Automática de Cambios de Tendencia
2.1 ¿Qué son los changepoints?
Los changepoints (puntos de cambio) son momentos en el tiempo donde el comportamiento de la tendencia cambia significativamente. Por ejemplo, un producto que empieza a crecer más rápido tras un lanzamiento viral, o una empresa cuyas ventas caen bruscamente por la pandemia.
Prophet detecta automáticamente los posibles changepoints al entrenar el modelo, colocando por defecto 25 candidatos en el primer 80% de la serie y seleccionando los más relevantes mediante regularización (Laplace prior sobre los cambios de pendiente).
2.2 Código para visualizar changepoints
# Listing all the change points in the model
deltas = m.params['delta'].mean(0)
cp = pd.DataFrame(m.changepoints)
cp['deltas'] = deltas
fig = go.Figure()
fig.add_trace(go.Bar(x=cp['ds'], y=cp['deltas'], name='CPs'))Tema 3: Parámetros del Modelo Prophet
| Parámetro | Descripción |
|---|---|
| Holidays | DataFrame con los días festivos relevantes para el modelo |
| Seasonality | Define si se consideran estacionalidades anuales, semanales o diarias (True/False) |
| Seasonality_mode | Tipo de estacionalidad: aditiva o multiplicativa |
| Seasonality_prior_scale | Controla la fuerza de la estacionalidad. Valores más altos permiten mayor flexibilidad |
| Holiday_prior_scale | Valores más altos permiten al modelo ajustarse más a los efectos de festivos |
| Changepoint_prior_scale | Determina qué tan fácil es que el modelo detecte cambios en la tendencia. Valor alto → cambios más bruscos |
Usar Hyperopt o GridSearch ayuda a automatizar la optimización de hiperparámetros, explorando un mayor número de configuraciones de forma eficiente.
Tema 4: Implementación en Python
4.1 Uso básico
Prophet espera que el DataFrame tenga exactamente dos columnas: ds (fecha) e y (valor a predecir).
# 1. Instanciar y entrenar el modelo
m = Prophet()
m.fit(dataset) # dataset debe tener columnas 'ds' y 'y'
# 2. Crear DataFrame futuro (180 días hacia adelante)
future = m.make_future_dataframe(periods=180, freq='D')
# 3. Generar predicciones
forecast = m.predict(future)
# 4. Columnas clave del resultado:
# ds: fecha, yhat: predicción, yhat_lower: límite inferior, yhat_upper: límite superior4.2 Ejemplo de salida de predicción
| ds | yhat | yhat_lower | yhat_upper |
|---|---|---|---|
| 2020-11-12 | 79.24 | 62.91 | 94.52 |
| 2020-11-13 | 73.76 | 58.42 | 89.83 |
| 2020-11-14 | 60.95 | 46.07 | 75.92 |
4.3 Prophet con variables exógenas
# Añadir festivos del país y regresores externos
m = Prophet(holidays=holidays)
m.add_country_holidays(country_name='ES')
m.add_regressor('rain')
m.add_regressor('temp')
m.fit(dataset)
future = m.make_future_dataframe(periods=0, freq='D')
future = future.merge(dataset, on='ds')
forecast = m.predict(future)4.4 Prophet con hyperparameter tuning
m = Prophet(
holidays=holidays,
changepoint_prior_scale=0.01,
changepoint_range=0.8,
seasonality_prior_scale=0.5,
holidays_prior_scale=1.0,
yearly_seasonality=20,
weekly_seasonality=5,
seasonality_mode='additive'
)Tema 5: Validación Cruzada Temporal
5.1 El problema con la validación cruzada estándar
A diferencia de otros tipos de datos, las series temporales tienen un orden cronológico: no podemos mezclar aleatoriamente los datos de entrenamiento y prueba. Si lo hiciéramos, estaríamos "mirando al futuro" durante el entrenamiento, lo que produce evaluaciones optimistas e irrealistas.
5.2 Validación temporal progresiva (Walk-Forward)
Prophet resuelve esto con una técnica de validación temporal progresiva: se entrena el modelo en una ventana inicial de tiempo y luego se prueba en una ventana futura (el horizon), repitiendo esto varias veces avanzando en el tiempo.
df_cv = cross_validation(
m,
initial='730 days', # 2 años de datos iniciales de entrenamiento
period='31 days', # cada 31 días avanza la ventana
horizon='365 days' # predice 1 año hacia adelante en cada iteración
)- initial: Los primeros 730 días (2 años) se usan para entrenar inicialmente
- horizon: Después de cada entrenamiento, el modelo predice 365 días
- period: Cada 31 días, Prophet avanza en el tiempo y hace una nueva división
ARIMA vs Prophet: Comparativa
| Característica | ARIMA | Prophet |
|---|---|---|
| Tipo de modelo | Estadístico clásico | Modelo aditivo basado en descomposición |
| Supone estacionariedad | Sí | No necesariamente |
| Tratamiento de tendencia | Diferenciación manual | Automático, con changepoints |
| Estacionalidad | Incluida como SARIMA | Modelada explícitamente y flexible |
| Incorporación de festivos | Manual y compleja | Nativa y sencilla |
| Curva de aprendizaje | Alta (requiere estadística) | Baja (intuitivo y automatizado) |
| Parámetros principales | p, d, q (y P,D,Q para SARIMA) | growth, seasonality, changepoints |