web-dev-qa-db-fra.com

algorithme utilisé pour calculer 5 étoiles

Je dois calculer des cotes 5 étoiles comme celle sur le site Web d'Amazon. J'ai fait assez de recherches pour trouver le meilleur algorithme, mais je ne parviens pas à obtenir une réponse correcte. Par exemple, si ce sont les évaluations

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

totally 478 évaluations 

Amazon a calculé qu'il s'agissait de "4,1 étoiles sur 5". Quelqu'un peut-il me dire comment ce chiffre est arrivé? Je ne peux pas obtenir cela simplement en faisant la moyenne.

51
user1241438

C'est une moyenne pondérée, où vous pesez chaque note avec le nombre de votes obtenus:

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

Si vous commencez à calculer la note globale à partir de début, cette formule vous aidera.

Formule

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

Exemple

supposons que vous n’ayez pas d’évaluation jusqu’à présent, alors la formule correspond à, l’évaluation globale est de "0" à maintenant . appréciation totale "0" et l’évaluation est "4"

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

Si la note globale est "4.11" La note totale est "478" Et la nouvelle note donner par un utilisateur est "2"

alors la formule est comme

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

Il existe une très bonne écriture sur ce sujet à evanmiller.org. Il passe en revue et discute des avantages et des inconvénients de quelques approches et suggère une méthode mathématiquement fiable pour pondérer et calculer les votes.

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

9
Jeff

Oui, vous pouvez les répartir:

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

8
garbagecollector

Ce système de notation est basé sur une { moyenne pondérée } _ ou moyenne pondérée. C'est-à-dire qu'ils ont utilisé le poids en étoiles pour calculer une valeur décimale arrondie à 4.1. Par exemple:

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

Réponse très utile de Blindy, voici le code PHP qui en découle. Certains peuvent trouver utile. Les résultats seront 4.11 selon l'exemple de l'OP:

$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;
}
4
Robert Sinclair

Vous voudrez peut-être vérifier cet algorithme: Calculer le classement moyen dans le bon sens à l'aide de PHP et de MySQL - il n'est pas nécessaire de sauvegarder chaque "étoile" (ainsi que le nombre de votes correspondant) avoir à récupérer des milliers de lignes de la base de données chaque fois que vous devez calculer leur moyenne. (sauf si vous souhaitez afficher exactement le nombre de personnes ayant attribué une note à 1, 2, 3, 4 et 5 étoiles à l'élément donné)

2
Marin

Moyenne pondérée, additionnez le nombre d'étoiles multiplié par son poids, puis divisez-le par le nombre total d'avis. 

1
Nico

une meilleure façon de le faire,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

Exemple:

total users rated: 6  
sum_of_max_rating_of_user_count: 6 x 5 = 30  
sum_of_rating: 25

rating = (25 * 5) / 30

Terminé!

0
Asad

en 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