Usa días feriados personalizados en un modelo de previsión de series temporales ARIMA_PLUS

En este instructivo, se muestra cómo realizar las siguientes tareas:

  • Crea un modelo de previsión de series temporales ARIMA_PLUS que solo use días feriados integrados.
  • Crea un modelo de previsión de series temporales ARIMA_PLUS que use días feriados personalizados, además de los días feriados integrados.
  • Visualiza los resultados previstos de estos modelos.
  • Inspecciona un modelo para ver qué días modela.
  • Evalúa los efectos de los feriados personalizados en los resultados previstos.
  • Compara el rendimiento del modelo que usa solo feriados integrados con el rendimiento del modelo que usa feriados personalizados además de los feriados integrados.

En este instructivo, se usan las tablas públicas bigquery-public-data.wikipedia.pageviews_*.

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create de IAM.

  • Para crear el modelo, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para ejecutar inferencias, necesitas los siguientes permisos:

    • bigquery.models.getData
    • bigquery.jobs.create

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta Introducción a IAM.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • BigQuery: You incur costs for the data you process in BigQuery.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Para obtener más información, consulte los Precios de BigQuery.

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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Crea un conjunto de datos

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

    Console

    1. En la consola de Google Cloud , ve a la página 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.

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

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

    bq

    Para crear un conjunto de datos nuevo, usa el comando bq mk con la marca --location. Para obtener una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

    1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos establecida en US y una descripción de BigQuery ML tutorial dataset:

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omites -d y --dataset, el comando crea un conjunto de datos de manera predeterminada.

    2. Confirma que se haya creado el conjunto de datos:

      bq ls

    API

    Llama al método datasets.insert con un recurso de conjunto de datos definido.

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    Permite trabajar con 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 ADC para un entorno de desarrollo local.

    import google.cloud.bigquery
    
    bqclient = google.cloud.bigquery.Client()
    bqclient.create_dataset("bqml_tutorial", exists_ok=True)

    Prepara los datos de series temporales

    Agrega los datos de las vistas de página de Wikipedia de la página de Google I/O en una sola tabla, agrupados por día:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views`
      AS
      SELECT
        DATETIME_TRUNC(datehour, DAY) AS date,
        SUM(views) AS views
      FROM
        `bigquery-public-data.wikipedia.pageviews_*`
      WHERE
        datehour >= '2017-01-01'
        AND datehour < '2023-01-01'
        AND title = 'Google_I/O'
      GROUP BY
        DATETIME_TRUNC(datehour, DAY)

    Crea un modelo de previsión de series temporales que use feriados integrados

    Crea un modelo que pronostique las vistas de página diarias de Wikipedia de “Google I/O”, según los datos de vistas de página anteriores a 2022 y teniendo en cuenta los feriados integrados:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.googleio_page_views`
      WHERE
        date < '2022-01-01';

    Visualiza los resultados previstos

    Después de crear el modelo mediante días festivos integrados, une los datos originales de la tabla bqml_tutorial.googleio_page_views con el valor previsto de la función ML.EXPLAIN_FORECAST. Luego, visualízalo con el uso de Looker Studio:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_without_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL `bqml_tutorial.forecast_googleio`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. En el panel Resultados de la consulta, haz clic en Explorar datos y, luego, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva.

    4. En la pestaña Looker Studio, haz clic en Agregar un gráfico y, luego, en el gráfico de serie temporal:

      Agrega un gráfico de serie temporal

      Coloca el gráfico en el informe.

    5. En la pestaña Configuración del panel Gráfico, haz clic en Agregar métrica y selecciona adjusted_views_without_custom_holiday:

      Agrega una métrica adicional.

      El gráfico es similar al siguiente:

      Gráfico de serie temporal de resultados de previsión con feriados integrados

      Puedes ver que el modelo de previsión captura bien la tendencia general. Sin embargo, no captura el aumento del tráfico relacionado con los eventos anteriores de Google I/O y no puede generar una previsión precisa.

      1. En las siguientes secciones, se muestra cómo lidiar con algunas de estas limitaciones.

    Crea un modelo de previsión de series temporales que use feriados integrados y personalizados

    Como puedes ver en Historial de Google I/O, el evento de Google I/O ocurrió en diferentes fechas entre 2017 y 2022. Para tener en cuenta esta variación, crea un modelo que pronostique las vistas de la página “Google_I/O” de Wikipedia hasta 2022, según los datos de las vistas de página anteriores a 2022 y que usen feriados personalizados para representar el evento de Google I/O cada año. En este modelo, también debes ajustar el período del efecto de los feriados a fin de que abarque tres días alrededor de la fecha del evento para capturar mejor algo de tráfico potencial de página antes y después del evento.

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`
        OPTIONS (
          model_type = 'ARIMA_PLUS',
          holiday_region = 'US',
          time_series_timestamp_col = 'date',
          time_series_data_col = 'views',
          data_frequency = 'DAILY',
          horizon = 365)
      AS (
        training_data AS (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date < '2022-01-01'
          ),
        custom_holiday AS (
            SELECT
              'US' AS region,
              'GoogleIO' AS holiday_name,
              primary_date,
              1 AS preholiday_days,
              2 AS postholiday_days
            FROM
              UNNEST(
                [
                  DATE('2017-05-17'),
                  DATE('2018-05-08'),
                  DATE('2019-05-07'),
                  -- cancelled in 2020 due to pandemic
                  DATE('2021-05-18'),
                  DATE('2022-05-11')])
                AS primary_date
          )
      );

    Visualiza los resultados previstos

    Después de crear el modelo con feriados personalizados, une los datos originales de la tabla bqml_tutorial.googleio_page_views con el valor previsto de la función ML.EXPLAIN_FORECAST y, luego, para visualizarlo, usa Looker Studio:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      SELECT
        original.date,
        original.views AS original_views,
        explain_forecast.time_series_adjusted_data
          AS adjusted_views_with_custom_holiday,
      FROM
        `bqml_tutorial.googleio_page_views` original
      INNER JOIN
        (
          SELECT
            *
          FROM
            ML.EXPLAIN_FORECAST(
              MODEL
                `bqml_tutorial.forecast_googleio_with_custom_holiday`,
              STRUCT(365 AS horizon))
        ) explain_forecast
        ON
          TIMESTAMP(original.date)
          = explain_forecast.time_series_timestamp
      ORDER BY
        original.date;
    3. En el panel Resultados de la consulta, haz clic en Explorar datos y, luego, en Explorar con Looker Studio. Looker Studio se abre en una pestaña nueva.

    4. En la pestaña Looker Studio, haz clic en Agregar un gráfico, haz clic en el gráfico de serie temporal y coloca el gráfico en el informe.

    5. En la pestaña Configuración del panel Gráfico, haz clic en Agregar métrica y selecciona adjusted_views_with_custom_holiday.

      El gráfico es similar al siguiente:

      Gráfico de serie temporal de resultados de previsión con feriados personalizados

      Como puedes ver, los feriados personalizados aumentaron el rendimiento del modelo de previsión. Ahora, captura de manera eficaz el aumento de las vistas de página que generó Google I/O.

    Inspecciona la información sobre los feriados

    Inspecciona la lista de feriados que se tomaron en cuenta durante el modelado mediante la función ML.HOLIDAY_INFO:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      SELECT *
      FROM
        ML.HOLIDAY_INFO(
          MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);

      En los resultados, se muestran Google I/O y los feriados integrados en la lista de feriados:

      Resultados de la función ML.HOLIDAY_INFO.

    Evalúa los efectos de los feriados personalizados

    Evalúa los efectos de los feriados personalizados en los resultados previstos mediante la función ML.EXPLAIN_FORECAST:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      SELECT
        time_series_timestamp,
        holiday_effect_GoogleIO,
        holiday_effect_US_Juneteenth,
        holiday_effect_Christmas,
        holiday_effect_NewYear
      FROM
        ML.EXPLAIN_FORECAST(
          model
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          STRUCT(365 AS horizon))
      WHERE holiday_effect != 0;

      Los resultados muestran que Google I/O contribuye con una gran cantidad de efectos de feriados a los resultados previstos:

      Resultados de la función ML.EXPLAIN_FORECAST.

    Cómo comparar el rendimiento del modelo

    Usa la función ML.EVALUATE para comparar el rendimiento del primer modelo creado sin feriados personalizados y el segundo modelo creado con feriados personalizados. Para ver el rendimiento del segundo modelo cuando se trata de pronosticar un feriado personalizado futuro, configura el intervalo de tiempo en la semana de Google I/O en 2022:

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      SELECT
        "original" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL `bqml_tutorial.forecast_googleio`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation))
      UNION ALL
      SELECT
        "with_custom_holiday" AS model_type,
        *
      FROM
        ml.evaluate(
          MODEL
            `bqml_tutorial.forecast_googleio_with_custom_holiday`,
          (
            SELECT
              *
            FROM
              `bqml_tutorial.googleio_page_views`
            WHERE
              date >= '2022-05-08'
              AND date < '2022-05-12'
          ),
          STRUCT(
            365 AS horizon,
            TRUE AS perform_aggregation));

      Los resultados muestran que el segundo modelo ofrece una mejora significativa del rendimiento:

      Resultados de la función ML.EXPLAIN_FORECAST.

    Limpia

    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.