Учитывая таблицу предметов, каждый из которых имеет рейтинг от 0 до 100. Какой термин или подход мне нужно исследовать, чтобы распределить значения более «равномерно» относительно друг друга? Я понимаю, что хочу увеличить значение стандартного отклонения.
Я считаю, что это должно быть довольно распространенная проблема с рейтинговыми системами. Где ~ 90% элементов в базе данных сходятся вокруг одинаковых «оценок», что делает значение менее значимым. В идеале я хотел бы получить решение, в котором рейтинг данного предмета каким-то образом относительно всех остальных в таблице.
В конечном итоге я стремлюсь достичь этого либо непосредственно в SQL (MySQL), либо при необходимости в PHP.
Пример ниже …
id | rating
01 | 98
02 | 92
03 | 85
04 | 80
05 | 75
06 | 71
07 | 69
08 | 66
09 | 64
10 | 62 //Data starts to 'cluster' around here
11 | 61
12 | 61
13 | 61
14 | 60
15 | 59
16 | 58
17 | 56
18 | 53
19 | 50
20 | 45
21 | 38
22 | 30
23 | 20
24 | 5
Это можно сделать в MySQL, но это требует нескольких вычислений. Во-первых, вам нужно среднее значение и стандартное отклонение. Оба являются функциями MySQL. Тогда, сколько стандартных отклонений от среднего значения считают допустимым значением? Я буду считать, что это 2, потому что это распространено. Теперь Mean- (2 * StdDev) является минимальным значением, а Mean + (2 * StdDev) является максимальным значением. Предположим, вы написали запрос (обратите внимание, что в эти дни я использую Oracle 100% времени, поэтому я могу получить синтаксис немного похожий на Oracle):
select avg(value)-2*stddev(value) minval,
avg(value)+2*stddev(value) maxval
from mytable
Вы можете сделать это подзапросом и присоединиться к нему. Затем вы можете рассчитать процент от минимального до максимального значения:
select (value-mival)/(maxval-minval) pctval
from mytable
join (
select avg(value)-2*stddev(value) minval,
avg(value)+2*stddev(value) maxval
from mytable
)
Результатом будет процент от минимального до максимального значения. Вы можете умножить это на 100, чтобы получить значения от 0 до 100 (будут значения <0 и> 100 для выбросов).
здесь используется только PHP
<?php
$cart = array();
$cart[] = 98;
$cart[] = 92;
$cart[] = 85;
$cart[] = 80;
$cart[] = 75;
$cart[] = 71;
$cart[] = 69;
$cart[] = 66;
$cart[] = 64;
$cart[] = 62;
$cart[] = 61;
$cart[] = 61;
$cart[] = 61;
$cart[] = 60;
$cart[] = 59;
$cart[] = 58;
$cart[] = 56;
$cart[] = 53;
$cart[] = 50;
$cart[] = 45;
$cart[] = 38;
$cart[] = 30;
$cart[] = 20;
$cart[] = 5;
echo stats_standard_deviation($cart);
function stats_standard_deviation(array $a, $sample = false) {
$n = count($a);
if ($n === 0) {
trigger_error("The array has zero elements", E_USER_WARNING);
return false;
}
if ($sample && $n === 1) {
trigger_error("The array has only 1 element", E_USER_WARNING);
return false;
}
$mean = array_sum($a) / $n;
$carry = 0.0;
foreach ($a as $val) {
$d = ((double) $val) - $mean;
$carry += $d * $d;
};
if ($sample) {
--$n;
}
return sqrt($carry / $n);
}
?>
стандартное отклонение составляет 20,7812265037,
это означает, что любой рейтинг в пределах + или — 20 из 62 является нормальным (68% рейтинговых номеров являются нормальными)