94

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

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

合計 478 件のレビュー

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

4

13 に答える 13

196

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

(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
于 2012-04-17T18:09:30.150 に答える
10

はい、あなたはそれらを平均化することができます:

(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33) / 478 = 4.11
于 2012-04-17T18:08:55.117 に答える
9

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
于 2016-07-14T15:46:20.930 に答える
4

この評価システムは、加重平均または加重平均に基づいています。つまり、星に関する重みを使用して、4.1 に丸められる 10 進数値を計算しました。例えば:

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
于 2012-04-17T18:11:19.180 に答える
2

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

于 2012-04-17T18:11:26.743 に答える
0

これは、フラッターを使用したメソッドの例です。

double starRating = 5.0;
  getRating() {
    // ! Check Already Accepted by others or Not -----------------------------------
    //
    int totalof5s = 0;
    int totalof4s = 0;
    int totalof3s = 0;
    int totalof2s = 0;
    int totalof1s = 0;
    //
    FirebaseFirestore.instance
        .collection('usersRating')
        .where("passengerUid", isEqualTo: "GNblJJJsjicaA2vkXJNJ6XCAiwa2")
        .snapshots()
        .forEach((querySnapshot) {
      if (querySnapshot.size > 0) {
        querySnapshot.docs.forEach((element) async {
          if (element["rating"] == 5) {
            totalof5s++;
          } else if (element["rating"] == 4) {
            totalof4s++;
          } else if (element["rating"] == 3) {
            totalof3s++;
          } else if (element["rating"] == 2) {
            totalof2s++;
          } else if (element["rating"] == 1) {
            totalof1s++;
          }
          //
          if (this.mounted) {
            setState(() {
              starRating = (5 * totalof5s +
                      4 * totalof4s +
                      3 * totalof3s +
                      2 * totalof2s +
                      1 * totalof1s) /
                  (totalof5s + totalof4s + totalof3s + totalof2s + totalof1s);
            });
          }
        });
        
      } else {
        // This is default one in any case these user doesn't have any rating document exists
        if (this.mounted) {
          setState(() {
            starRating = 5.0;
          });
        }
      }
    });
  }
于 2021-08-24T10:30:38.467 に答える