GitHub - takecy/grouping: simple id grouping package in golang. Useful for AB testing.

ABテストとは

ABテストとは? 今さら聞けないABテストの基礎中の基礎まとめ | 株式会社SHIFT

ABテストとは? 今さら聞けないABテストの基礎中の基礎まとめ | 株式会社SHIFT

ABテストツールVWOの日本唯一のプレミアムパートナーとして、多くのクライアント様のCROに取り組んできたABテストのプロフェッショナルである我々アッション(現・SHIFT)が、今回ABテストの概念・なぜ行う必要があるのか・実施する際のポイント等をまとめましたので、是非ご覧いただければと思います。

ABテストを実施するには、いくつかの要素があり、大きく下記がある。
事前準備として、

  1. ABテストを定義 (名前、割合etc..)
  2. 全ユーザーをグルーピング

そしてリクエストごとに、

  1. リクエスト元ユーザーの所属グループの決定
  2. 出し分け
  3. 結果のロギング
  4. 検証
  5. 繰り返し…

使い方

このパッケージは、「事前準備」と「各リクエストの1」をサーバーサイドでやるためのもので、

  1. あるABテストに対応するグループを定義 (e.g. group-A, group-B)
  2. グループに適用する割合を定義 (e.g. 80:20)
  3. 上記定義で初期化したインスタンスに、id (e.g. user-001)を渡す
  4. 所属しているグループを返す (e.g. group-A)

というすごくシンプルなもの。
基本的な使用例はこんな感じ。

package main

import (
	"fmt"

	"github.com/takecy/grouping"
)

// SimpleElem implements `grouping.Elementer`
type SimpleElem struct {
	name  string
	ratio int
}

func (e *SimpleElem) GetName() string { return e.name }
func (e *SimpleElem) GetRatio() int   { return e.ratio }
func (e *SimpleElem) SetRatio(r int)  { e.ratio = r }

func main() {
	group := grouping.GroupDefinition{
		// case: A+B+C=100
		Elems: []grouping.Elementer{
			&SimpleElem{name: "group-A", ratio: 10},
			&SimpleElem{name: "group-B", ratio: 20},
			&SimpleElem{name: "group-C", ratio: 70},
		},
	}

	g, err := grouping.New(group)
	if err != nil {
		panic(err)
	}

	//
	// The same result will be obtained no matter how many times it is executed.
	//
	testName := "welcome_content_test"

	userID1 := "user-001"
	elem1, err := g.GetGroup(userID1, testName)
	if err != nil {
		panic(err)
	}
	fmt.Printf("elem1: %v\n", elem1.GetName()) // group-A

	userID2 := "user-002"
	elem2, err := g.GetGroup(userID2, testName)
	if err != nil {
		panic(err)
	}
	fmt.Printf("elem2: %v\n", elem2.GetName()) // group-C
}

同じIDであれば、何度呼び出しても同じグループが返されるため、DBなどに保存しておく必要はない。

feature flagとしても使用可能

また、グループ判定に使用するハッシュ値を生成する関数を外から渡すことや、全体の20%に適用という指定も可能なので、feature flagとしても使える。

後はABテストを実施する箇所、例えばコンテンツのリストを作るところ、クライアント画面表示 などで、取得されたグループを参照し、分岐するよう実装する。

ログを取得し、検証し、さらに別のABを・・と、まだまだ道程は長いが、とりあえず最初の一歩用に。

takecy/grouping