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

更新于:2023年10月13日

2K+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告