Python & Data Science
Series Temporales En revisión

Prophet vs. Modelos Estadísticos: Un Enfrentamiento Práctico de Pronósticos

La última vez, Nora incorporó gradient boosting como una segunda opinión para el pronóstico de masa madre de la panadería. Las características de rezago y móviles diseñadas las manejó bien. Pero los cambios repentinos en el patrón subyacente — ahí fue donde se estancó. Ahora necesita un modelo que se adapte a los quiebres estructurales en lugar de luchar contra ellos.

1. Por qué tu antiguo modelo de pronóstico falló con datos reales

¿Alguna vez has construido un pronóstico que parecía perfecto en papel, solo para verlo desmoronarse en el momento en que llegó un día festivo o se lanzó una campaña? Para Nora, una planificadora de demanda en una cadena regional de panaderías, esto es lo que sucede cada vez que se abre una nueva tienda o llega un cambio de temporada.

Si has usado modelos clásicos como ARIMA, conoces la frustración. Son matemáticamente elegantes, pero exigen condiciones casi perfectas. Asumen que tus datos son “estacionarios” (sus propiedades estadísticas no cambian con el tiempo) y que las tendencias se mantienen constantes.

Los datos del mundo real son más desordenados. Valores faltantes, cambios abruptos, picos masivos en Black Friday. Cuando estos ocurren, ARIMA a menudo falla. Ese salto de data[70:] += 20 en el código a continuación refleja lo que ocurrió cuando la cadena de panaderías abrió su ubicación más reciente — las ventas se dispararon de la noche a la mañana y la antigua línea de tendencia quedó obsoleta. A continuación, probamos un enfoque ingenuo en datos con un cambio abrupto.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# Create a messy dataset: a steady trend that suddenly jumps
np.random.seed(42)
time = np.arange(100)
data = 10 + 0.5 * time + np.random.normal(0, 2, 100)
data[70:] += 20  # A sudden structural break (e.g., a new store opening)

df = pd.DataFrame({'y': data, 'ds': pd.date_range(start='2023-01-01', periods=100)})

# Try a simple ARIMA model
model = ARIMA(df['y'], order=(1, 1, 1))
results = model.fit()
forecast = results.get_forecast(steps=20).predicted_mean

plt.figure(figsize=(10, 5))
plt.plot(df['ds'], df['y'], label='Actual Data')
plt.plot(pd.date_range(start='2023-04-11', periods=20), forecast, label='ARIMA Forecast', color='red')
plt.title("ARIMA Struggling with a Structural Break")
plt.legend()
plt.show()
  • np.random.seed(42) — fija el generador de números aleatorios para que el conjunto de datos sintético de tendencia más ruido sea idéntico en cada ejecución, haciendo que el cambio estructural sea reproducible.
  • data[70:] += 20 — agrega un cambio de nivel permanente de +20 unidades a partir del índice 70, simulando un cambio estructural como la apertura de una nueva tienda que eleva la línea base de la noche a la mañana.
  • ARIMA(df['y'], order=(1, 1, 1)) — crea un modelo ARIMA con 1 término autorregresivo, 1 paso de diferenciación (para manejar la tendencia) y 1 término de promedio móvil — una configuración estándar para datos que siguen tendencias.
  • results.get_forecast(steps=20).predicted_mean — genera un pronóstico a 20 pasos del modelo ARIMA ajustado y extrae las predicciones puntuales; dado que ARIMA extrapola la tendencia anterior al cambio, el pronóstico probablemente quedará corto respecto a la realidad posterior al cambio.

En este ejemplo, la línea roja —nuestro pronóstico de ARIMA— no logra captar la nueva realidad de los datos. Debido a que ARIMA se basa en los rezagos recientes, se confunde con el salto repentino. Por eso Facebook (ahora Meta) creó Prophet. Necesitaban algo lo suficientemente robusto para que los no expertos lo usaran en datos comerciales desordenados sin que se rompiera cada vez que llegaba un día festivo.

2. Qué hace realmente Prophet (sin tecnicismos matemáticos)

Piensa en Prophet como un descomponedor, no como una ecuación matemática compleja.

En lugar de predecir el siguiente punto a partir del último punto como hace ARIMA, Prophet divide tus datos en tres partes:

  1. La Tendencia: Prophet rastrea el crecimiento o la declinación usando una línea “por tramos” que se dobla en “puntos de cambio” específicos.
  2. Estacionalidad: ¿Vendemos más los sábados o tenemos un pico cada diciembre? Las ondas (series de Fourier) mapean estos patrones repetitivos.
  3. Días festivos: Para los días que no encajan en el patrón normal —como Navidad— puedes señalarlos específicamente.

Así que el pronóstico final es simplemente: Trend + Seasonality + Holidays. Es aditivo. Esto hace que sea sencillo de explicar a un gerente. Así es como Prophet maneja esos mismos datos desordenados.

El modelo central de Prophet es una descomposición aditiva:

y(t)=g(t)+s(t)+h(t)+ϵty(t) = g(t) + s(t) + h(t) + \epsilon_t

Lenguaje sencilloSímbolo estadísticoEquivalente en Python
Tendencia (crecimiento lineal por tramos o logístico)g(t)g(t)forecast['trend']
Estacionalidad (términos de Fourier semanales, anuales)s(t)s(t)forecast['weekly'], forecast['yearly']
Efectos de días festivos (cambios conocidos para fechas específicas)h(t)h(t)forecast['holidays']
Ruido irregular / residualϵt\epsilon_tforecast['yhat'] - observed
Pronóstico final (suma de todos los componentes)y^(t)\hat{y}(t)forecast['yhat']

Prophet ajusta cada componente de forma independiente y los suma — la aditividad es lo que hace que el pronóstico sea interpretable y los componentes graficables mediante plot_components().

⚠️ Requiere: pip install prophet

from prophet import Prophet

# Prophet requires columns named 'ds' and 'y'
model_p = Prophet(changepoint_prior_scale=0.5)
model_p.fit(df)

future = model_p.make_future_dataframe(periods=20)
forecast_p = model_p.predict(future)

fig = model_p.plot_components(forecast_p)
plt.show()
  • from prophet import Prophet — importa Prophet desde el paquete prophet (anteriormente fbprophet); el paquete fue renombrado de fbprophet a prophet en versiones posteriores.
  • Prophet(changepoint_prior_scale=0.5) — crea un modelo de Prophet con una alta flexibilidad de puntos de cambio (el valor por defecto es 0.05); un valor más grande permite que la tendencia se doble más agresivamente en los puntos de cambio detectados, lo cual es necesario aquí porque los datos tienen una ruptura estructural repentina.
  • model_p.make_future_dataframe(periods=20) — genera un DataFrame con 20 marcas temporales diarias futuras añadidas a los datos de entrenamiento, que Prophet usa como la línea de tiempo para el pronóstico.
  • model_p.predict(future) — produce el DataFrame completo de pronóstico incluyendo yhat (pronóstico puntual), yhat_lower/yhat_upper (intervalos de incertidumbre), y columnas de componentes individuales (trend, weekly, yearly, holidays).
  • model_p.plot_components(forecast_p) — grafica cada componente descompuesto (tendencia, estacionalidad, días festivos) por separado, para que puedas verificar visualmente que la línea de tendencia se dobló para acomodar la ruptura estructural.

Observa los componentes y verás que la línea de “Tendencia” se dobla para encontrarse con los datos nuevos. Prophet no se preocupa por la estacionariedad. Ve un cambio y se adapta.

3. ARIMA: el caballo de batalla clásico (y cuándo brilla)

Espera: si Prophet es tan flexible, ¿por qué aún nos interesa ARIMA?

ARIMA significa AutoRegressive Integrated Moving Average. Dice: “Dime qué pasó ayer y cuánto me equivoqué ayer, y te diré qué pasará hoy.”

Las matemáticas son elegantes. ARIMA se centra en la autocorrelación—la relación entre un punto y sus vecinos. Para pronósticos a corto plazo donde los datos son estables y limpios, ARIMA suele ser más preciso que Prophet. Es un bisturí ligero; Prophet es una navaja suiza.

4. Cara a cara: Prophet vs. ARIMA con datos reales

Así que vamos a compararlos directamente. Dividiremos nuestros datos en un conjunto de entrenamiento (el pasado) y un conjunto de prueba (el futuro que queremos predecir), y luego mediremos cada modelo con el Error Absoluto Medio (MAE). Un MAE más bajo es mejor.

from sklearn.metrics import mean_absolute_error
from pmdarima import auto_arima

# Split data
train = df.iloc[:80]
test = df.iloc[80:]

# 1. Fit ARIMA (using auto_arima to find the best settings)
stepwise_model = auto_arima(train['y'], seasonal=False, trace=False)
arima_pred = stepwise_model.predict(n_periods=20)

# 2. Fit Prophet
m = Prophet().fit(train)
future = m.make_future_dataframe(periods=20)
p_forecast = m.predict(future)
prophet_pred = p_forecast.iloc[80:]['yhat']

print(f"ARIMA MAE: {mean_absolute_error(test['y'], arima_pred):.2f}")
print(f"Prophet MAE: {mean_absolute_error(test['y'], prophet_pred):.2f}")
  • from pmdarima import auto_arima — importa la función auto_arima de pmdarima, la cual busca automáticamente combinaciones de (p, d, q) utilizando un algoritmo paso a paso para encontrar el modelo ARIMA con mejor ajuste.
  • auto_arima(train['y'], seasonal=False, trace=False) — ajusta el modelo ARIMA a los datos de entrenamiento sin componentes estacionales y suprime el registro de la búsqueda paso a paso; devuelve un objeto de modelo ajustado.
  • stepwise_model.predict(n_periods=20) — genera predicciones puntuales a 20 pasos hacia el futuro a partir del modelo ARIMA seleccionado automáticamente para su comparación contra el conjunto de prueba.
  • m = Prophet().fit(train) — crea un modelo Prophet con la configuración predeterminada y lo ajusta a los datos de entrenamiento; el DataFrame de entrenamiento debe tener las columnas ds y y, lo cual ya se cumple.
  • p_forecast.iloc[80:]['yhat'] — selecciona del DataFrame de pronóstico de Prophet las filas a partir de la 80 en adelante (el período de prueba) y extrae yhat, la columna de pronóstico puntual, alineando las predicciones con el conjunto de prueba para el cálculo del MAE.
  • mean_absolute_error(test['y'], ...) — calcula el MAE entre los valores reales y los predichos para cada modelo; un MAE más bajo significa que las predicciones del modelo están, en promedio, más cerca de los valores reales.

Si el MAE de ARIMA da 15.0 y el de Prophet 4.0, las predicciones de Prophet estuvieron, en promedio, a solo 4 unidades de los valores reales — ARIMA falló por 15. En datos desordenados y propensos a cambios, Prophet suele llevar la ventaja.

5. Estacionalidad y múltiples patrones: dónde gana Prophet

ARIMA suele tener dificultades con más de un tipo de estacionalidad. Un patrón semanal (más tráfico los fines de semana) más un patrón anual (más tráfico en verano) ya es mucho para este modelo.

Prophet maneja ambos por defecto. También puedes agregar estacionalidades personalizadas. Si tu negocio tiene un ciclo de facturación específico de 4 semanas, simplemente dile a Prophet que busque eso. Esta naturaleza aditiva es lo que hace a Prophet muy adecuado para los datos empresariales.

6. Cambios de tendencia y rupturas estructurales

Esta es la parte más difícil de los pronósticos: saber cuándo han cambiado las reglas.

ARIMA asume que el proceso subyacente se mantiene igual. Si tu empresa es mencionada por un influencer famoso y tu tráfico base se triplica de la noche a la mañana, ARIMA intenta llevar el pronóstico de vuelta hacia la media antigua. En cambio, Prophet detecta un “punto de cambio”. Reconoce que la tendencia ha cambiado y proyecta la nueva tendencia hacia el futuro.

7. La carga del ajuste: simplicidad vs. complejidad

Ajustar ARIMA requiere esfuerzo. Estudias los gráficos de ACF y PACF, determinas cuántas veces diferenciar los datos y luego decides los parámetros (p, d, q). auto_arima ayuda, pero puede ser lento: prueba decenas de combinaciones antes de dar con una.

Prophet está diseñado para funcionar “listo para usar”. Sus valores predeterminados se adaptan al comportamiento a escala humana, por lo que dedicas menos tiempo a las matemáticas y más a tus eventos de negocio.

8. Cuándo ARIMA sigue siendo la opción correcta

No descartes ARIMA todavía. Aún gana en algunos escenarios:

  • Conjuntos de datos pequeños: Con solo 30 o 40 puntos de datos, Prophet puede sobreajustarse. ARIMA es la opción más segura aquí.
  • Finanzas de alta frecuencia: Para los ticks de acciones o datos de sensores que llegan cada segundo, el énfasis de ARIMA en los rezagos recientes es exactamente lo que buscas.
  • Simplicidad: Cuando los datos son básicamente una línea recta con algo de ruido, ARIMA es más rápido y ligero.

9. Más allá de Prophet y ARIMA: una visión general

Otros métodos que vale la pena conocer:

  • Suavizado exponencial (ETS): Excelente para tendencias simples y estacionalidad.
  • LSTM / Redes neuronales: Efectivas, pero necesitan enormes cantidades de datos y son “cajas negras”.
  • Ensambles: A menudo, el mejor pronóstico es simplemente el promedio de un modelo ARIMA y un modelo Prophet.

Prophet vs. ARIMA: ¿cuál deberías elegir?

EnfoqueFortalezasDebilidadesIdeal cuando
ProphetManeja rupturas estructurales y puntos de cambio automáticamente; múltiples estacionalidades superpuestas listas para usar; efectos de días festivos integrados; produce componentes interpretables (tendencia, estacionalidad, días festivos); los valores predeterminados sensatos funcionan sin ajustePuede sobreajustarse en conjuntos de datos pequeños (30–40 puntos); menos preciso para pronósticos estables a corto plazo; trata los regresores externos de forma aditiva en lugar de mediante interacciones complejas; más lento en conjuntos de datos muy grandesTus datos tienen días festivos, rupturas estructurales o múltiples estacionalidades; necesitas componentes interpretables; tienes un conjunto de datos de tamaño mediano a grande con patrones comerciales desordenados
ARIMA / SARIMALigero y rápido; preciso para pronósticos a corto plazo en datos estables; intervalos de confianza bien comprendidos; funciona bien en conjuntos de datos pequeños; captura la autocorrelación directamenteAsume estacionariedad (o requiere diferenciación); tiene dificultades con múltiples estacionalidades superpuestas; falla ante cambios estructurales; requiere ajuste manual de (p, d, q) o una búsqueda lenta con auto_arimaTienes datos limitados, un único ciclo estacional, patrones estables y necesitas precisión para pronósticos a corto plazo

La decisión clave: Prophet gana cuando tus datos tienen rupturas estructurales, días festivos o múltiples estacionalidades superpuestas — exactamente los patrones comerciales desordenados que rompen los supuestos de estacionariedad de ARIMA. ARIMA gana cuando los datos son estables, cortos y muy autocorrelacionados, donde su enfoque en los retardos y errores recientes le da ventaja. Para datos comerciales complejos como las ventas de la panadería de Nora, la detección automática de puntos de cambio y la aditividad de Prophet lo convierten en la opción predeterminada más segura.

10. Construye tu árbol de decisiones: qué modelo usar y cuándo

Esta es una forma de decidir:

def recommend_model(data_points, has_holidays, has_multiple_seasonality):
    if data_points < 50:
        return "ARIMA (Simple and robust for small data)"
    if has_holidays or has_multiple_seasonality:
        return "Prophet (Handles complex business patterns better)"
    return "Try both and ensemble!"

print(recommend_model(1000, True, True))
  • def recommend_model(data_points, has_holidays, has_multiple_seasonality) — una función de decisión sencilla que dirige a ARIMA o Prophet según tres características de los datos: tamaño de la muestra, presencia de festivos y presencia de múltiples estacionalidades.
  • if data_points < 50 — el primer filtro: si el conjunto de datos es muy pequeño, se prefiere ARIMA porque la detección de puntos de cambio de Prophet puede sobreajustarse cuando no hay suficientes puntos para distinguir un cambio real del ruido.
  • if has_holidays or has_multiple_seasonality — el segundo filtro: si los datos tienen festivos o ciclos estacionales superpuestos, se prefiere Prophet porque los maneja de forma nativa, mientras que el ARIMA estándar no.
  • return "Try both and ensemble!" — el respaldo: si ninguna condición se activa (datos moderados, sin festivos, estacionalidad única), vale la pena probar ambos modelos — y promediar sus predicciones a menudo supera a cualquiera por separado.

11. Integrando todo: un flujo de trabajo completo de pronóstico

Un flujo de trabajo sólido es más o menos así:

  1. Limpiar: Maneja primero las fechas faltantes.
  2. Dividir: Separa un conjunto de prueba que el modelo nunca toque.
  3. Línea base: Ejecuta algo sencillo, como un promedio móvil.
  4. Competir: Prueba Prophet y ARIMA.
  5. Evaluar: Revisa los residuos. Si los errores muestran un patrón, el modelo pasó por alto algo.

12. Resumen: tu caja de herramientas para pronósticos

  • Prophet es la opción sólida para datos de negocios con días festivos, múltiples estacionalidades y cambios de tendencia.
  • ARIMA es tu herramienta de precisión para datos estables, más cortos o altamente autocorrelacionados.
  • A menudo, la mejor opción es usar ambos.

Así que toma ese conjunto de datos desordenado que rompió tu último modelo y pruébalo con Prophet. Puede que te sorprenda lo limpias que se ven las cosas cuando tus pronósticos manejan realmente los días festivos. Prophet maneja bien el quiebre estructural de la nueva tienda. Pero lo que le causa problemas a Nora cada diciembre es la superposición de estacionalidades y el efecto halo de los días festivos en su pronóstico.

Comprueba tu comprensión

Las preguntas a continuación van desde el recuerdo simple hasta el diseño abierto, siguiendo aproximadamente la Taxonomía de Bloom.

Recordar ¿En qué tres componentes Prophet descompone una serie temporal y cómo se combinan en el pronóstico final?

Comprender Con tus propias palabras, explica por qué ARIMA “tiene dificultades” con el cambio estructural repentino en el ejemplo del artículo, utilizando la explicación del artículo sobre lo que ARIMA realmente examina (lags recientes y errores pasados).

Aplicar Usando la función de decisión recommend_model del artículo, ¿qué devolvería para un conjunto de datos con 200 puntos de datos, sin días festivos y con un único patrón de estacionalidad semanal?

Analizar El artículo dice que ARIMA “intentará llevar el pronóstico de vuelta al promedio antiguo” después de un cambio repentino, mientras que Prophet “detecta un punto de cambio” y proyecta la nueva tendencia hacia adelante. Explica paso a paso por qué la dependencia de ARIMA en los lags recientes y la diferenciación causa específicamente este comportamiento de “regreso”, en lugar de ser simplemente una debilidad general.

Evaluar La Sección 8 del artículo advierte que Prophet “podría sobreajustarse” en conjuntos de datos pequeños (30-40 puntos), recomendando ARIMA en su lugar. Critica esta afirmación específica: ¿qué aspecto del mecanismo de detección de puntos de cambio de Prophet lo haría más propenso al sobreajuste en datos dispersos en comparación con un modelo ARIMA de orden bajo correctamente especificado?

Crear Diseña un enfoque de pronóstico para un nuevo escenario: un negocio de suscripción de dos años de antigüedad con datos de ingresos mensuales (24 puntos) que experimentó un cambio de precios hace 8 meses y tiene una caída estacional sospechada pero no confirmada cada diciembre. Usando el árbol de decisión del artículo y la advertencia sobre datos pequeños de la Sección 8, ¿con qué modelo empezarías y a qué estarías atento que podría hacerte cambiar de opinión?


Artículos relacionados

Referencias y lecturas adicionales

  • Taylor, S. J., & Letham, B. (2018). “Forecasting at Scale.” The American Statistician, 72(1), 37–45. doi.org/10.1080/00031305.2017.1380080 — el artículo fundamental de Prophet que introduce el modelo de descomposición aditiva (tendencia + estacionalidad + días festivos), tendencias lineales por tramos con detección automática de puntos de cambio y estacionalidad de series de Fourier.
  • Documentación de la biblioteca prophet: facebook.github.io/prophet/ — la documentación oficial de Prophet que cubre el ajuste de puntos de cambio (changepoint_prior_scale), estacionalidades personalizadas, especificaciones de días festivos y la API plot_components utilizada a lo largo de este artículo.
  • Competencia “Store Sales — Time Series Forecasting” de Kaggle: kaggle.com/competitions/store-sales-time-series-forecasting — un punto de referencia de pronóstico minorista del mundo real donde los enfoques de Prophet, ARIMA y gradient boosting son todos viables; útil para comparar el manejo de puntos de cambio de Prophet frente a alternativas en datos con rupturas estructurales.

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 .

«Aplica lo que aprendiste» es para suscriptores Supporter e Insider.

Suscríbete para desbloquear los ejercicios de este artículo.

Ver planes

¿Buscas otra cosa?

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