Задать вопрос
@zevem
Стрелец

Как выявить сильное отклонение в массиве?

Есть массив с ценами:

$prices = array(
'10300',
'10200',
'1250',
'1260',
'1240',
'1140',
'20',
'30'
);


Нужно выявить отклонение от средней цены.
Т.е. значения 10300, 10200, 20, 30 должны быть удалены.
Помогите с алгоритмом.
  • Вопрос задан
  • 223 просмотра
Подписаться 1 Средний 18 комментариев
Пригласить эксперта
Ответы на вопрос 3
samodum
@samodum
Какой вопрос - такой и ответ
Математическое ожидание
среднеквадратичное отклонение
Ответ написан
dollar
@dollar
Делай добро и бросай его в воду.
В идеале вам нужно как-то посчитать себестоимость. По весу, по материалу товара, по его бренду, стране сборки и т.д. Затем прибавить условные 20%. Это будет "красная" цена (не путать со средней).

Далее вам нужно определиться, какое отклонение допустимо.
  • Например, оно может быть выражено в процентах от красной цены. Скажем, плюс-минус 40% - ок.
  • Другой пример, когда мы смотрим соседние цены, и если очередной скачок цены превышает 10%, то считаем, что продавец оборзел, а значит и все после него тоже борзые - отсекаем.
  • Любой другой числовой критерий. Это может быть комбинация вышеуказанных способов или ещё более сложная формула.


В статистике такие неудобные значения называются выбросами. Их принято исключать из выборки, потому что они портят саму статистику своей полной неадекватностью. Но вот критерий этой самой неадекватности определяете вы сами. Для этого важна природа изучаемого явления, а не просто голые числа. Конкретно про ваши числа известно, что это цены. На этом факте и построена логика моего ответа.
Ответ написан
@wassapman72
из комментариев: если убирать все числа у которых отклонение больше 100% от среднего, то 20 и 30 останутся.
потому просто просто Threshold нужный подбирайте, можете его на $avg завязать.

$prices = array(
'10300',
'10200',
'1250',
'1260',
'1240',
'1140',
'20',
'30'
);
$avg = array_sum($prices)/count($prices);
$threshold = 2100;

$result = array_filter($prices, function ($p) use ($avg, $threshold) {
return $p < ($avg + $threshold) && $p > ($avg - $threshold) ? $p : false;
});

var_dump($result);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы