Outliers, anomalies и прочие выбросы в ваших данных

Часто в ваших данных попадаются выбросы. С точки зрения маркетолога выбросы - это такие данные, которые выходят за ожидаемый диапазон значений.

Как с этим работать - тема сегодняшнего поста.

Чтобы проще было понимать о чем дальше будет идти речь, я сгенерировал 2 тестовых датасета. Каждый датасет состоит из таких полей:
  • порядковый номер записи (idx), 
  • средний чек заказа (AOV), 
  • средний чек первого заказа (first_AOV).
пример данных (10 записей).

Первый датасет состоит из 100 записей и в нем нет outliers (выбросов).

Второй датасет состоит из 30 записей и в нем точно есть outliers (я вручную задал 2 значения выше диапазонов случайных значений, которыми я параметризировал датасеты).

Outliers

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

Одно из самых простых и в тоже время рабочих определений дал в свое время известный математик Tukey: outlier это значение, которое выходит за рамки диапазона ± 1.5 * IQR.

использование функции ggplot::geom_boxplot() для определения outliers.

Когда точек немного, для оценки того, есть ли в датасете outlier или нет, я обычно рисую чарт используя ggplot::geom_boxplot(). Этот тип чартов, кстати, также разработка Tukey.

Итак, на чарте выше мы видим точку `19` из testdata (выделена красным), которая явно выбивается из распределения всех остальных точек (выходит за расстояние 1.5 * IQR). Действительно, в testdata практически все значения first_AOV находятся в диапазоне [11; 67] и `19` точка со значением 88 явно выделяется.

Однако недостаток такого метода в том, что выбросы в этом случае можно определить только по одному атрибуту (либо AOV, либо first_AOV).

Anomaly detection

Если вы хотите определить outlier по всему набору атрибутов, то, фактически, вам нужно уже использовать machine learning (ML).

Для этого вы тренируете ML-алгоритм (MicrosoftML::rxOneClassSvm()) на одном датасете (а данном случае на traindata). На выходе вы получаете модель, которую можно применить к новым данным (testdata). ML-алгоритм сам проранжирует новые точки на предмет являются ли они типичными (или аномальными) для ваших данных.

Anomaly detection - using OneClass SVM algorithm.

Итак, на чарте выше мы видим интересную картину.

Точка `19` была outlier, если смотреть только по атрибуту first_AOV. Но когда мы посмотрели на всю картину в целом (комбинации значений AOV и first_AOV), то точка `19` уже уникальна как по оси first_AOV так и по оси AOV.

В этом и прелесть ML-алгоритма - он позволяет понять является ли точка аномальной по N-атрибутам.

Более того, появилась еще одна точка - аномальная для этих данных - точка `2`. Эта точка `2` не является аномальной ни по атрибуту AOV, ни по атрибуту first_AOV, но если использовать их комбинацию, то она в достаточной степени уникальна и поэтому алгоритм определил ее как аномалию.

Действительно, в testdata (график справа) точка `2` соответствует значениям first_AOV = 18 и AOV  = 26. В traindata (график слева) с такими значениями (или очень близкими к ним) - точек просто нет. Поэтому алгоритм и счел точку `2` аномальной.

Т.о. machine learning алгоритм полезен там, где человеческий глаз (или простой чарт) уже бессильны.

UPDATE: Советую попробовать небольшое shiny-приложение, которое позволяет посмотреть как разные алгоритмы определяют разные точки как outliers.

UPDATE2: h2o.anomaly() и IsolationForest::AnomalyScore() также дают неплохие результаты.

Popular posts from this blog

RF-матрица как альтернатива для работы с LTV

A/B-тестирование: смотреть на конверсию vs смотреть на продажи

Дисконты, которые могут убить ваш бизнес