В любом случае надеюсь будет кому нибудь полезно=)
Смысл: проверить значение на валидность путем расчета коэффициента вариации и сравнения его с максимальным значением.
Простыми словами на примере: есть заведение, для заведения устанавливается "средний счет" каждым пользователем.
Соответственно при добавлении нового значения, оно должно не сильно отличаться от тех что уже добавлены, т.е. отклонение не должно превышать определённой величины от средней уже существующий выборки.
допустим если у нас уже существует выборка со значениями 100,200,300, то при разрешенном коэффициенте 60%, значения превышающие
480 или меньше 80 не пройдут, поскольку имеют большой коэффициент отклонения.
калькулятор - http://financial-analysis.ru/calculator/javFKStat.html
Реализация под конкретный проект, выглядит так:
Код: Выделить всё
public function validateExpense($attribute, $params) {
$sql = "SELECT expense
FROM opinion WHERE place_id=:PlaceId";
$command=$this->getDbConnection()->createCommand($sql);
$command->bindValue(":PlaceId", $this->place_id);
$listE = $command->queryColumn();
//добавляем в список текущее значение счета
array_push($listE, $this->expense);
$n = count($listE);
if($n < 2) return true;
$a = array_sum($listE) / $n; // cреднее арифметическое
$summ = 0;
for($i=0;$i<$n;$i++) {
$summ += pow($listE[$i]-$a, 2);
}
if($n > 1) $n -= 1;
$q2 = $summ/$n; //дисперсия
$q = sqrt($q2); //среднеквадратичное отклонение
$v = abs($q/$a)*100; //коэффициент вариации
if($v > self::EXPENSE_MAX_V)
$this->addError('expense','Коэффициент вариации по счету превышает максимальное значение');
}