聊天視窗

決策者的資料科學:分析基礎與實務應用 - 第 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. **品質管理流程**:從資料採集到監控,確保整體流程可重複、可追蹤。 掌握這些前處理技巧後,您將能在接下來的章節中更加順利地進行模型構建與評估,並確保最終洞察的可靠性與可執行性。 --- > **下一章預告**:機器學習概念與演算法選擇 — 以統計與實務案例為基礎,說明監督式、非監督式與強化學習的應用場景與演算法。