Algorithmus zur Berechnung der 5-Sterne-Bewertung


79

Ich muss 5-Sterne-Bewertungen wie die auf der Amazon-Website berechnen. Ich habe genug gesucht, um den besten Algorithmus zu finden, aber ich kann keine richtige Antwort erhalten. Zum Beispiel, wenn dies die Bewertungen sind

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

Insgesamt 478 Bewertungen

Amazon hat dies mit "4,1 von 5 Sternen" berechnet. Kann mir jemand sagen, wie diese Zahl zustande kommt? Ich bin nicht in der Lage, dies nur durch Durchschnitt zu erreichen.


3
embedded.plnkr.co/5STGsgya9mq7HLrbJtrT Ein ausführliches Programm zur Anzeige der durchschnittlichen Sternberechnung.
Sanju

Antworten:


167

Das ist ein gewichteter Durchschnitt, bei dem Sie jede Bewertung mit der Anzahl der abgegebenen Stimmen abwägen:

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

11
Wie unterscheidet sich das von einem "normalen" Durchschnitt?
Jeff

@ Jeff, die Gewichte unterscheiden sich von einem, was die meisten Leute als "Durchschnitt" bezeichnen.
Blindy

2
Es ist das gleiche wie im regulären Durchschnitt
Daniel

1
Ja, es ist das gleiche wie im regulären Durchschnitt. Wir werden (addieren die Gesamtzahl der Sterne) durch die Gesamtzahl der Benutzer geteilt. Es sieht aus wie eine gewichtete Multiplikation im Zähler. Aber wenn wir es umformulieren, würden wir im Wesentlichen alle 5s, alle 4s usw. hinzufügen, da 5s 252-mal sind, wird es 5 * 252 und so weiter.
Programmierer

20

Wenn Sie von Anfang an mit der Berechnung der Gesamtbewertung beginnen, hilft Ihnen diese Formel.

Formel

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

Beispiel

Angenommen, Sie haben bis jetzt keine Bewertungen, dann lautet die Formel wie folgt: Die Gesamtbewertung lautet bis jetzt "0". Gesamtbewertung "0" und gegebene Bewertung ist "4"

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

Wenn die Gesamtbewertung "4,11" ist, ist die Gesamtbewertung "478" und die neue Bewertung eines Benutzers ist "2".

dann ist die Formel wie

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

15

Zu evanmiller.org gibt es eine wirklich gute Zusammenfassung zu diesem Thema. Er geht durch und diskutiert die Vor- und Nachteile einiger Ansätze und schlägt eine mathematisch zuverlässige Methode zur Gewichtung und Berechnung von Stimmen vor.

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


6
Noch besser ist, dass er jetzt einen weiteren Artikel über Sternebewertungen
sj26

1
Sehr zu empfehlen, da der gewichtete Durchschnitt beim Vergleichen der Sortierung von Artikeln schrecklich ungenau sein kann.
Ryall

8

Super hilfreiche Antwort von Blindy, hier ist der PHP-Code, der darauf basiert. Einige mögen nützlich sein. Die Ergebnisse sind 4,11 gemäß OP-Beispiel:

$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;
}

So erstellen Sie das oben genannte $ bewertungsarray

Beispiel für einen Pseudocode, der jedoch funktionieren sollte, um zu erklären, wie das Array $ reviews erstellt wird, wenn Informationen in der Datenbank gespeichert werden, vorausgesetzt, Sie haben eine Tabelle mit dem Namen "Bewertungen" und eine Spalte mit dem Namen "Bewertung". In diesem Fall ist es 1 Join, Sie müssten 4 Joins durchführen, um alle Bewertungen zu erhalten, aber dies sollte Ihnen den Einstieg erleichtern:

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

Ein anderer Ansatz wurde in den Kommentaren vorgeschlagen

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

Sie haben ein Bewertungsarray erstellt. Wie erstelle ich dieses Array mit MySQL? Meine Daten sind in der Datenbank gespeichert
Ali Raza

1
@AliRaza Ich habe die Antwort aktualisiert, Sie müssten mehrere Verknüpfungen durchführen oder die Daten mit 5 separaten Abfragen abrufen
Robert Sinclair

1
Ich würde sagen, Sie waren die Person, die mir tatsächlich die Idee gegeben hat, und ich arbeite nur daran. Diese Abfrage funktioniert für michSELECT SUM(rating = 1) AS one_s ,SUM(rating = 2) AS two_s ,SUM(rating = 3) as three_s FROM reviews where product_id = 9
Ali Raza

8

Ja, Sie können sie mitteln:

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

6

ein besserer Weg, dies zu tun,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

Beispiel:

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

rating = (25 * 5) / 30

Erledigt!


Wofür steht das 5in sum_of_max_rating_of_user_count? Ist es die höchste Bewertung, die ein Benutzer gegeben hat?
Andho

Bitte erläutern Sie .... sum_of_max_rating_of_user_count: 6 x 5 = 30 ???
Thevikasnayak

6 ist die Gesamtzahl der Benutzer, die bewertet haben. 5 ist die maximale Anzahl von Sternen (z. B. verwenden wir normalerweise 5 Sterne)
Asad

4

Dieses Bewertungssystem basiert auf einem gewichteten Durchschnitt oder einem gewichteten Mittelwert . Das heißt, sie verwendeten das Gewicht in Sternen, um einen Dezimalwert zu berechnen, der auf 4,1 rundet. Zum Beispiel:

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

2

Der gewichtete Durchschnitt summiert die Anzahl der Sterne mal das Gewicht und dividiert sie durch die Gesamtzahl der Bewertungen.


2

Vielleicht möchten Sie diesen Algorithmus ausprobieren: Berechnen der durchschnittlichen Bewertung auf die richtige Weise mit PHP und MySQL - Sie müssen nicht jeden "Stern" (auch als Bewertungsnote bezeichnet) und die entsprechende Anzahl von Stimmen speichern und müssen dann Tausende von Zeilen aus der Datenbank jedes Mal, wenn Sie ihren Durchschnitt berechnen müssen. (es sei denn, Sie möchten genau anzeigen, wie viele Personen den angegebenen Artikel mit 1, 2, 3, 4 und 5 Sternen bewertet haben)


1

Entsprechend Ihrer Frage wird Ihre Lösung so sein.

Summe von (Rate * TotalRatingOfThatRate) / TotalNumberOfReviews

((5 · 252) + (4 · 124) + (3 · 40) + (2 · 29) + (1 · 33)) / (252 + 124 + 40 + 29 + 33)

Ausgabe wird 4.1 sein


0

(Gesamtzahl der Sterne / Gesamtzahl der Personen, die * 5 bewerten) * 5

= Antwort

Dezimalstellen in js auf 1 korrigiert.

answer.toFixed (1);

Beispiel die Gesamtbewertung von 5 Personen ist 20 Sterne.

(20/5 * 5) * 5 = 4,0


0

in Javascript

function 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

Außerdem versuche ich nur, praktischen und vollständigen Code für alle zu erstellen.

Mein Json Object Array

var yourRatingData =[{
        review_id:1,
        customer_id:5,
        customer_name:"Faysal",
        rating:5,
        review_content:"I like this product it's cool and best in quality"
    },
    {
        review_id:2,
        customer_id:6,
        customer_name:"Adams",
        rating:4,
        review_content:"It's quality product though price a bit high"
    },
    {
        review_id:3,
        customer_id:8,
        customer_name:"Jane",
        rating:3,
        review_content:"I like but should improve quality"
    },
    {
        review_id:4,
        customer_id:9,
        customer_name:"Julia",
        rating:1,
        review_content:"It's not good"
    }];

Bewertungsberechnung

let _5star = yourRatingData.filter(r=>r.rating==5).length;
let _4star = yourRatingData.filter(r=>r.rating==4).length;
let _3star = yourRatingData.filter(r=>r.rating==3).length;
let _2star = yourRatingData.filter(r=>r.rating==2).length;
let _1star = yourRatingData.filter(r=>r.rating==1).length;

//Sum of individual star.
let sumOfRating = parseInt( _5star + _4star + _3star + _2star + _1star );

//Total number of rating
let overallRating = parseInt( 5*_5star + 4*_4star + 3*_3star + 2*_2star +1*_1star );

//Average of all rating
let averageRating = parseFloat(overallRating/sumOfRating);

//Percentage of each star rating
let _5starPercentage = parseInt((_5star/totalRating)*100);
let _4starPercentage = parseInt((_4star/totalRating)*100);
let _3starPercentage = parseInt((_3star/totalRating)*100);
let _2starPercentage = parseInt((_2star/totalRating)*100);
let _1starPercentage = parseInt((_1star/totalRating)*100);

Ich finde es hilfreich.


-1

mit C #

double rating = (double)(5 * star5 + 4 * star4 + 3 * star3 + 2 * star2 + 1 * star1) / (star1 + star2 + star3 + star4 + star5);
rating = Math.Round(rating, 1);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.