返回目錄
A
決策的數據語言:從原始數據到洞察力 - 第 3 章
第三章:從雜訊到洞察——數據清洗與前處理的藝術
發布於 2026-03-03 08:54
# 第三章:從雜訊到洞察——數據清洗與前處理的藝術
> **編者註**:數據清洗不只是把錯誤抹掉,它是把雜訊轉化為可分析的語言。此章將帶你走進實務操作,從「未處理」到「可分析」,一步步打磨資料的質感。
## 3.1 為什麼清洗?
- **商業決策的核心基礎**:在金融風險評估裡,一個 1% 的錯誤率可能帶來數百萬的損失。
- **模型效能保證**:機器學習模型對噪聲極度敏感,清洗不佳往往導致過擬合或偏差。
- **可追溯性**:清洗步驟若缺乏紀錄,未來審計將變成「追蹤失敗」的遊戲。
> **實務提示**:在 ETL pipeline 的每一步加入「清洗日志」,並與 DVC 版本控制結合,確保回溯無痛。
## 3.2 清洗流程概覽
| 步驟 | 目標 | 工具 | 典型操作 |
|------|------|------|----------|
| 1. 資料型別校驗 | 轉換為正確型別 | `pandas`, `Spark` | `astype()` / `cast()` |
| 2. 缺失值處理 | 保留資訊 | `pandas`, `Dask`, `PySpark` | `fillna()`, `dropna()`, `impute()` |
| 3. 異常值檢測 | 去除噪聲 | `scipy`, `Spark MLlib` | IQR、Z-score、Isolation Forest |
| 4. 重複數據剔除 | 防止重影 | `pandas`, `Spark` | `drop_duplicates()` |
| 5. 資料標準化 | 方便模型收斂 | `sklearn.preprocessing`, `Spark ML` | `StandardScaler`, `MinMaxScaler` |
| 6. 編碼類別變數 | 轉為數值 | `pandas`, `Spark`, `category_encoders` | One-Hot, Target, Ordinal |
| 7. 產生衍生特徵 | 提升模型表現 | 自定義腳本 | `groupby().agg()`, `rolling()` |
> **案例小節**:金融行業常用「K線圖」的開盤、收盤、最高、最低價組合,經過標準化後可直接作為信用評分模型的輸入。
## 3.3 與 Great Expectations 搭配自動化
Great Expectations(GE)提供「Expectation Suite」即一組可重複執行的驗證規則,適用於 Spark DataFrame。下面示範一個簡易範例:
```python
import great_expectations as ge
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.read.parquet("s3://raw-data/transactions/2026-03.parquet")
df = ge.dataset.PandasDataset(df.toPandas())
# 定義期望
expectations = {
"column_values_to_not_be_null": {"column_name": "transaction_id"},
"column_values_to_be_between": {"column_name": "amount", "min_value": 0, "max_value": 1000000},
"column_values_to_match_regex": {"column_name": "currency", "regex": "USD|EUR|JPY"},
}
result = df.expectation_suite(expectations)
print(result)
```
> **提醒**:GE 的結果可以直接寫入 S3,作為品質追蹤的版本化物件。
## 3.4 缺失值處理技巧
| 方案 | 適用場景 | 優點 | 缺點 |
|------|----------|------|------|
| 直接刪除 | 缺失率低於 5% | 簡單快速 | 失去部分資訊 |
| 平均/中位數填補 | 數值型 | 保留數量 | 低保留性 |
| 前向/後向填補 | 時序資料 | 捕捉趨勢 | 可能產生偏差 |
| 迴歸填補 | 多變量關聯 | 高保真 | 需額外模型 |
| 多重插補 | 嚴重缺失 | 統計效能 | 計算量大 |
> **實務案例**:某銀行客戶資料缺失客戶年齡,使用「多重插補」後,風險模型的 AUC 提升 3%。
## 3.5 異常值處理與保留策略
- **IQR 方法**:`Q3 - Q1 > 1.5*IQR` 判定為異常。適用於偏態分佈。
- **Z-Score**:|Z| > 3 為異常。適用於近正態分佈。
- **Isolation Forest**:對高維度資料有效。
- **保留策略**:
1. **剔除**:當異常不具備業務意義。
2. **修正**:將極端值修正為鄰近值。
3. **標記**:保留並新增「is_outlier」欄位供模型學習。
> **風險提示**:在金融交易資料中,異常可能代表詐欺活動,過度剔除有風險。
## 3.6 特徵工程:從表面到深層
1. **聚合特徵**:
- `avg_transaction_per_month`、`max_deposit` 等可幫助風險評分。
2. **時間特徵**:
- `is_weekend`、`hour_of_day`,對於欺詐偵測具有關鍵資訊。
3. **文本特徵**:
- 使用 `tfidf` 或 `word2vec` 轉換交易說明欄。
4. **交叉特徵**:
- `age * income`、`transaction_count * average_amount`。
5. **正則化特徵**:
- 將類別特徵做 `Target Encoding`,保留目標相關資訊。
> **實戰技巧**:在 Spark 中,可利用 `pyspark.sql.functions` 進行分組聚合,並用 `ml.feature.VectorAssembler` 轉換為向量。
## 3.7 版本化與測試
- **DVC**:將原始檔、清洗腳本、期望值共存,`dvc add`, `dvc push`。
- **單元測試**:使用 `pytest` 撰寫 `test_cleaning.py`,驗證 `null` 處理、異常處理邏輯。
- **CI/CD**:在 GitHub Actions 中加入 `dvc pull`, `pytest`, `dvc repro` 步驟。
> **安全提醒**:清洗腳本應不含硬編碼的 API key 或憑證;使用環境變數或 Secret Manager。
## 3.8 小結
- **清洗是資料品質的守門員**:任何模型都需要乾淨的輸入。
- **流程化**:將清洗步驟拆分為可測試、可版本化的模組,減少人為錯誤。
- **智能化**:結合 AI 驅動的異常偵測,可在數據湖中即時標記問題。
- **合規**:在金融業務中,清洗流程需符合 GDPR、PDPA 等法規,避免隱私洩漏。
> **下一章**:我們將進入「探索性資料分析」領域,學會透過圖表與統計量把資料故事說清楚。
---
**編者註**:在下一章,我們將把清洗後的乾淨資料集輸送到 Snowflake,進行多維度分析與可視化,讓決策者能即時看到洞察。