如何在 IQR 中使用 Pandas 过滤器?
IQR 或四分位距是一种统计量度,用于测量给定数据的可变性。简单地说,它告诉我们大部分数据位于哪个范围内。它可以通过取数据集中第三个四分位数和第一个四分位数之间的差异来计算。
IQR = Q3 - Q1
其中,Q3 = 第 75 个百分位值(它是数据集中中位数和最大值之间的中间值)。 Q1 = 第 25 个百分位值(它是数据集中中位数和最小值之间的中间值)。此外,Q2 表示第 50 个百分位数,即数据集的中位数。有关 IQR 的更多信息,请阅读 https://www.geeksforgeeks.org/interquartile-range-iqr/。
在本文中,我们将了解如何在 IQR 的帮助下使用 Pandas 过滤数据集。
四分位距 (IQR) 是一种通常用于过滤数据集中异常值的方法。异常值是远离常规观测值的极端值,这些观测值可能由于测量的可变性或实验误差而产生。很多时候我们想识别这些异常值并过滤掉它们以减少错误。在这里,我们将展示一个使用Python编程语言中的 Pandas 检测异常值并过滤掉它们的示例。
让我们首先导入重要的库,我们需要这些库来识别和过滤异常值。
Python
# Importing important libraries
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.style.use('seaborn')
Python
# Reading the dataset
data = pd.read_csv('Dataset.csv')
print("The shape of the dataframe is: ", data.shape)
Python
print(data)
Python
data.describe()
Python
plt.figure(figsize=(6,4))
sns.boxplot(data['Height (in cm)'])
plt.show()
Python
# Removing the outliers
def removeOutliers(data, col):
Q3 = np.quantile(data[col], 0.75)
Q1 = np.quantile(data[col], 0.25)
IQR = Q3 - Q1
print("IQR value for column %s is: %s" % (col, IQR))
global outlier_free_list
global filtered_data
lower_range = Q1 - 1.5 * IQR
upper_range = Q3 + 1.5 * IQR
outlier_free_list = [x for x in data[col] if (
(x > lower_range) & (x < upper_range))]
filtered_data = data.loc[data[col].isin(outlier_free_list)]
for i in data.columns:
removeOutliers(data, i)
# Assigning filtered data back to our original variable
data = filtered_data
print("Shape of data after outlier removal is: ", data.shape)
Python
print(data)
现在,我们将读取要检测和过滤异常值的数据集。数据集可以从 https://tinyurl.com/gfgdata 下载。它可以使用 Pandas 库中的 read_csv() 方法来完成,可以写成:
Python
# Reading the dataset
data = pd.read_csv('Dataset.csv')
print("The shape of the dataframe is: ", data.shape)
The shape of the dataframe is: (20, 4)
打印数据集
我们可以打印数据集来查看数据。
Python
print(data)
我们的数据集如下所示:
我们可以使用 data.describe() 方法观察关于这个数据集的一些统计信息,可以这样做:
Python
data.describe()
可以观察到,与 75% 的值相比,诸如“高度”、“宽度”、“面积”之类的特征具有非常延迟的最大值,因此我们可以说某些观察结果在数据集中充当异常值。同样,这些列中的最小值与 25% 的值相差很大,因此它表示存在异常值。
可以通过绘制上述特征的箱线图来验证,这里我正在绘制高度列的箱线图,并以相同的方式绘制其他特征的箱线图。
Python
plt.figure(figsize=(6,4))
sns.boxplot(data['Height (in cm)'])
plt.show()
我们可以在箱线图中观察到超出第一个四分位数和第三个四分位数的异常值的存在。
为了找出并过滤数据集中的此类异常值,我们将创建一个自定义函数来帮助我们删除异常值。在函数,我们首先需要通过求第三四分位数和第一四分位数之间的差值来找出可以计算的IQR值。其次,我们将编写一个查询来选择位于lower_range 和upper_range IQR 区域之外的观测值并删除它们。可以写成:
Python
# Removing the outliers
def removeOutliers(data, col):
Q3 = np.quantile(data[col], 0.75)
Q1 = np.quantile(data[col], 0.25)
IQR = Q3 - Q1
print("IQR value for column %s is: %s" % (col, IQR))
global outlier_free_list
global filtered_data
lower_range = Q1 - 1.5 * IQR
upper_range = Q3 + 1.5 * IQR
outlier_free_list = [x for x in data[col] if (
(x > lower_range) & (x < upper_range))]
filtered_data = data.loc[data[col].isin(outlier_free_list)]
for i in data.columns:
removeOutliers(data, i)
# Assigning filtered data back to our original variable
data = filtered_data
print("Shape of data after outlier removal is: ", data.shape)
IQR value for column Height (in cm) is: 9.5
IQR value for column Width (in cm) is: 16.75
IQR value for column Area (in cm2) is: 706.0
Shape of data after outlier removal is: (18, 3)
之后打印数据我们可以注意到我们的两个极端观察结果作为异常值被删除了。
Python
print(data)
我们可以观察到从原始数据集中删除了索引号为 7 和 15 的行。