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.
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
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
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.
Oui, vous pouvez les répartir:
(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33)/478 = 4,11
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
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;
}
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é)
Moyenne pondérée, additionnez le nombre d'étoiles multiplié par son poids, puis divisez-le par le nombre total d'avis.
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é!
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));