如何使用带有 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 并应用过滤器,我们可以轻松识别与中心分布有显著偏差的值。根据分析目标,我们可以删除异常值,用合理的值进行归因,或者限制它们以减少其影响。