返回目錄
A
決策者的資料科學:分析基礎與實務應用 - 第 3 章
第 3 章:資料前處理與品質管理
發布於 2026-03-06 02:12
# 第 3 章:資料前處理與品質管理
資料前處理(Data Pre‑Processing)是任何資料科學專案中不可或缺的一環。它不僅能提升模型性能,更能確保分析結果可靠、可重現,並維護整體資料品質。以下將從 **缺失值處理**、**異常偵測**、**特徵縮放**、**編碼技術** 四個層面,結合實務案例與程式碼示範,帶領決策者與分析師掌握高效且可執行的前處理流程。
---
## 3.1 缺失值處理(Missing Data Handling)
### 3.1.1 缺失值概念
- **Missing Completely at Random (MCAR)**:缺失機制與任何觀測值均無關。
- **Missing at Random (MAR)**:缺失機制與其他觀測值有關。
- **Missing Not at Random (MNAR)**:缺失機制與自身缺失值有關。
了解缺失機制對選擇適當填補方法至關重要。若缺失是 MCAR,直接刪除(drop)即可;若是 MAR 或 MNAR,則須使用更精細的填補策略。
### 3.1.2 常見填補策略
| 方法 | 適用情境 | 優點 | 缺點 |
|------|-----------|------|------|
| `dropna()` | 缺失比例極低,且不影響樣本大小 | 簡單快速 | 可能損失資訊 |
| 平均 / 中位數 / 眾數填補 | 連續變數(均值 / 中位數)或類別變數(眾數) | 易實作 | 可能低估變異性 |
| 前向/後向填補(ffill / bfill) | 時序資料 | 追蹤歷史趨勢 | 可能產生過度平滑 |
| 插值(linear, spline, time) | 時序資料 | 保持趨勢 | 需確認連續性 |
| KNN 插補 | 多變數關聯 | 依相似鄰居填補 | 計算量大 |
| 迴歸 / 多重插補(MICE) | 需要保留資料結構 | 高品質 | 複雜實作 |
### 3.1.3 實務範例:填補客戶資料缺失
python
import pandas as pd
from sklearn.impute import SimpleImputer, KNNImputer
# 讀取客戶資料
df = pd.read_csv('customers.csv')
# 1. 簡單缺失比例檢查
print(df.isnull().mean() * 100)
# 2. 平均/中位數填補(數值型)
num_imputer = SimpleImputer(strategy='median')
num_cols = df.select_dtypes(include=['float64', 'int64']).columns
df[num_cols] = num_imputer.fit_transform(df[num_cols])
# 3. 眾數填補(類別型)
cat_imputer = SimpleImputer(strategy='most_frequent')
cat_cols = df.select_dtypes(include=['object']).columns
df[cat_cols] = cat_imputer.fit_transform(df[cat_cols])
# 4. KNN 插補(多變數關聯)
knn_imputer = KNNImputer(n_neighbors=5)
df[num_cols] = knn_imputer.fit_transform(df[num_cols])
print(df.isnull().sum())
> **實務小提醒**:在填補前務必先做 **資料分箱**(e.g., 年齡分級)或 **特徵交互**,以避免填補方法對關鍵關係產生偏差。
---
## 3.2 異常偵測(Outlier Detection)
### 3.2.1 為什麼要偵測異常?
- **噪音**:可能是輸入錯誤或測量誤差。
- **極端事件**:可能揭示重要洞察(e.g., 詐騙交易)。
- **模型穩定性**:異常值常導致模型過擬合或失真。
### 3.2.2 統計方法
| 方法 | 計算公式 | 典型使用方式 |
|------|----------|--------------|
| IQR | Q3 - Q1 | 範圍:Q1-1.5*IQR ~ Q3+1.5*IQR |
| Z‑score | (x - μ) / σ | | 3 以上視為異常 |
| 百分位 | 99% 分位數上限 | 針對右偏分布 |
### 3.2.3 進階方法
| 方法 | 主要概念 | 適用場景 |
|------|----------|----------|
| Isolation Forest | 隨機切割,隔離異常 | 大量資料,無需標記 |
| One‑Class SVM | 將正常點包覆 | 小樣本,非線性分布 |
| DBSCAN | 密度聚類 | 具體聚類同時偵測離群 |
### 3.2.4 範例:訂單金額異常處理
python
import pandas as pd
import numpy as np
from scipy import stats
orders = pd.read_csv('orders.csv')
# 1. IQR 檢測
Q1 = orders['amount'].quantile(0.25)
Q3 = orders['amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
mask = (orders['amount'] >= lower) & (orders['amount'] <= upper)
orders_clean = orders[mask]
# 2. 99% 分位上限偵測(右偏)
q99 = orders['amount'].quantile(0.99)
orders_clean = orders_clean[orders_clean['amount'] <= q99]
# 3. Z‑score 偵測
orders_clean['zscore'] = np.abs(stats.zscore(orders_clean['amount']))
orders_clean = orders_clean[orders_clean['zscore'] < 3]
print(f'原始數量:{len(orders)},清理後:{len(orders_clean)}')
> **實務小提醒**:異常處理應結合業務背景;有時候「異常」即是關鍵信號,需先與領域專家確認後再決定是否剔除或標記。
---
## 3.3 特徵縮放(Feature Scaling)
### 3.3.1 為何縮放?
- 防止某些特徵因量級差異而主導模型。
- 提升演算法收斂速度(如梯度下降)。
- 對距離度量敏感的演算法(KNN, SVM, DBSCAN)尤為重要。
### 3.3.2 主要縮放方法
| 方法 | 公式 | 適用演算法 |
|------|------|------------|
| **StandardScaler** | (x - μ) / σ | 需要正態分布假設的演算法(線性、SVM) |
| **MinMaxScaler** | (x - min) / (max - min) | 需要將特徵限制於 0~1 的場景(神經網路) |
| **RobustScaler** | (x - median) / IQR | 對離群敏感的資料 |
| **Log / Power Transform** | log(x) / power(x) | 右偏資料(收入、交易額) |
### 3.3.3 範例:交易金額標準化
python
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import pandas as pd
df = pd.read_csv('transactions.csv')
# 1. 標準化(零均值、單位方差)
scaler = StandardScaler()
df['amount_std'] = scaler.fit_transform(df[['amount']])
# 2. 取對數(右偏)
df['amount_log'] = np.log1p(df['amount'])
# 3. Min‑Max(0-1)
minmax = MinMaxScaler()
df['amount_minmax'] = minmax.fit_transform(df[['amount']])
print(df[['amount', 'amount_std', 'amount_log', 'amount_minmax']].head())
> **實務小提醒**:在交叉驗證時,縮放器的 `fit()` 應僅在訓練集完成,並將相同參數應用於驗證/測試集,以避免資料外洩。
---
## 3.4 編碼技術(Encoding Techniques)
### 3.4.1 類別資料的表示
| 類別 | 典型編碼 | 主要應用 |
|------|----------|----------|
| **LabelEncoder** | 數字序列(0,1,2…) | 有順序的類別、簡單演算法 |
| **One‑HotEncoder** | 二進位向量 | 無順序類別、線性/樹演算法 |
| **OrdinalEncoder** | 順序映射 | 有明確排序的類別 |
| **Binary Encoding** | 位元分組 | 特徵維度過高時節省空間 |
| **Target / Mean Encoding** | 目標變數均值 | 高卡路里類別、提升模型表現 |
| **Frequency Encoding** | 出現頻率 | 低成本、無序特徵 |
### 3.4.2 進階編碼:處理高卡路里類別
python
import pandas as pd
from category_encoders import TargetEncoder
df = pd.read_csv('orders.csv')
# 1. 目標編碼(假設 target 為是否該訂單成功)
enc = TargetEncoder(cols=['product_id'])
X = df.drop(columns=['success'])
y = df['success']
X_enc = enc.fit_transform(X, y)
print(X_enc.head())
> **實務小提醒**:目標編碼可能導致「資料外洩」,在交叉驗證時應在每個 fold 內獨立擬合編碼器。
---
## 3.5 資料品質管理流程(Data Quality Management)
| 步驟 | 內容 | 工具/方法 |
|------|------|------------|
| **資料採集** | 確保來源可靠、格式一致 | ETL、API、資料倉儲 |
| **資料概況** | 產生統計摘要、可視化 | pandas.describe(), seaborn.distplot |
| **資料清洗** | 缺失、異常、重複 | 上述填補、偵測、刪除 |
| **資料轉換** | 編碼、縮放、特徵構造 | sklearn.preprocessing, featuretools |
| **資料驗證** | 一致性、完整性、唯一性 | SQL CHECK, Pandas df.duplicated() |
| **品質度量** | 完整度、正確度、時效性 | Data Quality Score, Data‑Quality‑ML |
| **監控** | 實時監控、告警 | Airflow, DataHub, Great Expectations |
> **實務小提醒**:在企業環境中,資料品質管理往往需要跨部門協作;可將品質檢查納入 CI/CD pipeline,確保每次資料更新都符合規範。
---
## 小結
本章透過實務範例與程式碼,詳細說明了資料前處理的關鍵步驟:
1. **缺失值處理**:選擇合適填補方法,避免資料損失。
2. **異常偵測**:統計與機器學習方法相結合,辨識並處理離群點。
3. **特徵縮放**:調整量級,提升模型訓練效率與效果。
4. **編碼技術**:將類別資料轉換為數值,並避免編碼衍生問題。
5. **品質管理流程**:從資料採集到監控,確保整體流程可重複、可追蹤。
掌握這些前處理技巧後,您將能在接下來的章節中更加順利地進行模型構建與評估,並確保最終洞察的可靠性與可執行性。
---
> **下一章預告**:機器學習概念與演算法選擇 — 以統計與實務案例為基礎,說明監督式、非監督式與強化學習的應用場景與演算法。