聊天視窗

決策的數據語言:從原始數據到洞察力 - 第 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,進行多維度分析與可視化,讓決策者能即時看到洞察。