Usar feriados personalizados em um modelo de previsão de série temporal

Este tutorial mostra como fazer as seguintes tarefas:

  • Criar um modelo de previsão de série temporal ARIMA_PLUS que use apenas feriados integrados.
  • Criar um modelo de previsão de série temporal ARIMA_PLUS que use feriados personalizados, além de feriados integrados.
  • Confira os resultados previstos desses modelos.
  • Inspecione um modelo para conferir quais feriados ele modela.
  • Avaliar os efeitos dos feriados personalizados nos resultados previstos.
  • Compare o desempenho do modelo que usa apenas feriados integrados com aqueles que usam feriados personalizados, além dos integrados.

Neste tutorial, usamos as tabelas públicas bigquery-public-data.wikipedia.pageviews_*.

Permissões necessárias

  • Para criar o conjunto de dados, é preciso ter a permissão de IAM bigquery.datasets.create.
  • Para criar o recurso de conexão, você precisa das seguintes permissões:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para criar o modelo, você precisa das seguintes permissões:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • Para executar a inferência, você precisa das seguintes permissões:

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

Para mais informações sobre os papéis e as permissões do IAM no BigQuery, consulte Introdução ao IAM.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

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

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Para saber mais, acesse a página Preços do BigQuery.

Antes de começar

  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. Enable the BigQuery API.

    Enable the API

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

    Go to project selector

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

  7. Enable the BigQuery API.

    Enable the API

Criar um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar o modelo de ML:

  1. No console do Google Cloud, acesse a página do BigQuery.

    Acesse a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

  3. Clique em Conferir ações > Criar conjunto de dados.

    Criar conjunto de dados.

  4. Na página Criar conjunto de dados, faça o seguinte:

    • Para o código do conjunto de dados, insira bqml_tutorial.

    • Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).

      Os conjuntos de dados públicos são armazenados na multirregião US. Para simplificar, armazene seus conjuntos de dados no mesmo local.

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

      Página Criar conjunto de dados.

Preparar os dados da série temporal

Agregar os dados de visualização de páginas da Wikipédia para a página do Google I/O em uma única tabela, agrupada por dia:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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)

Crie um modelo de previsão de série temporal que usa feriados integrados

Crie um modelo que preveja visualizações de página diárias da página "Google I/O" da Wikipédia, com base em dados de visualização de página antes de 2022 e considerando os feriados integrados:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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';

Visualize os resultados previstos

Depois de criar o modelo usando feriados integrados, mescle os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST. e visualize-os usando o Looker Studio:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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. No painel Resultados da consulta, clique em Explorar dados e depois em Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia.

  4. Na guia do Looker Studio, clique em Adicionar um gráfico e no gráfico de série temporal:

    Adicionar um gráfico de séries temporais

    Insira o gráfico no relatório.

  5. Na guia Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_without_custom_holiday:

    Inclua outra métrica.

    O gráfico será assim:

    Gráfico de série temporal dos resultados da previsão usando feriados integrados

    O modelo de previsão captura a tendência geral muito bem. No entanto, ela não captura o aumento do tráfego relacionado aos eventos anteriores do Google I/O e não gera uma previsão precisa para

    1. As próximas seções mostram como lidar com algumas dessas limitações.

Criar um modelo de previsão de série temporal que usa feriados personalizados e integrados

Conforme exibido no histórico do Google I/O, o evento do Google I/O ocorreu em datas diferentes entre 2017 e 2022. Para considerar essa variação, crie um modelo que preveja visualizações de página para a página "Google_I/O" da Wikipédia até 2022, com base nos dados de visualização de página anteriores a 2022 e usando feriados personalizados para representar para o evento Google I/O todos os anos. Nesse modelo, ajuste também a janela de efeito de feriado para cobrir três dias perto da data do evento, capturando melhor algum tráfego de página em potencial antes e depois do evento.

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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
        )
    );

Visualize os resultados previstos

Depois de criar o modelo usando feriados personalizados, mescle os dados originais da tabela bqml_tutorial.googleio_page_views com o valor previsto da função ML.EXPLAIN_FORECAST e visualize-o usando o Looker Studio:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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. No painel Resultados da consulta, clique em Explorar dados e depois em Explorar com o Looker Studio. O Looker Studio é aberto em uma nova guia.

  4. Na guia do Looker Studio, clique em Adicionar um gráfico, no gráfico de série temporal e insira o gráfico no relatório.

  5. Na guia Configuração do painel Gráfico, clique em Adicionar métrica e selecione adjusted_views_with_custom_holiday.

    O gráfico será assim:

    Gráfico de série temporal dos resultados da previsão usando feriados personalizados

    Conforme exibido, os feriados personalizados otimizaram o desempenho do modelo de previsão. Agora, é possível capturar com eficácia o aumento de visualizações de página causado pelo Google I/O.

Inspecionar informações de feriados

Inspecione a lista de feriados que foram considerados durante a modelagem usando a função ML.HOLIDAY_INFO:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução SQL:

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

    Os resultados mostram o Google I/O e os feriados integrados na lista de feriados:

    Resultados da função ML.HOLIDAY_INFO.

Avaliar os efeitos dos feriados personalizados

Avaliar os efeitos dos feriados personalizados nos resultados previstos usando a função ML.EXPLAIN_FORECAST:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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;

    Os resultados mostram que o Google I/O contribui com uma grande quantidade de efeito do feriado para os resultados previstos:

    Resultados da função ML.EXPLAIN_FORECAST.

Comparar o desempenho do modelo

Use a função ML.EVALUATE para comparar o desempenho do primeiro modelo criado sem feriados personalizados e do segundo modelo criado com feriados personalizados. Para conferir o desempenho do segundo modelo em relação à previsão de um feriado personalizado, defina o período como a semana do Google I/O em 2022:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No painel Editor SQL, execute a seguinte instrução 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));

    Os resultados mostram que o segundo modelo oferece uma melhoria significativa de desempenho:

    Resultados da função ML.EXPLAIN_FORECAST.

Limpar

  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.