RailsにA/Bテストツールを導入する

A/B test

A/Bテストしたいと要望が来た。社内標準を聞いたら、“独自実装”らしい…。じゃぁ、“独自実装”するかぁ〜と思っていたのだが、社内での立ち位置は以下の通りなので、“独自実装”したら何を言われるか…。

そこで、OSSのA/Bテストツールの登場である。現在メンテナンスされていて、当然Rails4にも対応しているものを探したら、すぐに見つかったので、Splitを採用した。

Splitとは何か?

公式サイトを読もう!(もちろん、英語だ)

Split

Requirements

前提条件は以下の通り。

Split currently requires Ruby 1.9.2 or higher. If your project requires compatibility with Ruby 1.8.x and Rails 2.3, please use v0.8.0.
Split uses redis as a datastore.
Split only supports redis 2.0 or greater.
If you’re on OS X, Homebrew is the simplest way to install Redis:
$ brew install redis
$ redis-server /usr/local/etc/redis.conf
You now have a Redis daemon running on 6379.
split/README.md

Redisというものが必要らしい。Redisについては別途調べるとして、引き続き、インストールを。

Setup

Splitを使うにはRedisが必要なのでインストールする。

$ brew install redis

続いて、起動

$ redis-server /usr/local/etc/redis.conf

バックグラウンドで起動する場合は末尾に&を付ける

$ redis-server /usr/local/etc/redis.conf &

停止する時は

$ redis-cli shutdown

続いて本題のSpritをインストールする。

gem 'split'

ダッシュボード機能を使う場合は以下。ダッシュボード機能はA/Bテストの結果を画面から確認ができる機能になる。

gem 'split', require: 'split/dashboard'
mount Split::Dashboard, at: 'split'

その後に

$ bundle install

Usage

ab_testfinishedの2つのメソッドを使う。

ab_testはそのものずばり、A/Bテストのパターンを定義する。

controllerに記載する場合は以下になる。

def start_ab_test
  # @ab_test_oneをどこかのviewに挿入する
  @ab_test_one = ab_test('test_name', 'testA', 'testB')
end

viewに記載する場合は以下になる。

<% ab_test('test_name', 'testA', 'testB') do |text| %>
  <%= text %> 
<% end %>

ab_testを実行した結果はユーザのセッション毎に内容は同一になる(=リロードしても同じ内容になっている)。

finishedはコンバージョンを達成する際に呼ぶメソッド。

def finish_ab_test
  # 第一引数はコンバージョンを取りたいab_testの第一引数と一致させる
  finished('test_name')
end

finishedに第一引数しか指定しなければab_testのセッションはリセットされ、再びab_testを実行すると別の値になる可能性がある。

ab_testのセッションをリセットしたくない場合は

def finish_ab_test
  # 第一引数はコンバージョンを取りたいab_testの第一引数と一致させる
  finished('test_name', reset: false)
end

とすると、同一セッションのユーザはfinishedを実行後もab_testの内容を引き継ぎ、その後、何度finishedを実行してもデータに反映されない(=1セッション1コンバージョン)。

以下でダッシュボード機能を有効化している場合、/splitにアクセスすることで、セッション数、コンバージョン達成数、コンバージョン率などが確認できる。

mount Split::Dashboard, at: 'split'

関連情報