如何使用 Pandas 和 IQR 进行过滤
Pandas 是一个用于数据分析和处理的开源 Python 库。Pandas 提供了数据清洗、转换和过滤的功能。在大型数据集中,一些极端值(称为异常值)会修改数据分析结果。为了识别这些异常值,可以使用一种强大的统计度量方法,称为四分位距 (IQR)。在本文中,我们将了解如何使用 Pandas 和 IQR 来识别和处理数据集中的异常值。
理解四分位距 (IQR)
在了解如何使用 Pandas 和 IQR 进行过滤之前,让我们简要了解一下什么是四分位距 (IQR)。四分位数将数据集分成四个相等的部分,其中 Q1 代表第 25 个百分位数,Q3 代表第 75 个百分位数。IQR 计算为第 75 个百分位数(即 Q3)与第 25 个百分位数(即 Q1)之间的差值。简而言之,IQR 是统计离散度的度量,特别是数据集中间四分位数 (Q1) 和上四分位数 (Q3) 之间的范围。
IQR = Q3 - Q1
使用 Pandas 和 IQR 进行过滤的步骤
我们将使用来自 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() # Replace outliers with the mean
限制异常值:在某些情况下,用最接近的非异常值替换异常值可能是合适的。这种方法保持了整体分布,同时减少了极值的影响。
data[data < (Q1 - 1.5 * IQR)] = Q1 - 1.5 * IQR # Cap low outliers data[data > (Q3 + 1.5 * IQR)] = Q3 + 1.5 * IQR # Cap high outliers
在上面的例子中,我们将简单地删除包含异常值的行。您可以根据数据集的类型使用不同的异常值处理方法。上面房屋数据集的完整代码如下所示
import pandas as pd import numpy as np # Step 2: Loading the Dataset data = pd.read_csv('Housing.csv') # Step 3: Exploring the Dataset #print(data.head()) #print(data.info()) #print(data.describe()) # Step 4: Computing the IQR Q1 = data.quantile(0.25) Q3 = data.quantile(0.75) IQR = Q3 - Q1 # Step 5: Applying the IQR Filter outliers = (data < (Q1 - 1.5 * IQR)) | (data > (Q3 + 1.5 * IQR)) # Step 6: Handling the Outliers clean_data = data[~outliers.any(axis=1)] # Step 7: Conclusion 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
结论
在本文中,我们讨论了如何使用 Pandas 和 IQR 来确定和处理数据集中存在的异常值。我们使用了来自 Kaggle 的房屋数据集来对数据集执行过滤操作。通过计算 IQR 并应用过滤器,我们可以轻松识别与中心分布明显偏离的值。根据分析目标,我们可以删除异常值,用合理的值估算它们,或者限制它们以减少它们的影响。