ruby on railsでA/Btestその2:split使う
(追記:slideshareにsplitまとめたので、良ければどうぞ。 http://www.slideshare.net/ryumatsukano/rails-ab-testing-by-split-gem )
splitというgemを使って
ruby on rails3(3.1〜)で
A/B testするまで。
※ちょっとお酒が入っているので、
読み辛かったらすみません。。。
split
https://github.com/andrew/split
※redisが必要
目次
今回のシチュエーション
redisをlocal(mac)にinstall
rails sampleを作成
A/B testを作成
ブラウザ確認
結果の確認
今回のシチュエーション
scaffoldで作った画面の、
「新規作成」リンクを以下2パターン悩んでいたとする。
パターンA:「NEWNEW!」リンクにするべきか
パターンB:「新規に作成!」リンクにするべきか
これをA/B testで検証して確認してしまおう、
というシチュエーションを仮定。
redisをlocal(mac)にinstall
macなら
$ brew install redis
error
以下のようなエラーが出るかも。
Error: Permission denied - /usr/local/var/
こんな事言われたら、とりあえず、
$ sudo mkdir /usr/local/var
$ sudo chown -R 自分の名前:stuff /usr/local/var
根本解決になってないし、あまり、良くないのだろうけど、とりあえず上記でinstallできる。
redisをdaemon起動
daemonizeをyesにする
redis-serverを起動
1)daemonizeをyesにする
$ vim /usr/local/etc/redis.conf
daemonize yes
- 2)redis-serverを起動
$ redis-server /usr/local/etc/redis.conf
railsプロジェクトの準備
$ rails new split_jikken
$ cd split_jikken
$ vim Gemfile
以下を追記して終了
gem 'split' , :require => 'split/dashboard'
※後ろにdashboard付けるとWebInterfaceがつく(後述)
インストールする
$ bundle install
とりあえず、scaffoldしてdb作る。
$ rails generate scaffold apples name:string price:integer
$ bundle exec rake db:migrate
$ bundle exec rails server
これで、
localhost:3000/apples
に何か表示されている
A/B testを作成
app/views/apples/index.html.erb
<% ab_test("link-abtest", "NEWNEW!", "新規に作成!") do |link_label| %>
<%= link_to link_label, new_apple_path %>
<% end %>
構文
ab_test(ABテスト名, パターンA, パターンB, ・・・・・) do |今回のパターン| ... end
パターンは複数提示できる。
パターンは重み付けできる。 {pattern_a => 10} , {pattern_b => 1}
app/controllers/apples_controll
def new
- finished("link-abtest")
これで、split独自のセッションが終了する。(後述)
- 括弧内に有るのは、ab_testで定義したabtestの名前
config/routes.rb
- mount Split::Dashboard, :at => 'split'
これで、dashboardが見れる。
ブラウザ確認
を見ると、NEWNEWか、新規に作成と表示しているはず。
実験1)更新してみる
F5(Cmd + R)で、ブラウザ更新しまくる。
でも、結果、同じ。
ずっと、同じリンクを表示し続ける。
これは、独自のセッションをsplitで管理しているっぽく、
そのセッションが終わるまで、
同じパターンを保持し続けているっぽい。
すごいね。
実験2)リンクを押してみる(NEWNEWか新規に作成か、)
リンクを押して、
もう一度、index画面に戻ると、
NEWNEWか新規に作成か、が、
また、新しいものになっているかもしれない。
これは、controllerで、
finishedを指定しているため、
独自のセッションが終了するから。
※ちなみに、セッション終了後にも、
強制的に同じpatternを表示し続ける事も可能。
finishedにreset=>falseをつけるといいらしい。
結果の確認
localhost:3000/splitを見に行くと、
こんな感じになってる。
- participantsがsession数っぽい
- completedがfinishedまでたどり着いた数っぽい。(not finishedはその名の通り)
注目
ここで、注目すべきは、
Finishの欄のUse thisボタンを選択すると、
今後、そのパターンしか出さない。
Winner / Looserがつく。
sessionがfinishedになっていない人も
Winnerしか表示しない。
すげーよくできてる。
注意
winner/ looserみたいな
重要な情報をredisに入れているっぽいので、
redisを切り替える際等、ご注意を。
。。。というか、この機能使わない方がいいかも。
redisの状態自体で、表示切り替わるというのも、
保守の混乱の元になりそう。
なので、ab_testで結果確認したら、
ab_testとfinishedを消して行った方がいいかと思う。