Amazonウェブサイトのような5つ星の評価を計算する必要があります。最適なアルゴリズムを見つけるのに十分な検索を行いましたが、適切な答えを得ることができません。たとえば、これらが評価の場合
5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33
合計478件のレビュー
Amazonはこれを「5つ星のうち4.1」と計算しています。誰がこの数字に到達したか教えてもらえますか?平均するだけではこれを達成できません。
これは加重平均であり、各評価を獲得した投票数と比較します。
(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
Evanmiller.orgでこのトピックに関する非常に優れた記事があります。彼はいくつかのアプローチの長所と短所を検討し、数学的に信頼できる投票の重み付けと計算の方法を提案します。
あなたが最初から全体的な評価の計算を開始している場合、この式はあなたを助けます。
式
((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
はい、それらを平均化できます:
(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33)/ 478 = 4.11
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
この評価システムは、 加重平均 または加重平均に基づいています。つまり、星の点で重みを使用して、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 and 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));