聊天視窗

數據洞察:以資料科學驅動商業決策 - 第 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)下管理轉換腳本,以確保可重現性。