はじめに
Engineer Lab部所属の夏目です。普段はWebサイトのアクセス情報を含むビッグデータの分析を行なって、ビジネスに有効な知見を引き出すデータサイエンティストの業務と、自然言語処理モデル(BERT、他)やパブリッククラウドサービスの機械学習サービスを利用したシステムの開発を行なう機械学習エンジニアの業務をしています。今回は、その中から機械学習モデルを用いたWebサイトのアクセス数の時系列予測システムの開発をご紹介します。

開発の背景
まず、Webサイトのアクセス数の予測システム開発の背景について説明したいと思います。KADOKAWAグループでは、書籍・雑誌だけでなくWebメディアを展開して記事を配信しています。そして記事を作成するにあたり、どういうジャンル(カテゴリー)の記事を掲載するとアクセス数を伸ばすことができるのかを知りたいという課題がありました。そこで、とある一つのWebメディアでは、ジャンル(カテゴリー)ごとのアクセス数の予測をすることで、いつ・どのジャンルの記事を執筆すべきなのかという企画の参考になるのではないかと考え、開発をスタートさせました。
システム構成
Webサイトのアクセスの指標(Page Views、以下PVと呼びます)の取得については、Google Analytics 360(以下GAと呼びます)を利用しています。そのため、連携が容易であり、機械学習のサービスや機能が利用できるGoogle Cloudを利用することにしました。GAとGoogle CloudのBigQueryの連携の設定(BigQuery Export)を行い、BigQueryに取り込みます。BigQuery ML(後述します)を用いて予測を行い、Googleデータポータルを用いて可視化を行うという構成になっています(図2)。

予測モデル
今回のシステムではARIMA(Autoregressive integrated moving average、自己回帰和分移動平均)という時系列予測モデルを使用しました。ARIMAモデルは非定常な時系列データについて差分をとることにより定常性のある時系列データとして扱えるようにモデル化したものです(ARIMAモデルについては、書籍「入門はじめての時系列分析」(ISBN 978-4-489-02125-1)が参考になります)。
ARIMAモデルの長所としては、モデル作成(学習)を行うために必要なデータが対象変数(予測対象のデータ)のみであり、他の特徴量が必要ないことが挙げられると思います。そのため手軽にモデル作成ができます。
Google CloudのBigQuery MLでは、時系列モデルとしてARIMAモデル(「ARIMA_PLUS」モデル)が使用できますので、BigQuery MLを使用してARIMA_PLUSモデルを作成して予測に利用することにしました。
予測モデル作成と予測実施の手順
それでは予測モデル作成について順を追って説明していきます。
まず、Google AnalyticsのテーブルにSQLでクエリを行い、学習用データを作成します。作成方法の詳細は省略します。学習用データは、日付(年月日)、記事のカテゴリー、そのカテゴリーのPVの平均値(PV数の合計をページ数で割ったもの)となります。平均値を用いている理由は、記事の数、つまりページ数が多い場合は、その分PVの値が大きくなる影響を取り除くためです。ここではforecast_dataset
データセットのdata_forecast
テーブルにこのデータを格納しています(図3)。なお、データは説明のための仮のデータを用いています。

CREATE OR REPLACE MODEL forecast_dataset.forecast_pv OPTIONS (MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'day', TIME_SERIES_ID_COL = 'category', TIME_SERIES_DATA_COL = 'avg_pageviews' ) AS SELECT category, day, avg_pageviews FROM `forecast_dataset.data_forecast`;
ここで指定しているオプションの説明は表1のとおりです。他に指定できるオプション等は、公式のリファレンスを参照してください。
オプション名 | 説明 |
---|---|
MODEL_TYPE | モデル名(今回は「ARIMA_PLUS」) |
TIME_SERIES_TIMESTAMP_COL | タイムスタンプ、日付など時を示す値が格納されている列名 |
TIME_SERIES_ID_COL | 複数の時系列を識別するためのIDが格納されている列名 |
TIME_SERIES_DATA_COL | 予測対象の列名(今回は平均PV数) |
予測モデルについては、予測したい時系列(カテゴリー)が複数ある場合、それぞれについて予測モデルを作成する必要があるわけではなく、TIME_SERIES_ID_COL
を指定することにより1つのモデルで複数の時系列(複数のカテゴリー)を予測できるようにできます。モデルの作成に要する時間は数分です(テーブルのレコードの件数が数万行の場合)。
モデルの作成が完了すると、Google Cloudコンソールで作成したモデル(名前はforecast_pv
)が確認できます(図4)。

SELECT * FROM ML.ARIMA_EVALUATE(MODEL forecast_dataset.forecast_pv);
実行結果(図5)のうち、特にseasonal_periods
を確認します。ここで、年単位の周期(YEARLY)でアクセス数が変化するものは、その年単位の周期が適切に捉えられているかどうかを確認します。もし、データによって他の周期(月単位等)が想定される場合は、同様に確認します。


次に作成した予測モデルで予測を行います。予測はML.FORECAST関数を含む次のSQLを実行します。
SELECT category, DATE(forecast_timestamp) AS day, forecast_value, prediction_interval_lower_bound, prediction_interval_upper_bound FROM ML.FORECAST(MODEL forecast_dataset.forecast_pv, STRUCT(90 AS horizon, 0.8 AS confidence_level));
horizon
は予測日数です。学習に用いたデータの最終日の翌日(例えば学習用データが1月31日までなら2月1日)から何日分の予測を行うかを指定しています。ここでは90日の予測を行う指定となっています。また、confidence_level
は信頼区間に関する指定であり、実行結果(図7)に含まれるprediction_interval_lower_bound
からprediction_interval_upper_bound
までの区間に入る確率が指定した値になるような区間を出力する指定となっています。ここでは80%(0.8)になるように指定しています。
このようにBigQuery MLでは、予測の実施もテーブルへのクエリ同様にSQLで行えるようになっており、インタフェース的に扱いやすくなっています。

ユーザインタフェース
予測結果が得られましたが、それはSQLの実行結果の表形式のデータとなっています。これをもっと分かりやすく直感的に理解できるようにするため、可視化を行いました。
BigQueryのデータを可視化する方法としてGoogleデータポータルを使用すると比較的容易にダッシュボードを作成できますので、Googleデータポータルを使用してダッシュボードを作成しました。
Googleデータポータルでは、データソースとしてBigQueryを選択します(図8)。

UNION ALL
で結合しています。


おわりに
今回はBigQuery MLを使用してARIMAモデルを作成して予測を行い、ダッシュボードでの可視化を行いました。ARIMAモデルではPVなどの予測対象の値(対象変数)のみを学習用データとして利用しましたが、記事の内容(ジャンル、カテゴリー)によっては他の情報、例えば天気の情報や休日の情報などを用いるとより精度を向上させることが可能になると考えています。そのため、現在はVertex AI AutoML Forecasting(表形式データの予測モデル)やAWSのAmazon Forecastでの予測モデル作成にも取り組んでいます。また、Amazon Forecastの予測結果については、使用するツールの制限に囚われず、より自由度の高い可視化を行うため、Vue.jsでダッシュボードを開発中です。その詳細については、また後日このブログで紹介したいと考えています。
KADOKAWA Connectedでは中途採用を進めております。 ご興味がある方はこちらの求人一覧ページからご応募をお願いいたします。
※ 今回紹介したGoogle Cloud、AWSのサービスやその機能については、2022年2月時点の情報を掲載しております。ご利用になる場合は、念のため公式サイト等で最新の情報をご確認ください。
※ Google Cloud、Google Analytics、BigQuery、Vertex AIはGoogle LLC の商標です。その他の会社名、製品名、サービス名は各社の登録商標または商標です。