如何使用 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 並應用過濾器,我們可以輕鬆識別與中心分佈明顯偏離的值。根據分析目標,我們可以刪除異常值,用合理的值估算它們,或者限制它們以減少它們的影響。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP