返回目錄
A
數據洞察:以資料科學驅動商業決策 - 第 3 章
第三章:資料清理與前處理
發布於 2026-03-02 02:17
# 第三章:資料清理與前處理
在資料科學的工作流程中,資料清理與前處理(Data Cleaning & Pre‑Processing)是連結「資料蒐集」與「建模」之關鍵橋樑。這一章將以實務案例為基礎,講解缺失值處理、異常偵測、類別編碼、特徵縮放與標準化,以及資料品質管理的核心概念與工具。
---
## 3.1 為何資料清理與前處理至關重要
| 階段 | 作用 | 典型風險 |
|------|------|----------|
| 缺失值 | 保障資料完整性,避免模型失衡 | 低估/高估預測值,產生偏差 |
| 異常值 | 抑制噪音,提升模型穩定性 | 噪音引發過擬合,降低泛化能力 |
| 類別編碼 | 讓機器學習演算法能處理非數值資料 | 高維度、稀疏資料影響計算效率 |
| 特徵縮放 | 讓演算法在不同尺度下學習公平 | 不同量級特徵導致梯度失衡 |
| 資料品質 | 保證決策基礎可靠 | 決策失誤、合規風險 |
> **案例實例**:某電商平台在客戶流失預測模型中,因缺失的「訂單金額」欄位未處理,最終模型的 AUC 僅為 0.62,經過插補後提升至 0.78。
---
## 3.2 缺失值處理
### 3.2.1 先決定處理策略
| 缺失模式 | 典型處理方法 | 應用場景 |
|----------|--------------|----------|
| MCAR(完全隨機缺失) | 刪除缺失行/列 | 缺失比例 < 5% |
| MAR(隨機缺失) | 插補(均值/中位數/回歸) | 重要特徵缺失、無需保留完整行 |
| MNAR(非隨機缺失) | 先進插補(多重插補、kNN) | 缺失本身有資訊 |
### 3.2.2 常用插補技巧
python
import pandas as pd
from sklearn.impute import SimpleImputer, KNNImputer
# 讀取資料
raw = pd.read_csv('sales_data.csv')
# 1. 均值插補(數值)
imputer_mean = SimpleImputer(strategy='mean')
raw['price'] = imputer_mean.fit_transform(raw[['price']])
# 2. 中位數插補(數值)
imputer_median = SimpleImputer(strategy='median')
raw['age'] = imputer_median.fit_transform(raw[['age']])
# 3. KNN 插補(多維)
knn_imputer = KNNImputer(n_neighbors=5)
raw[['price', 'quantity', 'age']] = knn_imputer.fit_transform(raw[['price', 'quantity', 'age']])
### 3.2.3 失衡處理
- **刪除法**:保留樣本數較多的類別;
- **過採樣(SMOTE)**:在缺失資料中合成新樣本;
- **欠採樣**:隨機刪除過多類別的樣本。
---
## 3.3 異常偵測(Outlier Detection)
### 3.3.1 典型方法
| 方法 | 參數 | 適用場景 |
|------|------|----------|
| IQR(四分位距) | 1.5 × IQR | 簡單數值資料 |
| Z‑score | 3 標準差 | 正態分佈資料 |
| DBSCAN | eps, min_samples | 群聚結構資料 |
| Isolation Forest | n_estimators | 大規模資料集 |
### 3.3.2 代碼範例
python
import numpy as np
import pandas as pd
from sklearn.ensemble import IsolationForest
# 讀取資料
data = pd.read_csv('sensor_readings.csv')
# IQR 異常檢測
Q1 = data['temperature'].quantile(0.25)
Q3 = data['temperature'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers_iqr = data[(data['temperature'] < lower) | (data['temperature'] > upper)]
# Z‑score 檢測
z_scores = np.abs((data['temperature'] - data['temperature'].mean()) / data['temperature'].std())
outliers_z = data[z_scores > 3]
# Isolation Forest
iso = IsolationForest(contamination=0.02, random_state=42)
data['anomaly'] = iso.fit_predict(data[['temperature', 'humidity']])
# -1 表示異常,1 表示正常
### 3.3.3 對模型的影響
- 異常值若不處理,模型可能學到噪音,導致泛化失效。
- 在預測任務中,異常值常被視為「噪音」或「邊緣案例」需要特殊處理。
---
## 3.4 類別編碼(Categorical Encoding)
| 編碼方法 | 優點 | 缺點 |
|----------|------|------|
| Label Encoding | 簡單、低維度 | 產生順序假設 |
| One‑Hot Encoding | 無序假設 | 高維稀疏 |
| Ordinal Encoding | 可處理排序 | 需要事先定義順序 |
| Target Encoding | 捕捉目標相關性 | 易受過擬合 |
| Frequency Encoding | 維持頻率信息 | 可能缺乏分類資訊 |
### 3.4.1 Python 代碼
python
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
raw = pd.read_csv('customer_data.csv')
# Label Encoding
le = LabelEncoder()
raw['gender_encoded'] = le.fit_transform(raw['gender'])
# One‑Hot Encoding(scikit‑learn)
enc = OneHotEncoder(sparse=False)
encoded = enc.fit_transform(raw[['region']])
region_df = pd.DataFrame(encoded, columns=enc.get_feature_names_out(['region']))
raw = pd.concat([raw, region_df], axis=1)
### 3.4.2 特殊技巧
- **處理高基數類別**:使用 Target 或 Frequency Encoding;
- **稀疏特徵壓縮**:對 One‑Hot 進行 `SparseMatrix` 轉換;
- **避免資料洩露**:在交叉驗證時只在訓練集生成編碼,然後在測試集映射。
---
## 3.5 特徵縮放與標準化
| 方法 | 使用情境 |
|------|----------|
| Min‑Max Scaling (0–1) | 需要保留數值範圍(如圖像) |
| StandardScaler(Z‑score) | 正態分佈或線性模型 |
| RobustScaler(IQR) | 有明顯異常值的資料 |
| PowerTransformer(Box‑Cox / Yeo‑Johnson) | 需要正態化的非線性資料 |
### 3.5.1 範例代碼
python
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
import pandas as pd
X = pd.read_csv('loan_features.csv')
# Min‑Max
mm = MinMaxScaler()
X_scaled_mm = mm.fit_transform(X)
# Standard
ss = StandardScaler()
X_scaled_ss = ss.fit_transform(X)
# Robust
rs = RobustScaler()
X_scaled_rs = rs.fit_transform(X)
### 3.5.2 何時選擇哪種
- **神經網路**:通常使用 Min‑Max 或 Standard;
- **樹模型(XGBoost, LightGBM)**:不需要縮放;
- **距離基模型(KNN, SVM)**:需選擇 Robust 或 Standard 以降低異常影響。
---
## 3.6 資料品質管理(Data Quality Management)
### 3.6.1 資料品質指標
| 指標 | 定義 |
|------|------|
| 完整性(Completeness) | 缺失比例 |
| 正確性(Accuracy) | 與實際值偏差 |
| 一致性(Consistency) | 不同資料來源間的相符程度 |
| 及時性(Timeliness) | 資料更新頻率 |
| 唯一性(Uniqueness) | 重複記錄比例 |
### 3.6.2 管理流程
1. **資料檢查表**:設計自動化腳本定期執行,輸出報告。
2. **數據血緣追蹤**:使用資料線性化工具(e.g., dbt)維護資料來源與加工歷史。
3. **品質指標儀表板**:利用 Grafana/PowerBI 視覺化監控。
4. **修正回饋機制**:將異常報告回傳到原始系統,並修正資料源。
### 3.6.3 工具與平台
- **Great Expectations**:自動化資料驗證。
- **Apache Deequ**:大規模資料品質檢查。
- **dbt**:資料建模與品質追蹤。
- **Airflow + Python Operators**:排程與驗證腳本。
---
## 3.7 小結
資料清理與前處理不是單純的「排版工作」,它是資料科學實踐中最關鍵且成本最高的一環。透過合適的缺失值處理、異常偵測、類別編碼與特徵縮放,可大幅提升模型準確度與穩定性;同時,建立嚴謹的資料品質管理流程,能確保資料在整個生命週期中的一致性與可追蹤性。下一章將帶領讀者進入探索性資料分析(EDA),進一步洞悉資料結構與商業洞察。
---
> **小貼士**:在任何資料清理流程中,請務必保留原始資料備份,並在版本控制(git + DVC)下管理轉換腳本,以確保可重現性。