はじめに
こんにちは。推薦基盤ブロックの宮本です!(早いもので新卒 5 年目です)
最近は ZOZOTOWN のホーム画面のユーザーパーソナライズ化に関するプロジェクトに携わっています。
推薦システムをリリースする上で、必要不可欠なのが AB テストです。弊チームでは、AB テストの実施サイクルを高速化するために Looker Studio を活用しています!
Looker Studio は、以下のようなメリットがあります。
- BigQuery との連携が簡単
- 社内での共有がしやすい
- 一元管理が可能
一方で、制約も存在しており、「やりたいことができない」と感じることも多々あります。
今日は Looker Studio を使用して AB テストの結果を可視化する際に工夫したことを紹介します!
BI ツールの選定に関しては、以下の記事が参考になります。
課題
AB テストの結果を可視化する際、必ず確認したい指標の一つが、treatment/control 比、すなわち、新ロジック(treatment)が従来のロジック(control)に対してどれだけアップリフトをもたらしたかを示す値です。
しかし、残念ながら Looker Studio の UI 操作では、この treatment/control 比を算出することができません。(もし実現可能な方法をご存じの方がいれば、ぜひ教えてください!)
スプレッドシートでは簡単に計算できる操作ですが、Looker Studio は可視化専門のツールであるため、データの操作は BI ツール側で対応せず、ユーザーがあらかじめ必要なデータを用意する設計となっているのではと考えております。
そこで、treatment/control 比を算出するクエリを紹介します。
treatment/control 比を算出するクエリ
愚直に書いた場合、以下のようなクエリになります。
WITH control AS (
SELECT * FROM `target_table` WHERE variant_name = 'control'
)
, treatment1 AS (
SELECT * FROM `target_table` WHERE variant_name = 'treatment1'
)
, treatment2 AS (
SELECT * FROM `target_table` WHERE variant_name = 'treatment2'
)
, tre1_con AS (
SELECT
control.calendar_date
,"treatment1" AS variant_name
,SAFE_DIVIDE(treatment1.order_price,control.order_price) order_price
FROM control
LEFT JOIN treatment1
ON control.calendar_date = treatment1.calendar_date
)
, tre2_con AS (
SELECT
control.calendar_date
,"treatment2" AS variant_name
,SAFE_DIVIDE(treatment2.order_price,control.order_price) order_price
FROM control
LEFT JOIN treatment2
ON control.calendar_date = treatment2.calendar_date
)
SELECT * FROM tre1_con
UNION ALL
SELECT * FROM tre2_con
このクエリの問題点は、treatment が増えるたびにクエリのコード量が増え、その都度修正が必要になることです。
サンプルクエリ程度のコード量であれば問題は小さいですが、実際の AB テストでは以下のような状況が想定されるため、問題が顕著になります。
- 使用するロジックが増える
- 確認したい指標が増える
その結果、冗長なコード量が膨大になり、メンテナンスが困難になります。
そこで、上記の問題点を踏まえて改良したクエリが以下です。
WITH control AS (
SELECT * FROM `target_table` WHERE variant_name = 'control'
)
, treatment AS (
SELECT * FROM `target_table` WHERE variant_name != 'control' -- ポイント1
)
, tre_con AS (
SELECT
c.calendar_date
, concat(t.variant_name) as variant_name -- ポイント2
,SAFE_DIVIDE(treatment1.order_price,control.order_price) order_price
FROM treatment AS t, control AS c -- ポイント3
WHERE t.calendar_date = c.calendar_date
)
SELECT * FROM tre_con
このクエリでは、そもそものコード量が減っており、treatment が増えてもコードを修正する必要がありません。
まとめ
本記事では、Looker Studio の制約である treatment/control 比の算出が難しい点と、その解決策として汎用的なクエリを紹介しました。改良クエリにより、treatment が増えてもコード修正が不要になり、メンテナンス性と効率性が大幅に向上します。
これからも、実務で役立つこうした Tips を随時紹介していきます!