给出一个项目表,每个项目的评级在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
答案 0 :(得分:0)
这可以在MySQL中完成,但需要一些计算。首先,您需要平均值和标准差。两者都是MySQL功能。那么,与均值有多少标准差确实考虑了有效值?我会假设它是2,因为这很常见。现在,Mean-(2 * StdDev)是最小值,Mean +(2 * StdDev)是最大值。假设你写了一个查询(请注意我现在100%使用Oracle,所以我可能会得到类似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
)
结果将是从minval到maxval的百分比。您可以将其乘以100以获得0到100的值(对于异常值,将有值< 0和> 100)。
答案 1 :(得分:0)
这里只使用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,
这意味着62或+或 - 20之内的任何评级数都是正常的(68%的评级数是正常的)