如何使用 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+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.