Al iniciarse en data science, el análisis de series temporales es algo que a la gente le encantaría probar por sí misma. La idea general es aprender de los patrones históricos a lo largo del tiempo para predecir el futuro. Los casos de uso típicos podrían ser las predicciones meteorológicas o la previsión de ventas. Pero, ¿qué tiene que ver todo esto con el sabio profeta que te muestro en la imagen de cabecera?

Este artículo pretende eliminar las barreras de entrada para empezar con el análisis de series temporales en un tutorial práctico utilizando una de las herramientas más sencillas, cuyo nombre es Facebook Prophet dentro de Google Colab (¡ambas son gratuitas!). En caso de que quieras empezar inmediatamente, no dudes en saltarte los dos capítulos siguientes, en los que daré una breve introducción a los principios de las series temporales y a Facebook Prophet. Diviértete.

Tabla de contenidos

1. Principios generales del análisis de series temporales

Imagínate que eres gerente de una tienda de productos de consumo y deseas predecir la próxima demanda de productos para gestionar mejor la oferta. Un enfoque razonable de machine learning para este escenario es ejecutar algún análisis de series temporales que implica comprender, modelar y hacer predicciones basadas en puntos de datos secuenciales. [1]

El siguiente gráfico ilustra un desarrollo artificial de la demanda histórica de productos (línea azul oscuro) a lo largo del tiempo, que puede utilizarse para analizar un patrón de series temporales. Nuestro objetivo final sería predecir (línea de puntos rojos) la demanda futura real (línea azul claro) con la mayor precisión posible:

Una serie temporal suele descomponerse en tres componentes principales:

  1. Tendencia: el movimiento a largo plazo o la dirección general de los datos.
  2. Estacionalidad: fluctuaciones o patrones que se repiten a intervalos regulares.
  3. Residual/error: resto o variación sobrante en los datos.

La descomposición de una serie temporal en estos tres componentes, a menudo denominada descomposición aditiva o multiplicativa, permite a los analistas comprender mejor la estructura y las pautas subyacentes. Esta comprensión es esencial para seleccionar modelos de previsión adecuados y realizar predicciones precisas basadas en datos históricos. [2]

2. ¿Qué es Facebook Prophet?

Prophet es una herramienta de código abierto lanzada por el equipo de Data Science de Facebook que produce datos de previsión de series temporales basados en un modelo aditivo en el que se ajusta una tendencia no lineal con efectos de estacionalidad y vacaciones. Los principios de diseño permiten ajustar los parámetros sin mucho conocimiento del modelo subyacente, lo que hace que el método sea aplicable a equipos con menos conocimientos estadísticos. [3]

Prophet es especialmente adecuado para aplicaciones de previsión empresarial, y ha ganado popularidad debido a su facilidad de uso y eficacia en el manejo de una amplia gama de datos de series temporales. Como con cualquier herramienta, hay que tener en cuenta que, aunque Prophet es potente, la elección del método de previsión depende de las características específicas de los datos y de los objetivos del análisis. En general, no está garantizado que Prophet funcione mejor que otros modelos. Sin embargo, Prophet incorpora algunas funciones útiles, como el reflejo del cambio de estacionalidad antes y después de la COVID o el tratamiento de los cierres como vacaciones puntuales.

Para una introducción más detallada por parte de Meta (Facebook), te recomiendo ver el siguiente vídeo en YouTube.

En el siguiente tutorial, implementaremos y utilizaremos Prophet con Python. Sin embargo, ¡también puedes realizar tus análisis con R!

3. Tutorial práctico sobre el uso de Prophet

En caso de que tengas poca experiencia o no tengas acceso a tu entorno de codificación, te recomiendo hacer uso de Google Colaboratory («Colab») que es algo así como «un entorno de Jupyter notebook gratuito que no requiere configuración y se ejecuta completamente en la nube». Si bien este tutorial afirma más sobre la simplicidad y las ventajas de Colab, hay inconvenientes como la potencia de cálculo reducida en comparación con los entornos adecuados en la nube. Sin embargo, creo que Colab puede no ser un mal servicio para dar los primeros pasos con Prophet.

Para configurar un entorno básico de Análisis de Series Temporales dentro de Colab puedes seguir estos dos pasos:

  1. Abrir https://colab.research.google.com/ y registrarte para obtener una cuenta gratuita
  2. Crear un nuevo cuaderno dentro de Colab
  3. Instalar y utilizar el paquete prophet:

pip install prophet

from prophet import Prophet

Carga y preparación de datos

He cargado un pequeño conjunto de datos ficticio que representa la cantidad mensual de pasajeros de una empresa local de autobuses (2012-2023). Puedes encontrar los datos en GitHub.

Como primer paso, cargaremos los datos utilizando pandas y crearemos dos conjuntos de datos separados: un subconjunto de entrenamiento con los años 2012 a 2022 y un subconjunto de prueba con el año 2023. Entrenaremos nuestro modelo de series temporales con el primer subconjunto y trataremos de predecir el número de pasajeros en 2023. Con el segundo subconjunto, podremos validar la precisión más adelante.

import pandas as pd

df_data = pd.read_csv(«https://raw.githubusercontent.com/jonasdieckmann/prophet_tutorial/main/passengers.csv»)

df_data_train = df_data[df_data[«Month»] < «2023-01»]
df_data_test = df_data[df_data[«Month»] >= «2023-01»]

display(df_data_train)

La salida del comando de visualización puede verse a continuación. El conjunto de datos contiene dos columnas: la indicación de la combinación año-mes, así como una columna numérica con el importe de pasajeros en ese mes. Por defecto, Prophet está diseñado para trabajar con datos diarios (o incluso horarios), pero nos aseguraremos de que también se pueda utilizar el patrón mensual.

Descomposición de los datos de entrenamiento

Para comprender mejor los componentes de las series temporales dentro de nuestros datos ficticios, realizaremos una descomposición rápida. Para ello, importamos el método de la biblioteca statsmodels y ejecutamos la descomposición en nuestro conjunto de datos. Nos decidimos por un modelo aditivo e indicamos que un periodo contiene 12 elementos (meses) en nuestros datos. Un conjunto de datos diarios sería period=365.

from statsmodels.tsa.seasonal import seasonal_decompose

decompose = seasonal_decompose(df_data_train.Passengers, model=’additive’, extrapolate_trend=’freq’, period=12)

decompose.plot().show()

Este breve fragmento de código nos dará una impresión visual de las series temporales en sí, pero sobre todo de la tendencia, la estacionalidad y los residuos a lo largo del tiempo:

Ahora podemos ver claramente una tendencia al alza significativa en los últimos 10 años, así como un patrón de estacionalidad reconocible cada año. Siguiendo estas indicaciones, cabría esperar que el modelo predijera un nuevo aumento del número de pasajeros tras los picos estacionales del verano del año siguiente. Pero vamos a probarlo: ¡es hora de aplicar el aprendizaje automático!

Ajuste de modelos con Facebook Prophet

Para ajustar modelos en Prophet, es importante tener al menos una columna «ds» (fecha) e «y» (valor que se va a pronosticar). Debemos asegurarnos de que nuestras columnas tienen el mismo nombre.

df_train_prophet = df_data_train

# date variable needs to be named «ds» for prophet
df_train_prophet = df_train_prophet.rename(columns={«Month»: «ds»})

# target variable needs to be named «y» for prophet
df_train_prophet = df_train_prophet.rename(columns={«Passengers»: «y»})

Ahora puedes empezar la magia. El proceso para ajustar el modelo es bastante sencillo. Sin embargo, por favor, echa un vistazo a la documentación para hacerte una idea de la gran cantidad de opciones y parámetros que podríamos ajustar en este paso. Para simplificar las cosas, ajustaremos un modelo sencillo sin más ajustes por ahora, pero ten en cuenta que los datos del mundo real nunca son perfectos: sin duda necesitarás ajustar los parámetros en el futuro.

model_prophet = Prophet()
model_prophet.fit(df_train_prophet)

Eso es todo lo que tenemos que hacer para ajustar el modelo. ¡Hagamos algunas predicciones!

Hacer predicciones

Tenemos que hacer predicciones en una tabla que tenga una columna ‘ds’ con las fechas para las que quieres predicciones. Para configurar esta tabla, utiliza el método make_future_dataframe, y automáticamente incluirá las fechas históricas. De esta forma, podrás ver lo bien que el modelo se ajusta a los datos pasados y predice el futuro. Como manejamos datos mensuales, indicaremos la frecuencia con «freq=12» y pediremos un horizonte futuro de 12 meses («periods=12»).

df_future = model_prophet.make_future_dataframe(periods=12, freq=’MS’)
display(df_future)

Este nuevo conjunto de datos contiene tanto el periodo de entrenamiento como los 12 meses adicionales que queremos predecir:

Para realizar predicciones, basta con llamar al método predict de Prophet y proporcionar el futuro conjunto de datos. El resultado de la predicción contendrá un gran conjunto de datos con muchas columnas diferentes, pero nos centraremos únicamente en el valor predicho yhat, así como en los intervalos de incertidumbre yhat_inferior y yhat_superior.

forecast_prophet = model_prophet.predict(df_future)
forecast_prophet[[‘ds’, ‘yhat’, ‘yhat_lower’, ‘yhat_upper’]].round().tail()

La tabla siguiente nos da una idea de cómo se genera y almacena el resultado. Para agosto de 2023, el modelo predice un número de pasajeros de 532 personas. El intervalo de incertidumbre (que está fijado por defecto en el 80%) nos indica de forma sencilla que podemos esperar con toda probabilidad una cantidad de pasajeros de entre 508 y 556 personas en ese mes.

Por último, queremos visualizar los resultados para comprender mejor las predicciones y los intervalos.

Visualización de resultados

Para trazar los resultados, podemos utilizar las herramientas de trazado incorporadas en Prophet. Con el método de trazado, podemos mostrar los datos originales de la serie temporal junto con los valores pronosticados.

import matplotlib.pyplot as plt

# plot the time series
forecast_plot = model_prophet.plot(forecast_prophet)

# add a vertical line at the end of the training period
axes = forecast_plot.gca()
last_training_date = forecast_prophet[‘ds’].iloc[-12]
axes.axvline(x=last_training_date, color=’red’, linestyle=’–‘, label=’Training End’)

# plot true test data for the period after the red line
df_data_test[‘Month’] = pd.to_datetime(df_data_test[‘Month’])
plt.plot(df_data_test[‘Month’], df_data_test[‘Passengers’],’ro’, markersize=3, label=’True Test Data’)

# show the legend to distinguish between the lines
plt.legend()

Además del gráfico general de series temporales, hemos añadido una línea de puntos para indicar el final del periodo de entrenamiento y, por tanto, el inicio del periodo de predicción. Además, utilizamos el conjunto de datos de prueba reales que habíamos preparado al principio.

series temporales

Puede verse que nuestro modelo no es tan malo. La mayoría de los valores reales de pasajeros están dentro de los intervalos de incertidumbre previstos. Sin embargo, los meses de verano parecen seguir siendo demasiado pesimistas, lo cual es un patrón que ya podemos ver en años anteriores. Este es un buen momento para empezar a explorar los parámetros y características que podríamos utilizar con Prophet.

En nuestro ejemplo, la estacionalidad no es un factor aditivo constante, sino que crece con la tendencia a lo largo del tiempo. Por lo tanto, podríamos considerar cambiar el seasonality_mode de «aditivo» a «multiplicativo» durante el ajuste del modelo. [4]

Nuestro tutorial concluirá aquí para darnos algo de tiempo para explorar el gran número de posibilidades que nos ofrece Prophet. Para revisar juntos el código completo, he consolidado los fragmentos en este archivo Python. Además, puedes subir este notebook directamente a Colab y ejecutarlo tú mismo. ¡Cuéntame qué tal te ha funcionado!

Conclusión

Prophet es una potente herramienta para predecir valores futuros en datos de series temporales, especialmente cuando tus datos tienen patrones repetitivos como ciclos mensuales o anuales. Es fácil de usar y puede proporcionar rápidamente predicciones precisas para tus datos específicos. Sin embargo, es esencial ser consciente de sus limitaciones. Si tus datos no tienen un patrón claro o si hay cambios significativos que el modelo no haya visto antes, es posible que Prophet no funcione de forma óptima. Comprender estas limitaciones es crucial para utilizar la herramienta con sensatez.

La buena noticia es que es muy recomendable experimentar con Prophet en tus conjuntos de datos. Cada conjunto de datos es único, y ajustar la configuración y probar diferentes enfoques puede ayudarte a descubrir lo que funciona mejor para tu situación específica. Así pues, sumérgete, explora y mira cómo Prophet puede mejorar tus previsiones de series temporales.

References

[1] Shumway, Robert H.; Stoffer, David S. (2017): Time Series Analysis and Its Applications. Cham: Springer International Publishing.

[2] Brownlee, Jason (2017): Introduction to Time Series Forecasting With Python

[3] Rafferty, Greg (2021): Forecasting Time Series Data with Facebook Prophet

[4] https://facebook.github.io/prophet/docs/quick_start.html

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *