Распространяйте рейтинговые данные, чтобы увеличить стандартное отклонение

Дана таблица элементов, каждый из которых имеет рейтинг от 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

person james    schedule 27.03.2015    source источник
comment
Можете ли вы объяснить, какую проблему вы пытаетесь решить? Как выглядит результат вывода? Почему вы пытаетесь изменить рейтинги доктора?   -  person Gordon Linoff    schedule 27.03.2015
comment
Проблема заключается в том, что характер существующей рейтинговой системы приводит к тому, что примерно 80% элементов в таблице сходятся к рейтингу около 50-60%, что затрудняет отображение ощущения «диапазона» результатов. Как конечный пользователь, было бы неплохо увидеть рейтинг элементов относительно любого другого элемента.   -  person james    schedule 28.03.2015
comment
На выходе будут более «разбросанные» результаты, поэтому, если нанести их на график зависимости количества элементов от рейтинга, это будет «более плоская» кривая Гаусса.   -  person james    schedule 28.03.2015
comment
. . Типичный подход для этой цели состоит в том, чтобы поместить значения в квантили, часто в децили.   -  person Gordon Linoff    schedule 29.03.2015


Ответы (2)


Это можно сделать в 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
)

Результатом будет процент от minval до maxval. Вы можете умножить это на 100, чтобы получить значения от 0 до 100 (для выбросов будут значения ‹0 и >100).

person kainaw    schedule 27.03.2015

здесь используется только 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% рейтинговых номеров являются нормальными)

person David Petersen    schedule 27.03.2015