如何使用带有 IQR 的 Pandas 过滤器?

pythonpandasserver side programmingprogramming

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


相关文章