Evan Miller は、5 つ星の評価をランク付けするためのベイジアン アプローチを
示しています。
どこ
nk
はk
星評価の数、
sk
k
星の「価値」(ポイント)です。
N
は総投票数です
K
は星の最大数です (例: 5 つ星の評価システムでは K=5)。
z_alpha/2
1 - alpha/2
正規分布の分位数です。実際の並べ替え基準が計算された並べ替え基準と少なくとも同じ大きさであるという 95% の信頼性 (ベイズ事後分布に基づく) が必要な場合は、z_alpha/2
= 1.65 を選択します。
Python では、ソート基準は次のように計算できます。
def starsort(ns):
"""
http://www.evanmiller.org/ranking-items-with-star-ratings.html
"""
N = sum(ns)
K = len(ns)
s = list(range(K,0,-1))
s2 = [sk**2 for sk in s]
z = 1.65
def f(s, ns):
N = sum(ns)
K = len(ns)
return sum(sk*(nk+1) for sk, nk in zip(s,ns)) / (N+K)
fsns = f(s, ns)
return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1))
たとえば、項目に 60 個の 5 つ星、80 個の 4 つ星、75 個の 3 つ星、20 個の 2 つ星、および 25 個の 1 つ星がある場合、その全体的な星の評価は約 3.4 になります。
x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694
5つ星評価のリストを並べ替えることができます
sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True)
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)]
これは、より多くの評価が全体的な星の値に与える影響を示しています。
この式は、特に投票数が少ない場合 (たとえば、300 未満) に、Amazon、Ebay、Wal-mart などのサイトが報告する総合評価よりも少し低い総合評価を与える傾向があることがわかります。これは、投票数が少ないほど不確実性が高くなることを反映しています。投票数が (数千に) 増加すると、全体として、これらの評価式はすべて (加重) 平均評価になる傾向があります。
この式はアイテム自体の 5 つ星評価の頻度分布のみに依存するため、頻度分布を足し合わせるだけで、複数のソースからのレビュー
を組み合わせる(または、新しい投票に照らして全体的な評価を更新する) のは簡単です。
IMDb 式とは異なり、この式は、すべてのアイテムの平均スコアにも、人為的な最小投票数のカットオフ値にも依存しません。
さらに、この式は、星の平均数と投票数だけでなく、完全な度数分布を利用しています。また、5 つ星が 10 個と 1 つ星が 10 個ある項目は、3 つ星評価が 20 個ある項目よりも不確実性が高い (したがって、それほど高く評価されない) として扱われるべきであるため、当然のことです。
In [78]: starsort((10,0,0,0,10))
Out[78]: 2.386028063783418
In [79]: starsort((0,0,20,0,0))
Out[79]: 2.795342687927806
IMDb 式はこれを考慮していません。