Как убрать выбросы из данных python
Перейти к содержимому

Как убрать выбросы из данных python

  • автор:

Как удалить выбросы в Python

Выброс — это наблюдение, которое лежит аномально далеко от других значений в наборе данных. Выбросы могут быть проблематичными, поскольку они могут повлиять на результаты анализа.

В этом руководстве объясняется, как идентифицировать и удалять выбросы в Python.

Как идентифицировать выбросы в Python

Прежде чем вы сможете удалить выбросы, вы должны сначала решить, что вы считаете выбросом. Есть два распространенных способа сделать это:

1. Используйте межквартильный диапазон.

Межквартильный размах (IQR) — это разница между 75-м процентилем (Q3) и 25-м процентилем (Q1) в наборе данных. Он измеряет разброс средних 50% значений.

Вы можете определить наблюдение как выброс, если оно в 1,5 раза превышает межквартильный размах, превышающий третий квартиль (Q3), или в 1,5 раза превышает межквартильный размах, меньше первого квартиля (Q1).

Выбросы = наблюдения > Q3 + 1,5*IQR или Q1 – 1,5*IQR

2. Используйте z-значения.

Z-оценка показывает, сколько стандартных отклонений данного значения от среднего. Мы используем следующую формулу для расчета z-показателя:

z = (X — μ) / σ

  • X — это одно необработанное значение данных.
  • μ — среднее значение населения
  • σ — стандартное отклонение населения

Вы можете определить наблюдение как выброс, если его z-оценка меньше -3 или больше 3.

Выбросы = наблюдения с z-показателями> 3 или <-3

Как удалить выбросы в Python

Как только вы решите, что вы считаете выбросом, вы можете идентифицировать и удалить их из набора данных. Чтобы проиллюстрировать, как это сделать, мы будем использовать следующий кадр данных pandas:

Затем мы можем определить и удалить выбросы, используя метод z-оценки или метод межквартильного диапазона:

Метод Z-оценки:

Метод межквартильного диапазона:

Мы можем видеть, что метод z-показателя идентифицировал и удалил одно наблюдение как выброс, в то время как метод межквартильного диапазона идентифицировал и удалил 11 наблюдений как выбросы.

Когда удалять выбросы

Если в ваших данных присутствует один или несколько выбросов, вы должны сначала убедиться, что они не являются результатом ошибки ввода данных. Иногда человек просто вводит неправильное значение данных при записи данных.

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

Если значение является истинным выбросом, вы можете удалить его, если оно окажет значительное влияние на общий анализ. Просто не забудьте упомянуть в своем окончательном отчете или анализе, что вы удалили выброс.

Дополнительные ресурсы

Если вы работаете с несколькими переменными одновременно, вы можете использовать расстояние Махаланобиса для обнаружения выбросов.

Практическое занятие: обнаружение и обработка выбросов в Python с использованием правила 1.5 IQR

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

Здесь вы можете очень хорошо заметить, что всего два пункта повлияли на модель линейной регрессии (оценка R² составляет всего 47%).

Однако, когда выброс удален, вы видите, что производительность модели резко улучшается с 48% до 95%. Разве это не круто!

Цель обнаружения и обработки выбросов — гарантировать, что вы получите наилучшую модель из данных, учитывая тот факт, что ваши данные подходят для работы с алгоритмом. В этом случае данные линейны и совместимы с алгоритмом линейной регрессии. Итак, давайте посмотрим, как обнаруживать и удалять выбросы из ваших данных в Python с помощью правила 1.5 IQR.

IQR означает межквартильный диапазон. Давайте посмотрим определение IQR в Википедии.

В описательной статистике межквартильный размах, также называемый средним или средним 50%, или технически H-разбросом, является мерой статистической дисперсии, равной разнице между 75-м и 25-м процентилями или между верхним и нижним квартилями, IQR = Q₃ — Q₁.

Действия по обнаружению выбросов путем определения нижней и верхней границы данных:
1. Расположите данные в порядке возрастания
2. Вычислите Q1 (первый квартал)
3. Рассчитайте Q3 ( третий квартиль)
4. Найдите IQR = (Q3 — Q1)
5. Найдите нижний диапазон = Q1 — (1,5 * IQR)
6. Найдите верхний диапазон = Q3 + (1,5 * IQR)

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

Теперь давайте посмотрим на код того же:

  1. Импортируйте необходимые пакеты

2. Создайте образец набора данных с выбросами.

Как вы видите, в наборе данных я добавил экстремальное значение, то есть 20000. Давайте проверим диаграмму рассеяния, чтобы увидеть выброс,

В этом наборе данных 20000 — крайнее значение. Давайте проверим, помогает ли нам правило 1.5IQR!

3. Давайте напишем функцию выброса, которая будет возвращать нам нижнее и верхнее значения.

4. Используя указанную выше функцию, давайте получим нижнюю и верхнюю границы значений.

5. Давайте проверим, какой столбец считается выбросом.

Приведенный выше код дает следующий результат:

5. Теперь давайте удалим выбросы из набора данных.

6. Давайте посмотрим на диаграмму рассеяния после удаления выбросов.

Как видите, после удаления выброса данные теперь хорошо работают с линейной регрессией.

Есть ли функция, которая может удалить выбросы?

Вот функция для обнаружения выбросов, но мне нужна помощь в функции для удаления выбросов.

Здесь выбросы печати

Ответы (3)

Простым решением было бы использовать scipy.stats.zscore .

Я предполагаю, что под «удалением выбросов» вы подразумеваете «удалить строки из df фрейма данных, которые содержат выброс в столбце ‘Pre_TOTAL_PURCHASE_ADJ’ ». Если это неверно, возможно, вы могли бы изменить вопрос, чтобы прояснить ваш смысл.

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

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

Поскольку @political_scientist уже дал практическое решение с использованием scipy.stats.zscore для получения значений предиката в новом столбце is_outlier , я оставлю этот ответ как простой общий совет для работы с numpy и pandas. Учитывая этот ответ, нужные вам строки будут предоставлены

хотя было бы немного более понятно включить отрицание (

) в генерацию столбца селектора, а не в индексирование, как указано выше, переименовав столбец ‘is_not_outlier’ .

Detect and exclude outliers in a pandas DataFrame

Now I know that certain rows are outliers based on a certain column value.

column ‘Vol’ has all values around 12xx and one value is 4000 (outlier).

Now I would like to exclude those rows that have Vol column like this.

So, essentially I need to put a filter on the data frame such that we select all rows where the values of a certain column are within, say, 3 standard deviations from mean.

What is an elegant way to achieve this?

Trenton McKinney's user avatar

18 Answers 18

Remove all rows that have outliers in, at least, one column

If you have multiple columns in your dataframe and would like to remove all rows that have outliers in at least one column, the following expression would do that in one shot:

Description:

  • For each column, it first computes the Z-score of each value in the column, relative to the column mean and standard deviation.
  • It then takes the absolute Z-score because the direction does not matter, only if it is below the threshold.
  • all(axis=1) ensures that for each row, all column satisfy the constraint.
  • Finally, the result of this condition is used to index the dataframe.

Filter other columns based on a single column

  • Specify a column for the zscore , df[0] for example, and remove .all(axis=1) .

Fanchen Bao's user avatar

For each of your dataframe column, you could get quantile with:

and then filter with:

If one need to remove lower and upper outliers, combine condition with an AND statement:

Use boolean indexing as you would do in numpy.array

For a series it is similar:

This answer is similar to that provided by @tanemaki, but uses a lambda expression instead of scipy stats .

To filter the DataFrame where only ONE column (e.g. ‘B’) is within three standard deviations:

See here for how to apply this z-score on a rolling basis: Rolling Z-score applied to pandas dataframe

Alexander's user avatar

Before answering the actual question we should ask another one that’s very relevant depending on the nature of your data:

What is an outlier?

Imagine the series of values [3, 2, 3, 4, 999] (where the 999 seemingly doesn’t fit in) and analyse various ways of outlier detection

Z-Score

The problem here is that the value in question distorts our measures mean and std heavily, resulting in inconspicious z-scores of roughly [-0.5, -0.5, -0.5, -0.5, 2.0] , keeping every value within two standard deviations of the mean. One very large outlier might hence distort your whole assessment of outliers. I would discourage this approach.

Quantile Filter

A way more robust approach is given is this answer, eliminating the bottom and top 1% of data. However, this eliminates a fixed fraction independant of the question if these data are really outliers. You might loose a lot of valid data, and on the other hand still keep some outliers if you have more than 1% or 2% of your data as outliers.

IQR-distance from Median

Even more robust version of the quantile principle: Eliminate all data that is more than f times the interquartile range away from the median of the data. That’s also the transformation that sklearn ‘s RobustScaler uses for example. IQR and median are robust to outliers, so you outsmart the problems of the z-score approach.

In a normal distribution, we have roughly iqr=1.35*s , so you would translate z=3 of a z-score filter to f=2.22 of an iqr-filter. This will drop the 999 in the above example.

The basic assumption is that at least the "middle half" of your data is valid and resembles the distribution well, whereas you also mess up if your distribution has wide tails and a narrow q_25% to q_75% interval.

Advanced Statistical Methods

Of course there are fancy mathematical methods like the Peirce criterion, Grubb’s test or Dixon’s Q-test just to mention a few that are also suitable for non-normally distributed data. None of them are easily implemented and hence not addressed further.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *