返回目錄
A
洞見數據:用分析思維駕馭數據科學 - 第 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.