algoritmo utilizado para calcular calificaciones de 5 estrellas

79

Necesito calcular calificaciones de 5 estrellas como la del sitio web de Amazon. He realizado suficientes búsquedas para encontrar cuál es el mejor algoritmo, pero no puedo obtener una respuesta adecuada. Por ejemplo, si estas son las calificaciones

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

Totalmente 478 reseñas

Amazon ha calculado que esto es "4,1 de 5 estrellas". ¿Alguien puede decirme cómo se llega a esta cifra? No puedo obtener esto solo haciendo promedio.

usuario1241438
fuente
3
embed.plnkr.co/5STGsgya9mq7HLrbJtrT Un programa detallado para mostrar el cálculo de estrellas promedio.
Sanju

Respuestas:

174

Ese es un promedio ponderado, donde pondera cada calificación con el número de votos que obtuvo:

(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
Blindy
fuente
11
¿En qué se diferencia de un promedio "regular"?
Jeff
@Jeff, los pesos son diferentes a uno, que es lo que la mayoría de la gente llama un "promedio".
Blindy
2
es lo mismo que el promedio regular
Daniel
1
Sí, es lo mismo que el promedio regular. estamos (sumando el total de estrellas) dividido por el total de usuarios. Parece coz ponderada de multiplicación en numerador. Pero si lo reformulamos, esencialmente sumaríamos los 5, los 4, etc., ya que 5 son 252 veces, termina siendo 5 * 252 y así sucesivamente.
theprogrammer
21

Si está comenzando a calcular la calificación general desde el principio, esta fórmula lo ayudará.

Fórmula

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

Ejemplo

suponga que no tiene calificaciones hasta ahora, entonces la fórmula es como, la calificación general es "0" hasta ahora. calificación total "0" y la calificación dada es "4"

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

Si la calificación general es "4.11", la calificación total es "478" y la nueva calificación otorgada por un usuario es "2"

entonces la fórmula es como

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

Hay un gran artículo sobre este tema en evanmiller.org. Repasa y analiza los pros y los contras de algunos enfoques y sugiere una forma matemáticamente confiable de ponderar y calcular los votos.

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

Jeff
fuente
6
Aún mejor, ahora ha escrito otro artículo sobre calificaciones de estrellas: evanmiller.org/ranking-items-with-star-ratings.html
sj26
1
Muy recomendable, porque el promedio ponderado puede ser terriblemente inexacto al comparar la clasificación de elementos.
Ryall
8

Respuesta súper útil de Blindy, aquí está el código PHP que se basa en él. Algunos pueden resultar útiles. Los resultados serán 4.11 según el ejemplo de 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;
}

Cómo construir la matriz de $ ratings anterior

Ejemplo de pseudocódigo, pero que debería funcionar y que explica cómo construir la matriz $ ratings cuando la información se almacena en la base de datos asumiendo que tiene una tabla llamada "ratings" y una columna llamada "rating". En este caso, es 1 unión, necesitaría hacer 4 combinaciones para obtener todas las calificaciones, pero esto debería ayudarlo a comenzar:

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

otro enfoque sugerido en los comentarios

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
Robert Sinclair
fuente
has creado una matriz de clasificación, ¿cómo hago esta matriz usando mysql? mis datos se guardan en la base de datos
Ali Raza
1
@AliRaza He actualizado la respuesta, necesitaría hacer varias uniones o extraer los datos con 5 consultas separadas
Robert Sinclair
1
yo diría que eras la persona que realmente me dio la idea y me acaba de trabajar en él, esta consulta funciona para mí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
Ali Raza
8

Sí, puede promediarlos:

(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33) / 478 = 4.11
recolector de basura
fuente
7

una mejor manera de hacer esto,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

ejemplo:

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

rating = (25 * 5) / 30

¡Hecho!

Asad
fuente
¿Qué significa 5usado en sum_of_max_rating_of_user_count? ¿Es la calificación más alta otorgada por cualquier usuario?
andho
Por favor explique .... sum_of_max_rating_of_user_count: 6 x 5 = 30 ???
thevikasnayak
6 es el total de usuarios que calificaron .. 5 es el número máximo de estrellas (por ejemplo, usualmente usamos una calificación de 5 estrellas)
Asad
4

Este sistema de calificación se basa en un promedio ponderado o media ponderada . Es decir, utilizaron el peso en términos de estrellas para calcular un valor decimal que se redondea a 4,1. Por ejemplo:

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
Simchona
fuente
2

Promedio ponderado, sume el número de estrellas por su peso y luego divídalo por el número total de reseñas.

Nico
fuente
2

Es posible que desee verificar este algoritmo: Calcular la calificación promedio de la manera correcta usando PHP y MySQL : no es necesario guardar cada "estrella" (también conocida como calificación de calificación) y su número correspondiente de votos y luego tener que recuperar miles de filas de la base de datos cada vez que necesite calcular su promedio. (a menos que desee mostrar exactamente cuántas personas calificaron el artículo dado con 1, 2, 3, 4 y 5 estrellas)

Marin
fuente
1

Según tu pregunta tu solución será así.

Suma de (Rate * TotalRatingOfThatRate) / TotalNumberOfReviews

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

la salida será 4.1

Pius Geek
fuente
1

en 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));
Flavio Marques
fuente
0

(Número total de estrellas / número total de personas que opinan * 5) * 5

= Responder

Decimales fijos en js a 1.

answer.toFixed (1);

Por ejemplo, las reseñas totales de 5 personas son 20 estrellas.

(20/5 * 5) * 5 = 4.0

Jeremy Tangalan
fuente
0

Además, solo estoy tratando de hacer un código práctico y completo para todos.

Mi matriz de objetos Json

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"
    }];

Cálculo de calificación

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);

Creo que es útil.

Majedur Rahaman
fuente
-1

con C #

double rating = (double)(5 * star5 + 4 * star4 + 3 * star3 + 2 * star2 + 1 * star1) / (star1 + star2 + star3 + star4 + star5);
rating = Math.Round(rating, 1);
Ahsan Ismail
fuente