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

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

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

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

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。

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

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

    • 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. Verify 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. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Enable the API

  8. データセットを作成する

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

    コンソール

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

      [BigQuery] ページに移動

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

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

      [データセットを作成] のメニュー オプション。

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

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

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

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

    bq

    新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

    1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

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

      このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

    2. データセットが作成されたことを確認します。

      bq ls

    API

    定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

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

    BigQuery DataFrames

    このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

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

    時系列データを準備する

    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.