Как удалить выбросы в 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

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

 import numpy as np
import pandas as pd 
import scipy.stats as stats

#create dataframe with three columns 'A', 'B', 'C'
np.random.seed(10)
data = pd.DataFrame(np.random.randint(0, 10, size=(100, 3)), columns=['A', 'B', 'C'])

#view first 10 rows
data[:10]

           ABC
0 13.315865 7.152790 -15.454003
1 -0.083838 6.213360 -7.200856
2 2.655116 1.085485 0.042914
3 -1.746002 4.330262 12.030374
4 -9.650657 10.282741 2.286301
5 4.451376 -11.366022 1.351369
6 14.845370 -10.798049 -19.777283
7 -17.433723 2.660702 23.849673
8 11.236913 16.726222 0.991492
9 13.979964 -2.712480 6.132042

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

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

 #find absolute value of z-score for each observation
z = np.abs(stats.zscore(data))

#only keep rows in dataframe with all z-scores less than absolute value of 3 
data_clean = data[(z<3).all(axis=1)]

#find how many rows are left in the dataframe 
data_clean.shape

(99.3)

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

 #find Q1, Q3, and interquartile range for each column
Q1 = data.quantile(q=.25)
Q3 = data.quantile(q=.75)
IQR = data.apply(stats.iqr)

#only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3
data_clean = data[~((data < (Q1-1.5*IQR)) | (data > (Q3+1.5*IQR))).any(axis=1)]

#find how many rows are left in the dataframe 
data_clean.shape

(89.3)

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

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

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

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

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

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

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

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

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