聊天視窗

洞見數據:用分析思維駕馭數據科學 - 第 3 章

第三章:資料清洗與前處理

發布於 2026-02-27 01:56

# 第三章:資料清洗與前處理 在資料科學流程中,資料清洗與前處理是決定後續分析品質的關鍵環節。本章將帶領讀者從概念說明、實務技巧到程式實作,逐步掌握如何將原始數據轉化為可直接投入模型的乾淨資料。 ## 3.1 為何資料清洗如此重要? | 目的 | 影響 | 範例 | |------|------|------| | **提高模型準確度** | 噪音與缺失值會導致模型學習到不真實的模式 | 在房價預測中,缺失的平方英尺數據若不處理,模型預測誤差可能高達 20% | | **減少計算成本** | 低質量資料會增加計算量且難以收斂 | 列數極大的稀疏矩陣若不做壓縮,內存消耗倍增 | | **確保結果可重複** | 資料不一致會使實驗結果難以驗證 | 同一資料集經不同團隊處理後產生不同預測,影響可驗證性 | > **核心思維**:清洗不是「把數據變乾淨」的工作,而是「把資料質量提升到能產生可信賴洞察的層級」。 ## 3.2 主要挑戰與關鍵概念 1. **遺失值(Missing Values)** - *缺失模式*:完全隨機(MCAR)、條件隨機(MAR)、非隨機(MNAR) - *常見策略*:刪除、填補(平均值、中位數、眾數、前向/後向填補、KNN、多重插補) 2. **離群值(Outliers)** - *檢測方法*:IQR、Z-Score、基於模型的檢測(Isolation Forest, One-Class SVM) - *處理方式*:刪除、截斷、轉換(對數、Box‑Cox) 3. **資料類型轉換(Data Type Conversion)** - 字串→類別(`category`) - 日期時間→時間戳或特徵(年、月、週、星期幾) - 數值型→整數/浮點、分段等 4. **標準化與正則化(Feature Scaling)** - *標準化*(StandardScaler):均值0、方差1 - *正則化*(MinMaxScaler, MaxAbsScaler, RobustScaler):保持分佈形狀 - *必要性*:梯度下降、距離度量、正則化項對此敏感 ## 3.3 資料品質報告的構成 | 指標 | 公式 | 目標 | 範例 | |------|------|------|------| | 缺失率 | `missing_count / total_rows` | < 5% | `0.032` | | 重複率 | `duplicate_count / total_rows` | < 2% | `0.018` | | 時間戳對齊 | `|ts_i - ts_{i-1}|` | 24小時內 | `0.98` | | 變異數 | `np.var(series)` | > 0 | `3.14` | > **實務提醒**:在每次資料進口後,自動產生上述報告並上傳至監控儀表板,確保資料源穩定性。 ## 3.4 程式範例(Python + Pandas) python import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 讀取原始資料 df = pd.read_csv('raw_data.csv') # 1. 資料品質檢查 missing_rate = df.isna().mean() duplicate_rate = df.duplicated().mean() print('缺失率:\n', missing_rate) print('重複率:', duplicate_rate) # 2. 遺失值處理 # 以數值欄位填補中位數;分類欄位填補眾數 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns categorical_cols = df.select_dtypes(include=['object']).columns impute_numeric = df[numeric_cols].median() impute_categorical = df[categorical_cols].mode().iloc[0] df[numeric_cols] = df[numeric_cols].fillna(impute_numeric) df[categorical_cols] = df[categorical_cols].fillna(impute_categorical) # 3. 離群值處理(IQR 篩選) Q1 = df[numeric_cols].quantile(0.25) Q3 = df[numeric_cols].quantile(0.75) IQR = Q3 - Q1 mask = ~((df[numeric_cols] < (Q1 - 1.5 * IQR)) | (df[numeric_cols] > (Q3 + 1.5 * IQR))).any(axis=1) df = df[mask] # 4. 類別編碼 + 標準化 numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())]) cat_transformer = Pipeline(steps=[('onehot', OneHotEncoder(handle_unknown='ignore'))]) preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_cols), ('cat', cat_transformer, categorical_cols) ]) # 5. 輸出乾淨資料 X_clean = preprocessor.fit_transform(df) # 轉回 DataFrame 方便後續分析 X_df = pd.DataFrame(X_clean.toarray() if hasattr(X_clean, 'toarray') else X_clean) X_df.to_csv('clean_data.csv', index=False) > **提示**:若資料量超過 10 億筆,可考慮使用 `Dask` 或 `PySpark` 進行分散式清洗。 ## 3.5 先進技巧 | 技巧 | 目的 | 實作方式 | |------|------|----------| | **多重插補(Multiple Imputation)** | 在缺失機率高、資料分布複雜時保持不確定性 | `fancyimpute.MICE` 或 `statsmodels.imputation.MICE` | | **自動化流程(ETL pipelines)** | 減少手動操作、確保版本可追溯 | Airflow DAG → `PythonOperator` 或 Prefect Flow → `PythonTask` | | **資料質量監控(Data Quality Checks)** | 及時發現資料漂移 | Great Expectations、Deequ | | **統計一致性檢查** | 防止資料被無意篡改 | 哈希校驗、校驗碼(CRC32) | ## 3.6 小結 1. 資料清洗與前處理是整個資料科學流程的基石,直接影響模型表現與結果可重複性。 2. 了解遺失值、離群值的統計特性與處理策略,才能針對不同資料集作出最優化決策。 3. 建立資料品質報告,並將其自動化上傳至監控儀表板,是確保資料源穩定與可追溯性的關鍵。 4. 利用現代工具(pandas, sklearn, Great Expectations)搭建自動化 ETL 流程,可提升團隊協作效率與資料治理水平。 > **實務提醒**:清洗過程中常見的「假乾淨」問題,如未考慮資料漂移、隱藏的缺失模式,會在後續模型訓練中產生「預測不準」的症狀。務必在每次資料進口後,先行產生品質報告,再進行離群值與缺失值的處理。 ## 3.7 參考文獻 - J. Bergstra, R. Bardenet, Y. Bengio & B. Kégl. *Scikit‑learn: Machine Learning in Python*. Journal of Machine Learning Research, 2015. - A. Gelman, J. Hill. *Data Analysis Using Regression and Multilevel/Hierarchical Models*. Cambridge University Press, 2007. - R. Harshbarger. *Python for Data Cleaning and Feature Engineering*. O'Reilly Media, 2021. - G. Varoquaux. *Python Data Science Handbook*. O'Reilly Media, 2018. - G. W. B. Great Expectations, `great_expectations` package, 2023.