Ответ 1
Это средневзвешенное значение, когда вы взвешиваете каждый рейтинг с количеством голосов, которое он получил:
(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
Мне нужно рассчитать 5-звездочные рейтинги, такие как на сайте Amazon. Я сделал достаточно поиска, чтобы найти лучший алгоритм, но я не могу получить правильный ответ. Например, если это рейтинги
5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33
всего 478 отзывов
Amazon подсчитал, что это "4,1 из 5 звезд". Может кто-нибудь сказать мне, как эта цифра получена? Я не могу получить это, просто делая среднее.
Это средневзвешенное значение, когда вы взвешиваете каждый рейтинг с количеством голосов, которое он получил:
(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
Если вы начинаете подсчет общего рейтинга с самого начала, то эта формула поможет вам.
формула
((Overall Rating * Total Rating) + new Rating) / (Total Rating + 1)
пример
Предположим, что у вас нет оценок до сих пор, тогда формула похожа, общая оценка до сих пор равна "0". итоговый рейтинг "0" и рейтинг "4"
((0*0)+4)/1 = 4
Если общий рейтинг равен "4.11", общий рейтинг равен "478", а новый пользователь дает оценку "2".
тогда формула как
((4.11 * 478)+ 2)/479 // 479 is increment of new rating from 478
В этой теме на evanmiller.org есть действительно отличная запись. Он обсуждает и обсуждает плюсы и минусы нескольких подходов и предлагает математически надежный способ взвешивания и расчета голосов.
Да, вы можете усреднить их:
(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33) / 478 = 4.11
Очень полезный ответ от Blindy, здесь PHP-код, основанный на нем. Некоторые могут найти полезным. Результаты будут 4,11 в соответствии с примером OP:
$ratings = array(
5 => 252,
4 => 124,
3 => 40,
2 => 29,
1 => 33
);
function calcAverageRating($ratings) {
$totalWeight = 0;
$totalReviews = 0;
foreach ($ratings as $weight => $numberofReviews) {
$WeightMultipliedByNumber = $weight * $numberofReviews;
$totalWeight += $WeightMultipliedByNumber;
$totalReviews += $numberofReviews;
}
//divide the total weight by total number of reviews
$averageRating = $totalWeight / $totalReviews;
return $averageRating;
}
Как создать вышеуказанный массив $ рейтингов
Пример псевдокода, но который должен работать, который объясняет, как построить массив $ рейтинги, когда информация хранится в БД, при условии, что у вас есть таблица с именем "рейтинги" и столбец с именем "рейтинг". В этом случае это 1 присоединение, вам нужно сделать 4 объединения, чтобы получить все рейтинги, но это должно помочь вам начать:
SELECT count(c1.rating) as one_star, count(c2.rating) as two_star
FROM ratings c1
LEFT OUTER JOIN
ratings c2
ON
c1.id = c2.id
WHERE
c1.rating = 1
AND
c2.rating = 2
другой подход предлагается в комментариях
SELECT SUM(rating = 1) AS one_s ,SUM(rating = 2) AS two_s ,SUM(rating = 3) as three_s FROM reviews where product_id = 9
Эта рейтинговая система основана на средневзвешенном значении или средневзвешенном значении. То есть они использовали вес в терминах звезд для вычисления десятичного значения, которое округляется до 4.1. Например:
Sum of (weight * number of reviews at that weight) / total number of reviews
(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / 478 = 4.1
Средневзвешенное значение, суммируйте количество звезд, умноженное на его вес, и затем разделите его на общее количество обзоров.
Вы можете проверить этот алгоритм: Вычисление среднего рейтинга с использованием PHP и MySQL - нет необходимости сохранять каждую "звезду" "(оценка рейтинга) и соответствующее количество голосов, а затем необходимо извлекать тысячи строк из базы данных каждый раз, когда вам нужно рассчитать их среднее значение. (если вы не хотите точно отображать, сколько людей оценили данный предмет с помощью 1, 2, 3, 4 и 5 звезд)
лучший способ сделать это,
rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count
пример:
total users rated: 6
sum_of_max_rating_of_user_count: 6 x 5 = 30
sum_of_rating: 25
rating = (25 * 5) / 30
Готово!
в JavaScript
calcAverageRating(ratings) {
let totalWeight = 0;
let totalReviews = 0;
ratings.forEach((rating) => {
const weightMultipliedByNumber = rating.weight * rating.count;
totalWeight += weightMultipliedByNumber;
totalReviews += rating.count;
});
const averageRating = totalWeight / totalReviews;
return averageRating.toFixed(2);
}
const ratings = [
{
weight: 5,
count: 252
},
{
weight: 4,
count: 124
},
{
weight: 3,
count: 40
},
{
weight: 2,
count: 29
},
{
weight: 1,
count: 33
}
];
console.log(calcAverageRating(ratings));
(Общее количество звездочек/общее количество людей, просмотревших * 5) * 5
= Ответ
Исправлены десятичные дроби в js до 1.
answer.toFixed(1);
Пример всего отзывов 5 человек 20 звезд.
(20/5 * 5) * 5 = 4,0