На самом деле существует лучший способ рассчитать это:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
Вам может понадобиться объединить «лайки» и «комментарии» в один балл, назначив каждому свой весовой коэффициент каждомуперед включением его в формулу в качестве значения «положительного голоса».
по ссылке выше:
Оценка = нижняя граница доверительного интервала оценки Вильсона для параметра Бернулли
Нам необходимо сбалансировать пропорцию положительных оценок с неопределенностью небольшого числа наблюдений.К счастью, математика для этого была разработана в 1927 году Эдвином Б. Уилсоном.Мы хотим спросить: Учитывая мои рейтинги, есть 95% -ная вероятность, что «реальная» доля положительных рейтингов будет, по крайней мере, чем? Уилсон дает ответ.Учитывая только положительные и отрицательные оценки (то есть не 5-звездочную шкалу), нижняя граница доли положительных оценок определяется следующим образом:
(используйте минус, где указаноплюс / минус для расчета нижней границы.) Здесь p̂
является наблюдаемой долей положительных оценок, zα/2
является (1-α/2)
квантилем стандартного нормального распределения, а n
является общимколичество оценок.Та же формула, реализованная в Ruby:
require 'statistics2'
def ci_lower_bound(pos, n, confidence)
if n == 0
return 0
end
z = Statistics2.pnormaldist(1-(1-confidence)/2)
phat = 1.0*pos/n
(phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end
pos
- количество положительных оценок, n
- общее количество оценок, а доверие относится к статистическому доверительному уровню.: выберите 0,95, чтобы иметь 95% -ную вероятность того, что ваша нижняя граница верна, 0,975, чтобы иметь вероятность 97,5%, и т. д. Z-показатель в этой функции никогда не меняется, так что если у вас нет удобного пакета статистики или если производительностьэто проблема, вы всегда можете жестко указать здесь значение для z
.(Используйте 1,96 для уровня достоверности 0,95.)
Та же формула, что и для запроса SQL:
SELECT widget_id, ((positive + 1.9208) / (positive + negative) -
1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) /
(positive + negative)) / (1 + 3.8416 / (positive + negative))
AS ci_lower_bound FROM widgets WHERE positive + negative > 0
ORDER BY ci_lower_bound DESC;