如何使用IQR的Pandas过滤器
IQR或四分位数范围是一种统计学措施,用于衡量特定数据的可变性。天真地讲,它告诉我们大部分数据在哪个范围内。它可以通过在一个数据集中取第三四分位数和第一四分位数之间的差值来计算。
IQR = Q3 - Q1
其中,Q3=第75个百分位数(它是一个数据集里面的中位数和最大值之间的中间值)。Q1 = 第25个百分位数(它是一个数据集里面的中位数和最小值之间的中间值)。另外,Q2表示第50个百分点,即数据集的中位数。
在这篇文章中,我们将了解如何在IQR的帮助下使用Pandas过滤数据集。
四分位数范围(IQR)是一种方法,通常用于过滤数据集中的离群值。离群值是指远离常规观测值的极端值,可能是由于测量或实验误差的变化而产生的。很多时候,我们想要识别这些离群值并将其过滤掉以减少误差。在这里,我们将展示一个使用Python编程语言中的Pandas检测离群值并将其过滤掉的例子。
首先,让我们开始导入重要的库,我们需要这些库来识别和过滤异常值。
# Importing important libraries
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.style.use('seaborn')
现在,我们将读取我们想要检测和过滤异常值的数据集。该数据集可以从https://tinyurl.com/gfgdata。可以使用Pandas库中的read_csv()方法来完成,可以写成。
# 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)
打印数据集
我们可以打印数据集,看一看数据。
print(data)
我们的数据集看起来像这样。
我们可以用data.describe()方法观察这个数据集的一些统计信息,可以这样做。
data.describe()
输出:
可以看出,诸如 “高度”、”宽度”、”面积 “等特征的最大值与75%的值相比有很大的延迟,因此我们可以说在数据集中有某些观察值作为离群值。同样地,这些列中的最小值与25%的值相差很大,所以它标志着离群值的存在。
可以通过绘制上述特征的箱形图来验证,这里我绘制的是高度列的箱形图,以同样的方式也可以绘制其他特征的箱形图。
plt.figure(figsize=(6,4))
sns.boxplot(data['Height (in cm)'])
plt.show()
输出:
我们可以观察到箱形图中第一个四分位数和第三个四分位数以外的异常值的存在。
为了找出并过滤数据集中的这种离群值,我们将创建一个自定义函数,帮助我们去除离群值。在这个函数中,我们首先需要找出IQR值,这个值可以通过找到第三和第一四分位数之间的差值来计算。其次,我们将编写一个查询,选择位于 lower_range 和 upper_range IQR 区域之外的观察值,并将其删除。它可以写成:。
# 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:
if i == data.columns[0]:
removeOutliers(data, i)
else:
removeOutliers(filtered_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)
之后打印数据,我们可以注意到有两个作为异常值的极端观察值被删除了。
print(data)
输出:
我们可以看到索引号为7和15的行被从原始数据集中删除。