wilson_score 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a66381f037f35b8c6af86cd5c654f243378f620
4
- data.tar.gz: 8d56f3a99766730ee9baecbb0c63b39be703fd0b
3
+ metadata.gz: be14e070c2299eb4ca4bfb98fff17bc037778702
4
+ data.tar.gz: 811d3aed20e01c0f4498c5ef40ac7129f8322eff
5
5
  SHA512:
6
- metadata.gz: 50d652c3613f6bba4dd2c685ad8c60943eb8d974276be0cee64c6fb2fab9aee514efb6b64471d9d862d527853d7d6f3cfdcc61a99aa84b376e654e3c5c6fc20f
7
- data.tar.gz: 1734379e9da77cef40f164ba86525f98f35c991f0c3ff954e93ec82b459865a42eb5384b92289e7d8db56e618e3e6d974560f7952515f51cc29cfa0567d07199
6
+ metadata.gz: 640f472abf05bd6f9acc79ee4644136387346a15d409c60d4c0dd5f739da5aaef2e4178bcf79d954822c5e4477676c577eaccde796b8b76f37ea5ade87440925
7
+ data.tar.gz: ee62a52fc1f1049a4c3c2659afa4621fd651ed2b923c16b4c4d26fea556f753b286e2466f3446d2a7b02c8e459284a8ac6e5f7c1b6c58ec25132d3d3fb2be74a
data/README.md CHANGED
@@ -20,9 +20,9 @@ WilsonScore.interval(3, 5, 0.95, true)
20
20
 
21
21
  ## Star Ratings
22
22
 
23
- Imagine you have a rating system with 1 to 5 stars.
23
+ You have a rating system where users can rate products from 1 to 5 stars.
24
24
 
25
- There are two ratings, a 4 star and a 5 star.
25
+ A product has two ratings - one 4 star and one 5 star.
26
26
 
27
27
  ```ruby
28
28
  average_rating = 4.5
@@ -30,9 +30,12 @@ total_ratings = 2
30
30
  rating_range = 1..5 # 1 to 5 stars
31
31
  confidence = 0.95 # 95%
32
32
 
33
- WilsonScore.rating_interval(average_rating, total_ratings, rating_range, confidence)
33
+ interval = WilsonScore.rating_interval(average_rating, total_ratings, rating_range, confidence)
34
+ lower_bound = interval.first
34
35
  ```
35
36
 
37
+ Use the lower bound of the interval to sort items.
38
+
36
39
  Again, you can set the last parameter to `true` for continuity correction.
37
40
 
38
41
  ## Installation
data/lib/wilson_score.rb CHANGED
@@ -4,18 +4,23 @@ module WilsonScore
4
4
 
5
5
  # http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval
6
6
  def self.interval(k, n, confidence, correction = false)
7
- z = pnorm(1 - (1 - confidence) / 2)
7
+ z = pnorm(1 - (1 - confidence) / 2.0)
8
8
  phat = k / n.to_f
9
+ z2 = z**2
9
10
  if correction # continuity correction
10
- a = 1.0 / (2 * (n + z**2))
11
- b = 2*n*phat + z**2
12
- c = z * Math.sqrt(z**2 - 1.0/n + 4*n*phat*(1 - phat) + (4*phat - 2)) + 1
13
- ([0, a * (b - c)].max)..([1, a * (b + c)].min)
11
+ a = 2 * (n + z2)
12
+ b = 2*n*phat + z2
13
+ c = z * Math.sqrt(z2 - 1.0/n + 4*n*phat*(1 - phat) + (4*phat - 2)) + 1
14
+ d = z * Math.sqrt(z2 - 1.0/n + 4*n*phat*(1 - phat) - (4*phat - 2)) + 1
15
+ # hack for phat = 0 or 1
16
+ lower = phat == 0 ? 0 : (b - c) / a
17
+ upper = phat == 1 ? 1 : (b + d) / a
18
+ ([0, lower].max)..([1, upper].min)
14
19
  else
15
- a = 1.0 / (1 + z ** 2 / n)
16
- b = phat + z ** 2 / (2 * n)
17
- c = z * Math.sqrt((phat * (1 - phat) + z ** 2 / (4 * n)) / n)
18
- (a * (b - c))..(a * (b + c))
20
+ a = 1 + z2 / n
21
+ b = phat + z2 / (2 * n)
22
+ c = z * Math.sqrt((phat * (1 - phat) + z2 / (4 * n)) / n)
23
+ ((b - c) / a)..((b + c) / a)
19
24
  end
20
25
  end
21
26
 
@@ -1,3 +1,3 @@
1
1
  module WilsonScore
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -14,6 +14,30 @@ class TestWilsonScore < Minitest::Test
14
14
  assert_in_delta 0.9733, interval.last
15
15
  end
16
16
 
17
+ def test_continuity_correction_zero_one
18
+ interval = WilsonScore.interval(0, 1, 0.95, true)
19
+ assert_in_delta 0, interval.first
20
+ assert_in_delta 0.9454, interval.last
21
+ end
22
+
23
+ def test_continuity_correction_one_fifty
24
+ interval = WilsonScore.interval(1, 50, 0.95, true)
25
+ assert_in_delta 0.0010, interval.first
26
+ assert_in_delta 0.1201, interval.last
27
+ end
28
+
29
+ def test_continuity_correction_one_one
30
+ interval = WilsonScore.interval(1, 1, 0.95, true)
31
+ assert_in_delta 0.0546, interval.first
32
+ assert_in_delta 1, interval.last
33
+ end
34
+
35
+ def test_continuity_correction_one_three
36
+ interval = WilsonScore.interval(1, 3, 0.95, true)
37
+ assert_in_delta 0.0176, interval.first
38
+ assert_in_delta 0.8747, interval.last
39
+ end
40
+
17
41
  def test_rating
18
42
  interval = WilsonScore.rating_interval(5, 1, 1..5, 0.95)
19
43
  assert_in_delta 1.8262, interval.first
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wilson_score
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-28 00:00:00.000000000 Z
11
+ date: 2013-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler