Previsión de varias series temporales con una sola consulta para viajes de Citi Bike en NYC

En este instructivo aprenderás a crear un conjunto de modelos de serie temporal para realizar varias previsiones de series temporales con una sola consulta. Usarás los datos de new_york.citibike_trips. Estos datos contienen información sobre los viajes de Citi Bike en la ciudad de Nueva York.

Antes de leer este instructivo, te recomendamos que leas la Previsión de series temporales individuales a partir de datos de Google Analytics.

Objetivos

En este instructivo usarás lo siguiente:

  • La declaración CREATE MODEL, para crear un modelo de serie temporal o un conjunto de modelos de serie temporal
  • La función ML.ARIMA_EVALUATE, para evaluar el modelo
  • La función ML.ARIMA_COEFFICIENTS, para inspeccionar los coeficientes del modelo
  • La función ML.EXPLAIN_FORECAST, que permite recuperar varios componentes de las series temporales (como la temporada y la tendencia) que se pueden usar para explicar los resultados de la previsión.
  • Google Data Studio, para visualizar los resultados de la previsión
  • La función ML.FORECAST, para prever el total de visitas diarias

Costos

En este instructivo se usan componentes facturables de Google Cloud, que incluyen los siguientes:

  • BigQuery
  • BigQuery ML

Para obtener más información sobre los costos de BigQuery, consulta la página de precios de BigQuery.

Para obtener más información sobre los costos de BigQuery ML, consulta la página de precios de BigQuery ML.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyecto

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. BigQuery se habilita de forma automática en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a Habilita la API BigQuery.

    Habilita la API

Paso uno: Crea el conjunto de datos

El primer paso es crear un conjunto de datos de BigQuery donde se almacenará tu modelo de AA. Para crear tu conjunto de datos, sigue estos pasos:

  1. En Cloud Console, ve a la página de BigQuery.

    Ir a la página de BigQuery

  2. En la sección Recursos, haz clic en el nombre del proyecto.

  3. En el panel de detalles, haz clic en Crear conjunto de datos.

    Crea un conjunto de datos.

  4. En la página Crear conjunto de datos, sigue estos pasos:

    • En ID del conjunto de datos, ingresa bqml_tutorial.
    • En Ubicación de los datos, elige Estados Unidos (EE.UU.). En la actualidad, los conjuntos de datos públicos se almacenan en la ubicación multirregión US. Para que sea más simple, debes colocar el conjunto de datos en la misma ubicación.

      Página Crear un conjunto de datos.

  5. Usa los valores predeterminados para el resto de la configuración y haz clic en Crear conjunto de datos.

Paso dos: Visualiza la serie temporal que deseas prever (opcional)

Antes de crear el modelo, es beneficioso ver cómo se ve la serie temporal de entrada. Puedes lograr esto mediante Google Data Studio.

En la siguiente consulta, la cláusula FROM bigquery-public-data.new_york.citibike_trips indica que consultas la tabla citibike_trips en el conjunto de datos new_york.

En la declaración SELECT, la consulta usa la función EXTRACT para extraer la información de la fecha de la columna starttime. La consulta usa la cláusula COUNT(*) para obtener la cantidad total diaria de viajes con Citi Bike.

#standardSQL
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
GROUP BY date

Para ejecutar la consulta, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date
    
  3. Haz clic en Ejecutar.

    Después de que se ejecuta la consulta, el resultado es similar a la siguiente captura de pantalla. En la captura de pantalla, puedes ver que esta serie temporal tiene 1,184 datos diarios, que abarcan más de 4 años. Haz clic en el botón Explorar datos y, luego, en Explorar con Data Studio. Google Data Studio se abre en una pestaña nueva. Completa los siguientes pasos en la pestaña nueva.

    Resultado de la consulta.

  4. En el panel Gráfico, elige Gráfico de serie temporal (Time series chart):

    Time_series_chart.

  5. En el panel Datos, debajo del panel Gráfico, ve a la sección Métrica. Agrega el campo num_trips y quita la métrica predeterminada Conteo de registros (Record Count):

    Time_series_data_fields.

    Después de completar el paso anterior, aparece el siguiente gráfico. El gráfico muestra que la serie temporal de entrada tiene patrones semanales y anuales. La serie temporal también es una tendencia en alza.

    Result_visualization.

Paso tres: Crea un modelo de serie temporal para realizar una previsión de una serie temporal individual

A continuación, crea un modelo de serie temporal mediante los datos de viajes de Citi Bike en NYC.

La siguiente consulta de SQL estándar crea un modelo que se usa para prever el total de viajes diarios en bicicleta. La cláusula CREATE MODEL crea y entrena un modelo llamado bqml_tutorial.nyc_citibike_arima_model.

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips'
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
GROUP BY date

La cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que creas un modelo de serie temporal basado en ARIMA. De forma predeterminada, auto_arima=TRUE, por lo que el algoritmo auto.ARIMA ajusta de forma automática los hiperparámetros en los modelos ARIMA_PLUS. El algoritmo se adapta a decenas de modelos de candidatos y elige el mejor con el criterio de información Akaike (AIC) más bajo. Además, debido a que el valor predeterminado es data_frequency='AUTO_FREQUENCY', el proceso de entrenamiento infiere de forma automática la frecuencia de datos de la serie temporal de entrada. Por último, la declaración CREATE MODEL usa decompose_time_series=TRUE de forma predeterminada, y los usuarios pueden comprender mejor cómo se prevé la serie temporal mediante la recuperación de componentes de series temporales, como períodos estacionales y efectos de festividades.

Ejecuta la consulta CREATE MODEL para crear y entrenar el modelo:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips'
      ) AS
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date
    
  3. Haga clic en Ejecutar.

    La consulta toma unos 44 segundos en completarse, después de eso, tu modelo (nyc_citibike_arima_model) aparece en el panel de navegación. Debido a que en la consulta se usa una declaración CREATE MODEL para crear un modelo, no se muestran los resultados.

Paso cuatro: Realiza una previsión de las series temporales y visualiza los resultados

Para explicar cómo se prevén las series temporales, visualiza todos los componentes de las series temporales, como la estacionalidad y la tendencia, mediante la función ML.EXPLAIN_FORECAST.

Para ello, haz lo siguiente:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(MODEL bqml_tutorial.nyc_citibike_arima_model,
                          STRUCT(365 AS horizon, 0.9 AS confidence_level))
    
  3. Haz clic en Ejecutar.

  4. Una vez completada la consulta, haz clic en el botón Explorar datos y, luego, en Explorar con Data Studio. Se abrirá una pestaña nueva en el navegador. Luego, en el panel Gráfico, busca el ícono de Gráfico de serie temporal (Time series chart) y haz clic en él, como se muestra en la siguiente captura de pantalla.

    Time_series_chart.

  5. En el panel Datos (Data), haz lo siguiente:

    1. En la sección Dimensión del período (Date Range Dimension), selecciona time_series_timestamp (Date).
    2. En la sección Dimensión (Dimension), selecciona time_series_timestamp (Date).
    3. En la sección Métrica (Metric), quita la métrica predeterminada Record Count y agrega lo siguiente:
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_yearly
      • seasonal_period_weekly
      • spikes_and_dips
      • step_changes

    Time_series_chart.

  6. En el panel Estilo (Style), desplázate hacia abajo hasta la opción Datos faltantes (Missing Data) y usa Saltos de línea (Line Breaks) en lugar de Line to zero.

    Style_section.

    Después de completar estos pasos, aparecerá el siguiente gráfico en el panel izquierdo.

    Result_visualization.

Paso cinco: Realiza una previsión de varias series temporales al mismo tiempo

A continuación, es posible que desees prever la cantidad total diaria de viajes a partir de diferentes estaciones de Citi Bike. Para ello debes prever muchas series temporales. Puedes escribir varias consultas de CREATE MODEL, pero puede ser un proceso tedioso y lento, en especial cuando tienes una gran cantidad de series temporales.

A fin de mejorar este proceso, BigQuery ML te permite crear un conjunto de modelos de serie temporal para prever varias series temporales mediante una sola consulta. Además, todos los modelos de serie temporal se ajustan de forma simultánea.

En la siguiente consulta de SQL estándar, la cláusula CREATE MODEL crea y entrena un conjunto de modelos llamado bqml_tutorial.nyc_citibike_arima_model_group.

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model_group
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 5
  ) AS
SELECT
   start_station_name,
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
WHERE start_station_name LIKE '%Central Park%'
GROUP BY start_station_name, date

La cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que creas un conjunto de modelos de serie temporal ARIMA_PLUS basados en ARIMA. Además de time_series_timestamp_col y time_series_data_col, debes especificar time_series_id_col, que se usa para anotar series temporales de entrada diferentes. La opción auto_arima_max_order controla el espacio de búsqueda para el ajuste de hiperparámetros en el algoritmo auto.ARIMA. Por último, la instrucción CREATE MODEL usa decompose_time_series=TRUE de forma predeterminada, y los usuarios pueden comprender aún más cómo se analiza la serie temporal en la canalización de entrenamiento si recuperas los resultados de la descomposición.

La cláusula SELECT ... FROM ... GROUP BY ... indica que formas varias series temporales, cada una asociada con un start_station_name diferente. Para simplificar usamos la cláusula WHERE ... LIKE ..., a fin de limitar las estaciones de inicio a aquellas con Central Park en el nombre.

A fin de ejecutar la consulta CREATE MODEL para crear y entrenar el modelo, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model_group
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips',
       time_series_id_col = 'start_station_name',
       auto_arima_max_order = 5
      ) AS
    SELECT
       start_station_name,
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    WHERE start_station_name LIKE '%Central Park%'
    GROUP BY start_station_name, date
    
  3. Haga clic en Ejecutar.

    La consulta toma unos 90 segundos en completarse, después de eso, tu modelo (nyc_citibike_arima_model_group) aparece en el panel de navegación. Como la consulta usa una declaración CREATE MODEL, no ves los resultados de la consulta.

Paso seis: Inspecciona las métricas de evaluación del conjunto de modelos de serie temporal

Después de crear los modelos, puedes usar la función ML.ARIMA_EVALUATE para ver las métricas de evaluación de todos los modelos creados.

En la siguiente consulta de SQL estándar, la cláusula FROM usa la función ML.ARIMA_EVALUATE en el modelo, bqml_tutorial.nyc_citibike_arima_model_group. Las métricas de evaluación solo dependen de la entrada de entrenamiento, por lo que el modelo es la única entrada.

Para ejecutar la ML.ARIMA_EVALUATE, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL bqml_tutorial.nyc_citibike_arima_model_group)
    
  3. Haz clic en Ejecutar.

  4. La consulta toma menos de un segundo en completarse. Cuando la consulta finalice, haz clic en la pestaña Resultados debajo del área de texto de la consulta. Los resultados deberían verse de la siguiente manera:

    Resultado de ML.EVALUATE.

    Los resultados incluyen las siguientes columnas:

    • start_station_name
    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    start_station_name, la primera columna, anota la serie temporal en la que se ajusta cada modelo de serie temporal. Es lo mismo que especifica time_series_id_col.

    Las siguientes cuatro columnas (non_seasonal_p, non_seasonal_d, non_seasonal_q y has_drift) definen un modelo ARIMA en la canalización de entrenamiento. Las tres métricas posteriores (log_likelihood, AIC y variance) son relevantes para el proceso de ajuste del modelo ARIMA. El proceso de ajuste determina el mejor modelo ARIMA con el algoritmo auto.ARIMA, uno para cada serie temporal.

    Las columnas has_holiday_effect, has_spikes_and_dips y has_step_changes solo se propagan cuando decompose_time_series=TRUE.

    La columna seasonal_periods es el patrón estacional dentro de la serie temporal de entrada. Cada serie temporal puede tener diferentes patrones estacionales. Por ejemplo, en la figura, puedes ver que una serie temporal tiene un patrón anual, mientras que otras no.

Paso siete: Inspecciona los coeficientes de los modelos

La función ML.ARIMA_COEFFICIENTS se usa para recuperar los coeficientes del modelo ARIMA_PLUS, bqml_tutorial.nyc_citibike_arima_model_group. ML.ARIMA_COEFFICIENTS toma el modelo como la única entrada.

Para ejecutar la consulta ML.ARIMA_COEFFICIENTS, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL bqml_tutorial.nyc_citibike_arima_model_group)
    
  3. Haz clic en Ejecutar.

    La consulta toma menos de un segundo en completarse. Los resultados deberían ser similares a los de la siguiente captura de pantalla:

    Resultado de ML.ARIMA_COEFFICIENTS.

    Los resultados incluyen las siguientes columnas:

    • start_station_name
    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    start_station_name, la primera columna, anota la serie temporal en la que se ajusta cada modelo de serie temporal.

    ar_coefficients muestra los coeficientes del modelo de la parte autorregresiva (AR) del modelo ARIMA. De manera similar, ma_coefficients muestra los coeficientes del modelo de la parte de promedio móvil (MA). Ambos son arreglos, cuyas longitudes son iguales a non_seasonal_p y non_seasonal_q, respectivamente. El intercept_or_drift es el término constante en el modelo ARIMA.

Paso ocho: Usa el modelo para prever varias series temporales de forma simultánea

con explicaciones

La función ML.EXPLAIN_FORECAST prevé valores de series temporales futuras con un intervalo de predicción mediante el modelo bqml_tutorial.nyc_citibike_arima_model_group y, al mismo tiempo, muestra todos los componentes separados de la serie temporal.

La cláusula STRUCT(3 AS horizon, 0.9 AS confidence_level) indica que la consulta prevé tres puntos de tiempo futuros y genera un intervalo de predicción con una confianza del 90%. La función ML.EXPLAIN_FORECAST toma el modelo, así como algunos argumentos opcionales.

Para ejecutar la consulta ML.EXPLAIN_FORECAST, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL bqml_tutorial.nyc_citibike_arima_model_group,
                         STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. Haz clic en Ejecutar.

    La consulta toma menos de un segundo en completarse. Los resultados deberían verse como estos:

    output1 de ML.EXPLAIN_FORECAST1. output2 de ML.EXPLAIN_FORECAST2

    Los resultados incluyen las siguientes columnas:

    • start_station_name
    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes

    Las filas de salida se ordenan por start_station_name y, para cada start_station_name, las filas de salida están en el orden cronológico de time_series_timestamp. Los diferentes componentes se enumeran como columnas del resultado. Para obtener más información, consulta la definición de ML.EXPLAIN_FORECAST.

Paso nueve: Usa el modelo para prever varias series temporales (opcional)

en simultáneo

La función ML.FORECAST también se puede usar para predecir valores de series temporales futuras con un intervalo de predicción mediante tu modelo, bqml_tutorial.nyc_citibike_arima_model_group.

Al igual que ML.EXPLAIN_FORECAST, la cláusula STRUCT(3 AS horizon, 0.9 AS confidence_level) indica que, para cada serie temporal, la consulta predice tres puntos futuros y genera un intervalo de predicción con un 90% de confianza.

La función ML.FORECAST toma el modelo, así como algunos argumentos opcionales.

Para ejecutar la consulta ML.FORECAST, sigue estos pasos:

  1. En Cloud Console, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL bqml_tutorial.nyc_citibike_arima_model_group,
                 STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. Haz clic en Ejecutar.

    La consulta toma menos de un segundo en completarse. Los resultados deberían verse de la siguiente manera:

    Resultado de ML.FORECAST.

    Los resultados incluyen las siguientes columnas:

    • start_station_name
    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound (próximamente dejará de estar disponible)
    • confidence_interval_upper_bound (próximamente dejará de estar disponible)

    start_station_name, la primera columna, anota la serie temporal en la que se ajusta cada modelo de serie temporal. Cada start_station_name tiene una cantidad de filas de horizonte para los resultados de previsión.

    Para cada start_station_name, las filas de salida se ordenan en el orden cronológico de forecast_timestamp. En la previsión de series temporales, el intervalo de confianza, que capturan los límites inferior y superior, es tan importante como el forecast_value. El forecast_value es el punto medio del intervalo de confianza. El intervalo de confianza depende del standard_error y el confidence_level.

Realice una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

  • Puedes borrar el proyecto que creaste.
  • De lo contrario, puedes mantener el proyecto y borrar el conjunto de datos.

Borra tu conjunto de datos

Borrar tu proyecto quita todos sus conjuntos de datos y tablas. Si prefieres volver a usar el proyecto, puedes borrar el conjunto de datos que creaste en este instructivo:

  1. Si es necesario, abre la página de BigQuery en Cloud Console.

    Ir a la página de BigQuery

  2. En el panel de navegación, haz clic en el conjunto de datos bqml_tutorial que creaste.

  3. Haz clic en Borrar conjunto de datos para borrar el conjunto de datos, la tabla y todos los datos.

  4. En el cuadro de diálogo Borrar conjunto de datos, escribe el nombre del conjunto de datos (bqml_tutorial) para confirmar el comando de borrado y, luego, haz clic en Borrar.

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?