class ABAnalyzer::ABTest

Public Class Methods

new(values) click to toggle source

values should be hash of hashes, with top level hash the group names: { :groupa => { :yes => 20, :no => 10 }, :groupb => { :yes => 18, :no => 8 } }

# File lib/abanalyzer/abtest.rb, line 7
def initialize(values)
  @values = Matrix.new values
end

Public Instance Methods

chisquare_p() click to toggle source
# File lib/abanalyzer/abtest.rb, line 35
def chisquare_p
  1 - Statistics2.chi2dist(df, chisquare_score)
end
chisquare_score() click to toggle source
# File lib/abanalyzer/abtest.rb, line 15
def chisquare_score
  sum = 0
  @values.each_cell do |colname, rowname, value|
    ex = expected(colname, rowname)
    test_sufficient_data(colname, rowname, ex, value)
    sum += ((value - ex)**2) / ex
  end
  sum
end
different?(sig = 0.05) click to toggle source
# File lib/abanalyzer/abtest.rb, line 11
def different?(sig = 0.05)
  gtest_p < sig
end
gtest_p() click to toggle source
# File lib/abanalyzer/abtest.rb, line 39
def gtest_p
  1 - Statistics2.chi2dist(df, 2 * gtest_score)
end
gtest_score() click to toggle source
# File lib/abanalyzer/abtest.rb, line 25
def gtest_score
  sum = 0
  @values.each_cell do |colname, rowname, value|
    ex = expected(colname, rowname)
    test_sufficient_data(colname, rowname, ex, value)
    sum += value * Math.log(value / ex)
  end
  sum
end

Private Instance Methods

df() click to toggle source
# File lib/abanalyzer/abtest.rb, line 54
def df
  (@values.columns.length - 1) * (@values.rows.length - 1)
end
expected(colname, rowname) click to toggle source
# File lib/abanalyzer/abtest.rb, line 50
def expected(colname, rowname)
  (@values.row_sum(rowname) * @values.column_sum(colname)).to_f / @values.total_sum.to_f
end
test_sufficient_data(colname, rowname, expected, value) click to toggle source
# File lib/abanalyzer/abtest.rb, line 45
def test_sufficient_data(colname, rowname, expected, value)
  msg = "Insufficient data size for column #{colname} row #{rowname}.  Expected value must be >= 5, and value must be > 0."
  raise InsufficientDataError, msg if (expected < 5) || (value <= 0)
end