【データ分析入門】BigQuery MLを用いた時系列分析例

predict 入門

BigQuery MLが必要となるケース

 データ分析でご支援させていただく際は基礎分析を用いた知見抽出が多いですが、時々時系列分析などを用いた予測を行う必要のあるシーンがでてきます。ただそういった際も「とにかく精度の高いモデル」が必要とされるケースは珍しく、最初は開発コストや運用コストが高すぎない手軽なモデルで十分なケースが多いです。そういった際に候補として上がってくる手段として、BigQuery上で手軽に利用することができるBigQuery MLがあります。

BigQuery MLとは

BigQuery ML を使用すると、BigQuery で標準 SQL クエリを使用して機械学習モデルを作成し、実行できます。BigQuery ML は、SQL 実務担当者が既存の SQL ツールやスキルを使ってモデルを構築することを可能にし、機械学習をより多くの人が利用できるようにします。BigQuery ML ではデータを移動する必要がないため、開発スピードを向上させることができます。

https://cloud.google.com/bigquery-ml/docs/introduction

 BigQuery MLはSQLを用いることで線形回帰や時系列など、11の項目におけるモデルを利用することができるサービスになります。通常モデルを利用とした場合「モデル実行サーバーの準備」「学習データの準備・学習」など様々な準備が必要となりますが、BigQuery MLではそれらが不必要で手軽に始めることができます。

BigQuery MLでホームページ閲覧数の予測を行う

BigQuery MLの利用フロー

 BigQuery MLを利用する際は以下の3ステップで構成されています。

  1. 元データの準備:利用データテーブル
  2. モデルの作成:利用モデルの作成
  3. モデルの利用:モデルを利用したSQLの実行

 元データ準備とモデル作成を行った後得られる結果は他のテーブルと類似しており、利用する際は普通のテーブルと同じようにSELECTしたりJOINすることができます。今回はARIMAモデル(時系列分析)で出したホームページ閲覧予測データをLooker Studioで可視化していこうと思います。

利用データ(ホームページ閲覧数)

 今回利用するサンプル時系列データとしては、Google Analytics4で取得しているホームページのアクセスログを利用いたしました。アクセスログを可視化しGAのデータを直感的に理解できる型態にする試み(ネットワーク型)で利用したSQLを改良し、以下のような日別のセッション数を出せるようにしています。

CREATE OR REPLACE TABLE `XXXXX.XXXXX.ga_sessions` AS (
  SELECT
    PARSE_DATE('%Y%m%d', event_date) AS event_date,
    COUNT(DISTINCT (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id' LIMIT 1)) AS session_nums
  FROM
    `XXXXX.analytics_XXXXX.events_*`
  WHERE
    event_name = 'page_view'
  GROUP BY
    1
  ORDER BY
    event_date DESC
);

利用モデル(ARIMAモデル)

 時系列予測系のモデルとしては「ARIMA_PLUS」が準備されているため、今回そちらを利用しています。弊社で利用することが多いprophetとの大きな違いとして、データカラムの数値以外の要素を説明変数にいれられず、例えば「ブログ記事の数」といった外部要因を考慮することができないことです。また休日フラグは「HOLIDAY_REGION」で準備されたものしか利用できないため、特殊な休暇の影響などは考慮できないようです。

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
OPTIONS(MODEL_TYPE = 'ARIMA_PLUS' -- モデル種類
  [, TIME_SERIES_TIMESTAMP_COL = string_value ] -- 日時カラム名
  [, TIME_SERIES_DATA_COL = string_value ] -- データカラム名
  [, TIME_SERIES_ID_COL = { string_value | string_array } ]
  [, HORIZON = int64_value ] -- 予測日時ポイント数(利用時指定)
  [, AUTO_ARIMA = { TRUE | FALSE } ] -- 自動でフィッティングする
  [, AUTO_ARIMA_MAX_ORDER = int64_value ]
  [, NON_SEASONAL_ORDER = (int64_value, int64_value, int64_value) ]
  [, DATA_FREQUENCY = { 'AUTO_FREQUENCY' | 'PER_MINUTE' | 'HOURLY' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'QUARTERLY' | 'YEARLY' } ]
  [, INCLUDE_DRIFT = { TRUE | FALSE } ]
  [, HOLIDAY_REGION = string_value | string_array ]
  [, CLEAN_SPIKES_AND_DIPS = { TRUE | FALSE } ]
  [, ADJUST_STEP_CHANGES = { TRUE | FALSE } ]
  [, DECOMPOSE_TIME_SERIES = { TRUE | FALSE } ]
  [, TIME_SERIES_LENGTH_FRACTION = float64_value ]
  [, MIN_TIME_SERIES_LENGTH = int64_value ]
  [, MAX_TIME_SERIES_LENGTH = int64_value ]
  [, TREND_SMOOTHING_WINDOW_SIZE = int64_value ])
AS query_statement
CREATE OR REPLACE MODEL
  `XXXXX.XXXXX.ga_arima_model` OPTIONS (model_type = 'ARIMA_PLUS',
    time_series_timestamp_col = 'event_date',
    time_series_data_col = 'session_nums' ) AS
SELECT
  event_date,
  session_nums
FROM
  `XXXXX.XXXXX.ga_sessions`
ORDER BY
  event_date;

予測結果の参照

 作成したモデルを参照すれば結果が出せるため、以下SQLで実績データと合わせたデータを参照することができます。

SELECT
  event_date,
  session_nums,
  CAST(NULL AS FLOAT64) AS forecast_value,
  CAST(NULL AS FLOAT64) AS prediction_interval_lower_bound,
  CAST(NULL AS FLOAT64) AS prediction_interval_upper_bound
FROM
  `XXXXX.XXXXX.ga_sessions`
UNION ALL
SELECT
  DATE(forecast_timestamp) AS event_date,
  CAST(NULL AS FLOAT64) AS session_nums,
  forecast_value,
  prediction_interval_lower_bound,
  prediction_interval_upper_bound
FROM
 ML.FORECAST(MODEL `XXXXX.XXXXX.ga_arima_model`,
             STRUCT(360 AS horizon, 0.8 AS confidence_level)); -- 360日後まで予測

結果の可視化

 できた結果をLooker Studioで可視化した結果が以下のグラフになります。結果を見たところweeklyの影響が大きく出た結果が出ているように見受けられます。直近一気に閲覧数が上がっていたためそこがどのように評価されるか気になっていましたが、基本的には慣らして予測が行われるようです。

※Looker Studioの可視化結果(上が2021/10~2023/11, 下が2022/10~2023/05)

まとめ

 今回BigQuery MLのモデルの一つである時系列予測系のモデル「ARIMA_PLUS」を用い、ホームページ閲覧ログの予測を出す流れを説明させていただきました。普段利用することの多いprophetと比較すると利用できる説明変数が少なく、より簡易的に傾向を出す用途では使えそうな印象を受けます。スケジュールSQLとの併用によってバッチも組めるため、簡易的に予測結果が必要なケースなどに用いていただけると幸いです。

参考リンク

本記事内容をご利用される前にご確認お願いします

  • SinkCapitalギルドメンバーが記載したギルド内部向け記事を一般公開したものです
  • 記載内容の情報鮮度や正確性に問題があった場合も、本記事の内容を利用したことによるあらゆる問題には一切責任を負いかねます
  • 要望や指摘、意見等あれば気軽にコメントいただけると幸いです
  • 弊社にご興味のあるかたは是非弊社HP相談フォームを御覧ください

コメント

タイトルとURLをコピーしました