별 5 개 등급을 계산하는 데 사용되는 알고리즘


79

아마존 웹 사이트에서와 같이 별 5 개 등급을 계산해야합니다. 최고의 알고리즘을 찾기 위해 충분한 검색을 수행했지만 적절한 답을 얻을 수 없습니다. 예를 들어, 이것이 등급이라면

5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33

총 478 개 리뷰

아마존은 이것을 "별 5 개 중 4.1 개"로 계산했습니다. 누구든지이 수치가 어떻게 도착했는지 말해 줄 수 있습니까? 나는 평균을함으로써 이것을 얻을 수 없다.


3
embed.plnkr.co/5STGsgya9mq7HLrbJtrT 평균 별 계산을 표시하는 Verbose 프로그램입니다.
Sanju

답변:


174

그것은 가중 평균이며, 각 등급을 투표 수로 평가합니다.

(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change

11
"일반"평균과 어떻게 다릅니 까?
제프

@Jeff, 가중치는 대부분의 사람들이 "평균"이라고 부르는 1과 다릅니다.
Blindy

2
그것은 일반 평균과 동일합니다
다니엘

1
예 일반 평균과 동일합니다. 우리는 (총 별 추가) 총 사용자로 나눈 것입니다. 분자에서 곱셈의 가중 coz처럼 보입니다. 그러나 우리가 그것을 다시 말하면, 우리는 본질적으로 모든 5, 모든 4 등을 추가 할 것입니다. 5는 252 배이므로 결국 5 * 252가됩니다.
theprogrammer

21

처음부터 전체 등급 계산을 시작하는 경우이 공식이 도움이 될 것입니다.

공식

((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

15

evanmiller.org에는이 주제에 대한 훌륭한 글이 있습니다. 그는 몇 가지 접근 방식의 장단점을 검토하고 토론하며 수학적으로 신뢰할 수있는 가중치 부여 및 투표 계산 방법을 제안합니다.

http://evanmiller.org/ranking-items-with-star-ratings.html


6
: 더 나은, 그는 지금 등급에 다른 기사 쓰여 evanmiller.org/ranking-items-with-star-ratings.html
sj26

1
가중 평균은 항목 정렬을 비교할 때 매우 부정확 할 수 있으므로 적극 권장됩니다.
Ryall 2016-04-28

8

더 좋은 방법은

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

끝난!


5사용되는 것은 무엇 sum_of_max_rating_of_user_count을 의미합니까? 사용자가 부여한 최고 평점입니까?
andho

설명 해주세요 .... sum_of_max_rating_of_user_count : 6 x 5 = 30 ???
thevikasnayak

6 등급 전체 사용자입니다 .. 5 별의 최대 NUM (예 : 보통 우리는 5 성급 호텔 사용)
아사드

8

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

등급 배열을 만들었습니다. mysql을 사용하여이 배열을 어떻게 만드나요? 내 데이터는 데이터베이스에 저장입니다
알리 라자

1
내가 대답을 업데이 트했습니다 @AliRaza, 당신은 몇 가지를 할 조인이 필요하거나 5 개 별도의 쿼리로 데이터를 가져 오는 것
로버트 싱클레어

1
나는 당신이 실제로 나에게 아이디어를 준 사람이라고 말하고 나는 단지 그것에 대해 일하고 있습니다.이 쿼리는 나에게 효과적입니다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
Ali Raza


4

이 등급 시스템은 가중 평균 또는 가중 평균을 기반으로합니다 . 즉, 그들은 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

2

가중 평균, 별 개수와 무게를 더한 다음 총 리뷰 수로 나눕니다.


2

이 알고리즘을 확인해 볼 수 있습니다. PHP와 MySQL을 사용하여 올바른 방법으로 평균 등급 계산 -각 "별"(등급 등급이라고도 함)과 해당 투표 수를 저장 한 다음 수천 개의 행을 검색 할 필요가 없습니다. 평균을 계산해야 할 때마다 데이터베이스. (주어진 항목을 1, 2, 3, 4, 5 개의 별표로 평가 한 사람 수를 정확히 표시하고 싶지 않은 경우)


1

귀하의 질문에 따르면 귀하의 솔루션은 다음과 같습니다.

(Rate * TotalRatingOfThatRate) / TotalNumberOfReviews의 합계

((5 * 252) + (4 * 124) + (3 * 40) + (2 * 29) + (1 * 33)) / (252 + 124 + 40 + 29 + 33)

출력은 4.1입니다.


1

자바 스크립트

function 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));

0

(별의 총 nunber / 리뷰 한 총 인원수 * 5) * 5

= 답변

js의 소수점을 1로 고정했습니다.

answer.toFixed (1);

예를 들어 5 명의 총 리뷰는 별 20 개입니다.

(20 / 5 * 5) * 5 = 4.0


0

또한 모든 사람을 위해 실용적이고 완전한 코드를 만들려고 노력하고 있습니다.

내 Json 객체 배열

var yourRatingData =[{
        review_id:1,
        customer_id:5,
        customer_name:"Faysal",
        rating:5,
        review_content:"I like this product it's cool and best in quality"
    },
    {
        review_id:2,
        customer_id:6,
        customer_name:"Adams",
        rating:4,
        review_content:"It's quality product though price a bit high"
    },
    {
        review_id:3,
        customer_id:8,
        customer_name:"Jane",
        rating:3,
        review_content:"I like but should improve quality"
    },
    {
        review_id:4,
        customer_id:9,
        customer_name:"Julia",
        rating:1,
        review_content:"It's not good"
    }];

등급 계산

let _5star = yourRatingData.filter(r=>r.rating==5).length;
let _4star = yourRatingData.filter(r=>r.rating==4).length;
let _3star = yourRatingData.filter(r=>r.rating==3).length;
let _2star = yourRatingData.filter(r=>r.rating==2).length;
let _1star = yourRatingData.filter(r=>r.rating==1).length;

//Sum of individual star.
let sumOfRating = parseInt( _5star + _4star + _3star + _2star + _1star );

//Total number of rating
let overallRating = parseInt( 5*_5star + 4*_4star + 3*_3star + 2*_2star +1*_1star );

//Average of all rating
let averageRating = parseFloat(overallRating/sumOfRating);

//Percentage of each star rating
let _5starPercentage = parseInt((_5star/totalRating)*100);
let _4starPercentage = parseInt((_4star/totalRating)*100);
let _3starPercentage = parseInt((_3star/totalRating)*100);
let _2starPercentage = parseInt((_2star/totalRating)*100);
let _1starPercentage = parseInt((_1star/totalRating)*100);

도움이된다고 생각합니다.


-1

C # 사용

double rating = (double)(5 * star5 + 4 * star4 + 3 * star3 + 2 * star2 + 1 * star1) / (star1 + star2 + star3 + star4 + star5);
rating = Math.Round(rating, 1);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.