ニューヨーク市のシティバイクの利用状況について 1 つのクエリで複数の時系列を予測する


このチュートリアルでは、一連の時系列モデルを作成し、1 つのクエリで複数の時系列予測を行う方法を学習します。また、さまざまな高速トレーニング戦略を適用してクエリを大幅に高速化する方法や予測精度を評価する方法も学習します。new_york.citibike_trips データを使用します。このデータには、ニューヨーク市でのシティバイクの利用状況に関する情報が含まれています。

このチュートリアルを読む前に、Google アナリティクス データからの 1 つの時系列を予測するをお読みになることを強くおすすめします。

目標

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

  • CREATE MODEL ステートメント: 1 つの時系列モデルまたは時系列モデルのセットを作成します。
  • ML.ARIMA_EVALUATE 関数: モデルを評価します。
  • ML.ARIMA_COEFFICIENTS 関数: モデルの係数を検査します。
  • ML.EXPLAIN_FORECAST 関数: 予測結果の説明に使用できる時系列のさまざまなコンポーネント(季節性やトレンドなど)を取得します。
  • Looker Studio: 予測結果を可視化します。
  • 省略可: ML.FORECAST 関数: 1 日の合計訪問数を予測します。

費用

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

  • BigQuery
  • BigQuery ML

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

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

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、

    BigQuery API を有効にします。

    API を有効にする

    にアクセスします。

ステップ 1: データセットを作成する

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

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

    [BigQuery] ページに移動

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

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

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

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

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

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(multiple regions in United States)] を選択します。

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

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

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

ステップ 2(省略可): 予測する時系列を可視化する

モデルを作成する前に、入力時系列がどのように表示されるかを確認しておきましょう。これは、Looker Studio を使用して行います。

次のクエリでは、FROM bigquery-public-data.new_york.citibike_trips 句により new_york データセット内の citibike_trips テーブルのデータを取得します。

SELECT ステートメントで EXTRACT 関数を使用し、starttime 列から日付情報を抽出します。さらに、COUNT(*) 句を使用して、1 日あたりのシティバイクの合計利用回数を取得します。

#standardSQL
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
GROUP BY date

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    GROUP BY date
    
  3. [実行] をクリックします。

    クエリを実行すると、次のスクリーンショットのような出力が表示されます。スクリーンショットを見ると、この時系列に 1,184 個の日次データポイントがあり、その期間は 4 年以上になっています。[データを探索] ボタンをクリックして、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。新しいタブで次の操作を行います。

    クエリ出力。

  4. [グラフ] パネルで [時系列グラフ] を選択します。

    Time_series_chart。

  5. [データ] パネルで、[グラフ] パネルの下にある [指標] セクションに移動します。num_trips フィールドを追加し、デフォルトの指標である [レコード数] を削除します。

    Time_series_data_fields。

    上記の操作を行うと、次のようなグラフが表示されます。このグラフでは、入力時系列が週単位と年単位の両方のパターンで表示されています。また、時系列は上昇傾向にあります。

    Result_visualization。

ステップ 3: 時系列モデルを作成して単一の時系列を予測する

次に、ニューヨーク市のシティバイクの利用データを使用して時系列モデルを作成します。

次の GoogleSQL クエリでは、1 日あたりの自転車レンタルの合計回数を予測するモデルを作成します。CREATE MODEL 句で bqml_tutorial.nyc_citibike_arima_model という名前のモデルを作成してトレーニングします。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips'
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
GROUP BY date

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句で ARIMA ベースの時系列モデルを作成しています。デフォルトは auto_arima=TRUE であるため、auto.ARIMA アルゴリズムによって ARIMA_PLUS モデルのハイパーパラメータが自動的に調整されます。アルゴリズムが多数の候補モデルを学習し、Akaike information criterion(AIC)が最も低い最適なモデルを選択します。また、data_frequency='AUTO_FREQUENCY' がデフォルトのため、トレーニング プロセスでは入力時系列のデータ頻度が自動的に推定されます。最後に、CREATE MODEL ステートメントではデフォルトで decompose_time_series=TRUE を使用し、ユーザーは季節、休日効果などの別々の時系列のコンポーネントの取得により時系列を予測する方法をさらに理解できます。

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips'
      ) AS
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    GROUP BY date
    
  3. [実行] をクリックします。

    クエリが完了するまでに約 17 秒かかります。完了後、モデル(nyc_citibike_arima_model)がナビゲーション パネルに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。

ステップ 4: 時系列を予測して結果を可視化する

時系列を予測する方法を説明するには、ML.EXPLAIN_FORECAST 関数を使用して、季節性、トレンドなどのすべての副時系列のコンポーネントを可視化します。

これを実施する手順は次のとおりです。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model`,
                          STRUCT(365 AS horizon, 0.9 AS confidence_level))
    
  3. [実行] をクリックします。

  4. クエリが完了したら、[データを探索] ボタンをクリックし、[Looker Studio で調べる] をクリックします。ブラウザで新しいタブが開きます。次に、[グラフ] パネルで [時系列グラフ] アイコンをクリックします。次のスクリーンショットをご覧ください。

    Time_series_chart。

  5. [データ] パネルで次の操作を行います。

    1. [期間のディメンション] セクションで、time_series_timestamp (Date) を選択します。
    2. [ディメンション] セクションで [time_series_timestamp (Date)] を選択します。
    3. [指標] セクションで、デフォルトの指標 Record Count を削除し、以下を追加します。
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_yearly
      • seasonal_period_weekly
      • spikes_and_dips
      • step_changes

    Time_series_chart。

  6. [スタイル] パネルで、[Missing Data] オプションまでスクロールし、[Line to Zer] ではなく [Line Breaks] を使用します。

    Style_section。

    この手順を完了すると、左パネルに次のグラフが表示されます。

    Result_visualization。

ステップ 5: 複数の時系列を同時に予測する

次に、さまざまなシティバイク ステーションでの 1 日あたりの合計利用回数を予測します。これを行うには、複数の時系列を予測する必要があります。複数の CREATE MODEL クエリを作成できますが、時系列が非常に多い場合は、作成に手間や時間がかかる可能性があります。

この作業を効率的に行うため、BigQuery ML では、1 つのクエリで複数の時系列を予測する一連の時系列モデルを作成できます。また、すべての時系列モデルが同時に適合されます。

次の GoogleSQL クエリでは、CREATE MODEL 句を使用して、bqml_tutorial.nyc_citibike_arima_model_group という名前のモデルセットを作成してトレーニングします。

 #standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 5
  ) AS
SELECT
   start_station_name,
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
WHERE start_station_name LIKE '%Central Park%'
GROUP BY start_station_name, date

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句で、一連の ARIMA ベースの時系列 ARIMA_PLUS モデルを作成します。time_series_timestamp_coltime_series_data_col のほかに、time_series_id_col を指定する必要があります。これは、異なる入力時系列にアノテーションを付けるために使用します。auto_arima_max_order オプションは、auto.ARIMA アルゴリズムにおいて、ハイパーパラメータ調整の検索空間を制御します。最後に、CREATE MODEL ステートメントはデフォルトで decompose_time_series=TRUE を使用しますが、これによりユーザーは、分解の結果の取得によりトレーニング パイプラインで時系列を分析する方法をさらに理解できます。

SELECT ... FROM ... GROUP BY ... 句で、複数の時系列を作成しています。それぞれの時系列が異なる start_station_name に関連付けられます。わかりやすくするため、WHERE ... LIKE ... 句を使用して、名前に Central Park が含まれるステーションに限定します。

CREATE MODEL クエリを実行してモデルを作成し、トレーニングする手順は次のとおりです。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips',
       time_series_id_col = 'start_station_name',
       auto_arima_max_order = 5
      ) AS
    SELECT
       start_station_name,
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    WHERE start_station_name LIKE '%Central Park%'
    GROUP BY start_station_name, date
    
  3. [実行] をクリックします。

    クエリが完了するまでに約 24 秒かかります。完了後、モデル(nyc_citibike_arima_model_group)がナビゲーション パネルに表示されます。クエリは CREATE MODEL ステートメントを使用するため、クエリの結果は表示されません。

ステップ 6: 一連の時系列モデルの評価指標を調べる

モデルを作成したら、ML.ARIMA_EVALUATE 関数を使用して、作成したすべてのモデルの評価指標を確認します。

次の GoogleSQL クエリでは、FROM 句でモデル bqml_tutorial.nyc_citibike_arima_model_group に対して ML.ARIMA_EVALUATE 関数を使用します。評価指標はトレーニングの入力にのみ依存します。このため、モデルは唯一の入力となります。

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. [実行] をクリックします。

  4. クエリが完了するまでに 1 秒もかかりません。クエリが完了したら、クエリテキスト領域の下にある [結果] タブをクリックします。結果は次のようになります。

    ML.EVALUATE の出力。

    結果には次の列が含まれます。

    • start_station_name
    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    最初の列である start_station_name は、各時系列モデルが適合される時系列にアノテーションを付けます。これは time_series_id_col で指定されたものと同じです。

    次の 4 つの列(non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift)でトレーニング パイプライン内の ARIMA モデルを定義します。その後の 3 つの指標(log_likelihoodAICvariance)は ARIMA モデルの適合プロセスに関連しています。適合プロセスでは、時系列ごとに auto.ARIMA アルゴリズムが使用され、最適な ARIMA モデルが決定されます。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 列は、decompose_time_series=TRUE の場合にのみ入力されます。

    seasonal_periods 列は、入力時系列内の季節パターンです。時系列ごとに異なるパターンがある場合があります。たとえば、この図では 1 つの時系列に 1 年ごとのパターンがありますが、他の時系列には存在しません。

ステップ 7: モデルの係数を調べる

ML.ARIMA_COEFFICIENTS 関数を使用して、ARIMA_PLUS モデル bqml_tutorial.nyc_citibike_arima_model_group のモデル係数を取得します。ML.ARIMA_COEFFICIENTS は、モデルを唯一の入力として受け取ります。

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. [実行] をクリックします。

    クエリが完了するまでに 1 秒もかかりません。結果は次のスクリーンショットのようになります。

    ML.ARIMA_COEFFICIENTS の出力。

    結果には次の列が含まれます。

    • start_station_name
    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    最初の列である start_station_name は、各時系列モデルが適合される時系列にアノテーションを付けます。

    ar_coefficients は、ARIMA モデルの自己回帰(AR)部分のモデル係数を示します。同様に、ma_coefficients は移動平均(MA)部分のモデル係数を示します。どちらも配列で、長さはそれぞれ non_seasonal_pnon_seasonal_q です。intercept_or_drift は、ARIMA モデルの定数項です。

ステップ 8: モデルを使用して複数の時系列を説明とともに同時に予測する

ML.EXPLAIN_FORECAST 関数は、モデル bqml_tutorial.nyc_citibike_arima_model_group を使用して将来の時系列値を特定の予測間隔で予測し、それと同時に時系列の個々のコンポーネントをすべて返します。

STRUCT(3 AS horizon, 0.9 AS confidence_level) 句は、クエリが 3 個の将来の時点を予測し、信頼度 90% の予測間隔を生成するように指示します。ML.EXPLAIN_FORECAST 関数は、モデルおよび数個のオプションの引数を取得します。

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                         STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. [実行] をクリックします。

    クエリが完了するまでに 1 秒もかかりません。結果は次のようになります。

    ML.EXPLAIN_FORECAST の出力 1。 ML.EXPLAIN_FORECAST の出力 2。

    結果には次の列が含まれます。

    • start_station_name
    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual

    出力行は start_station_name 順に並べ替えられ、start_station_name ごとに出力行は time_series_timestamp の日付順に表示されます。さまざまなコンポーネントが出力の列として一覧表示されます。詳細については、ML.EXPLAIN_FORECAST の定義をご覧ください。

(省略可)ステップ 9: モデルを使用して複数の時系列を同時に予測する

また、ML.FORECAST 関数を使用して、モデル bqml_tutorial.nyc_citibike_arima_model_group から将来の時系列値を特定の予測間隔で予測することもできます。

ML.EXPLAIN_FORECAST と同様に、STRUCT(3 AS horizon, 0.9 AS confidence_level) 句は、時系列ごとにクエリは 3 個の将来の時間点を予測し、信頼度 90% で予測間隔を生成するように指示します。

ML.FORECAST 関数は、モデルおよび数個のオプションの引数を取得します。

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

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. [クエリエディタ] のテキスト領域に、次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                 STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. [実行] をクリックします。

    クエリが完了するまでに 1 秒もかかりません。結果は次のようになります。

    ML.FORECAST の出力。

    結果には次の列が含まれます。

    • start_station_name
    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound(間もなくサポート終了)
    • confidence_interval_upper_bound(間もなくサポート終了)

    最初の列 start_station_name は、各時系列モデルが適合される時系列にアノテーションを付けます。各 start_station_name には、予測結果用に horizon 数の行があります。

    start_station_name ごとに、出力行が forecast_timestamp の日付順に並べ替えられます。時系列予測の場合、下限と上限で取得される予測間隔は forecast_value と同じくらい重要です。forecast_value は予測間隔の中間点です。予測間隔は standard_errorconfidence_level によって異なります。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットを削除する

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

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

    [BigQuery] ページに移動

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

  3. [データセットの削除] をクリックして、データセット、テーブル、すべてのデータを削除します。

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

プロジェクトの削除

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

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ