返回目錄
A
數據駕馭:企業資料科學實戰手冊 - 第 3 章
第三章:探索性資料分析與特徵工程
發布於 2026-02-24 20:15
# 第三章:探索性資料分析與特徵工程
## 3.1 為何需要探索性資料分析(EDA)
在機器學習項目的早期階段,最先面對的通常是「原始」數據。這些數據往往來源多樣、結構不統、一致性不高。若直接投入模型訓練,往往會因為
- **缺失值**、**離群值**或
- **資料型別錯誤**、
- **資料分佈不平衡**
等問題而導致模型表現不佳。
EDA 的核心目標是:
1. **快速把握資料特性**:如數值型變數的分佈、類別型變數的頻率。
2. **檢測潛在問題**:發現缺失值模式、異常值、重複資料。
3. **啟發特徵工程**:透過統計量與可視化發現可用於建模的新特徵。
4. **建立信任**:為商業決策者展示資料的「說服力」與可靠性。
## 3.2 資料品質檢查工具
| 工具 | 主要功能 | 適用場景 |
|------|----------|----------|
| **pandas** | `DataFrame.describe()`, `DataFrame.isnull()` | 小規模到中等規模資料集 |
| **Great Expectations** | 需求定義、資料驗證、報告 | 大規模、需可追溯的品質管控 |
| **dbt** | SQL 驗證、資料測試 | 企業級資料倉儲、資料湖 |
| **Apache Spark** | 分散式資料處理、Spark SQL | PB級資料、實時流處理 |
| **Delta Lake / Iceberg** | ACID 交易、快照管理 | 需要多版本資料保留 |
> **實務建議**:在資料入口即執行簡易驗證,使用 `Great Expectations` 或 `dbt test` 產生報告,確保 downstream 服務可直接接收「已經經過驗證」的資料。
## 3.3 統計摘要與可視化
### 3.3.1 數值型特徵
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('sales.csv')
print(df['revenue'].describe())
sns.histplot(df['revenue'], kde=True)
plt.title('Revenue Distribution')
plt.show()
### 3.3.2 類別型特徵
python
sns.countplot(data=df, x='product_category', order=df['product_category'].value_counts().index)
plt.xticks(rotation=45)
plt.title('Product Category Frequency')
plt.show()
### 3.3.3 多變量關係
python
# Pearson correlation heatmap
corr = df.corr()
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm')
plt.title('Feature Correlation Matrix')
plt.show()
> **可視化選型**:
> - **Matplotlib / Seaborn**:快速、可自訂。
> - **Plotly / Bokeh / Altair**:互動式報表,適合商業 dashboard。
> - **Superset / Tableau / PowerBI**:企業級 BI 圖表,支持多資料源合併。
## 3.4 特徵工程概念
| 方向 | 主要技術 | 說明 |
|------|----------|------|
| **編碼(Encoding)** | One-Hot, Target, Ordinal, Frequency | 將類別型轉為數值型。
| **標準化 / 正規化** | StandardScaler, MinMaxScaler | 使數值特徵尺度相同。
| **派生特徵** | 日期拆解、交互項、聚合 | 從原始欄位衍生更具意義的特徵。
| **降維** | PCA, t-SNE, UMAP | 在資料量大或特徵維度高時使用。
| **特徵選擇** | L1 Regularization, Tree Feature Importance, Recursive Feature Elimination | 去除冗餘、無效特徵。
### 3.4.1 例子:電商購物車資料
假設 `sales.csv` 包含欄位:`order_id, customer_id, product_id, order_date, quantity, price, payment_method`。
python
# 日期拆解
df['order_date'] = pd.to_datetime(df['order_date'])
df['order_year'] = df['order_date'].dt.year
df['order_month'] = df['order_date'].dt.month
# 交互項:每筆訂單總價
df['total_price'] = df['quantity'] * df['price']
# 類別編碼(Target Encoding)
from category_encoders import TargetEncoder
enc = TargetEncoder(cols=['payment_method'], target='total_price')
df['payment_method_te'] = enc.fit_transform(df['payment_method'], df['total_price'])
> **小技巧**:使用 `category_encoders` 進行 Target Encoding 可以提升模型對於稀疏類別的預測能力。
## 3.5 工具選型與工作流
| 步驟 | 工具 | 為何選擇 |
|------|------|----------|
| 資料輸入 | **Python / pandas** 或 **Spark** | 彈性、易於 prototyping;Spark 適合大資料 |
| 版本控制 | **Git** + **DVC** | 對資料與模型進行版本管理 |
| 任務排程 | **Airflow** / **Prefect** | 可視化 DAG、重試機制 |
| 測試 | **Great Expectations** | 以代碼定義驗證規則 |
| 報告 | **Jupyter / VSCode Notebook** | 交互式分析、即時視覺化 |
| 共享 | **Databricks Workspace** / **S3** | 組織層級的存取控制 |
> **建議流程**:
> 1. **資料導入** → 2. **資料驗證** (Great Expectations) → 3. **資料清洗** (pandas / Spark) → 4. **EDA & 特徵工程** → 5. **版本化** (DVC) → 6. **模型訓練**。
## 3.6 常見陷阱與對策
1. **忽略缺失值**:直接 drop 會導致資料偏差。對於關鍵特徵應使用合理填補或建模。
2. **過度擬合**:EDA 期間觀察離群值,必要時使用 robust 標準化。
3. **資料泄露**:特徵選擇時避免使用「未來」資訊,保證時序一致性。
4. **可視化偏差**:選擇合適比例、避免過度美化。
5. **重複工作**:將 EDA 及特徵工程寫成可重用函式,使用 `makefile` 或 `invoke` 進行自動化。
## 3.7 小結
本章透過理論與實務案例說明了探索性資料分析與特徵工程的核心流程。掌握以下幾點,您將能在
- **資料品質檢查** 取得第一手證據;
- **統計與可視化** 直觀展現資料面貌;
- **特徵工程** 為機器學習模型奠定堅實基礎。
在下一章,我們將帶您進入 **機器學習模型構建** 的實務領域,從選型到訓練、調參,再到模型評估與部署。