資料知識地圖 · 4. 資料清理
缺失值處理
補值 / 刪除 / 標記
觀念教學
資料表裡的空格不是「沒事」,每一格都在逼你選邊:補?刪?還是標記起來?
核心觀念
三大策略:補值(Imputation)——用均值/中位數、KNN(向相似樣本借值)或時間序列插值填補;刪除——整列丟棄,簡單但資訊損失大;標記——把缺失本身當一個特殊類別,因為「沒填」有時就是訊號。怎麼選,取決於缺失機制:MCAR(完全隨機缺失)——缺失與任何變數無關;MAR(隨機缺失)——缺失與其他觀察得到的變數有關;MNAR(非隨機缺失)——缺失與那個值本身有關,例如高收入者傾向不填收入。
白話理解
問卷收入欄一堆空白:若是系統當機漏存(MCAR),補中位數傷害不大;若是高收入族群刻意不填(MNAR),補平均會系統性低估——這時「沒填」本身就該標記成特徵。
策略選擇要點
- 均值補值簡單,但會壓縮變異、扭曲分布;偏態資料改用中位數較穩
- KNN 補值借相似列的值,補值準確度較高,計算成本也高
- 時間序列優先用線性插值(Linear Interpolation):利用前後時間點的連續性推補
- 缺失率極高的欄位,補了也是編故事,考慮整欄棄用
- 直接刪除列,只適合缺失少且近似 MCAR 的情況
🎯 口訣:先問為什麼缺(MCAR/MAR/MNAR),再決定補、刪、標。
iPAS 考點
真實考題:工業感測器溫度時序資料約 5% 遺漏,確認為短暫失聯而非設備異常,要求不引入虛假異常——答案方向是線性插值,以前後值內插,貼合時間連續性;陷阱選項是補 0、補整體平均(會製造斷崖式假異常)或整段刪除(破壞時序完整)。觀念題另考 MCAR/MAR/MNAR 定義配對,「缺失與值本身有關」是 MNAR。
📝 本節掛載 1 題 iPAS 歷屆試題 — 讀完往下到「iPAS 考題練習」直接實戰。
應用場景
評估指標
iPAS 歷屆考題詳解(5 題)
先自行作答,再展開詳解。題目出處均為 iPAS AI 應用規劃師正式考題,著作權屬原主辦單位。
某工業感測器回傳溫度時序資料,約5%出現遺漏值,確認為短暫失聯所致,非設備異常。資料工程師需在不引入虛假異常的前提下進行補值。考量資料具時間連續性,下列何種填補方式最為合適?
- A將遺漏值全數填補為0;
- B以前後時間點的觀測值進行線性插補;
- C填補整份資料的平均值;
- D直接刪除包含遺漏值的時間點
看正解與逐選項詳解
正解:B
一間遊戲市場研究公司分析全球電子遊戲銷售資料集 vgsales.csv(以 data = pd.read_csv("vgsales.csv") 載入),欄位包含 Name(遊戲名稱)、Platform(平台)、Year(發售年份)、Genre(類型)、Publisher(發行商)、NA_Sales / EU_Sales / JP_Sales / Other_Sales(各地區銷售量,單位:百萬份)與 Global_Sales(全球總銷售量)。 分析師執行 data['Year'] 檢視欄位,輸出顯示共 16598 筆、值如 2006.0、1985.0 等,dtype 為 float64,而非一般年份常用的整數。他想了解這樣的情形為什麼會發生。請問下列哪些原因可能導致這種狀況? 原因A:CSV 檔中 Year 欄位有缺失值(NaN),導致 Pandas 自動將整欄轉為浮點數。 原因B:CSV 檔中的年份資料原本是字串(如 "2006"),Pandas 轉換時出錯而變成浮點數。 原因C:Pandas 預設會將所有數值型態讀取為 float64,不論資料是否為整數。 原因D:CSV 檔中的年份資料可能包含小數點(例如 2006.0),因此被視為浮點數。
- A原因B、原因C
- B原因A、原因D
- C原因A、原因B、原因D
- D原因C、原因D
看正解與逐選項詳解
正解:B
承前述遊戲銷售資料集(DataFrame 變數為 data),其 Year 欄位目前為 float64 型態。研究團隊想要將 Year 欄位轉換為整數型態,以便後續進行年份趨勢分析。考慮到資料中可能包含缺失值(NaN),請選出最合適的轉換方式。
- Adata['Year'] = data['Year'].astype(int)
- Bdata['Year'] = data['Year'].fillna(0).astype(int)
- Cdata['Year'] = data['Year'].fillna(1).astype(int)
- Ddata['Year'] = data['Year'].astype('Int64')
看正解與逐選項詳解
正解:D
承前述行銷資料集(DataFrame 變數為 df,欄位為 youtube、facebook、newspaper、sales)。欲計算各變數的遺漏值(NaN)個數,執行後得到以下結果: youtube 0 facebook 1 newspaper 0 sales 0 dtype: int64 下列哪些語法可以得到上述結果? 選項A:df.isnull().sum() 選項B:df.isNaN().sum() 選項C:df.isna().sum() 選項D:df.isnan().sum()
- A選項D
- B選項B、選項C、選項D
- C選項A、選項C
- D選項A、選項B、選項C
看正解與逐選項詳解
正解:C
某共享乘車平台整理出司機每日營運資料檔 driver_daily_stats.csv,其中 daily_earnings 欄位為司機日總收入(美元)。資料分析師使用 Python 檢視該欄位的基本統計量,執行以下程式碼(Pandas 2 以上版本): import pandas as pd df = pd.read_csv('driver_daily_stats.csv') print(df['daily_earnings'].describe()[['mean', '50%', 'max']]) 輸出結果如下:mean:223.411306、50%:128.552462、max:4500.000000。若團隊進一步發現 daily_earnings 欄位約有 5% 的遺失值,且目前規劃先建立線性迴歸(Linear Regression)模型來預測未來收入。為盡可能保留該欄位原有分布特性,並降低因補值造成的偏差,請問下列哪一種處理方式最為合理?
- Adf['daily_earnings'].fillna(df['daily_earnings'].mean(), inplace=True)
- Bdf['daily_earnings'].fillna(df['daily_earnings'].median(), inplace=True)
- Cdf['daily_earnings'].fillna(df['daily_earnings'].max(), inplace=True)
- D直接刪除所有遺失資料,因數值型欄位不適合進行補值處理
看正解與逐選項詳解
正解:B