Outliers, anomalies и прочие выбросы в ваших данных
Часто в ваших данных попадаются выбросы. С точки зрения маркетолога выбросы - это такие данные, которые выходят за ожидаемый диапазон значений.
Как с этим работать - тема сегодняшнего поста.
Чтобы проще было понимать о чем дальше будет идти речь, я сгенерировал 2 тестовых датасета. Каждый датасет состоит из таких полей:
Первый датасет состоит из 100 записей и в нем нет outliers (выбросов).
Второй датасет состоит из 30 записей и в нем точно есть outliers (я вручную задал 2 значения выше диапазонов случайных значений, которыми я параметризировал датасеты).
Outliers
Ожидаемый диапазон значений понятие субъективное (иногда вы можете оценить его адекватно, но чаще - нет). Поэтому здесь лучше опираться на математическую базу.
Одно из самых простых и в тоже время рабочих определений дал в свое время известный математик Tukey: outlier это значение, которое выходит за рамки диапазона ± 1.5 * IQR.
Когда точек немного, для оценки того, есть ли в датасете 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-алгоритм сам проранжирует новые точки на предмет являются ли они типичными (или аномальными) для ваших данных.
Итак, на чарте выше мы видим интересную картину.
Точка `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() также дают неплохие результаты.
Как с этим работать - тема сегодняшнего поста.
Чтобы проще было понимать о чем дальше будет идти речь, я сгенерировал 2 тестовых датасета. Каждый датасет состоит из таких полей:
- порядковый номер записи (idx),
- средний чек заказа (AOV),
- средний чек первого заказа (first_AOV).
пример данных (10 записей). |
Первый датасет состоит из 100 записей и в нем нет outliers (выбросов).
Второй датасет состоит из 30 записей и в нем точно есть outliers (я вручную задал 2 значения выше диапазонов случайных значений, которыми я параметризировал датасеты).
Ожидаемый диапазон значений понятие субъективное (иногда вы можете оценить его адекватно, но чаще - нет). Поэтому здесь лучше опираться на математическую базу.
Одно из самых простых и в тоже время рабочих определений дал в свое время известный математик Tukey: outlier это значение, которое выходит за рамки диапазона ± 1.5 * IQR.
использование функции ggplot::geom_boxplot() для определения outliers. |
Когда точек немного, для оценки того, есть ли в датасете outlier или нет, я обычно рисую чарт используя ggplot::geom_boxplot(). Этот тип чартов, кстати, также разработка Tukey.
Однако недостаток такого метода в том, что выбросы в этом случае можно определить только по одному атрибуту (либо 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() также дают неплохие результаты.
Comments
Post a Comment