返回目錄
A
資料科學實戰:從數據到決策的完整流程 - 第 3 章
第三章:資料清洗與品質保證——從原始到乾淨的轉變
發布於 2026-03-04 21:18
# 第三章:資料清洗與品質保證——從原始到乾淨的轉變
> **「資料不乾淨就像泥濘的道路,分析師若不修理就永遠無法到達目的地。」**
在前一章我們已經把資料帶進雲端,現在的任務是將雜亂無章的原始資料整理成可用的分析物件。資料清洗不是單純的「刪除錯誤」;它是把不確定性、重複性與不一致性轉化為可衡量、可追蹤的品質指標。以下將詳細闡述流程、工具、測試與自動化,讓你在實務中能迅速建立高品質資料基礎。
## 3.1 清洗的目的與價值
| 目的 | 為什麼重要? | 典型例子 |
|------|--------------|-----------|
| 1. 提升模型準確度 | 資料噪音直接削弱預測能力 | 銀行風險模型因信用卡資料缺失率高而失準 |
| 2. 降低運算成本 | 清除重複與不必要欄位節省儲存與處理時間 | 產品推薦引擎去除重複的用戶行為記錄 |
| 3. 符合合規要求 | 需要證明資料完整性與可追溯性 | GDPR 需要可查證的資料處理流程 |
| 4. 加速決策流程 | 快速定位問題點,減少資料前處理時間 | 醫療診斷系統在實時檢測前先做快速缺失值填補 |
## 3.2 常見的資料問題
1. **缺失值**:隨機缺失 (MCAR)、非隨機缺失 (MNAR) 等。
2. **重複記錄**:完全重複或部分重複。
3. **格式不統一**:日期時間、貨幣、電話號碼等。
4. **離群值**:極端數值,可能是輸入錯誤或真正異常。
5. **類型不一致**:數值被存成字串、布林值混亂。
6. **非結構化資料缺失結構化**:需要先提取關鍵欄位。
> **提醒**:先不擔心「最佳」處理方法,先確定「問題」是什麼。否則清洗成效會變成盲目操作。
## 3.3 工具選型:從 dbt 到 Great Expectations
| 工具 | 角色 | 主要功能 | 優勢 |
|------|------|----------|------|
| **dbt** | 轉換、重組 | SQL 轉換、模型重構、版本管理 | 版本可追蹤、即時執行、與 Snowflake 無縫整合 |
| **Great Expectations** | 資料驗證 | 期待值、完整性、邏輯驗證 | 可視化報告、自動化測試、整合 CI/CD |
| **Airflow** | 編排 | 觸發工作流、監控 | 豐富的 Operators、可視化 DAG |
| **DataCleaner** | 解析、品質檢查 | 文字、表格解析、統計摘要 | 開源、易於部署 |
| **Soda SQL** | 監控 | 連續品質檢測 | 針對 SQL 資料庫設計 |
> **選型策略**:若資料已在 Snowflake,dbt 先做結構化轉換;若需要驗證,將 Great Expectations 放在 dbt 的「測試」層;最後用 Airflow 編排整個工作流。其餘工具作為輔助。
## 3.4 實戰案例:電商交易資料清洗
### 3.4.1 原始資料
sql
SELECT * FROM raw_transactions;
-- 共 1,200,000 行
-- 欄位:trx_id, user_id, item_id, qty, price, trx_date, status, shipping_address, coupon_code
### 3.4.2 轉換規則(dbt)
sql
-- models/clean_transactions.sql
WITH source AS (
SELECT
trx_id,
user_id,
item_id,
qty,
price,
trx_date,
status,
shipping_address,
coupon_code
FROM {{ ref('raw_transactions') }}
)
SELECT
trx_id,
user_id,
item_id,
CASE
WHEN qty < 0 THEN 0
ELSE qty
END AS qty,
ROUND(price, 2) AS price,
TO_TIMESTAMP_NTZ(trx_date) AS trx_ts,
LOWER(status) AS status,
TRIM(shipping_address) AS shipping_address,
COALESCE(coupon_code, 'N/A') AS coupon_code
FROM source;
### 3.4.3 資料驗證(Great Expectations)
python
# great_expectations/expectations/clean_transactions.yml
data_asset_type: table
dataset: clean_transactions
expectations:
- expect_column_values_to_not_be_null:
column: trx_id
- expect_column_values_to_be_unique:
column: trx_id
- expect_column_values_to_be_in_set:
column: status
value_set: ['completed', 'pending', 'cancelled']
- expect_column_values_to_be_of_type:
column: qty
type_: integer
- expect_column_pair_values_to_be_in_set:
column_A: qty
column_B: price
condition: 'qty > 0 AND price > 0'
> **註解**:Great Expectations 會產生 HTML 報告,方便審核與修正。
### 3.4.4 自動化編排(Airflow)
python
# dags/clean_transactions_dag.py
from airflow import DAG
from airflow.providers.snowflake.operators.snowflake import SnowflakeOperator
from datetime import datetime
with DAG(
'clean_transactions',
start_date=datetime(2024, 1, 1),
schedule_interval='@daily',
catchup=False,
) as dag:
run_dbt = SnowflakeOperator(
task_id='run_dbt',
sql='CALL dbt.run()',
snowflake_conn_id='snowflake_default',
)
run_great_expectations = SnowflakeOperator(
task_id='run_gx',
sql='CALL great_expectations.run()',
snowflake_conn_id='snowflake_default',
)
run_dbt >> run_great_expectations
> **要點**:Airflow 只負責執行,具體邏輯留給 dbt + Great Expectations。若驗證失敗,可透過 Slack 通知或自動退回到開發環境。
## 3.5 測試驅動清洗(Test‑Driven Data Cleaning)
1. **先寫測試**:定義期望值(如唯一性、格式)
2. **執行清洗**:以 dbt 或腳本實現
3. **驗證**:Great Expectations 或自定義 PyTest
4. **迭代**:若失敗即回到步驟 1
> **好處**:確保每次變更都有自動檢查,避免資料漂移。
## 3.6 監控與持續改進
- **Soda SQL**:設定每小時自動執行,報告異常率
- **Grafana + Snowflake**:視覺化缺失率、重複率
- **Slack Bot**:當資料品質指標下降時即時通知
- **CI/CD**:將 dbt 與 Great Expectations 整合至 GitHub Actions,任何 PR 都觸發測試
> **提醒**:品質保證不是一次性工程,而是「持續監控、持續改進」的循環。
## 3.7 小結
1. 資料清洗是提升模型效能與商業價值的關鍵步驟。
2. 建立「測試驅動」的清洗流程,確保每一次變更都有自動驗證。
3. 利用 dbt、Great Expectations、Airflow 等工具組合,能快速、可追蹤且可擴充的工作流。
4. 監控與報告機制是維持長期資料品質的必要條件。
> **結語**:在這一章中,我們已經把雜亂的原始資料變成了可運算的「乾淨」資料。接下來,將帶你進入資料探索的世界,從數字背後讀出商業洞見。