Predicción de Series de Tiempo usando Prophet

Predicción de Series de Tiempo usando Prophet

Tendencia, Estacionalidad y Anomalías en Python

Las series de tiempo están en todas partes: desde el monitoreo de operaciones mineras hasta el análisis de ventas o métricas web. Sin embargo, modelarlas suele ser un desafío debido a las tendencias cambiantes, los patrones estacionales complejos y los valores atípicos (outliers).

Aquí es donde Prophet, la librería desarrollada por Meta (Facebook), destaca enormemente. A diferencia de los modelos tradicionales como ARIMA, Prophet está diseñado para ser intuitivo, tolerante a datos faltantes y robusto frente a cambios abruptos de tendencia.

En este artículo veremos cómo descompone una serie temporal — explicando a detalle el cálculo de la tendencia, periodicidad y puntos anómalos — y cómo implementarlo paso a paso en Python.

1. ¿Para qué fue creado Prophet y cómo se usa hoy en día?

Origen y Propósito

Prophet fue lanzado por el equipo de Core Data Science de Facebook (hoy Meta) con un objetivo muy claro: democratizar y escalar el pronóstico de series temporales dentro de la organización.

En empresas tecnológicas a gran escala, miles de equipos necesitan generar predicciones confiables (para tráfico web, servidores, conversiones, finanzas o marketing) sin ser necesariamente expertos doctorados en econometría o estadística avanzada. Prophet nació para automatizar este proceso, ofreciendo un modelo que requiriera poca intervención manual, que fuera resistente a datos sucios o faltantes, y que permitiera a los analistas ajustar fácilmente parámetros de negocio (como días festivos o efectos estacionales específicos).

Usos en la actualidad

Hoy en día, Prophet se ha convertido en un estándar de la industria tanto en ciencia de datos como en ingeniería y analítica de negocios. Sus aplicaciones más comunes incluyen:

Planificación de Capacidad y Operaciones: Predicción de demanda en cadenas de suministro, logística o infraestructura en la nube.

Marketing y Ventas: Pronóstico de conversiones, retornos de campañas publicitarias y proyecciones de ingresos mensuales o anuales.

Monitoreo de Infraestructura y Negocio: Detección de anomalías en métricas de servidores, dispositivos IoT o indicadores clave de rendimiento (KPIs).

2. El corazón del modelo: Modelos Aditivos vs. Multiplicativos

Antes de ajustar una serie temporal, Prophet te permite elegir cómo interactúan sus componentes (tendencia y estacionalidad) mediante dos enfoques matemáticos principales:

A. Modelo Aditivo (Por defecto)

Asume que los componentes de la serie temporal se suman entre sí. Es ideal cuando la amplitud de la estacionalidad (las fluctuaciones estacionales) se mantiene constante a lo largo del tiempo, sin importar si la tendencia general sube o baja.La fórmula general es:

\[y(t) = g(t) + s(t) + h(t) + \epsilon_t\]

B. Modelo Multiplicativo

Asume que los componentes se multiplican. Es fundamental cuando la amplitud de la estacionalidad crece o decrece proporcionalmente con la tendencia. Por ejemplo, si un negocio de comercio electrónico duplica sus ventas base anuales, es muy probable que las fluctuaciones de diciembre (Navidad) también se dupliquen en magnitud absoluta en lugar de mantenerse fijas.La fórmula general se expresa como:

\[y(t) = g(t) \times (1 + s(t)) + \epsilon_t\]

Donde:

$g(t)$ Tendencia (Trend): Modela los cambios no periódicos a largo plazo.

$s(t)$ Periodicidad / Estacionalidad (Seasonality): Modela los patrones cíclicos (anuales, semanales, diarios).

$h(t)$ Efectos de días festivos (Holidays): Impactos de eventos especiales o feriados.

$\epsilon_t$ Error: Cambios no capturados por el modelo.

En Prophet, puedes configurar esto fácilmente al inicializar tu modelo con growth='linear' o multiplicative' según el comportamiento visual de tus datos.

3. Desglose del Motor de Cálculo

A. Tendencia $g(t)$: Crecimiento Logístico y por Tramos

Prophet ofrece dos tipos de modelos de tendencia

  • Crecimiento Linear por Tramos (Piecewise Linear): Ideal para la mayoría de los casos. En lugar de ajustar una sola línea recta, Prophet detecta automáticamente puntos de cambio (changepoints) donde la tasa de crecimiento cambia de dirección o pendiente. Coloca una serie de cambios potenciales de forma flexible y aplica una penalización (regularización L1) para evitar el sobreajuste (overfitting).
  • Crecimiento Logístico (Saturation Growth): Útil cuando el mercado o la métrica tiene un límite superior claro (una capacidad de carga máxima $C$).

B. Periodicidad / Estacionalidad $s(t)$: Series de Fourier

Para capturar patrones recurrentes, Prophet no utiliza medias móviles tradicionales, sino Series de Fourier. Cualquier función periódica suave puede aproximarse mediante una combinación de senos y cosenos:

\[s(t) = \sum_{n=1}^{N} \left( a_n \cos\left(\frac{2\pi n t}{P}\right) + b_n \sin\left(\frac{2\pi n t}{P}\right) \right)\]

Donde $P$ es el período conocido (ej. $P=365.25$ para anualidad, $P=7$ para semanal). El usuario o el algoritmo ajusta los parámetros $a_n$ y $b_n$ para modelar la forma de la curva estacional con gran flexibilidad y eficiencia.

C. Puntos Anómalos (Outliers y Changepoints)

Prophet maneja las anomalías de dos formas distintas según su naturaleza:

  • Anomalías en la Tendencia (Changepoints): Si ocurre un evento estructural (por ejemplo, el lanzamiento de un nuevo producto o un cambio en la operación), Prophet identifica puntos donde la tendencia cambia abruptamente mediante la optimización de tasas de crecimiento dispersas (sparse prior).
  • Anomalías puntuales (Outliers / Valores atípicos): Si hay picos o caídas aisladas debido a errores de medición o eventos pasajeros extremos, la mejor práctica en Prophet es tratar esos valores como nulos (NaN) antes de entrenar. Al hacerlo, el algoritmo ignora dichos puntos en el ajuste de la tendencia y la estacionalidad, evitando que sesguen la proyección futura.

4. Ejemplo Práctico en Python

A continuación, implementaremos un flujo completo: generaremos una serie de datos simulados, ajustaremos el modelo Prophet y visualizaremos la tendencia junto con sus componentes.

Requisitos previos: Si no tienes instaladas las librerías, puedes instalarla vía pip:

pip install pandas numpy matplotlib prophet

La simulacion de la serie de tiempo es aditiva (linealidad en los componentes)

import numpy as np
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# 1. Generar una serie temporal sintética con tendencia y estacionalidad
np.seed = 45
fechas = pd.date_range(start="2025-01-01", end="2026-07-31", freq="D")
n = len(fechas)

# Componentes simulados: Tendencia lineal + Estacionalidad + Ruido
tendencia = np.linspace(50, 150, n)
est_year = 16 * np.sin(2 * np.pi * np.arange(n) / 365.25)
est_week = 0.5 * np.sin((1+np.pi) * np.arange(n) / 7)

ruido = np.random.normal(0, 5, n)
y = tendencia + est_year + est_week + ruido

# Crear el DataFrame requerido por Prophet (columnas obligatorias: 'ds' y 'y')
df = pd.DataFrame({"ds": fechas, "y": y})
# Simular una anomalía puntual (outlier extremo) artificialmente
df.loc[df["ds"] == "2025-06-15", "y"] = 150  # Valor anómalo
# Para que Prophet no distorsione la tendencia por este outlier, lo tratamos como NaN:
df.loc[df["ds"] == "2025-08-30", "y"] = np.nan

Ahora entrenamos el modelo usando la siguiente configuracion:

# 2. Inicializar y entrenar el modelo Prophet
modelo = Prophet(
    yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False
)

# Ajustar el modelo a los datos
modelo.fit(df)

# 3. Crear un DataFrame para predicciones futuras (ej. 90 días adelante)
futuro = modelo.make_future_dataframe(periods=90)

# Realizar la predicción
forecast = modelo.predict(futuro)

Se realiza la isnpección visual de la serie, la modelación y predicción del modelo prophet a 90 días.

# 4. Visualizar los resultados principales
fig1 = modelo.plot(forecast)
plt.title("Predicción de Serie Temporal con Prophet")
plt.xlabel("Fecha")
plt.ylabel("Valor")
plt.show()
time_series_prophet

Se observa el dato outlier, aunque el modelo no lo consideró en la estimación, ya que no se oberva cambios bruscos en la curva estimada.

# 5. Visualizar los componentes desglosados (Tendencia y Estacionalidad)
fig2 = modelo.plot_components(forecast)
plt.show()
components_time_series

Los componentes de tendencia y estacionariedad se muestran en la gráfica. La componente de tendencia coincide con la simualción (tendencia lineal creciente), mientras que la estacionariedad anual muestra una curva sinudoidal (sin/cos), mientras que la frecuencia semanal los días con más valores son los días lunes y miércoles.

5. Conclusión

Prophet destaca como una herramienta sumamente potente y accesible en el ecosistema de ciencia de datos. Su gran ventaja radica en que automatiza tareas complejas —como la selección de puntos de cambio en la tendencia y el modelado armónico de la estacionalidad mediante series de Fourier — permitiéndonos obtener pronósticos robustos en cuestión de minutos.

Al combinar una correcta limpieza de outliers con la flexibilidad de su estructura aditiva, podrás anticiparte con mayor precisión a los comportamientos futuros en tus proyectos analíticos.

6. Bibliografía

Pagina facebook Modelo Prophet

Rubén Miranda Rubén Miranda Data curious!