Что такое выбросы

По определению выбросы — это экстремальные точки данных в наборе данных. Чтобы упростить понимание, предположим, что вы хотите узнать среднюю зарплату в компании, и вам даны данные о зарплате 6 человек.

— 5 сотрудников — Вывод 25 000 в месяц

— 1 генеральный директор — получение 50 000 в месяц

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

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
salary = pd.DataFrame(data = [['CEO',50000],
                              ['Associate',25000],
                              ['Associate',25500],
                              ['Associate',26000],
                              ['Associate',27000],
                              ['Associate',28900]],columns =
                              ['Designation','Salary'])
                              salary
salary
Designation Salary
0 CEO       50000
1 Associate 25000
2 Associate 25500
3 Associate 26000
4 Associate 27000
5 Associate 28900

Теперь, если мы попытаемся найти здесь среднее значение, посмотрим, что получится.

print(f"the average employee salary is, {salary['Salary'].mean()}")
the average employee salary is, 30400.0

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

Способ 1 — Визуализация

sns.boxplot(salary['Salary'])
plt.show

fig, ax = plt.subplots(figsize = (5,2))
ax.scatter(salary['Salary'],salary['Designation'])
plt.show()

Как мы видим выше, точка данных «50000» далека от всех других данных, которые у нас есть в наборе и на графике, верхняя часть приближается к отметке «29000», поэтому мы можем узнать все данные выше, 29 000 и удалить их.

print(f"The outlier data points are")
print(np.where(salary['Salary']>29000))
The outlier data points are
(array([0], dtype=int64),)

Выше мы видим, что индекс выброса равен «0», теперь давайте выясним, какие данные находятся в позиции 0 индекса.

Designation   CEO
Salary     50000
Name: 0, dtype: object

Метод 2 — IQR-метод

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

IQR используется для измерения изменчивости путем деления набора данных на квартили. Данные сортируются в порядке возрастания и разбиваются на четыре равные части. Q1, Q2 и Q3, называемые первым, вторым и третьим квартилями, представляют собой значения, разделяющие 4 равные части.

— Q1 представляет 25-й процентиль данных.

— Q2 представляет собой 50-й процентиль данных.

— Q3 представляет собой 75-й процентиль данных.

Если набор данных имеет 2n / 2n+1 точек данных, то

— Q1 = медиана набора данных.

- Q2 = медиана n наименьших точек данных.

- Q3 = медиана n самых высоких точек данных.

IQR — это диапазон между первым и третьим квартилями, а именно Q1 и Q3: IQR = Q3 — Q1. Точки данных, которые попадают ниже Q1–1,5 IQR или выше Q3 + 1,5 IQR, являются выбросами.

Q1 = np.percentile(salary['Salary'], 25, interpolation = 'midpoint')
Q2 = np.percentile(salary['Salary'], 50, interpolation = 'midpoint')
Q3 = np.percentile(salary['Salary'], 75, interpolation = 'midpoint')
print('Q1 25 percentile of the given data is, ', Q1)
print('Q1 50 percentile of the given data is, ', Q2)
print('Q1 75 percentile of the given data is, ', Q3)

IQR = Q3 - Q1
print('Interquartile range is', IQR)
Q1 25 percentile of the given data is, 25750.0
Q1 50 percentile of the given data is, 26500.0
Q1 75 percentile of the given data is, 27950.0
Interquartile range is 2200.0

Теперь давайте найдем нижний и верхний пределы наших данных.

low_lim = Q1 - 1.5 * IQR
up_lim = Q3 + 1.5 * IQR
print('low_limit is', low_lim)
print('up_limit is', up_lim)
low_limit is 22450.0
up_limit is 31250.0

Теперь мы будем хранить наши выбросы в списке

outlier =[]
for x in (salary['Salary']):
    if ((x> up_lim) or (x<low_lim)):
          outlier.append(x)
print(' outlier in the dataset is', outlier)
outlier in the dataset is [50000]
print(f"The outlier data points are")
print(np.where(salary['Salary']==50000))py
The outlier data points are
(array([0], dtype=int64),)
print(salary.iloc[0])
Designation CEO
Salary   50000
Name: 0, dtype: object

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

Метод 3 — Метод оценки Z

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

Zscore = (data_point -mean) / std. отклонение

from scipy import stats
z = np.abs(stats.zscore(salary['Salary']))
print(z)
0 2.213359
1 0.609803
2 0.553340
3 0.496877
4 0.383950
5 0.169390
Name: Salary, dtype: float64

Мы снова можем определить, какой индекс выше всех остальных, в соответствии с оценкой для этого случая мы можем определить пороговый предел как 1, как правило, мы принимаем его как 3 (поскольку 99,7% точек данных лежат между +/- 3 стандартных отклонения (с использованием подхода распределения Гаусса) для реальных данных, но поскольку наши данные малы и мы видим, что 99% данных попадают в пределы 1 Z-показателя, мы можем оставить порог равным 1.

#Position of the outlier
print(np.where(z > 1))
(array([0], dtype=int64),)
print(salary.iloc[0])
Designation CEO
Salary 50000
Name: 0, dtype: object

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

Вывод —

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

salary.drop(salary.index[[0]], inplace = True)
salary
Designation Salary
1 Associate 25000
2 Associate 25500
3 Associate 26000
4 Associate 27000
5 Associate 28900

Я надеюсь, что эта статья помогла вам получить некоторое представление об обнаружении и удалении выбросов в python.

Для получения большего количества такого контента, пожалуйста, следуйте за моим профилем Medium и страницей LinkedIn — https://www.linkedin.com/in/chandan-sengupta/