алгоритм, що використовується для обчислення оцінок 5 зірок


79

Мені потрібно розрахувати 5-зірковий рейтинг, такий як на веб-сайті Amazon. Я здійснив достатньо пошуку, щоб знайти найкращий алгоритм, але не можу отримати правильної відповіді. Наприклад, якщо це рейтинги

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

всього 478 відгуків

Amazon підрахував, що це "4,1 із 5 зірок". Хто-небудь може сказати мені, як доходить до цієї цифри? Я не можу отримати це, просто виконуючи усереднення.


3
embed.plnkr.co/5STGsgya9mq7HLrbJtrT Детальна програма для відображення середнього розрахунку зірок.
Санджу

Відповіді:


174

Це середньозважене значення, де ви зважуєте кожну оцінку з кількістю отриманих голосів:

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

11
Чим це відрізняється від "звичайного" середнього?
Джефф,

@ Джефе, ваги відрізняються від одиниці, що більшість людей називає "середнім".
Blindy,

2
це те саме, що звичайне середнє
Даніель

1
Так, це те саме, що звичайне середнє. ми (додаючи загальну кількість зірочок) ділимо на загальну кількість користувачів. Це виглядає як зважений coz множення в числівнику. Але якщо ми переформулюємо це, ми б по суті додали всі 5, всі 4 і т.д., оскільки 5 - це 252 рази, в кінцевому підсумку це 5 * 252 і так далі.
theprogrammer

21

Якщо ви починаєте розрахунок загальної оцінки з самого початку, то ця формула вам допоможе.

Формула

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

Приклад

припустимо, у вас досі немає рейтингів, тоді формула подібна, загальна оцінка дотепер "0". загальна оцінка "0" і дана оцінка "4"

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

Якщо загальний рейтинг "4.11" Загальний рейтинг "478", а новий рейтинг, наданий одним користувачем, "2"

тоді формула подібна

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

15

Існує справді чудова робота на цю тему на evanmiller.org. Він розглядає і обговорює плюси і мінуси кількох підходів і пропонує математично надійний спосіб зважування та обчислення голосів.

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


6
Навіть краще, зараз він написав ще одну статтю про рейтинг зірок: evanmiller.org/ranking-items-with-star-ratings.html
sj26,

1
Настійно рекомендуємо, оскільки середньозважений показник може бути жахливо неточним при порівнянні сортування предметів.
Ryall

8

Дуже корисна відповідь від Blindy, ось PHP-код, який базується на ньому. Деякі можуть виявитися корисними. Результати становитимуть 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;
}

Як створити наведений вище масив оцінок $

Приклад псевдокоду, але який повинен працювати, що пояснює, як створити масив оцінок $, коли інформація зберігається в БД, припускаючи, що у вас є таблиця "рейтинги" та стовпець "рейтинг". У цьому випадку це 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

ви створили масив оцінок, як мені зробити цей масив за допомогою mysql. мої дані зберігаються в базі даних
Алі Раза

1
@AliRaza, я оновив відповідь, вам потрібно буде зробити кілька приєднань або витягнути дані за допомогою 5 окремих запитів
Роберт Сінклер,

1
я б сказав, що ти був людиною, яка насправді дала мені ідею, і я просто працюю над нею, цей запит працює для мене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
Алі Раза

8

Так, ви можете їх усереднити:

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

7

кращий спосіб зробити це,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

приклад:

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

rating = (25 * 5) / 30

Готово!


Що означає 5вживаний in sum_of_max_rating_of_user_count? Це найвища оцінка, яку дав будь-який користувач?
andho

Будь ласка, поясніть .... sum_of_max_rating_of_user_count: 6 x 5 = 30 ???
thevikasnayak

6 - це загальна кількість користувачів, які оцінили .. 5 - це максимальна кількість зірок (наприклад, зазвичай ми використовуємо 5-зірковий рейтинг)
Асад

4

Ця рейтингова система базується на середньозваженому або середньозваженому . Тобто, вони використовували вагу в перерахунку на зірки для обчислення десяткового значення, яке округлюється до 4.1. Наприклад:

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

Середньозважене, підсумовують кількість зірок, помножену на його вагу, а потім ділять на загальну кількість оглядів.


2

Можливо, ви захочете перевірити цей алгоритм: Правильний розрахунок середньої оцінки за допомогою PHP та MySQL - немає необхідності зберігати кожну "зірочку" (вона ж рейтингова оцінка) та відповідну кількість голосів, а потім отримувати тисячі рядків із бази даних кожного разу, коли вам потрібно обчислити їх середнє значення. (якщо ви не хочете точно вказати, скільки людей оцінило даний предмет 1, 2, 3, 4 та 5 зірками)


1

Відповідно до вашого запитання, ваше рішення буде таким.

Сума (Rate * TotalRatingOfThatRate) / TotalNumberOfReviews

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

вихід буде 4.1


1

у 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

(Загальна кількість зірок / загальна кількість осіб, які переглядають * 5) * 5

= Відповідь

Виправлені десяткові знаки в js до 1.

answer.toFixed (1);

Наприклад, загальна кількість відгуків 5 осіб - 20 зірок.

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


0

Крім того, я просто намагаюся створити практичний і повний код для всіх.

Мій масив об’єктів 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"
    }];

Розрахунок рейтингу

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

Я думаю, це корисно.


-1

з C #

double rating = (double)(5 * star5 + 4 * star4 + 3 * star3 + 2 * star2 + 1 * star1) / (star1 + star2 + star3 + star4 + star5);
rating = Math.Round(rating, 1);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.