8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 8

Looker Studio で AB テストの結果を可視化する際の Tips

Last updated at Posted at 2024-12-07

はじめに

こんにちは。推薦基盤ブロックの宮本です!(早いもので新卒 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 比を算出するクエリ

愚直に書いた場合、以下のようなクエリになります。

sample1.sql
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 テストでは以下のような状況が想定されるため、問題が顕著になります。

  • 使用するロジックが増える
  • 確認したい指標が増える

その結果、冗長なコード量が膨大になり、メンテナンスが困難になります。

そこで、上記の問題点を踏まえて改良したクエリが以下です。

sample2.sql
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 を随時紹介していきます!

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?