Google アナリティクス データからの 1 つの時系列を予測する


このチュートリアルでは、google_analytics_sample.ga_sessions サンプル テーブルを使用して時系列モデルを作成し、1 つの時系列予測を行う方法について学習します。

ga_sessions テーブルには、Google アナリティクス 360 によって収集され、BigQuery に送信されたセッション データのスライスに関する情報が含まれています。

目標

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

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

費用

このチュートリアルでは、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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

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

    Enable the BigQuery API.

    Enable the API

    に移動します。

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

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

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

    [BigQuery] ページに移動

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

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

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

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

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

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

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

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

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

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

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

SQL

これは、Looker Studio を使用して行います。

次の GoogleSQL クエリでは、FROM bigquery-public-data.google_analytics_sample.ga_sessions_* 句で google_analytics_sample データセット内の ga_sessions_* テーブルに対してクエリを実行しています。これらのテーブルはパーティション分割テーブルです。

SELECTステートメントで、入力テーブルの date 列を TIMESTAMP 型として解析し、名前を parsed_date に変更します。このクエリでは、SUM(...) 句と GROUP BY date 句を使用して、totals.visits を毎日集計します。

#standardSQL
SELECT
PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
SUM(totals.visits) AS total_visits
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

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

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

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

    #standardSQL
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
  3. [実行] をクリックします。

    このクエリが完了するまでに約 7 秒かかります。クエリを実行すると、次のスクリーンショットのような出力が表示されます。スクリーンショットを見ると、この時系列には 366 個のデータポイントがあります。[データを探索] ボタンをクリックして、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。新しいタブで次の操作を行います。

    クエリ出力

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

    Time_series_chart

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

    Time_series_data_fields

    これらの手順を完了すると、次のグラフが表示されます。このグラフでは、入力時系列が週単位のパターンで表示されています。

    Result_visualization

BigQuery DataFrames

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

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

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
visits = df["totals"].struct.field("visits")
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: visits, dtype: Int64

total_visits.plot.line()

次のような結果になります。 Result_visualization

ステップ 3: 時系列モデルを作成する

次に、Google アナリティクス 360 のデータを使用して時系列モデルを作成します。次の GoogleSQL クエリでは、totals.visits の予測に使用するモデルを作成します。

CREATE MODEL 句で bqml_tutorial.ga_arima_model という名前のモデルを作成してトレーニングします。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'parsed_date',
   time_series_data_col = 'total_visits',
   auto_arima = TRUE,
   data_frequency = 'AUTO_FREQUENCY',
   decompose_time_series = TRUE
  ) AS
SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
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.ga_arima_model`
    OPTIONS
     (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'parsed_date',
      time_series_data_col = 'total_visits',
      auto_arima = TRUE,
      data_frequency = 'AUTO_FREQUENCY',
      decompose_time_series = TRUE
    ) AS
    SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
     SUM(totals.visits) AS total_visits
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
  3. [実行] をクリックします。

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

ステップ 4: 評価されたすべてのモデルの評価指標を調べる

モデルを作成した後、ML.ARIMA_EVALUATE 関数を使用すると、ハイパーパラメータの自動調整中に評価されたすべての候補モデルの評価指標を確認できます。

次の GoogleSQL クエリでは、FROM 句でモデル bqml_tutorial.ga_arima_model に対して ML.ARIMA_EVALUATE 関数を使用します。デフォルトでは、このクエリはすべての候補モデルの評価指標を返します。

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

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

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

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

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

    ML.ARIMA_EVALUATE の出力。

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

    • 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

    次の 4 つの列(non_seasonal_{p,d,q}has_drift)でトレーニング パイプライン内の ARIMA モデルを定義します。その後の 3 つの指標(log_likelihoodAICvariance)は ARIMA モデルの適合プロセスに関連しています。

    まず、auto.ARIMA アルゴリズムは KPSS テストを使用して、non_seasonal_d の最適値を 1 に決定します。non_seasonal_d が 1 の場合、auto.ARIMA は 42 の ARIMA 候補モデルを並行してトレーニングします。non_seasonal_dが 1 でない場合、auto.ARIMA は 21 の異なる候補モデルをトレーニングします。この例では、42 個の候補モデルがすべて有効です。したがって、出力には 42 行が含まれ、各行は ARIMA 候補モデルに関連付けられています。一部の時系列では、非反転または非静止の候補モデルが無効になります。無効なモデルは出力から除外されるため、出力行数は 42 行未満になります。これらの候補モデルは AIC の昇順で並べ替えられます。最初の行のモデルは AIC が最も低く、最適なモデルとみなされます。この最適モデルが最終モデルとして保存され、次に示すように ML.EXPLAIN_FORECASTML.FORECASTML.ARIMA_COEFFICIENTS を呼び出すときに使用されます。

    seasonal_periods 列は、入力時系列内の季節パターンに関するものです。ARIMA モデリングとは関係がないため、すべての出力行で同じ値になります。前述のステップ 2 で説明したように、1 週間のパターンが報告されますが、これは想定内です。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 列は、decompose_time_series=TRUE の場合にのみ入力されます。これらは ARIMA モデリングとは関係のない、休日効果、スパイクと低下、ステップ変更に関するものです。したがって、失敗したモデルを除き、すべての出力行で同じです。

    error_message 列は、auto.ARIMA の適合プロセス中に発生した可能性のあるエラーを示します。考えられる原因は、選択した non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 列で時系列が固定できていないことです。すべての候補モデルの可能性のあるエラー メッセージを取得するには、show_all_candidate_models=true を設定します。

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

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

ML.ARIMA_COEFFICIENTS クエリを実行します。

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

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

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

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

    ML.ARIMA_COEFFICIENTS の出力。

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

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    ar_coefficients は、ARIMA モデルの自己回帰(AR)部分のモデル係数を示します。同様に、ma_coefficients は移動平均(MA)部分のモデル係数を示します。どちらも配列で、長さはそれぞれ non_seasonal_pnon_seasonal_q です。ML.ARIMA_EVALUATE の出力から、一番上の行の non_seasonal_p は 2 で、non_seasonal_q は 3 です。したがって、ar_coefficients は長さ 2 の配列で、ma_coefficients は長さ 3 の配列です。intercept_or_drift は、ARIMA モデルの定数項です。

ステップ 6: モデルを使用して時系列を予測する

ML.FORECAST 関数は、bqml_tutorial.ga_arima_model モデルを使用して、予測間隔付きで将来の時系列値を予測します。

次の GoogleSQL クエリの STRUCT(30 AS horizon, 0.8 AS confidence_level) 句は、30 個の将来の時点を予測し、信頼度レベル 80% の予測間隔を生成するように指示します。ML.FORECAST は、モデルとオプションの引数を受け取ります。

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

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

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

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

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

    ML.FORECAST の出力。

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

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

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

ステップ 7: 予測結果を説明して可視化する

時系列の予測方法を理解して、予測時系列と履歴時系列および別々のコンポーネントを一緒に可視化するために、ML.EXPLAIN_FORECAST 関数は、モデル bqml_tutorial.ga_arima_model を使用して予測間隔で将来の時系列値を予測し、同時に時系列の別々のコンポーネントを返します。

ML.FORECAST 関数と同様に、STRUCT(30 AS horizon, 0.8 AS confidence_level) 句は、30 個の将来の時点を予測し、信頼度 80% の予測間隔を生成するように指示します。ML.EXPLAIN_FORECAST 関数は、モデルおよび数個のオプションの引数を取得します。

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

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

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

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

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

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

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

    • 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

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

  4. クエリが完了したら、[データを探索] ボタンをクリックし、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。

    Union_all_query の出力

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

    Time_series_chart

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

    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_weekly
      • step_changes

    Data_panel

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

    Style_section

    次のプロットが表示されます。

    Result_visualization

ステップ 8(省略可): decompose_time_series を有効にせずに予測結果を可視化する

ARIMA_PLUS トレーニングで decompose_time_series が false に設定されている場合、履歴時系列と予測時系列を UNION ALL 句と ML.FORECAST 関数を使用して連結できます。

次のクエリでは、UNION ALL 句の前の SQL によって履歴時系列が形成されます。UNION ALL 句の後の SQL で、ML.FORECAST 機能を使用して予測時系列と予測間隔を生成します。このクエリでは、history_valueforecasted_value に異なるフィールドを使用して、それぞれを異なる色で表示しています。

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

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

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

    #standardSQL
    SELECT
     history_timestamp AS timestamp,
     history_value,
     NULL AS forecast_value,
     NULL AS prediction_interval_lower_bound,
     NULL AS prediction_interval_upper_bound
    FROM
     (
       SELECT
         PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
         SUM(totals.visits) AS history_value
       FROM
         `bigquery-public-data.google_analytics_sample.ga_sessions_*`
       GROUP BY date
       ORDER BY date ASC
     )
    UNION ALL
    SELECT
     forecast_timestamp AS timestamp,
     NULL AS history_value,
     forecast_value,
     prediction_interval_lower_bound,
     prediction_interval_upper_bound
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 AS confidence_level))
  3. [実行] をクリックします。

  4. クエリが完了したら、[データを探索] ボタンをクリックし、[Looker Studio で調べる] をクリックします。Looker Studio が新しいタブで開きます。新しいタブで次の操作を行います。

    Union_all_query の出力

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

    Time_series_chart

  6. [データ] パネルで、[グラフ] パネルの下にある [指標] セクションに移動します。指標として history_valueforecast_valueprediction_interval_lower_boundprediction_interval_upper_bound を追加します。次に、デフォルトの指標 Record Count を削除します。

    Data_section

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

    Style_section

    この手順を完了すると、左パネルに次のグラフが表示されます。入力の履歴時系列は青で、予測時系列は緑で表示されます。予測間隔は、下限の系列と上限の系列の間の領域です。

    Result_visualization

クリーンアップ

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

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

データセットを削除する

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

  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.

次のステップ