아마존 웹 사이트에서와 같이 별 5 개 등급을 계산해야합니다. 최고의 알고리즘을 찾기 위해 충분한 검색을 수행했지만 적절한 답을 얻을 수 없습니다. 예를 들어, 이것이 등급이라면
5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33
총 478 개 리뷰
아마존은 이것을 “별 5 개 중 4.1 개”로 계산했습니다. 누구든지이 수치가 어떻게 도착했는지 말해 줄 수 있습니까? 나는 평균을함으로써 이것을 얻을 수 없다.
답변
그것은 가중 평균이며, 각 등급을 투표 수로 평가합니다.
(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에는이 주제에 대한 훌륭한 글이 있습니다. 그는 몇 가지 접근 방식의 장단점을 검토하고 토론하며 수학적으로 신뢰할 수있는 가중치 부여 및 투표 계산 방법을 제안합니다.
답변
더 좋은 방법은
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
끝난!
답변
Blindy의 매우 유용한 답변, 여기에 기반한 PHP 코드가 있습니다. 일부는 유용 할 수 있습니다. 결과는 OP의 예에 따라 4.11입니다.
$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;
}
위의 $ ratings 배열을 만드는 방법
의사 코드의 예이지만 “ratings”라는 테이블과 “rating”이라는 열이 있다고 가정 할 때 정보가 DB에 저장 될 때 $ ratings 배열을 빌드하는 방법을 설명하는 작동해야합니다. 이 경우 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
답변
예, 평균을 낼 수 있습니다.
(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33) / 478 = 4.11