分配评级数据以增加标准偏差

时间:2015-03-27 14:20:58

标签: php mysql statistics rating rating-system

给出一个项目表,每个项目的评级在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

2 个答案:

答案 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%的评级数是正常的)