abanalyzer 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/Gemfile.lock +16 -0
- data/Rakefile +5 -31
- data/lib/abanalyzer.rb +1 -0
- data/lib/abanalyzer/sample.rb +42 -0
- data/lib/abanalyzer/version.rb +1 -1
- metadata +34 -56
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/Rakefile
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
$:.push File.expand_path("../lib", __FILE__)
|
2
1
|
require 'rubygems'
|
3
|
-
require '
|
2
|
+
require 'bundler'
|
4
3
|
require 'rake/testtask'
|
5
|
-
require '
|
6
|
-
require 'rake/gempackagetask'
|
4
|
+
require 'rdoc/task'
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
require "abanalyzer/version"
|
6
|
+
Bundler::GemHelper.install_tasks
|
11
7
|
|
12
8
|
desc "Create documentation"
|
13
|
-
|
9
|
+
RDoc::Task.new("doc") { |rdoc|
|
14
10
|
rdoc.title = "ABAnalyzer - A/B test analysis library for Ruby"
|
15
11
|
rdoc.rdoc_dir = 'docs'
|
16
12
|
rdoc.rdoc_files.include('README.rdoc')
|
@@ -19,29 +15,7 @@ Rake::RDocTask.new("doc") { |rdoc|
|
|
19
15
|
|
20
16
|
desc "Run all unit tests"
|
21
17
|
Rake::TestTask.new("test") { |t|
|
22
|
-
t.libs
|
18
|
+
t.libs +=[ "lib", "." ]
|
23
19
|
t.test_files = FileList['test/*_test.rb']
|
24
20
|
t.verbose = true
|
25
21
|
}
|
26
|
-
|
27
|
-
spec = Gem::Specification.new do |s|
|
28
|
-
s.name = "abanalyzer"
|
29
|
-
s.version = ABAnalyzer::VERSION
|
30
|
-
s.authors = ["Brian Muller"]
|
31
|
-
s.date = Date.today.to_s
|
32
|
-
s.description = "A/B test analysis library for Ruby - performs Chi-Square tests and G-tests on A/B results."
|
33
|
-
s.summary = "Performs statistical tests for significant differences in categorical data."
|
34
|
-
s.email = "brian.muller@livingsocial.com"
|
35
|
-
s.files = FileList["lib/**/*", "[A-Z]*", "Rakefile", "docs/**/*"]
|
36
|
-
s.homepage = "https://github.com/livingsocial/abanalyzer"
|
37
|
-
s.require_paths = ["lib"]
|
38
|
-
s.add_dependency('statistics2', '>= 0.54')
|
39
|
-
end
|
40
|
-
|
41
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
42
|
-
pkg.need_zip = true
|
43
|
-
pkg.need_tar = true
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "Default task: builds gem and runs tests"
|
47
|
-
task :default => [ :gem, :test ]
|
data/lib/abanalyzer.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'statistics2'
|
2
|
+
|
3
|
+
module ABAnalyzer
|
4
|
+
|
5
|
+
# Calculate the minimum sample size (per group) based on the desire to detect
|
6
|
+
# a increase from proportion p1 to proportion p2. Significance is generally
|
7
|
+
# safe at 0.05 (why? just because) and a power of 0.8 (why? just because)
|
8
|
+
def self.calculate_size(p1, p2, significance, power)
|
9
|
+
[ p1, p2, significance, power ].each { |a|
|
10
|
+
raise "All arguments to calculate_size must be Floats" unless a.is_a?(Float)
|
11
|
+
}
|
12
|
+
|
13
|
+
pbar = (p1 + p2) / 2.0
|
14
|
+
sides = 2.0
|
15
|
+
|
16
|
+
zcrit = Statistics2.pnormaldist(1 - (significance / sides))
|
17
|
+
zpow = Statistics2.pnormaldist(power)
|
18
|
+
|
19
|
+
numerator = (zcrit * Math.sqrt(2 * pbar * (1 - pbar)) + zpow * Math.sqrt(p2 * (1 - p2) + p1 * (1 - p1))) ** 2
|
20
|
+
denominator = (p2 - p1) ** 2
|
21
|
+
(numerator / denominator).ceil
|
22
|
+
end
|
23
|
+
|
24
|
+
# Calculate the confidence interval given the number of successes and trials at
|
25
|
+
# the desired level of significance. Returns an Array of [lower, upper]
|
26
|
+
def self.confidence_interval(successes, trials, alpha)
|
27
|
+
sides = 2.0
|
28
|
+
zcrit = Statistics2.pnormaldist(1 - (alpha / sides))
|
29
|
+
p = successes.to_f / trials.to_f
|
30
|
+
|
31
|
+
interval = zcrit * Math.sqrt((p * (1 - p)) / trials.to_f)
|
32
|
+
[p - interval, p + interval]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Like confidence_interval, but returns the relative interval compared to the baseline given
|
36
|
+
# in compared_proportion
|
37
|
+
def self.relative_confidence_interval(successes, trials, compared_proportion, alpha)
|
38
|
+
ci = confidence_interval(successes, trials, alpha)
|
39
|
+
[(ci.first - compared_proportion) / compared_proportion, (ci.last - compared_proportion) / compared_proportion]
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/lib/abanalyzer/version.rb
CHANGED
metadata
CHANGED
@@ -1,88 +1,66 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: abanalyzer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 0.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Brian Muller
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-08-17 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: statistics2
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70291725609180 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 54
|
33
|
-
version: "0.54"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.54'
|
34
22
|
type: :runtime
|
35
|
-
|
36
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70291725609180
|
25
|
+
description: A/B test analysis library for Ruby
|
37
26
|
email: brian.muller@livingsocial.com
|
38
27
|
executables: []
|
39
|
-
|
40
28
|
extensions: []
|
41
|
-
|
42
29
|
extra_rdoc_files: []
|
43
|
-
|
44
|
-
files:
|
30
|
+
files:
|
45
31
|
- lib/abanalyzer/abtest.rb
|
46
32
|
- lib/abanalyzer/exceptions.rb
|
47
33
|
- lib/abanalyzer/matrix.rb
|
34
|
+
- lib/abanalyzer/sample.rb
|
48
35
|
- lib/abanalyzer/version.rb
|
49
36
|
- lib/abanalyzer.rb
|
37
|
+
- Gemfile
|
38
|
+
- Gemfile.lock
|
50
39
|
- LICENSE
|
51
40
|
- Rakefile
|
52
41
|
- README.rdoc
|
53
|
-
has_rdoc: true
|
54
42
|
homepage: https://github.com/livingsocial/abanalyzer
|
55
43
|
licenses: []
|
56
|
-
|
57
44
|
post_install_message:
|
58
45
|
rdoc_options: []
|
59
|
-
|
60
|
-
require_paths:
|
46
|
+
require_paths:
|
61
47
|
- lib
|
62
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
49
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
|
69
|
-
- 0
|
70
|
-
version: "0"
|
71
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
55
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
segments:
|
78
|
-
- 0
|
79
|
-
version: "0"
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
80
60
|
requirements: []
|
81
|
-
|
82
|
-
|
83
|
-
rubygems_version: 1.3.7
|
61
|
+
rubyforge_project: abanalyzer
|
62
|
+
rubygems_version: 1.8.17
|
84
63
|
signing_key:
|
85
64
|
specification_version: 3
|
86
|
-
summary:
|
65
|
+
summary: A/B test analysis library for Ruby
|
87
66
|
test_files: []
|
88
|
-
|