📜  从 Matplotlib 中寻找离群点

📅  最后修改于: 2022-05-13 01:54:31.547000             🧑  作者: Mango

从 Matplotlib 中寻找离群点

异常值是与其他观测值不同或与其他数据相距一定距离的数据点。它们主要是由于一些实验误差而产生的,这可能会导致统计分析中的一些问题。虽然在大数据集中,很明显有些数据将远离样本均值。需要找到并明智地处理这些异常值。

我们可以根据需要使用箱线图

上面是一个箱线图,用于显示数据值的汇总及其中位数、第一四分位数、第三四分位数、最小值和最大值。上下须线外的数据点是异常值。在晶须的第一个和第三个四分位数之间是四分位数区域,在该区域上方有一条垂直线通过,称为中位数。有关更多详细信息,请参阅博客 Box plot using Python。以下是从箱线图中查找异常值的方法:

1.Visualizing through matplotlib boxplot using plt.boxplot().
2.Using 1.5 IQR rule.

例子:

Python3
# Adding libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
# random integers between 1 to 20
arr = np.random.randint(1, 20, size=30)
 
# two outliers taken
arr1 = np.append(arr, [27, 30])
 
print('Thus the array becomes{}'.format(arr1))


Python3
plt.boxplot(arr1)
fig = plt.figure(figsize =(10, 7))
plt.show()


Python
# finding the 1st quartile
q1 = np.quantile(arr1, 0.25)
 
# finding the 3rd quartile
q3 = np.quantile(arr1, 0.75)
med = np.median(arr1)
 
# finding the iqr region
iqr = q3-q1
 
# finding upper and lower whiskers
upper_bound = q3+(1.5*iqr)
lower_bound = q1-(1.5*iqr)
print(iqr, upper_bound, lower_bound)


Python3
outliers = arr1[(arr1 <= lower_bound) | (arr1 >= upper_bound)]
print('The following are the outliers in the boxplot:{}'.format(outliers))


Python3
# boxplot of data within the whisker
arr2 = arr1[(arr1 >= lower_bound) & (arr1 <= upper_bound)]
plt.figure(figsize=(12, 7))
plt.boxplot(arr2)
plt.show()


输出:

使用 plt.boxplot() 通过 matplotlib boxplot 进行可视化

蟒蛇3

plt.boxplot(arr1)
fig = plt.figure(figsize =(10, 7))
plt.show()


输出:

所以从上图中,我们可以看到两个异常值。

1.5 IQR 规则

1.5IQR 规则的步骤:-

  • 查找中位数、四分位数和四分位数区域
  • 计算低于第一个四分位数的 1.5*IQR 并检查低异常值。
  • 计算高于第三个四分位数的 1.5*IQR 并检查异常值。

Python

# finding the 1st quartile
q1 = np.quantile(arr1, 0.25)
 
# finding the 3rd quartile
q3 = np.quantile(arr1, 0.75)
med = np.median(arr1)
 
# finding the iqr region
iqr = q3-q1
 
# finding upper and lower whiskers
upper_bound = q3+(1.5*iqr)
lower_bound = q1-(1.5*iqr)
print(iqr, upper_bound, lower_bound)

输出:

8.25 26.375 -6.625

蟒蛇3

outliers = arr1[(arr1 <= lower_bound) | (arr1 >= upper_bound)]
print('The following are the outliers in the boxplot:{}'.format(outliers))

输出:

The following are the outliers in the boxplot:[27 30]

因此,已使用该规则检测到异常值。现在消除它们并用数据点绘制图形 -

蟒蛇3

# boxplot of data within the whisker
arr2 = arr1[(arr1 >= lower_bound) & (arr1 <= upper_bound)]
plt.figure(figsize=(12, 7))
plt.boxplot(arr2)
plt.show()

输出 :