資料前處理-缺失值、異常值處理

Katrina Yeh
數據領航員
Published in
10 min readJun 27, 2022

--

無論是要做資料分析或是機器學習,當我們取得資料時總會發現資料有缺失或不合常理的值出現,因此,在使用資料之前會需要對這些缺失值和異常值做處理才能使我們得到較好的結果,接下來就要為大家介紹缺失值和異常值的處理方法~

目錄

缺失值(Missing Value)

數據出現缺失的情形,有可能是系統記錄造成,也可能是人為因素造成

處理方法

缺失值處理的方法,可以透過補值、刪除或不處理的方式,需要依據應用情境和數據類型選擇適合的處理方式

1.補值:

  • 平均、中位數、眾數:在使用平均進行補值需注意是否會受到極大值或是極小值影響;如果為非數值型資料可以使用眾數來找出出現頻率最高的值。
  • 模型預測:可以使用sklearn 中的IterativeImputation套件進行填補,此方法為多變量填充,在進行填補時會考慮特徵之間的關係,接著建模,每次會選取一個特徵欄位作為結果y,而其他特徵欄位作為輸入x,經過不斷的迭代循環,將最後一次迭代得到的預測值進行填補;預設模型是使用BayesianRidge,也可以選擇其他模型像是RandomForestRegressor, KNeighborsRegressor...進行預測。
    👉 想進一步了解sklearn缺失值填補可前往這裡

2. 刪除:此方法很可能會丟棄重要訊息,除非此欄位不具任何意義或是和要分析的項目無關連,否則不建議使用。

3. 不處理:有些機器學習模型對缺失值有容忍度或是會忽略,像是在KNN中缺失值不會參與距離計算;在決策樹中可能可以作為分類的依據之一。

👨‍💻示範

以下使用Kaggle Netflix Movies and TV Shows資料集中TV Show的資料示範如何使用pandas填補缺失值。

df.info()

df.info() 查看 dataframe 的基本信息:欄位數量、欄位非空值數量、欄位型別

show.info()
show.info()

有了基本資訊後,可以從Non-Null Count這個欄位查看是否有缺失值,詳細的缺失值數量可以用df.isnull().sum()查看

df.isnull().sum()

isnull()方法會回傳布林值True, False,sum()方法則會將True加總

show.isnull().sum()
show.isnull().sum()

df.fillna()

df.fillna( 要填補的值 ),若不指定欄位會對整個 DataFrame 補值

這邊用director和rating欄位進行指定欄位填補示範:

對director為空的TV Show補'unknown'字串;而從上方show.info()得知rating為類別型資料,因此對rating為空的TV Show透過眾數方式進行補值。

## 針對指定欄位填補值
values = {"director": 'unknown', "rating":show['rating'].mode()[0]}
show = show.fillna(value=values)

df.fillna()除了上述介紹的字串或是中位數,下方也分享的其他用法給大家

df.fillna(0) # 用數值(0)填補
df.fillna(df.mean()) # 用平均值填補
df.fillna(method='ffill') # 用前面的值填補
df.fillna(method="backfill") # 用後面的值填補

異常值(Outlier)

數據中出現和整體資料差距過大的值,又稱為離群值。

辨別方法

我們可以透過統計方法、三個標準差原則來檢查是否有異常值

  1. 簡單統計分析 :透過資料的平均值、標準差、最大值、最小值…等等來判斷資料是否有異常。
  2. 3σ原則:如果資料是屬於常態分佈,約有68%的資料落在距離平均數正負一個標準差的範圍內,約有95%的資料落在距離平均數正負兩個標準差的範圍內,而距離平均數正負三個標準差的範圍內則包含約99.7%的資料。
圖片來源-68–95–99.7法則

處理方法

  1. 刪除異常值
  2. 視為缺失值,用處理缺失值的方法進行處理
  3. 不處理:有些機器學習模型對異常值不敏感,例如:在決策樹中異常值可以作為分類的依據之一

👨‍💻示範

這邊使用seaborn裡面的tips小費資料集來觀察及排除異常值。

tips = sns.load_dataset('tips')

df.describe()

df.describe()查看數值欄位的分佈情形:平均值、標準差、最大值、最小值以及25%, 50%, 75%分別落在哪個數

tips.describe()
tips.describe()

對資料分佈初步了解之後,我們可以透過seaborn的盒鬚圖(boxplot)畫出資料分布的情形

💡盒鬚圖中間盒狀的部分顯示資料集的四分位數(quartiles),而延伸的鬚狀(藍線)則顯示分佈其餘的部分,通常都是以四分位距(Interquartile range)的1.5倍做為判斷離群值的標準,在鬚狀之外的圓點稱為outlier。
圖片來源-[Python 商業數據分析之可視化繪圖] 第11講: 箱形圖(Seaborn-Box)(一)
df_tips = tips[['total_bill', 'tip', 'size']] # 選出要做圖的欄位
fig, axes = plt.subplots(figsize=(16, 8)) # 設定畫布大小
sns.boxplot(data=df_tips, orient="h", ax=axes) # 繪圖
axes.set_title("Boxplot", fontsize = 20, color = 'green') # 標題

從上圖可以發現total_bill, tip, size這三個欄位都存在著異常值,而排除異常值的方法,我們通常會以Q1 — 1.5*IQRQ3+1.5*IQR作為界線將outlier排除,下方將以這三個欄位做舉例

## total_bill
# IQR = Q3 - Q1
IQR = np.percentile(df_tips['total_bill'], 75) - np.percentile(df_tips['total_bill'], 25)
# outlier = Q3 + 1.5*IQR
df_tips = df_tips[df_tips['total_bill'] < np.percentile(df_tips['total_bill'], 75) + 1.5*IQR]
# outlier = Q1 - 1.5*IQR
df_tips = df_tips[df_tips['total_bill'] > np.percentile(df_tips['total_bill'], 25) - 1.5*IQR]
## tip
# IQR = Q3 - Q1
IQR = np.percentile(df_tips['tip'], 75) - np.percentile(df_tips['tip'], 25)
# outlier = Q3 + 1.5*IQR
df_tips = df_tips[df_tips['tip'] < np.percentile(df_tips['tip'], 75) + 1.5*IQR]
# outlier = Q1 - 1.5*IQR
df_tips = df_tips[df_tips['tip'] > np.percentile(df_tips['tip'], 25) - 1.5*IQR]
## size
# IQR = Q3 - Q1
IQR = np.percentile(df_tips['size'], 75) - np.percentile(df_tips['size'], 25)
# outlier = Q3 + 1.5*IQR
df_tips = df_tips[df_tips['size'] < np.percentile(df_tips['size'], 75) + 1.5*IQR]
# outlier = Q1 - 1.5*IQR
df_tips = df_tips[df_tips['size'] > np.percentile(df_tips['size'], 25) - 1.5*IQR]

將outlier排除之後可以發現平均值都有些微下降,最大值和最小值之間的差距縮小很多,資料分布的情形比排除前集中。

最後,在處理缺失值和異常值時,上方所介紹的方法要依據分析和應用去做相對應的處理才是正確的喔~~

參考資料:

sklearn-Imputation of missing values

資料處理 — 缺失值處理&異常值處理

網站數據分析(6) — — 缺失值、異常值和重複值的處理

教育部補助大專院校STEM領域及女性研發人才培育計畫目標為建構一個「以智慧物聯技術與實務應用為基礎的教育環境和實作場域」,並規劃出符合此STEM教育領域的創新特色課程,以畢業前進入企業實習的方式,讓學生了解相關產業界所面對的問題,再輔以業界實作場域的教育訓練活動,共同帶領學生發展出動手做、判斷與解決問題的相關技能;本計畫也規劃讓學生以專題實作的組隊方式,跟業界協力領導學生對外參與智慧物聯技術的應用競賽,不僅可以累積學生實務開發的能力,更能激發其潛能來幫助企業解決所面臨的難題。

Data Science Meetup 台灣資料科學社群的使命是「為資料科學人士與企業創建經濟機會」。我們相信大數據蘊藏著巨量的信息和價值,如何處理好大數據並發掘其潛藏的商業價值,就要靠資料科學有效的應用。21世紀是資料科學決勝時代,我們社群將為大家提供與資料科學相關的最新技術和資訊實戰攻略,並透過全球業界人士和學者幫助相關職業規劃與挑戰,社群活動包含

  • 台北實體版聚
  • 線上版聚
  • Mentorship Program

歡迎加入我們社團瞭解更多資訊:https://www.facebook.com/groups/datasciencemeetup/

--

--

Katrina Yeh
數據領航員

東吳大學資料科學系|Data Preprocessing & Machine Learning |樂於學習新事物,正在往資料科學的路上前進中~|📧Email:katrina001205@gmail.com