如何使用带有 IQR 的 Pandas 过滤器?
Pandas 是一个用于数据分析和处理的开源 Python 库。Pandas 提供数据清理、转换和过滤功能。在大型数据集中,一些称为异常值的极端值可以修改数据分析结果。为了识别这些异常值,使用了一种称为四分位距 (IQR) 的稳健统计测量方法。在本文中,我们将了解如何使用 IQR 过滤 pandas 以识别和处理数据集中的异常值。
了解四分位距 (IQR)
在了解如何使用带有 IQR 的 Pandas 过滤器之前,让我们简单了解一下什么是四分位距 (IQR)。四分位将数据集分成四个相等的部分,其中 Q1 代表第 25 个百分位数,Q3 代表第 75 个百分位数。 IQR 计算为第 75 个百分位数即 Q3 与第 25 个百分位数即 Q1 之间的差值。简单来说,IQR 是统计离散度的度量,具体来说是数据集中第一四分位数 (Q1) 和第三四分位数 (Q3) 之间的范围。
IQR = Q3 - Q1
使用带 IQR 的 Pandas Filter 的步骤
我们将使用 Kaggle 的住房数据集,可从 Kaggle 网站下载。(https://www.kaggle.com/datasets/ashydv/housing-dataset?resource=download)。 Kaggle 是一个流行的数据集查找和共享平台。它托管了各种数据集,包括与住房相关的数据。您可以在 Kaggle 上搜索住房数据集,网址为 https://www.kaggle.com/datasets。
步骤 1:导入必要的库
第一步是导入使用 pandas 和 numpy 方法所需的库。在此示例中,我们将使用 Python 中的 import 属性导入 pandas 和 numpy 库。
import pandas as pd import numpy as np
步骤 2:加载数据集
现在,在导入所需的库后,我们需要读取我们的住房数据集。在这里,我们将使用 Python 的 read_csv() 方法读取 CSV 文件。
data = pd.read_csv('housing_data.csv')
步骤 3:探索数据集
在应用 IQR 过滤器之前,探索数据集并了解其结构非常重要。我们可以使用各种 Pandas 函数来深入了解数据。例如,head() 显示前几行,info() 提供数据集的摘要,describe() 计算每列的统计指标。
print(data.head()) print(data.info()) print(data.describe())
输出
price area bedrooms bathrooms stories mainroad guestroom basement \
0 13300000 7420 4 2 3 yes no no
1 12250000 8960 4 4 4 yes no no
2 12250000 9960 3 2 2 yes no yes
3 12215000 7500 4 2 2 yes no yes
4 11410000 7420 4 1 2 yes yes yes
hotwaterheating airconditioning parking prefarea furnishingstatus
0 no yes 2 yes furnished
1 no yes 3 no furnished
2 no no 2 yes semi-furnished
3 no yes 3 yes furnished
4 no yes 2 no furnished
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 545 entries, 0 to 544
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 price 545 non-null int64
1 area 545 non-null int64
2 bedrooms 545 non-null int64
3 bathrooms 545 non-null int64
4 stories 545 non-null int64
5 mainroad 545 non-null object
6 guestroom 545 non-null object
7 basement 545 non-null object
8 hotwaterheating 545 non-null object
9 airconditioning 545 non-null object
10 parking 545 non-null int64
11 prefarea 545 non-null object
12 furnishingstatus 545 non-null object
dtypes: int64(6), object(7)
memory usage: 55.5+ KB
price area bedrooms bathrooms stories \
count 5.450000e+02 545.000000 545.000000 545.000000 545.000000
mean 4.766729e+06 5150.541284 2.965138 1.286239 1.805505
std 1.870440e+06 2170.141023 0.738064 0.502470 0.867492
min 1.750000e+06 1650.000000 1.000000 1.000000 1.000000
25% 3.430000e+06 3600.000000 2.000000 1.000000 1.000000
50% 4.340000e+06 4600.000000 3.000000 1.000000 2.000000
75% 5.740000e+06 6360.000000 3.000000 2.000000 2.000000
max 1.330000e+07 16200.000000 6.000000 4.000000 4.000000
parking
count 545.000000
mean 0.693578
std 0.861586
min 0.000000
25% 0.000000
50% 0.000000
75% 1.000000
max 3.000000
步骤 4:计算 IQR
一旦我们了解了数据集,我们就可以计算每个数字列的 IQR。为此,我们使用 Pandas 中的 quantile() 函数,该函数计算给定数据集所需的分位数。在我们的例子中,我们需要每列的第 25 个百分位数 (Q1) 和第 75 个百分位数 (Q3)。
Q1 = data.quantile(0.25) Q3 = data.quantile(0.75) IQR = Q3 - Q1
步骤 5:应用 IQR 过滤器
在上一步中,我们计算了每列的 IQR 值,现在我们可以应用过滤器来识别异常值。一般规则是,任何低于 Q1 - 1.5 * IQR 或高于 Q3 + 1.5 * IQR 的值都被视为异常值。我们可以使用逻辑运算符创建布尔掩码来过滤掉这些值。
outliers = (data < (Q1 - 1.5 * IQR)) | (data > (Q3 + 1.5 * IQR))
第 6 步:处理异常值
一旦我们确定了异常值,我们就可以决定如何处理它们。有几种可用的选项,具体取决于数据集的性质和分析目标。一些常用方法如下:
删除异常值:在这种方法中,我们只需从数据集中删除包含异常值的行即可。当异常值不太可能出现在未来的数据点中,或者异常值是由于数据输入错误或测量错误导致时,这种方法很有用。我们可以使用 Pandas 中的 drop() 函数删除包含异常值的行。
clean_data = data[~outliers.any(axis=1)]
归纳异常值:我们可以用更合理的值替换异常值,而不是删除它们。当我们认为异常值是有效数据点但仍想减轻其影响时,这种方法很有用。插补方法包括用平均值、中位数或自定义值替换异常值。
data[outliers] = data.mean() # 用平均值替换异常值
限制异常值:在某些情况下,用最接近的非异常值替换异常值可能是合适的。这种方法可以保持整体分布,同时减少极端值的影响。
data[data < (Q1 - 1.5 * IQR)] = Q1 - 1.5 * IQR # 限制低异常值 data[data > (Q3 + 1.5 * IQR)] = Q3 + 1.5 * IQR # Cap 高异常值
在上面的例子中,我们将简单地删除包含异常值的行。您可以根据数据集的类型使用不同的方法处理异常值。上述 Housing 数据集的完整代码如下:
import pandas as pd
import numpy as np
# 步骤 2:加载数据集
data = pd.read_csv('Housing.csv')
# 步骤 3:探索数据集
#print(data.head())
#print(data.info())
#print(data.describe())
# 步骤 4:计算 IQR
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
# 步骤 5:应用 IQR 过滤器
outliers = (data < (Q1 - 1.5 * IQR)) | (data > (Q3 + 1.5 * IQR))
# 步骤 6:处理异常值
clean_data = data[~outliers.any(axis=1)]
# 步骤 7:结论
print(clean_data.head())
输出
price area bedrooms bathrooms stories mainroad guestroom basement \
15 9100000 6000 4 1 2 yes no yes
16 9100000 6600 4 2 2 yes yes yes
18 8890000 4600 3 2 2 yes yes no
19 8855000 6420 3 2 2 yes no no
20 8750000 4320 3 1 2 yes no yes
hotwaterheating airconditioning parking prefarea furnishingstatus
15 no no 2 no semi-furnished
16 no yes 1 yes unfurnished
18 no yes 2 no furnished
19 no yes 1 yes semi-furnished
20 yes no 2 no semi-furnished
结论
在本文中,我们讨论了如何使用带有 IQR 的 Pandas 过滤器来确定和处理数据集中的异常值。我们使用 Kaggle 的 Housing 数据集对数据集执行过滤操作。通过计算 IQR 并应用过滤器,我们可以轻松识别与中心分布有显著偏差的值。根据分析目标,我们可以删除异常值,用合理的值进行归因,或者限制它们以减少其影响。
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

