資料知識地圖 · 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 考題練習」直接實戰。

應用場景

均值補值中位數補值KNN 補值多重插補

評估指標

補值準確度資訊損失

iPAS 歷屆考題詳解(5 題)

先自行作答,再展開詳解。題目出處均為 iPAS AI 應用規劃師正式考題,著作權屬原主辦單位。

115年第二次初級AI應用規劃師第一科人工智慧基礎概論 第18題

某工業感測器回傳溫度時序資料,約5%出現遺漏值,確認為短暫失聯所致,非設備異常。資料工程師需在不引入虛假異常的前提下進行補值。考量資料具時間連續性,下列何種填補方式最為合適?

  1. A將遺漏值全數填補為0;
  2. B以前後時間點的觀測值進行線性插補;
  3. C填補整份資料的平均值;
  4. D直接刪除包含遺漏值的時間點
看正解與逐選項詳解

正解:B

正確答案:(B) 【正解解析】 題幹條件:溫度時序資料具時間連續性,遺漏比例約 5% 且成因為短暫失聯而非設備異常,補值時不得引入虛假異常。以前後時間點的觀測值進行線性插補(Linear Interpolation),利用溫度變化的連續性沿趨勢內插,補出的數值與前後觀測自然銜接,不會產生不合理的尖峰或斷點,最符合題幹要求,故 (B) 正確。 【為何其他選項錯了?】 - (A):將遺漏值一律填 0 會製造不存在的極端低溫,在時序中形成突兀的假異常訊號,直接違反「不引入虛假異常」的前提。 - (C):以整份資料的平均值填補會忽略時間局部的變化,在升溫或降溫段落插入全域平均值,同樣會扭曲局部趨勢。 - (D):直接刪除含遺漏值的時間點會破壞時間序列的等間隔連續性,影響後續依賴時間結構的分析與模型。 提示:具時間連續性的短暫缺值,優先以前後時間點插補;填 0、填全域平均或刪除時間點都會破壞時序結構。
114年第二梯次中級AI應用規劃師第二科大數據處理分析與應用 第43題

一間遊戲市場研究公司分析全球電子遊戲銷售資料集 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),因此被視為浮點數。

  1. A原因B、原因C
  2. B原因A、原因D
  3. C原因A、原因B、原因D
  4. D原因C、原因D
看正解與逐選項詳解

正解:B

正確答案:(B) 【正解解析】 原因A正確:NumPy 的 int64 型態無法表示 NaN,只要欄位中存在任何缺失值,Pandas 讀檔時就會把整欄提升為 float64 以容納 NaN,這是年份欄位變成浮點數最常見的原因。原因D也正確:若 CSV 檔中的年份原本就以 2006.0 這種帶小數點的格式儲存,Pandas 依字面值推斷型態,自然會判定為浮點數。兩者皆為可能成因,故正確組合為原因A加原因D。 【為何其他選項錯了?】 - (A):原因B不正確,若年份欄位含有無法解析為數值的字串,Pandas 會把整欄讀成 object 型態,而不是「轉換出錯而變成 float64」;原因C亦不正確,理由見選項 (D) 的說明。 - (C):此組合多納入了錯誤的原因B(同上),因此整個組合不成立。 - (D):原因C不正確,Pandas 不會把所有數值一律讀成 float64;一欄完整無缺失的整數會被推斷為 int64。float64 是「含 NaN 或含小數點」造成的結果,並非預設行為。 提示:int64 無法容納 NaN,整欄會自動升級為 float64;年份欄位出現 .0,應先檢查是否有缺失值。
114年第二梯次中級AI應用規劃師第二科大數據處理分析與應用 第44題

承前述遊戲銷售資料集(DataFrame 變數為 data),其 Year 欄位目前為 float64 型態。研究團隊想要將 Year 欄位轉換為整數型態,以便後續進行年份趨勢分析。考慮到資料中可能包含缺失值(NaN),請選出最合適的轉換方式。

  1. Adata['Year'] = data['Year'].astype(int)
  2. Bdata['Year'] = data['Year'].fillna(0).astype(int)
  3. Cdata['Year'] = data['Year'].fillna(1).astype(int)
  4. Ddata['Year'] = data['Year'].astype('Int64')
看正解與逐選項詳解

正解:D

正確答案:(D) 【正解解析】 astype('Int64')(首字母大寫)會將欄位轉換為 Pandas 的可空整數型態(Nullable Integer),以 pd.NA 表示缺失值,允許整數欄位中存在缺失值。此寫法既能把 2006.0 轉回整數 2006,又能完整保留缺失資訊,不需填入任何人為數值,是含 NaN 年份欄位最合適的轉換方式;原生的小寫 int64 則無法容納缺失值。 【為何其他選項錯了?】 - (A):astype(int) 遇到 NaN 會拋出 IntCastingNaNError,因為原生整數型態無法表示缺失值,轉換直接失敗。 - (B):先以 0 填補雖可成功轉型,但等於在資料中製造「年份為 0」的虛假紀錄,後續年份趨勢分析會被這些不存在的資料點扭曲。 - (C):以 1 填補與以 0 填補是同一類錯誤,同樣以不存在的年份取代缺失值,引入假資料並破壞原始分布。 提示:整數欄位要保留缺失值,使用 astype('Int64')(大寫 I 的 Nullable Integer);以 0 或 1 硬填等於自行製造錯誤資料。
114年第二梯次中級AI應用規劃師第二科大數據處理分析與應用 第49題

承前述行銷資料集(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()

  1. A選項D
  2. B選項B、選項C、選項D
  3. C選項A、選項C
  4. D選項A、選項B、選項C
看正解與逐選項詳解

正解:C

正確答案:(C) 【正解解析】 Pandas 檢查缺失值的標準方法有兩個:isnull() 與 isna(),兩者為完全相同的函式(isnull 是 isna 的別名),回傳布林 DataFrame 後接 .sum() 即可統計每欄的 NaN 個數,得到 youtube 0、facebook 1、newspaper 0、sales 0 的結果。因此選項A與選項C皆正確,答案為 (C)。 【為何其他選項錯了?】 - (A):df.isnan() 並不存在,isnan 是 NumPy 的函式(np.isnan),DataFrame 沒有這個方法,呼叫會拋出 AttributeError。 - (B):isNaN() 是 JavaScript 的函式,Pandas 中並不存在;此組合除選項C外皆為不存在的方法,且遺漏了正確的選項A。 - (D):選項A與選項C正確,但混入了不存在的 isNaN()(選項B),整個組合因此不成立。 提示:Pandas 檢查缺失值只有 isna() 與 isnull() 兩個等價方法;isnan 屬於 NumPy,isNaN 屬於 JavaScript,不可混用。
115年第一次中級AI應用規劃師第二科大數據處理分析與應用 第41題

某共享乘車平台整理出司機每日營運資料檔 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)模型來預測未來收入。為盡可能保留該欄位原有分布特性,並降低因補值造成的偏差,請問下列哪一種處理方式最為合理?

  1. Adf['daily_earnings'].fillna(df['daily_earnings'].mean(), inplace=True)
  2. Bdf['daily_earnings'].fillna(df['daily_earnings'].median(), inplace=True)
  3. Cdf['daily_earnings'].fillna(df['daily_earnings'].max(), inplace=True)
  4. D直接刪除所有遺失資料,因數值型欄位不適合進行補值處理
看正解與逐選項詳解

正解:B

正確答案:(B) 【正解解析】 先判讀統計量:平均數 223.4 遠大於中位數 128.6,最大值高達 4500,是典型的右偏分布,少數極高收入日把平均值明顯拉高。對右偏且含極端值的欄位,中位數是位置量數中最穩健的代表值:以中位數補值不受 4500 這類極端值影響,補入的數值落在資料的典型區間,對原有分布形狀的扭曲最小,符合題目「保留分布特性、降低補值偏差」的要求。 【為何其他選項錯了?】 - (A):平均數 223.4 已被右尾極端值拉高,高於半數以上司機的實際日收入;以其填補 5% 的缺失值,會系統性高估這些日子的收入,加深偏差。 - (C):以最大值 4500 填補,等於把所有缺失紀錄都設為極端高收入,會在分布右尾製造人為的集中點,嚴重扭曲分布並影響迴歸模型的估計。 - (D):缺失比例僅 5% 即整列刪除,會損失可觀樣本;若缺失非完全隨機,還會引入選擇偏差。且「數值型欄位不適合補值」的說法本身錯誤,數值欄位正是補值方法最成熟的類型。 提示:mean 遠大於 median 代表右偏;右偏加極端值的欄位,補值優先使用中位數,平均數在偏態資料中代表性不足。

相關節點