2013年3月15日金曜日

rubyからr言語を使って、キャンペーン前後で売上に変化があったか判断する

同一期間ではないので、対応のない場合のt検定を行います。
rubyからR言語を使うには、rsrubyというライブラリを使う。

まずはRのインストール
$ brew install R

で、rのpathを設定します。
$ export R_HOME=/Library/Frameworks/R.framework/Resources

次にrsrubyのインストール
$ gem install rsruby -- --with-R-include=/Library/Frameworks/R.framework/Headers --with-R-lib=/Library/Frameworks/R.framework/Libraries

で、準備は完了。

今回はこんな感じの想定です。
・送料無料キャンペーン(今まで送料無料ではなかった部分の売上が増える=平均単価が減少する仮説)
・送料無料キャンペーンをやっていなかった、去年の売上と今年の売上を比較
・月初から今日までの期間を考える


以下がコード

まずはヒストリカルグラフで確認
require 'rsruby'

r = RSRuby::instance
x = Order.where("created_at between ? and ?" , Time.now.beginning_of_month, Time.now).map(&:price).(&:to_f)
y = Order.where("created_at between ? and ?" , Time.now.beginning_of_month - 1.years, Time.now - 1.years).map(&:price).(&:to_f)

r.eval_R(<<-RCOMMAND)

hist(#{y.join(",")}, breaks = 5 ,col = "#0000ff40", border = "#0000ff", freq = TRUE)
hist(#{x.join(",")}, breaks = 5 ,col = "#ff00ff40", border = "#ff00ff", freq = TRUE, add = TRUE)

RCOMMAND
一応F検定
r.var_test(x, y)

t検定
r.t_test(x, y, altenative="two.sided")

するとこんな感じの結果がでます。

 {"statistic"=>{"t"=>1.8121550934930575}, "parameter"=>{"df"=>4.0}, "p.value"=>0.1441855869309796, "conf.int"=>[-14560.490812856453, 69286.49081285646], "estimate"=>{"mean of x"=>32613.0, "mean of y"=>5250.0}, "null.value"=>{"difference in means"=>0.0}, "alternative"=>"two.sided", "method"=>"Welch Two Sample t-test", "data.name"=>"c(63210L, 14385L, 74970L, 5250L, 5250L) and c(5250L, 5250L)"}

2013年3月4日月曜日

ruby2.0 on Rails4.0でABテストができる短縮URLサービスを作った

先日ruby2.0が公開され、Rails4.0がついにbetaとしてgem化されていたので、早速使ってみた。

作ったサービスは、こちら http://url-s.herokuapp.com/

ソースはgithubにあげてあります。

これは2種類以上のURLを登録できる短縮URLサービスです。
外部サービスを利用していてABテストができないときに、2種類のランディングページを用意しておいて、短縮URLでランダムに飛んでもらいテストするという用途を想定しています。

以下ruby2.0とRails4.0を使ってみた感想。

  • 起動早い。2.0のおかげだと思うけど、前の環境には戻りたくない
  • マジックコメントいちいち書かなくていいの最高!
  • strong paramerterでちょいはまり。特にネストしたモデルのを扱うなら、attributesの方のidを許可しないと、updateした時に、新規で作成されてしまうので注意。
  • find_byメソッドのほうが直感的でよい。というかなんでそうじゃなかったの?

結論。 新規でアプリ作る場合、特に躊躇する理由もないので、この組み合わせで積極的に使っていきたい。