BigQuery ML 試し打ち #03

SQLによるクラスタリング。

BigQuery MLは、Googleが提供するデータウェアハウス(Data Warehouse:DWH)であるGoogle BigQuery上にて機械学習(Machine Learning:ML)を可能とするクラウドサービスです。最大の特徴は、モデルの作成から評価や予測までをBigQueryと同様の標準SQLによるクエリ形式で行う点です。これにより、データの準備を含めた機械学習のすべてのプロセスをBigQuery上でSQLのみで完結することが可能となり、作業効率やセキュリティの面で大きなメリットが得られます。

前回の「BigQuery ML 試し打ち」ではロジスティック回帰モデルを用いて、総合ECサイトの会員の継続予測を行いました。今回は先日ベータ版がリリースされたk平均法クラスタリングのモデルの試し打ちがてら、例によって「データエスノグラフィ入門」と連動し、総合ECサイトの会員のクラスタリングを行なってみようと思います。

なお、同じテーマを「クラスター分析入門」で扱っており、クラスター分析(Cluster Analysis)あるいはクラスタリング(Clustering)とは何か、階層型非階層型の違いは何かなどの詳細はそちらに詳しいので、ここでは省略します。また分析ツールについては、そこではGoogle Cloud Datalabを用いましたが、ここではBigQuely MLを用いるため、どちらも試しながら両方の違いを検証するのもよいでしょう。

機械学習用のデータと環境を準備。

それではBigQuery MLを用いたクラスタリングを始めましょう。分析を進める前に、まずは分析の背景と目的を整理します。

あなたは、とある総合ECサイトの責任者です。ECサイトでは、F2転換率が重要であると言われています。この”F”は購買頻度(Frequency)のことで、F2転換率とは初回購買から二回目購買への転換率(Conversion Rate)を意味します。一般的に、新規会員の獲得よりも、既存会員のリピート購買促進のほうがコスト効率が高いため、F2転換率は重要な指標となります。とはいえF2転換した会員が、その後も継続的に購買してくれる、いわゆる優良会員になるとは限りません。

そこで今回の分析目的を「優良化する会員の行動特性を、購買履歴データから把握する」とします。なおそこには、まだ優良化していな会員を意図的に優良化するためのヒントがあることは言うまでもありません。

分析対象データは、とある総合ECサイトの会員の購買履歴データとし、概要は以下のとおりです。

  • 種類:総合ECサイトの会員の購買履歴
  • 期間:2005年1月〜2013年12月(9年間)
  • 会員数:639,777人
  • 購買数:7,599,650件(平均11.9件/人)

データソースは以下の3つを使用します。なお、こちらはすでにBigQueryに投入済みとします。

データソース 変数 ダウンロード
会員マスタ
mst_members
会員ID, 年齢, 性別, 居住地など [↓]105MB
商品マスタ
mst_products
商品ID, 商品カテゴリなど [↓]53MB
購買履歴
trx_orders
会員ID, 商品ID, 注文日, 価格 [↓]698MB

行動特性の分析を進める中で、購買商品カテゴリ数と優良化との間に相関があることがわかりました。(※「データエスノグラフィ入門 #04」を参照)これは、新たな商品カテゴリを提案することが優良化につながる可能性を示唆しています。ただし、闇雲に提案するよりも、類似する会員セグメントの併売傾向と照らし合わせ、未購買商品カテゴリを提案するほうが効果が高いと考えられます。そこでクラスター分析によりそれを明らかにします。

まずはクラスタリングに用いる説明変数を定義します。説明変数を定義することを変数選択特徴選択といいますが、非常に難しい問題なので、ここでは深く触れず、ひとまず「性別・年齢・購買商品カテゴリ」とします。

なお、クラスタリングにおいて強い相関をもつ変数の存在は冗長で無意味であり、予めどちらかを除外する必要がありますが、これらの各変数間に相関性が見られないことは確認済みとします。(※「クラスター分析入門 #02」を参照)

次にクラスタリング用のデータを用意するわけですが、ここでひとつ前処理が必要になります。クラスタリングでは要素間の距離を類似度とみなすことで類似性を分析するのですが、距離を測定するためには変数が数値化されている必要があります。しかしながら、性別や購買商品カテゴリは質的変数であるため、そのままでは数値として扱うことができません。そこでダミー変数(Dummy Variable)に置き換えます。また、年齢は量的変数であるため、説明変数として扱うことが可能ですが、クラスタリングに使うには他の説明変数と値の範囲を揃える必要があります。そこで正規化(Normalization)を行います。ダミー変数と正規化については「クラスター分析入門 #02」に詳しいので省略します。

以上を踏まえ、クラスタリング用のデータを以下のスキーマ定義で作成します。

変数
性別(gender) 男性:0、女性:1
年齢(age) 年齢の1/100
洋服の購買経験あり(is_buy_clothing) 偽:0、真:1
玩具の購買経験あり(is_buy_toy) 偽:0、真:1
スポーツ用品の購買経験あり(is_buy_sports) 偽:0、真:1
家庭用品の購買経験あり(is_buy_home) 偽:0、真:1
美容用品の購買経験あり(is_buy_beauty) 偽:0、真:1
本の購買経験あり(is_buy_books) 偽:0、真:1
自動車用品の購買経験あり(is_buy_automotive) 偽:0、真:1
映画の購買経験あり(is_buy_movie) 偽:0、真:1
電化製品の購買経験あり(is_buy_electronics) 偽:0、真:1

この定義に従ってBigQueryで分析用のテーブルを作成します。BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。このクエリ結果をデータセット「DE」に「sum_members_cls_ non」という名前で保存します。これで分析用のデータと環境は整いました。

モデルを作成する。

データの準備が整ったので、クラスタリングを進めて行きます。まずはモデルの作成を行います。モデルの作成には、BigQuery MLで用意されているCREATE MODELという関数を使用し、以下の構文で記述します。なおクラスタリングは教師なし学習のため、正解を示す目的変数は存在せず、また訓練データと評価用データに分割する必要はありません。

CREATE OR REPLACE MODEL データセット名.モデル名 
OPTIONS( 
  model_type = 使用するモデリングタイプ
  ,num_clusters = クラスター数
  ,standardize_features = 真偽値
) AS (
  SELECT 説明変数, ...
  FROM 機械学習用データテーブル
)

[model_type]にはk平均法クラスタリングを示す[kmeans]を指定します。クラスター数を指定するオプションの[num_clusters]には妥当性が確認されているである10を指定します。(※「クラスター分析入門 #03」を参照)また、[standardize_features]は正規化を行うかどうかのオプションで、すでに処理済みですがTRUEを指定しておきます。なお、初期設定はTRUE であるため省略可能です。

BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。なおこのクエリ結果はデータセット「DE」に「mdl_members_cls」という名前で自動的に保存されます。

これでモデルの作成は完了です。次回は作成したモデルの可視化や予測結果の出力を行います。