wilson_score 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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