返回目錄
A
決策的數據語言:從原始數據到洞察力 - 第 4 章
第 4 章 探索性資料分析
發布於 2026-03-03 09:06
# 第 4 章 探索性資料分析
> **目的**:在模型建構之前,先透過圖形與統計量快速掌握資料結構、分布與關聯,為後續分析奠定堅實基礎。
---
## 4.1 為什麼要做探索性資料分析(EDA)
| 目的 | 說明 |
|------|------|
| **資料質量檢查** | 找出缺失值、異常值與重複觀測。 |
| **分布理解** | 確認變數是否符合正態分布、檢視偏態。 |
| **關聯發現** | 量化特徵之間的線性或非線性關係。 |
| **假設生成** | 為統計推斷或機器學習模型提供初步假設。 |
| **溝通橋樑** | 以可視化方式向非技術利益相關者說明資料特徵。 |
> **小提醒**:EDA 不是最後一步,而是模型選擇與特徵工程的起點。
---
## 4.2 基本統計量與直方圖
> **核心統計量**:平均值、媒體、標準差、四分位數、極值。
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 範例資料載入
df = pd.read_csv('data/transactions.csv')
# 取出金額欄位
amount = df['amount']
# 基本統計量
print(amount.describe())
# 直方圖 + KDE
sns.histplot(amount, kde=True, bins=30, color='steelblue')
plt.title('交易金額分布')
plt.xlabel('金額 (NT$)')
plt.ylabel('頻率')
plt.show()
### Q-Q 圖
檢查是否接近正態分布。
python
import scipy.stats as stats
stats.probplot(amount, dist='norm', plot=plt)
plt.title('Q-Q 圖')
plt.show()
> **實務技巧**:若 Q‑Q 圖明顯偏離對角線,考慮對數轉換或使用非參數模型。
---
## 4.3 盒鬚圖(Boxplot)與異常檢測
python
sns.boxplot(x=amount, color='lightgreen')
plt.title('交易金額盒鬚圖')
plt.xlabel('金額 (NT$)')
plt.show()
> **說明**:盒鬚圖即四分位數、最大/最小值與離群值。離群值通常以 1.5 × IQR 外的點表示。
> **實務**:在金融風險評估中,異常交易往往代表欺詐或系統錯誤,需進一步人工審查。
---
## 4.4 相關矩陣與熱力圖
python
# 只保留數值型變數
num_df = df.select_dtypes(include=['int64', 'float64'])
# 相關係數矩陣
corr = num_df.corr(method='pearson')
# 熱力圖
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title('特徵相關矩陣')
plt.show()
| 變數 | 相關係數範例 |
|------|--------------|
| `amount` vs `fee` | 0.73 |
| `amount` vs `customer_age` | -0.05 |
> **解讀**:正相關表示兩者同時升高;負相關則相反。若相關係數接近 0,可能存在非線性關係或無直接關聯。
> **進階**:使用 Spearman(秩相關)或 Kendall(一致性)可捕捉非線性趨勢。
---
## 4.5 分群視覺化:層級聚類與 K‑means
### 層級聚類(Dendrogram)
python
from scipy.cluster.hierarchy import dendrogram, linkage
# 以 `amount`、`fee`、`time_of_day` 建立距離矩陣
X = num_df[['amount', 'fee', 'time_of_day']].values
Z = linkage(X, method='ward')
plt.figure(figsize=(10, 4))
_dendrogram = dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12.)
plt.title('層級聚類 Dendrogram')
plt.xlabel('樣本編號')
plt.ylabel('距離')
plt.show()
### K‑means 直方圖
python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)
plt.title('K‑means 聚類結果 (前兩維)')
plt.xlabel('amount')
plt.ylabel('fee')
plt.show()
> **使用場景**:客戶細分、風險分層、異常交易分群。
---
## 4.6 時間序列探索
python
# 轉成時間序列索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# 日交易總額
daily = df['amount'].resample('D').sum()
plt.plot(daily.index, daily.values)
plt.title('每日交易總額趨勢')
plt.xlabel('日期')
plt.ylabel('金額 (NT$)')
plt.show()
### 自相關圖(ACF)與偏自相關圖(PACF)
python
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(daily, lags=30)
plt.title('自相關圖 (ACF)')
plt.show()
plot_pacf(daily, lags=30)
plt.title('偏自相關圖 (PACF)')
plt.show()
> **解讀**:週期性顯現在自相關圖中。若 ACF 在 7、14 等滯後處有顯著峰值,代表存在一週週期。
---
## 4.7 交叉表與分層分析
python
# 交易類型與付款方式的交叉表
ct = pd.crosstab(df['payment_method'], df['transaction_type'], normalize='index')
ct.plot(kind='barh', stacked=True, figsize=(8, 6))
plt.title('付款方式與交易類型分佈')
plt.xlabel('比例')
plt.ylabel('付款方式')
plt.legend(title='交易類型', bbox_to_anchor=(1.05, 1))
plt.tight_layout()
plt.show()
> **分層**:可進一步用 `groupby` 針對不同客戶族群(如年齡、地區)進行統計,發現潛在的偏差。
---
## 4.8 實務案例:零售交易數據的 EDA
| 步驟 | 目標 | 主要工具 |
|------|------|----------|
| 1. 資料載入 | 讀取 CSV/DB | pandas, sqlalchemy |
| 2. 缺失值檢查 | 了解缺失比例 | pandas.isnull, matplotlib heatmap |
| 3. 分布可視化 | 判斷分布形態 | seaborn histplot, kde |
| 4. 相關性 | 估計特徵關聯 | seaborn heatmap, scipy.stats |
| 5. 時間趨勢 | 發現季節性 | pandas resample, matplotlib line |
| 6. 分群分析 | 針對高價值客戶 | scikit‑learn KMeans |
| 7. 報告輸出 | 生成 PDF/HTML | pandas‑excelwriter, matplotlib, seaborn |
> **關鍵發現**:在 2023 年 11 月節慶期間,`transaction_amount` 平均提升 35%;支付方式為 `Apple Pay` 的交易比例增加 12%;高價值客戶(前 10%)的交易頻率比低價值客戶高 3 倍。
---
## 4.9 執行流程與最佳實踐
1. **版本化資料**:使用 DVC 或 Git LFS 管理原始資料。
2. **Jupyter Notebook 或 Polars Notebook**:便於即時可視化與迭代。
3. **重現性**:將分析腳本封裝為 Python 模組,使用 `pytest` 進行單元測試。
4. **可讀性**:統一命名規則,使用 `snake_case`;所有圖表都加上標題、坐標軸名稱與圖例。
5. **存取權限**:在雲端資料倉儲(Snowflake、Redshift)上設置 RBAC;在程式碼中使用環境變數或 Secret Manager 讀取憑證。
6. **資料隱私**:對客戶敏感欄位進行匿名化或加密,並在 EDA 報告中使用聚合統計以避免個人資料外泄。
---
## 4.10 小結
- **EDA 是資料科學的門檻**:透過可視化與統計量,快速掌握資料特性。
- **圖表是語言**:正確選擇圖形能把複雜資訊簡化,並與非技術人士溝通。
- **可重複性與合規**:結合版本控制、測試與資料治理,確保分析可追溯且符合法規。
- **下一步**:在第 5 章中,我們將把 EDA 的發現轉化為統計推斷,進一步驗證假設。
---
> **實務小建議**:在每個 EDA 項目完成後,務必將關鍵圖表與統計表格匯出為 PDF,並在報告中標註資料來源、處理步驟與可能的偏差,以提升決策透明度。