Modelos de Series de Tiempo en Python

Pronóstico de viajes en bicicletas públicas para la CDMX

Rafael González Gouveia
Ciencia y Datos
5 min readDec 4, 2018

--

¡Hola Mundo! En este articulo quiero realizar un pronóstico de los viajes en bicicletas públicas para la Ciudad de México (CDMX). Los datos son los viajes realizados durante el mes de octubre de 2018 en EcoBici. Se utiliza un modelo de series de tiempo ARIMA estacional. Pretendo mostrar una parte del proceso de ciencia de datos a través de este caso de estudio.

EcoBici es el sistema de bicicletas públicas de la CDMX. Es utilizado por sus habitantes y turistas como medio de transporte y recreación. Este servicio se presta desde 2010 y cuenta con más de 170 mil usuarios registrados, más de 6 mil 800 bicicletas y mas de 100 cicloestaciones distribuidas en 55 colonias de la ciudad. Fuente: https://www.ecobici.cdmx.gob.mx/es/informacion-del-servicio/que-es-ecobici

El artículo se divide en secciones que resumen el proceso de ciencia de datos en cuatro etapas

Descarga > Procesamiento > Modelos > Pronósticos

Todo el proyecto puede ser consultado en su repositorio de GitHub.

Estoy atento a sugerencias, preguntas o comentarios y también si quieres aprender más sobre Data Science en Python, te recomiendo mirar esté video de mi canal de YouTube:

Ahora sí, Empecemos.

Descarga

Los datos pueden descargase manualmente en la web de EcoBici. Utilizaremos la tabla de los viajes que ocurrieron en el mes de octubre de 2018.

En la web de EcoBici seleccionamos el año y mes deseado

Para la lectura, limpieza y procesamiento utilizamos los dataframes de pandas.

Luego de leer los datos obtenemos la siguiente tabla

El próximo paso es limpiar y procesar los viajes para que puedan ser utilizados en los modelos de series temporales.

Procesamiento

Para obtener la cantidad de viajes se puede incorporar un índice temporal al dataframe y luego agrupar según la cantidad de viajes por hora. Concatenamos las columnas de fecha y hora de retiro separadas por un espacio y cambiamos el tipo de dato de string a datetime. Luego asignamos los tiempos al índice del dataframe y limpiamos posibles valores para otros meses o años. Estas tareas se pueden realizar utilizando el siguiente código:

La expresión lambda es una forma de escribir funciones sobre la marcha. Es una alternativa a “def” con la cual no es necesario asignar nombre a la función. Las funciones lambda también son llamadas funciones anónimas. Por otro lado, el método .map() aplica una función a cada elemento de la columna.

El próximo paso es la agrupación de viajes por hora. Esto lo podemos hacer con el siguiente código:

El método .resample() permite calcular estadísticas (como conteos, sumas, promedios, etc) sobre diferentes intervalos de tiempo. Es importante tener un índice temporal para que este método pueda aplicarse sin mayor inconveniente.

La gráfica de la primera semana de octubre es la siguiente:

Cantidad de viajes por hora. Lunes es 01. Viernes es 05.

Los datos empiezan a contar una historia. Para cada día ocurre un primer pico en en las mañanas, posiblemente sea gente que va a trabajar. Hay otro pico al rededor de las 2pm, que suele ser la hora de la comida y el descanso. Por último, la mayor cantidad de viajes ocurre a partir de las 6pm, cuando ya vamos de regreso a casa y alguno que otro sale a pasear en bici en la noche (como yo). Este patrón se repite con cierta regularidad cada 24 horas. Es nuestro trabajo como científicos de datos capturar esa historia en un modelo estadístico, que es el objetivo de la siguiente sección.

Modelos para series de tiempo

Queremos pronosticar la cantidad de viajes por hora del día. Para esto, utilizamos la variable dependiente o target (la cantidad de viajes) en un tiempo anterior como variable independiente o feature (sí, suena complicado al principio). Por ejemplo, la cantidad de viajes que se realiza un día a las 13 horas puede estar relacionada con la cantidad de viajes que se realizaron a las 13 horas de uno o dos días antes.

El tipo de modelos que sigue esta filosofía se llaman AutoRegresivos o AR. Utilizaremos una variante más avanzada llamada SARIMA (Seasonal AutoRegressive Integrated Moving Average). Estos modelos consideran además la estacionalidad, lo que permite incorporar el patrón repetitivo de cada día.

En Python existe una implementación del SARIMA en el módulo statsmodels. Este módulo posee ademas clases y funciones para la estimación de diferentes modelos estadísticos.

Esta familia de modelos suele denotarse como SARIMA(p,d,q)(P,D,Q)[m]. Los términos (p,d,q) se refieren a los términos autoregresivos, integrados y de media móvil respectivamente. Los términos (P,D,Q) se refieren a la parte estacional de los mismos términos, con m periodos. En nuestro caso nos interesa una estacionalidad de 24 periodos (horas). El resto de los términos ha sido escogido por ensayo y error (minimizando el AIC). Luego de varias pruebas nos quedamos con la familia SARIMA(2,0,1)x(2,1,0)[24].

Para estimar los parámetros y el AIC del modelo utilizamos el siguiente código:

Ahora podemos calcular los pronósticos para los siguientes días de la semana.

Pronósticos

Para observar los pronósticos generamos una gráfica con la estimación puntual y de intervalos para el resto de la semana. Como el 31 de octubre de 2018 fue miércoles, se presentan las estimaciones para los primeros dos días de noviembre, jueves y viernes. De esta forma se puede apreciar como el modelo captura el patrón del comportamiento de los viajes en bici.

La gráfica se obtuvo con el siguiente código:

Conclusiones

A lo largo de este análisis hemos recorrido distintas etapas del proceso de ciencia de datos. En resumen:

  • Se descargaron datos públicos del sistema de EcoBici.
  • Se transformaron entradas de texto en índices temporales.
  • Se agruparon los datos para obtener a cantidad de viajes por hora y por día de la semana.
  • Se discutió sobre modelos autoregresivos.
  • Se ajustó un modelo SARIMA a nuestros datos.
  • Se pronosticó la cantidad de viajes para los primeros días de noviembre.

Los modelos de series de tiempo pueden ser una herramienta clave para pronosticar los valores futuros de una métrica o indicador. Espero que te hayas llevado algo interesante del articulo.

Recuerda para más información de programación para ciencia de datos puedes suscribirte en YouTube:

Te mando un saludo donde quiera que estés!

--

--