GoogleAnalytics360と機械学習で売上高予測モデルを構築

20190318-e

1. GoogleAnalyticsのデータ活用課題

GoogleAnalyticsは世界で最も使用されているWEBサイトのトラッキングツールだ。アクセス情報だけでなく、ECサイトなどの商品売上も計測できる。

有償版のGoogleAnalytics360では、ユーザID単位の分析が可能になり、ユーザ毎の売上高や購入履歴を閲覧できる。これにより、ユーザ単位の売上予測やレコメンド等の機械学習によるモデルが作成できる。

しかし、これは初学者にとってはハードルが高い。機械学習モデルはPythonなどのプログラミング言語を用いて作成するため、言語やアルゴリズムの知識、高性能なインフラ等が必要だ。

これらの課題を解決したのがBigQueryMLである。

2. BigQueryMLの紹介

GoogleAnalytics360のデータはBigQueryと呼ばれる、大規模なデータベースに格納される。BigQueryMLは、BigQuery上で機械学習モデルが構築できる機能だ。以下に、BigQueryMLの特徴を述べる。

2-1:作成可能なモデル
BigQueryMLは教師あり学習とよばれる「データからある値を予測するためのモデル」を作成できる。具体的には以下の通りとなる。

 A:2 項ロジスティック回帰モデル
 2つのクラスの1つを予測する場合に使用する。例えば、ユーザが特定の商品を購入するか否か、ある広告をクリックするか否か、など。

 B:マルチクラス ロジスティック回帰モデル
 3つ以上のクラスを予測する場合に使用する。例えば、ユーザが購入する商品カテゴリは何か、など。

 C:線形回帰モデル
 数値の予測に使用する。例えば、ユーザが購入する商品売上がいくらになるか、サイトに何秒滞在してくれるか、など。

2-2:安価な料金で利用可能
BigQueryMLではモデルを構築している時間だけ課金が発生する。よって、データベースやモデルの構築環境を保持するケースに比べて、はるかに安価である。

3. 線形回帰モデルでGoogleAnalyticsの売上を予測

ここからは、実際にBigQueryMLで線形回帰モデルを作成していく。今回はサンプルで公開されているGoogleAnalyticsの売上データセットを使用する。

このデータはBigQueryを利用できる方は誰でも扱える。GCPのプロジェクトを作成した状態で以下のリンクをクリックすればよい。

https://bigquery.cloud.google.com/table/bigquery-public-data:google_analytics_sample.ga_sessions_20170801

また、BigQueryの操作やBigQueryMLの操作に関しては以下のGoogle公式ドキュメントを参考にしてほしい。

https://cloud.google.com/bigquery/?hl=ja

図1:GoogleAnalyticsの売上データセット
図1:GoogleAnalyticsの売上データセット

3-1:データセットの作成
まずはデータセットの作成が必要だ。BigQueryMLをはじめとした教師あり学習モデルでは説明変数とよばれる特徴データを用いて、目的変数を予測する。

GoogleAnalyticsには扱えるデータが大量に存在するが、今回は売上を予測するために以下のデータを使用する。

目的変数(予測したいデータ)

  • ユーザの総売上:totals.totalTransactionRevenue

説明変数(学習に使用するデータ)

  • 日付:date
  • 訪問回数:visitNumber
  • 直帰か否か:totals.bounces
  • 総ヒット数:totals.hits
  • 新規ユーザか否か:totals.newVisits
  • 総ページビュー数:totals.pageviews
  • 流入元のグループ:channelGrouping
  • 直接流入か否か:trafficSource.isTrueDirect
  • 参照元:trafficSource.source
  • 利用端末の種類:device.deviceCategory
  • 利用端末のOS:device.operatingSystem
  • 大陸:geoNetwork.continent
目的変数と説明変数を決めたら、実際にモデルを作成していく。

3-2:モデルの作成
次に、線形回帰モデルを作成する。以下のSQLを実行すればモデルの作成が始まる。

#standardSQL
# 01_bqml_testデータセット配下に、liner_reg_transactionモデルを作成
CREATE OR REPLACE MODEL `01_bqml_test.liner_reg_transaction`
OPTIONS
 (
  model_type='linear_reg'		# 線形回帰モデルを作成
  ,l2_reg=0.2			   	# 過学習防止ステータス
  ,max_iterations=50		   	# 訓練回数
  ,learn_rate_strategy='line_search'
  ,ls_init_learn_rate=0.1		# 学習率の指定
  ,early_stop=True			# 改善しなければ途中で学習を停止
  ,data_split_method='auto_split'
 )
AS
  # 説明変数と目的変数を取得。目的変数にはAS labelを指定。
  SELECT
  IFNULL(totals.totalTransactionRevenue, 0) AS label
  ,date
  ,visitNumber
  ,IFNULL(totals.bounces, 0) AS bouces  # 値が空であるなら0に置き換える
    ,IFNULL(totals.hits, 0) AS hits
  ,IFNULL(totals.newVisits, 0) AS newVisits
  ,IFNULL(totals.pageviews, 0) AS pageviews
  ,channelGrouping
  ,trafficSource.isTrueDirect
  ,trafficSource.source
  ,device.deviceCategory
  ,device.operatingSystem
  ,geoNetwork.continent
 FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
 WHERE
  _TABLE_SUFFIX BETWEEN '20160801' AND '20170701'

モデルの作成では説明変数の値を使用して、目的変数の値を予測する。また、BigQuery側で自動的に訓練データと検証データを分割するため、データを分ける前処理が不要となる。

その後、予測値と実際値の差を利用して、損失が最小限となるモデルを見つける。損失とは、精度の低い予測に対するペナルティで、予測の精度がどのくらい低いかを表す。

下記の図2において、Training Data Lossが訓練データの損失で、Evaluation Data Lossが検証データの損失を表す。

図2:損失の値
図2:損失の値

3-3:売上高の予測
作成を行った後は、未知の説明変数に対して、結果を予測する。

#standardSQL
SELECT
 fullVisitorId
 ,correct_transaction_revenue               	# 実際の売上高
 ,predicted_label AS predict_transaction_revenue	# 予測した売上高
FROM
 ML.PREDICT(MODEL `01_bqml_test.liner_reg_transaction`, (
  SELECT
    * 
  FROM (
   SELECT
        IFNULL(totals.totalTransactionRevenue, 0) AS correct_transaction_revenue
    ,fullVisitorId
        ,date
        ,visitNumber
        ,IFNULL(totals.bounces, 0) AS bouces
        ,IFNULL(totals.hits, 0) AS hits
        ,IFNULL(totals.newVisits, 0) AS newVisits
        ,IFNULL(totals.pageviews, 0) AS pageviews
        ,channelGrouping
        ,trafficSource.isTrueDirect
        ,trafficSource.source
        ,device.deviceCategory
        ,device.operatingSystem
        ,geoNetwork.continent
     	FROM
       	 `bigquery-public-data.google_analytics_sample.ga_sessions_*`
      WHERE
          _TABLE_SUFFIX BETWEEN '20170702' AND '20170801')))
      ORDER BY
        correct_transaction_revenue desc

以下に予測結果を抜粋している。結果の見方は以下の通りである。
 fullVisitorId:一意なユーザID
 correct_transaction_revenue:実際の売上高
 predict_transaction_revenue:モデルが予測した売上高

この実売上高と予測売上高の差が小さいほど、予測の精度が高いことを意味している。

図3:モデルで予測したユーザごとの売上高
図3:モデルで予測したユーザごとの売上高

4. 評価指標を改善するために

BigQueryMLでモデルを実際に作成した。しかし、実際の売上高と予測した売上高の差が大きくBigQueryMLが実運用に使えないと考えた方が大半だと思われる。

評価指標の改善には説明変数の再選択、データ量の増加等を行う必要がある。しかし、一番の問題はBigQueryに格納されたデータがモデル作成に適していないことだ。

モデルを作成するために、データを整形する「前処理」と「特徴エンジニアリング」を行うことが重要だ。モデル作成における時間はこの2つが大半を占める。

次回はデータを整形したうえで、再度BigQueryMLでモデルを作成していく。

参考文献
BigQuery公式ドキュメント(2019/3/10現在)
https://cloud.google.com/bigquery/docs/?hl=ja
BigQuery Exportのスキーマ(2019/3/10現在)
https://support.google.com/analytics/answer/3437719?hl=ja

邑川真也

執筆者 邑川真也

デジタルマーケティングの最適化を専門に行っています。
(デジタルマーケティング事業部 デジタルマーケティングコンサルタント)

お問い合わせ

当社のサービス・製品に関するご相談やご質問、お見積りのご依頼など、こちらからお問い合わせください。