Previsión de series temporales individuales a partir de datos de Google Analytics


En este instructivo, aprenderás a crear un modelo de serie temporal para realizar previsiones de series temporales individuales mediante la tabla de muestra google_analytics_sample.ga_sessions.

La tabla ga_sessions contiene información sobre una parte de los datos de sesión que recopiló Google Analytics 360 y que se enviaron a BigQuery.

Objetivos

En este instructivo usarás lo siguiente:

  • La declaración CREATE MODEL, para crear un modelo 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.FORECAST, para prever el total de visitas diarias
  • 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.
  • Looker Studio: Para visualizar los resultados de la previsión.

Costos

En este instructivo, se usan componentes facturables de Google Cloud, incluidos 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 los precios de BigQuery ML.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. BigQuery se habilita automáticamente en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a

    Enable the BigQuery API.

    Enable the API

Paso uno: Crea tu conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:

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

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haz clic en Ver acciones > Crear conjunto de datos.

    Crea un conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, ingresa bqml_tutorial.

    • En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).

      Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

    • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

      Página Crear un conjunto de datos

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

Antes de crear el modelo, es útil ver cómo se ve la serie temporal de entrada.

SQL

Puedes hacerlo mediante Looker Studio.

En la siguiente consulta de GoogleSQL, la cláusula FROM bigquery-public-data.google_analytics_sample.ga_sessions_* indica que consultas las tablas ga_sessions_* en el conjunto de datos google_analytics_sample. Estas tablas son tablas particionadas.

En la declaración SELECT, la consulta analiza la columna date de la tabla de entrada al tipo TIMESTAMP y le cambia el nombre a parsed_date. La consulta usa la cláusula SUM(...) y la cláusula GROUP BY date para acumular totals.visits a diario.

#standardSQL
SELECT
PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
SUM(totals.visits) AS total_visits
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

Para ejecutar la consulta, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
  3. Haz clic en Ejecutar.

    La consulta toma unos 7 segundos en completarse. Después de que se ejecuta esta consulta, el resultado es similar a la siguiente captura de pantalla. En la captura de pantalla, puedes ver que esta serie temporal tiene 366 datos. Haz clic en el botón Explorar datos y, luego, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva. Completa los siguientes pasos en la pestaña nueva.

    Resultado de la consulta

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

    Time_series_chart

    En el panel Datos (Data), debajo del panel Gráfico (Chart), ve a la sección Métrica (Metric). Agrega el campo total_visits y, luego, quita la métrica predeterminada Conteo de registros (Record Count). Esto se muestra en la siguiente figura.

    Time_series_data_fields

    Después de completar estos pasos, aparecerá el siguiente gráfico. El gráfico muestra que la serie temporal de entrada tiene un patrón estacional semanal.

    Result_visualization

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de BigQuery DataFrames.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
visits = df["totals"].struct.field("visits")
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: visits, dtype: Int64

total_visits.plot.line()

El resultado es similar al siguiente:Result_visualization

Paso tres: Crea un modelo de serie temporal

A continuación, crea un modelo de serie temporal mediante los datos de Google Analytics 360. En la siguiente consulta de GoogleSQL, se crea un modelo que se usa para prever totals.visits.

La cláusula CREATE MODEL crea y entrena un modelo llamado bqml_tutorial.ga_arima_model.

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'parsed_date',
   time_series_data_col = 'total_visits',
   auto_arima = TRUE,
   data_frequency = 'AUTO_FREQUENCY',
   decompose_time_series = TRUE
  ) AS
SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
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 los componentes de series temporales diferentes, como las temporadas y el efecto de festividades.

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

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
    OPTIONS
     (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'parsed_date',
      time_series_data_col = 'total_visits',
      auto_arima = TRUE,
      data_frequency = 'AUTO_FREQUENCY',
      decompose_time_series = TRUE
    ) AS
    SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
     SUM(totals.visits) AS total_visits
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
  3. Haz clic en Ejecutar.

    La consulta toma unos 43 segundos en completarse, después de eso, tu modelo (ga_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: Inspecciona las métricas de evaluación de todos los modelos evaluados

Después de crear el modelo, puedes usar la función ML.ARIMA_EVALUATE para ver las métricas de evaluación de todos los modelos candidatos que se evaluaron durante el proceso de ajuste automático de hiperparámetros.

En la siguiente consulta de GoogleSQL, la cláusula FROM usa la función ML.ARIMA_EVALUATE en el modelo, bqml_tutorial.ga_arima_model. De forma predeterminada, esta consulta muestra las métricas de evaluación de todos los modelos candidatos.

Para ejecutar la ML.ARIMA_EVALUATE, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`)
  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 (Results) debajo del área de texto de la consulta. Los resultados deberían ser similares a los de la siguiente captura de pantalla:

    Resultado de ML.ARIMA_EVALUATE.

    Los resultados incluyen las siguientes columnas:

    • 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

    Las siguientes cuatro columnas (non_seasonal_{p,d,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 algoritmo auto.ARIMA primero usa la prueba de KPSS para decidir que el mejor valor de non_seasonal_d es 1. Cuando non_seasonal_d es 1, auto.ARIMA entrena 42 candidatos diferentes de modelos ARIMA en paralelo. Ten en cuenta que, cuando non_seasonal_d no es 1, auto.ARIMA entrena 21 modelos candidatos diferentes. En este ejemplo, los 42 modelos candidatos son válidos. Por lo tanto, el resultado contiene 42 filas y cada una está asociada con un candidato de modelo ARIMA. Ten en cuenta que, para algunas series temporales, algunos modelos candidatos no son válidos, ya que no son invertibles o no son fijos. Estos modelos no válidos se excluyen del resultado, lo que hará que tenga menos de 42 filas. Estos modelos candidatos se ordenan por AIC en orden ascendente. El modelo de la primera fila tiene el AIC más bajo y se considera el mejor modelo. El mejor modelo se guarda como el modelo final y se usa cuando llamas a ML.EXPLAIN_FORECAST, ML.FORECAST, y ML.ARIMA_COEFFICIENTS como se muestra en los siguientes pasos.

    La columna seasonal_periods es el patrón estacional dentro de la serie temporal de entrada. No tiene nada que ver con el modelo ARIMA, por lo tanto, tiene el mismo valor en todas las filas de salida. Informa un patrón semanal, que está dentro de nuestras expectativas, como se describe en el paso dos.

    Las columnas has_holiday_effect, has_spikes_and_dips y has_step_changes solo se propagan cuando decompose_time_series=TRUE. Se relacionan con el efecto, los aumentos y las disminuciones de las festividades, y los cambios de pasos dentro de la serie temporal de entrada, que no están relacionados con el modelo ARIMA. Por lo tanto, todas son iguales en todas las filas de salida, excepto en los modelos con fallas.

    La columna error_message muestra el posible error generado durante el proceso de ajuste auto.ARIMA. Un motivo posible es que las columnas non_seasonal_p, non_seasonal_d, non_seasonal_q y has_drift seleccionadas no pueden estabilizar la serie temporal. Para recuperar el mensaje de error posible de todos los modelos candidatos, configura show_all_candidate_models=true.

Paso cinco: Inspecciona los coeficientes del modelo

La función ML.ARIMA_COEFFICIENTS recupera los coeficientes del modelo ARIMA, bqml_tutorial.ga_arima_model. ML.ARIMA_COEFFICIENTS toma el modelo como la única entrada.

Ejecuta la consulta ML.ARIMA_COEFFICIENTS:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

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

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

    Resultado de ML.ARIMA_COEFFICIENTS.

    Los resultados incluyen las siguientes columnas:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    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. A partir del resultado de ML.ARIMA_EVALUATE, el mejor modelo de la fila superior tiene un non_seasonal_p de 2 y un non_seasonal_q de 3. Por lo tanto, ar_coefficients es un arreglo de longitud 2 y ma_coefficients es un arreglo de longitud 3. El intercept_or_drift es el término constante en el modelo ARIMA.

Paso seis: Usa el modelo para prever la serie temporal

La función ML.FORECAST prevé valores de series temporales futuras con un intervalo de confianza mediante el modelo bqml_tutorial.ga_arima_model.

En la siguiente consulta de GoogleSQL, la cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) indica que la consulta prevé 30 puntos futuros y genera un intervalo de predicción con un nivel de confianza del 80%. ML.FORECAST toma el modelo, así como algunos argumentos opcionales.

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

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 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:

    • 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)

    Las filas de salida se ordenan en 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.

Paso siete: Explica y visualiza los resultados de la previsión

Para comprender cómo se prevén las series temporales y visualizar las series temporales previstas junto con el historial de series temporales y todos los componentes diferentes, la función ML.EXPLAIN_FORECAST realiza una previsión de los valores de series temporales futuras con un intervalo de predicción mediante el modelo bqml_tutorial.ga_arima_model y, al mismo tiempo, muestra todos los componentes distintos de la serie temporal.

Al igual que la función ML.FORECAST, la cláusula STRUCT(30 AS horizon, 0.8 AS confidence_level) indica que la consulta prevé 30 puntos temporales futuros y genera un intervalo de predicción con una confianza del 80%. 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 la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                         STRUCT(30 AS horizon, 0.8 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:

    • 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
    • residual

    Las filas de salida se ordenan en 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.

  4. Una vez completada la consulta, haz clic en el botón Explorar datos y, luego, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva.

    Resultado de Union_all_query

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

    Time_series_chart

  6. 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_weekly
      • step_changes

    Data_panel

  7. 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

    Aparece el siguiente gráfico:

    Result_visualization

Paso ocho (opcional): Visualiza los resultados de previsión sin tener habilitado decompose_time_series

Si decompose_time_series se configura como falso en el entrenamiento de ARIMA_PLUS, puedes concatenar la serie temporal del historial y la serie temporal prevista con la cláusula UNION ALL y la función ML.FORECAST.

En la siguiente consulta, el SQL antes de la cláusula UNION ALL forma el historial de series temporales. El SQL después de la cláusula UNION ALL usa la función ML.FORECAST para generar las series temporales previstas y el intervalo de predicción. La consulta usa diferentes campos para history_value y forecasted_value, a fin de trazarlos en diferentes colores.

Para ejecutar la consulta, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de GoogleSQL en el área de texto del Editor de consultas.

    #standardSQL
    SELECT
     history_timestamp AS timestamp,
     history_value,
     NULL AS forecast_value,
     NULL AS prediction_interval_lower_bound,
     NULL AS prediction_interval_upper_bound
    FROM
     (
       SELECT
         PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
         SUM(totals.visits) AS history_value
       FROM
         `bigquery-public-data.google_analytics_sample.ga_sessions_*`
       GROUP BY date
       ORDER BY date ASC
     )
    UNION ALL
    SELECT
     forecast_timestamp AS timestamp,
     NULL AS history_value,
     forecast_value,
     prediction_interval_lower_bound,
     prediction_interval_upper_bound
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 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 Looker Studio. Looker Studio se abre en una pestaña nueva. Completa los siguientes pasos en la pestaña nueva.

    Resultado de Union_all_query

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

    Time_series_chart

  6. En el panel Datos, debajo del panel Gráfico, ve a la sección Métrica. Agrega las siguientes métricas: history_value, forecast_value, prediction_interval_lower_bound y prediction_interval_upper_bound. Luego, quita la métrica predeterminada Record Count.

    Data_section

  7. 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. El historial de series temporales de entrada está en azul, mientras que la serie prevista está en verde. El intervalo de confianza es la región entre la serie de límite inferior y la serie de límite superior.

    Result_visualization

Realiza 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 la consola de Google Cloud.

    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 en el lado derecho de la ventana. Esta acción borra el conjunto de datos, la tabla y todos los datos.

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

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

¿Qué sigue?