時系列予測モデルでカスタム休日を使用する

このチュートリアルでは、次のタスクを行う方法を説明します。

  • 組み込み休日のみを使用する ARIMA_PLUS 時系列予測モデルを作成します。
  • 組み込み休日に加えてカスタム休日を使用する ARIMA_PLUS 時系列予測モデルを作成します。
  • これらのモデルによる予測結果を可視化します。
  • モデルを調べて、モデリングされる休日を確認します。
  • カスタム休日が予測結果に与える影響を評価します。
  • 組み込み休日のみを使用するモデルのパフォーマンスと、組み込み休日に加えてカスタム休日を使用するモデルのパフォーマンスを比較します。

このチュートリアルでは、一般公開テーブル bigquery-public-data.wikipedia.pageviews_* を使用します。

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。
  • 接続リソースを作成するには、次の権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • モデルを作成するには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 推論を実行するには、次の権限が必要です。

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

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

詳細については、BigQuery の料金をご覧ください。

始める前に

  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

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. 「アクションを表示」> [データセットを作成] をクリックします。

    データセットを作成する。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

      データセットの作成ページ。

時系列データを準備する

Google I/O の Wikipedia のページビュー データを単一のテーブルに日ごとにグループ化して集約します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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)

組み込み休日を使用する時系列予測モデルを作成する

Wikipedia の「Google I/O」ページの 1 日あたりのページビューを予測するモデルを、2022 年より前のページビュー データに基づき、組み込み休日を考慮して、作成します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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';

予測結果を可視化する

組み込み休日を使用してモデルを作成したら、bqml_tutorial.googleio_page_views テーブルの元のデータを ML.EXPLAIN_FORECAST 関数の予測値と結合してから、Looker Studio を使用して可視化します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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. [クエリ結果] ペインで、[データを探索] をクリックして、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。

  4. [Looker Studio] タブで、[Add a chart] をクリックし、時系列グラフをクリックします。

    時系列グラフを追加する

    グラフをレポートに配置します。

  5. [グラフ] ペインの [設定] タブで、[指標を追加] をクリックし、[adjusted_views_without_custom_holiday] を選択します。

    指標を追加します。

    グラフは次のようになります。

    組み込み休日を使用した予測結果の時系列グラフ

    予測モデルでは一般的な傾向をかなりうまく捉えていることがわかります。ただし、以前の Google I/O イベントに関連する増加トラフィックは捉えられず、正確な予測を生成できません。

    1. 次のセクションでは、これらの制限の一部に対処する方法について説明します。

組み込み祝日とカスタム休日を使用する時系列予測モデルを作成する

Google I/O の履歴からわかるように、Google I/O イベントは 2017 年から 2022 年までの間に発生しました。このバリエーションを考慮するには、2022 年より前のページビュー データに基づいて、毎年の Google I/O イベントを表すカスタム休日を使用して、2022 年までの Wikipedia の「Google_I/O」ページのページビューを予測するモデルを作成します。このモデルでは、イベント前後のある程度の潜在的なページ トラフィックをより的確に捉えられるように、イベント日の前後 3 日間をカバーするように休日効果の時間枠も調整します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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
        )
    );

予測結果を可視化する

カスタム休日を使用してモデルを作成したら、bqml_tutorial.googleio_page_views テーブルの元のデータを ML.EXPLAIN_FORECAST 関数の予測値と結合してから、Looker Studio を使用して可視化します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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. [クエリ結果] ペインで、[データを探索] をクリックして、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。

  4. [Looker Studio] タブで [Add a chart] をクリックし、時系列グラフをクリックして、レポートにグラフを配置します。

  5. [グラフ] ペインの [設定] タブで、[指標を追加] をクリックし、[adjusted_views_with_custom_holiday] を選択します。

    グラフは次のようになります。

    カスタム休日を使用した予測結果の時系列グラフ

    ご覧のとおり、カスタム休日により予測モデルのパフォーマンスが向上しています。Google I/O に起因するページビューの増加を効果的に捉えることができるようになりました。

休日情報を検査する

ML.HOLIDAY_INFO 関数を使用して、モデリング中に考慮された休日のリストを調べます。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の SQL ステートメントを実行します。

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

    休日のリストには、Google I/O と組み込み休日の両方が表示されます。

    ML.HOLIDAY_INFO 関数の結果。

カスタム休日の影響を評価する

ML.EXPLAIN_FORECAST 関数を使用して、予測結果に対するカスタム休日の影響を評価します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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;

    この結果は、Google I/O が予測結果に大きな休日効果をもたらすことを示しています。

    ML.EXPLAIN_FORECAST 関数の結果。

モデルのパフォーマンスを比較する

ML.EVALUATE 関数を使用して、カスタム休日なしで作成された最初のモデルと、カスタム休日ありで作成された 2 番目のモデルのパフォーマンスを比較します。将来のカスタム休日を予測するときに 2 番目のモデルのパフォーマンスを確認するには、期間を 2022 年の Google I/O の週に設定します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. SQL エディタペインで、次の 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));

    結果から、2 番目のモデルでは大幅なパフォーマンスの改善があることがわかります。

    ML.EXPLAIN_FORECAST 関数の結果。

クリーンアップ

  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.