lxyuma BLOG

開発関係のメモ

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が必要

目次

  1. 今回のシチュエーション

  2. redisをlocal(mac)にinstall

  3. rails sampleを作成

  4. A/B testを作成

  5. ブラウザ確認

  6. 結果の確認

今回のシチュエーション

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起動

  1. daemonizeをyesにする

  2. redis-serverを起動

  3. 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が見れる。

ブラウザ確認

https://localhost:3000/apples

を見ると、NEWNEWか、新規に作成と表示しているはず。

実験1)更新してみる

F5(Cmd + R)で、ブラウザ更新しまくる。

でも、結果、同じ。

ずっと、同じリンクを表示し続ける。

これは、独自のセッションをsplitで管理しているっぽく、

そのセッションが終わるまで、

同じパターンを保持し続けているっぽい。

すごいね。

実験2)リンクを押してみる(NEWNEWか新規に作成か、)

リンクを押して、

もう一度、index画面に戻ると、

NEWNEWか新規に作成か、が、

また、新しいものになっているかもしれない。

これは、controllerで、

finishedを指定しているため、

独自のセッションが終了するから。

※ちなみに、セッション終了後にも、

 強制的に同じpatternを表示し続ける事も可能。

 finishedにreset=>falseをつけるといいらしい。

結果の確認

localhost:3000/splitを見に行くと、

こんな感じになってる。

f:id:lxyuma:20130218230653p:plain

  • participantsがsession数っぽい
  • completedがfinishedまでたどり着いた数っぽい。(not finishedはその名の通り)

注目

ここで、注目すべきは、

Finishの欄のUse thisボタンを選択すると、

今後、そのパターンしか出さない。

f:id:lxyuma:20130218231325p:plain

Winner / Looserがつく。

sessionがfinishedになっていない人も

Winnerしか表示しない。

すげーよくできてる。

注意

winner/ looserみたいな

重要な情報をredisに入れているっぽいので、

redisを切り替える際等、ご注意を。

。。。というか、この機能使わない方がいいかも。

redisの状態自体で、表示切り替わるというのも、

保守の混乱の元になりそう。

なので、ab_testで結果確認したら、

ab_testとfinishedを消して行った方がいいかと思う。