階層型時系列予測

このチュートリアルでは、階層型時系列を生成する方法について説明します。このチュートリアルでは、同じデータに対して 2 つの時系列モデルを作成します。1 つは階層型予測を使用するモデル、もう 1 つは使用しないモデルです。これにより、モデルから返された結果を比較できます。

このチュートリアルでは、iowa_liquor.sales.sales データを使用してモデルをトレーニングします。このデータセットでは、アイオワ州の一般公開の酒類販売データが使用され、さまざまな店舗で扱われている 100 万点を超える酒類商品に関する情報が含まれています。

このチュートリアルに進む前に、複数の時系列予測を行う方法について理解しておく必要があります。このトピックの概要については、Google アナリティクス データから複数の時系列を予測するのチュートリアルをご覧ください。

必要な権限

  • データセットを作成するには、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 の概要をご覧ください。

目標

このチュートリアルでは、次のものを使用します。

  • CREATE MODEL ステートメント: 時系列モデルと階層型時系列モデルを作成します。
  • ML.FORECAST 関数: 1 日の販売数の合計を予測します。

費用

このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。

  • BigQuery
  • BigQuery ML

BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。

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

始める前に

  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 マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

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

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

階層的な調整

多くの場合、時系列予測は、関心のあるさまざまな項目に基づいて分割または集計できます。これらは階層型時系列と呼ばれます。たとえば、州ごとの総人口を示す国勢調査データは、都市別や郵便番号別に分類できます。逆に、国や大陸ごとにデータを集計することもできます。

階層型予測を生成して調整するために使用できる手法はいくつかあります。次の例は、アイオワ州の酒類販売の階層構造を単純化したものです。

階層型時系列。

最下層には店舗レベルが示され、その後に郵便番号、市区町村、郡、州が続きます。階層型予測の目標は、各レベルのすべての予測を調整することです。たとえば、前の図では、クライブとデモインの予測を合計するとポーク郡の予測になります。同様に、ポーク郡、リン郡、スコット郡の予測は、アイオワ州の予測に加算されます。

レベルごとに調整された予測を生成するために使用できる一般的な手法がいくつかあります。その一つがボトムアップ アプローチです。この方法では、予測は階層の最下位で生成された後、他のレベルに合計されます。前の例では、各店舗の予測値を使用して、他のレベル(最初に郵便番号、次に市区町村など)の予測モデルを作成します。

時系列モデルを作成する

まず、アイオワ州の酒類販売データを使用して時系列モデルを作成します。

次の GoogleSQL クエリは、2015 年にポーク、リン、スコットの各郡で販売されたボトルの 1 日あたりの合計数を予測するモデルを作成します。CREATE MODEL ステートメントで bqml_tutorial.liquor_forecast というモデルを作成してトレーニングします。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句で ARIMA ベースの時系列モデルを作成しています。デフォルトは auto_arima=TRUE であるため、auto.ARIMA アルゴリズムによって ARIMA_PLUS モデルのハイパーパラメータが自動的に調整されます。アルゴリズムが多数の候補モデルを学習し、Akaike information criterion(AIC)が最も低い最適なモデルを選択します。holiday_region オプションUS に設定すると、時系列に米国の休日パターンがある場合に、米国の休日の時点をより正確にモデリングできます。

CREATE MODEL クエリを実行してモデルを作成し、トレーニングします。

  1. Google Cloud コンソールで、[BigQuery でクエリを実行] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;
  1. [実行] をクリックします。

    クエリが完了するまでに約 37 秒かかります。完了後、モデル(liquor_forecast)が [エクスプローラ] ペインに表示されます。このクエリでは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

時系列モデルの結果を調べる

モデルを作成したら、ML.FORECAST 関数を使用して予測結果を確認できます。

モデル liquor_forecast に対して ML.FORECAST 関数を実行するには、FROM 句で関数を指定します。

デフォルトでは、このクエリはデータ内の一意の時系列の予測を返します。一意の時系列は、store_numberzip_codecitycounty の各列で識別されます。

ML.FORECAST クエリを実行する手順は次のとおりです。

  1. Google Cloud コンソールで、[BigQuery でクエリを実行] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

#standardSQL
SELECT *
FROM
  ML.FORECAST(
    MODEL `bqml_tutorial.liquor_forecast`,
    STRUCT(20 AS horizon, 0.8 AS confidence_level))
ORDER BY store_number, county, city, zip_code, forecast_timestamp
  1. [実行] をクリックします。

    クエリの実行には 5 秒ほどかかります。クエリの実行後、出力に次の結果が表示されます。

    時系列の例

    最初の時系列の予測がどのように表示されているのか見てみましょう(store_number=2190, zip_code=50314, city=DES MOINES, county=POLK)。他の行を見ると、他のグループの予測が表示されています。

    通常、予測は一意の時系列ごとに生成されます。特定の郡に対する予測など、集計レベルの予測を生成するには、階層型予測を生成する必要があります。

階層予測を使用して時系列モデルを作成する

アイオワ州の酒類販売データを使用して、階層型の時系列予測を作成します。

次の GoogleSQL クエリでは、ポーク、リン、スコットの各郡で 2015 年に販売されたボトルの日次合計販売数の階層予測を生成するモデルを作成します。CREATE MODEL ステートメントで bqml_tutorial.liquor_forecast_hierarchical というモデルを作成してトレーニングします。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_hierarchical`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HIERARCHICAL_TIME_SERIES_COLS = ['zip_code', 'store_number'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;

HIERARCHICAL_TIME_SERIES_COLS パラメータは、一連の列に基づいて階層予測を作成することを示します。これらの列はそれぞれ統合され、集計されます。たとえば、前述のクエリでは、store_number が統合され、countycityzip_code の予測が表示されます。zip_codestore_number の両方が統合され、countycity の予測が表示されます。列の順序で階層構造を定義するため、これは重要になります。

CREATE MODEL クエリを実行してモデルを作成し、トレーニングします。

  1. Google Cloud コンソールで、[BigQuery でクエリを実行] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.liquor_forecast_hierarchical`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS',
    TIME_SERIES_TIMESTAMP_COL = 'date',
    TIME_SERIES_DATA_COL = 'total_bottles_sold',
    TIME_SERIES_ID_COL = ['store_number', 'zip_code', 'city', 'county'],
    HIERARCHICAL_TIME_SERIES_COLS = ['zip_code', 'store_number'],
    HOLIDAY_REGION = 'US')
AS
SELECT
  store_number,
  zip_code,
  city,
  county,
  date,
  SUM(bottles_sold) AS total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE
  date BETWEEN DATE('2015-01-01') AND DATE('2015-12-31')
  AND county IN ('POLK', 'LINN', 'SCOTT')
GROUP BY store_number, date, city, zip_code, county;
  1. [実行] をクリックします。

    クエリが完了するまでに約 45 秒かかります。完了後、モデル(bqml_tutorial.liquor_forecast_hierarchical)が [エクスプローラ] ペインに表示されます。このクエリでは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

階層型時系列モデルの結果を調べる

  1. Google Cloud コンソールで、[BigQuery でクエリを実行] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
    *
    FROM
    ML.FORECAST(
      MODEL `bqml_tutorial.liquor_forecast_hierarchical`,
      STRUCT(30 AS horizon, 0.8 AS confidence_level))
    WHERE city = 'LECLAIRE'
    ORDER BY county, city, zip_code, store_number, forecast_timestamp
    
  3. [実行] をクリックします。

    クエリの実行には 5 秒ほどかかります。クエリの実行後、出力に次の結果が表示されます。

    階層型時系列の例。

    ルクレア市の予測がどのように集計されて表示されているのか見てみましょう(store_number=NULL, zip_code=NULL, city=LECLAIRE, county=SCOTT)。残りの行を見ると、他のサブグループの予測が表示されています。次の図では、郵便番号 52753(store_number=NULL, zip_code=52753, city=LECLAIRE, county=SCOTT)の予測が集計されています。

    階層型時系列の例。

データセットを削除する

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. ナビゲーションで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。

  4. [データセットの削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして確定します。

プロジェクトの削除

プロジェクトを削除するには:

  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.

次のステップ