返回目錄
A
資料科學實戰:從數據到洞察 - 第 3 章
第3章 探索性資料分析(EDA)
發布於 2026-02-27 05:21
# 第3章 探索性資料分析(EDA)
> **核心觀念**:在任何資料科學專案中,EDA 是「洞察的起點」與「品質保證的過關測試」。透過圖表、統計指標與交互式視覺化,我們能快速驗證假設、發現異常、決定特徵處理方向。以下章節以剛剛完成清洗的金融交易資料為例,示範如何使用 Pandas、Matplotlib、Seaborn 進行完整的 EDA。
---
## 3.1 為何進行 EDA
| 目的 | 說明 |
|------|------|
| 需求確認 | 了解業務問題、資料結構、欄位含義 |
| 資料品質驗證 | 檢查遺失、離群、重複、資料型別 |
| 規劃特徵工程 | 先驗證變數間關係、分布特徵 |
| 模型預備 | 針對模型假設(如正態、獨立性)做初步檢驗 |
> **實務提醒**:EDA 的時間投入往往比模型訓練更長,因為它是「資料之門」。若忽略此步驟,往往會在後續模型階段因資料假設錯誤而失敗。
## 3.2 典型圖表工具
| 工具 | 主要用途 | 典型圖表 |
|------|----------|----------|
| Matplotlib | 基礎繪圖、靜態圖 | 折線圖、長條圖、散佈圖 |
| Seaborn | 統計視覺化、色彩調整 | Boxplot、Violin、Pairplot |
| Pandas | 快速畫圖、快速摘要 | df.plot()、df.hist() |
> **建議**:在實務中,先用 Pandas 取快照,再用 Seaborn 進行精緻化呈現。
## 3.3 資料分布檢查
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 讀取已清洗資料
df = pd.read_csv('cleaned_transactions.csv')
# 1. 變數摘要
print(df.describe(include='all'))
# 2. 直方圖
df['transaction_amount'].hist(bins=50, figsize=(8,5), color='skyblue')
plt.title('交易金額分布')
plt.xlabel('金額 (元)')
plt.ylabel('頻數')
plt.show()
# 3. 箱型圖(離群檢測)
sns.boxplot(x=df['transaction_amount'])
plt.title('交易金額離群檢測')
plt.show()
> **分析點**:觀察右偏分布是否需要對數轉換;離群值是否真的異常或是業務邏輯。
## 3.4 相關性與協方差
python
# 相關係數矩陣
corr = df.corr()
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('變數相關係數熱力圖')
plt.show()
> **解讀**:高相關係數(|r|>0.7)可能導致多重共線性,需要考慮特徵選擇或降維;負相關可揭示潛在反向影響。
## 3.5 時序分析(如果有時間戳)
python
# 確保時間戳為 datetime
df['transaction_time'] = pd.to_datetime(df['transaction_time'])
# 設置索引
df.set_index('transaction_time', inplace=True)
# 每日交易總額
daily = df['transaction_amount'].resample('D').sum()
plt.figure(figsize=(12,4))
daily.plot()
plt.title('每日交易總額時間序列')
plt.ylabel('金額 (元)')
plt.show()
> **商業洞察**:發現週末或節假日的交易量波動,或是某個時段高峰,進而調整風控閾值。
## 3.6 特徵工程前的洞察
| 特徵 | 觀察結果 | 可能處理方式 |
|------|----------|--------------|
| transaction_amount | 右偏、離群 | log 轉換、Winsorising |
| customer_age | 正態分布 | 標準化 |
| transaction_day_of_week | 星期一高峰 | 建立週期性 dummy |
| merchant_category | 種類多元 | 進行 one‑hot 或 target encoding |
> **注意**:EDA 的洞察不應該直接成為模型特徵,而是「決策點」。例如,若發現 `transaction_amount` 的 log 轉換後對模型表現更佳,就在特徵工程階段實作;若發現某些類別對結果無影響,可直接刪除。
## 3.7 常見陷阱與實務小技巧
1. **過度擬合的可視化**:在大量資料上直接畫散佈圖會變得雜亂。可採用 `sns.scatterplot(alpha=0.3)` 或 `sns.jointplot(kind='hex')`。
2. **缺失值在圖表中的處理**:Matplotlib 會自動忽略 NaN,但 Seaborn 可能產生誤導。先使用 `df.dropna()` 或填補後再畫圖。
3. **顏色選擇**:對色盲友善的配色(如 Tableau 10)可提高報告可讀性。
4. **重複計算成本**:在大型資料集上,先使用 Pandas 的 `describe()` 與 `value_counts()` 取快照,再用分塊(chunk)方式進行可視化。
## 3.8 實務案例:金融欺詐交易資料
1. **資料描述**:`cleaned_transactions.csv` 包含 200,000 條交易,欄位包括 `transaction_id, customer_id, transaction_amount, transaction_time, merchant_category, is_fraud`。
2. **EDA 步驟**:
- 先檢查 `is_fraud` 分布,發現 1.2% 為欺詐。
- 觀察 `transaction_amount` 在欺詐與非欺詐的分布差異,發現欺詐交易金額偏高。
- 透過 `sns.boxplot(x='is_fraud', y='transaction_amount', data=df)` 直觀呈現。
- 時間序列顯示某段時間(假期前夕)欺詐率升高。
- 相關性矩陣發現 `merchant_category` 與 `is_fraud` 相關度較高,提出將類別做 target encoding。
3. **洞察成果**:基於 EDA 的結果,我們在特徵工程階段加入:
- `log_amount`:交易金額取對數。
- `merchant_target_encoding`:每個商戶的欺詐率。
- `weekday`:交易週幾。
- `hour_bin`:時間段(0‑6、7‑12、13‑18、19‑23)
4. **後續步驟**:進入 4 章模型選擇,使用 LightGBM、XGBoost 與深度學習,並以 AUC、Precision‑Recall 為評估指標。
---
## 3.9 小結
- **EDA 不是「一次性工作」**:資料流動時需定期重新檢視,確保洞察仍然有效。
- **圖表即是語言**:精心設計的視覺化能將複雜統計變成直觀商業洞察。
- **洞察轉化為特徵**:EDA 為特徵工程提供「線索」與「證據」,而不是直接生成模型。
- **品質先行**:即使後續模型表現優異,若資料品質不佳也會帶來風險,特別在金融領域。
> **下個章節**:4章將以這些洞察為基礎,實作特徵工程、模型訓練與評估,進一步將「資料到洞察」推向「洞察到決策」。