web-dev-qa-db-ja.com

5つ星評価の計算に使用されるアルゴリズム

Amazonウェブサイトのような5つ星の評価を計算する必要があります。最適なアルゴリズムを見つけるのに十分な検索を行いましたが、適切な答えを得ることができません。たとえば、これらが評価の場合

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

合計478件のレビュー

Amazonはこれを「5つ星のうち4.1」と計算しています。誰がこの数字に到達したか教えてもらえますか?平均するだけではこれを達成できません。

58
user1241438

これは加重平均であり、各評価を獲得した投票数と比較します。

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

Evanmiller.orgでこのトピックに関する非常に優れた記事があります。彼はいくつかのアプローチの長所と短所を検討し、数学的に信頼できる投票の重み付けと計算の方法を提案します。

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

10
Jeff

あなたが最初から全体的な評価の計算を開始している場合、この式はあなたを助けます。

((Overall Rating * Total Rating) + new Rating) / (Total Rating + 1)

あなたは今までの評価を持っていないと仮定すると、式は次のようになります、全体的な評価は今まで「0」です。合計評価「0」および指定された評価は「4」です

((0*0)+4)/1 = 4

総合評価が「4.11」の場合総合評価は「478」であり、1人のユーザーによる新しい評価は「2」です。

数式は

((4.11 * 478)+ 2)/479 // 479 is increment of new rating from 478
10
SSKhan

はい、それらを平均化できます:

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

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
6
Robert Sinclair

この評価システムは、 加重平均 または加重平均に基づいています。つまり、星の点で重みを使用して、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
4
simchona

このアルゴリズムをチェックアウトすることをお勧めします: PHP and MySQL )を使用して正しい方法で平均評価を計算する-必要はありません各「スター」(別名評価グレード)とそれに対応する投票数を保存し、平均を計算する必要があるたびにデータベースから数千行を取得する必要があります。 1、2、3、4、5つ星のアイテム)

2
Marin

これを行うためのより良い方法、

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

できた!

2
Asad

加重平均は、星の数にその重みを掛けて合計し、レビューの総数で割ります。

1
Nico

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));
0
Flavio Marques