Cómo hacer previsión de series temporales con Prophet en Machine Learning
Este tutorial muestra cómo hacer previsión de series temporales con Prophet en Machine Learning para obtener previsiones simples, interpretar estacionalidad y gestionar festivos. Es útil para planificar inventario, ventas o capacidad con un método robusto y fácil de usar.
Requisitos previos
- Python 3.8+ y pip
- Bibliotecas: pandas, prophet, matplotlib (instalar vía pip)
- Un conjunto de datos con fechas y un valor (ej.: vendas_diarias.csv)
Paso 1: Instalar e importar las bibliotecas
Instalar Prophet (el paquete se llama prophet) más pandas y matplotlib. Luego importar lo esencial. Si hay problemas en la instalación, verificar el compilador C++ o usar una distribución conda.
pip install pandas prophet matplotlib
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
Paso 2: Preparar los datos en el formato que Prophet exige
Prophet espera dos columnas: ds (fechas) y y (valor). Cargar el archivo, convertir la columna de fecha y resumir por día si es necesario.
# Ejemplo mínimo
df = pd.read_csv('vendas_diarias.csv')
df['ds'] = pd.to_datetime(df['data'])
df = df[['ds', 'vendas']].rename(columns={'vendas':'y'})
# Opcional: ordenar y rellenar días faltantes
df = df.sort_values('ds').reset_index(drop=True)
Paso 3: Explorar la serie y tratar valores extremos
Visualizar la serie para entender tendencias, estacionalidad y outliers. Decidir si imputar valores nulos o winsorizar outliers antes de entrenar.
df.plot(x='ds', y='y', figsize=(10,4))
plt.title('Serie temporal de ventas')
plt.show()
# Ejemplo simple de imputación
df['y'] = df['y'].fillna(method='ffill')
Paso 4: Crear y ajustar el modelo Prophet
Crear un modelo Prophet básico. Puede configurar estacionalidad anual, semanal, y añadir festivos. Ajustar changepoint_prior_scale para controlar la sensibilidad a cambios bruscos (overfitting vs underfitting).
# Modelo básico con estacionalidad semanal y anual
m = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False)
# Si tiene festivos, crear DataFrame de festivos y añadir
# feriados = pd.DataFrame({'ds': [...], 'holiday': [...]})
# m.add_country_holidays(country_name='PT')
# Ajuste del modelo
m.fit(df)
Paso 5: Generar previsiones y intervalos de confianza
Crear un DataFrame de futuro con el período deseado (por ej. 30 días) y predecir. Prophet devuelve la previsión con intervalo (yhat, yhat_lower, yhat_upper).
future = m.make_future_dataframe(periods=30, freq='D')
forecast = m.predict(future)
# Ver algunas columnas útiles
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
Paso 6: Visualizar e interpretar resultados
Visualizar la previsión y los componentes para ver tendencia, estacionalidad y efectos de festivos. Esto ayuda a interpretar el porqué de las previsiones.
m.plot(forecast)
plt.title('Previsión con Prophet')
plt.show()
m.plot_components(forecast)
plt.show()
Paso 7: Validar el modelo (backtesting simple)
Hacer validación temporal: separar los últimos N días como prueba, entrenar en el resto y comparar previsiones con valores reales usando métricas como MAE o RMSE.
from sklearn.metrics import mean_absolute_error, mean_squared_error
# Ejemplo: validar últimos 30 días
train = df.iloc[:-30]
test = df.iloc[-30:]
m2 = Prophet(yearly_seasonality=True, weekly_seasonality=True)
m2.fit(train)
future2 = m2.make_future_dataframe(periods=30, freq='D')
forecast2 = m2.predict(future2)
pred = forecast2.set_index('ds').loc[test['ds'], 'yhat']
mae = mean_absolute_error(test['y'], pred)
rmse = mean_squared_error(test['y'], pred, squared=False)
print('MAE:', mae, 'RMSE:', rmse)
Verificar el resultado
Confirmar que el gráfico de previsión incluye la línea yhat y que los componentes muestran estacionalidad. Validar con MAE/RMSE y comprobar si los errores están dentro de la tolerancia del negocio. Si los intervalos yhat_lower/upper cubren la mayoría de los puntos reales, el modelo está calibrado.
Conclusión
Has aprendido a preparar datos, entrenar Prophet, generar previsiones y validar con backtesting. Próximos pasos: experimentar con changepoint_prior_scale, añadir regresores externos (promociones, precios) y usar cross-validation avanzada de Prophet. Consejo: comienza con modelos simples y añade complejidad solo cuando los errores lo justifiquen.