Pull to refresh

Comments 14

Возможно эти выбросы являются неплохими индикаторами)

Да, совершенно верно. Однако, в тех данных с которыми работаем мы, продажи на очень большие суммы (либо на очень маленькие) являются выбросами.
Например, товар X в неделю в среднем отгружается на 150 т.р. а сегодня он ушёл со склада на сумму 1 500 000 рублей. Это явно выброс. Так как такие отгрузки, в силу специфичности бизнеса, очень редки.
Более подробно расскажу в статье, где мы на рабочих (реальных) данных будем строить модель прогнозирования продаж

Возможно, десятикратное превышение среднего и выброс. Но как определить границу, как различать выбросы при меньших отклонениях, те которые "не явные"?

Но как определить границу, как различать выбросы при меньших отклонениях, те которые "не явные"?

А вот это уже вопрос не к алгоритму, а к эксперту. Именно по этой причине человека пока что нельзя заменить системами на основе ML, которые прекрасно находят выбросы, если критерий задан, но совершенно не приспособлены для ответов на вопросы типа "А для чего мы хотим найти и удалить эти выбросы? Что является конечной целью такой обработки?", без ответов на которые невозможно подобрать оптимальный критерий и алгоритм дефектовки.

В программе может быть хоть сто процедур для анализа и коррекции выбросов, но эта тьма инструментов никак не поможет, если за штурвалом сидит "оператор", а не эксперт. Пока у него нет содержательного понимания - что должно считаться выбросом в данном конкретном случае - нет никакого смысла формализовать алгоритм.

Другой вопрос, как к этому пониманию прийти. Ну так для этого мы и сидим у компьютера ;-) В геофизике достаточно часто срабатывает подход, основанный на численном моделировании: мы обрабатываем сигнал много раз, варьируя критерии определения выбросов и т.д., а затем вычисляем какие-то целевые параметры и оцениваем, насколько хорош результат. Но использовать этот подход надо весьма аккуратно, так как при этом очень легко можно впасть в

иллюзию значимости

Что-то не нашел сейчас ссылку на описание этого эффекта, который заключается в том, что если мы проводим многократные повторные расчеты с разными наборами случайных данных, то просто по статистике иногда будем получать значимый результат. Если в этот момент крикнуть Эврика! и сразу же бежать делать публикацию в Nature за повышением оклада к начальнику, забыв про предыдущие неудачные опыты, то можно, мягко говоря, очень жестко сесть в лужу. А ведь у этого эффекта даже название вроде бы есть, и где-то я его даже видел... (чертов склероз!).

Так что вопрос совершенно правильный... но простого ответа на него нет

Вы хорошо и развернуто написали. Автору стоило бы ответить на эти, да и другие вопросы в статье. Хорошая статья про конкретный фильтр. Но зачем он в прогнозировании продаж? Почему продажи - это временной ряд? Не то, чтобы я против, ну, временной так временной, но почему и зачем? Почему он подчиняется закону Гаусса? Почему 10-кратная продажа выброс? Опять, я не против, хотите считать это "выбросом", - считайте. Но объясните, плиз, что значит в данном случае слово "выброс", лучше бы его не было или все-таки это неплохо, продать в 10 раз больше чем обычно? Я понимаю, что это вопросы не к Вам. Наверное, я занудствую. У меня в первом комментарии после "те" запятая пропущена.

Если я правильно понял, то Вы говорите о p-hacking.

Это бич всяких третьесортных исследований когда умышленно подбирают n семплов, такой, что p-value эксперимента становится статистически значим (ниже заданного порога). Иногда, конечно, это происходит и по незнанию, или не делаются нужные поправки для учёта возможности взлома p-value. Но суть такова - не стоит верить исследованиям в которых в выборке участвуют до 50 (в некоторых случаях нужно сильно больше) случайных людей, которым дали шоколадку, а они от неё похудели.

У Veritasium (ютубер) есть хорошее видео на эту тему.

Прогнозирование продаж Python

Вообще, это легко можно воспринять так, что вы продаете Python. Почем он у вас? И как идут продажи? Как по мне, тут не хватает слов. «Прогнозирование продаж, реализация на Python», или что-то в этом духе было бы лучше.

Фильтр Хэмпеля
фильтра Хэмплея

А вот всего два разных написания для основного предмета статьи — маловато. Давайте еще вариантов придумаем? :)

А вот всего два разных написания для основного предмета статьи — маловато. Давайте еще вариантов придумаем? :)

Я бы еще предложил вариант Хампель. ;-)

Сама идея оценки выбросов в скользящем окне правильная и хорошая. На эту тему существуют десятки подходов и методов. Их основная идея состоит в том, что критерий идентификации выбросов адаптируется к текущим свойствам сигнала. Чаще всего текущее значение ряда сравнивается со средним или с медианным значением в окне, а величина выброса измеряется в стандартных отклонениях, рассчитанных в том же окне либо по всему ряду в целом. Мы обычно применяем именно второй вариант, так как у нас в геофизических временных рядах выбросы часто идут пачками и в окно иногда попадает сразу несколько выбросов, что приводит к росту локальной (скользящей) дисперсии. А слишком сильная изменчивость уровня отсечения выбросов - это не всегда хорошо.

Но иногда более подходящим может оказаться и критерий скользящей дисперсии. Для многих сигналов, в том числе и в эконометрике, разброс пропорционален текущему среднему. Тогда дисперсию лучше оценивать в скользящем окне, чтобы критерий сохранял однородность (в относительных единицах) на всем протяжении ряда вне зависимости от его текущего уровня. Но тут есть один важный нюанс. Если в сигнале встречаются участки быстрого роста или быстрого спада сигнала, то стандартное отклонение в таких окнах может оказаться намного больше, чем фактический разброс данных относительно линии тренда. Поэтому для аккуратного удаления выбросов лучше сначала удалить из сигнала функциональный либо непараметрический тренд (можно взять ту же скользящую медиану), и только после этого применять критерий выделения выбросов. Идентифицированные таким способом выбросы потом выбраковываются, естественно, из исходного ряда с трендом. Подробнее такой подход к фильтрации выбросов описан вот в этой статье.

Ну и последнее замечание: все методы этого типа прекрасно работают при наличии в сигнале пропусков наблюдений. Поэтому при кодировании таких процедур нет никакого смысла заранее ограничивать себя требованием полноты данных. Ведь во всех реальных рядах неизбежно присутствуют дефекты разного рода, и очень часто методологически правильнее просто исключать такие значения из анализа вместо того, чтобы заменять их какими-то искусственными (вымышленными) значениями.

Точнее, такие данные надо не исключать, а...

иногда исключать из некоторых расчетов. А в других случаях они, наоборот, могут оказаться самыми ценными наблюдениями - у нас в геофизике такое довольно часто бывает. Поэтому мы не выбраковываем в исходном сигнале все аномальные точки автоматически, если только нет твердой уверенности, что это технический брак. Вместо этого в базе данных хранится исходный сигнал, а особые точки выбраковываются (заменяются пропусками) только при проведении некоторых расчетов. А в других случаях они обрабатываются как-то иначе. То есть, определения понятий "выброс", пропуск" и "аномалия" не фиксированы, а варьируются в зависимости от задачи, которая решается в данный момент.

Поэтому при программировании фильтров, подобных описанному в статье, лучше сразу же предусмотреть возможность наличия в данных пропущенных наблюдений, чтобы их не требовалось чем-нибудь заполнять. Например, можно закодировать пропуск каким-то особым числом, которое никогда не встречается в данных. Затем во всех функциях для оценки стандартного отклонения, медианы и прочего добавляется один оператор, который проверяет каждое значение ряда. Если оно равно пропуску (функция isNan() возвращает "увы, да"), то такое значение игнорируется. Мы обычно при этом еще задаем максимальный разрешенный процент пропущенных наблюдений в окне - если фактическое количество данных в пределах некоторого окна слишком маленькое, то такое окно бракуется целиком. Добавить такую обработку в программу совсем не сложно, но она кардинально повышает гибкость методики при процессинге данных с дефектами.

В функции def hampel забыли домножить на k = 1.4826

Да увидел
Там такая строка будет: r_mad = k * np.median(np.abs(y[(i - window_size):(i + window_size)] - r_median))

В статье все было бы прекрасно если бы автор просто применял фильтр Хэмпла к одномерной выборке а не к временным рядам.

Временной ряд обладает такими свойствами как тренд, сезонность (суточная, еженедельная, месячная, ...), и подверженность экзогенным факторам, таким как например промоакции, скидки в цене, знаковые события (черные пятницы, кубки мира, рождество,...), отсутствию товара на складе и каннибализациям по конкурентам. Хорошо что автор не занимается прогнозированием, иначе пришлось бы рассказывать рассерженным стейкхолдерам что в виновен в "аутоффстоке" (и упущенной выгоде бизнеса соответственно) не автор а фильтр Хэмпла.

Почему именно 3? Потому что этого с лихвой хватит для нашего временного ряда.

Спасибо за отличное настроение))

Мы считаем, что данные подчиняются распределению Гаусса, поэтому берём коэффициент равным 1,4826.

2X-пасибки))))

Мы прогнозируем временные ряды. И для прогноза используем сглаженные данные (так, как в данных есть аномалии, либо продажи которые более не повторяться). Да, мы сглаживаем не все, например есть всплески в продажах, которые вызваны рекламными акциями или открытием нового филиала, такие данные мы не сглаживаем и не убираем. Но по итогу, моделька прогнозирует кол-во отгрузок со склада, с точностью 91,8% (по самым ходовым товарам). Да, если вдруг придет сейчас продажа например на 30 000 единиц товара, то модель ее не спрогнозирует. Но такие КП бывают редко. Со всем остальным это алгоритм справляется. Например на прошлой неделе должно было уйти 2877 единиц товара, а ушло по факту 2836 единиц.

Да, про сезонность и тренд автор знает) + мы для прогнозирования используем логику: построения тренда и сезонности (через ариму/профет (тут для примера)), а потом загоняем эти данные в бустинг, который уточняет прогноз первой модели.

Да, вы правы, я допустил ошибку в статье, сказав что очищаем временный ряд. Мы очищаем выборку от аномалий, пропусков и битых данных.

Sign up to leave a comment.

Articles