返回目錄
A
數據洞見:從原始數據到決策智慧 - 第 3 章
第三章:探索性資料分析
發布於 2026-03-05 22:29
# 第三章:探索性資料分析
## 3.1 章節概覽
探索性資料分析(Exploratory Data Analysis, EDA)是資料科學流程中極為關鍵的一環。它的主要目標是:
- **了解資料結構**:分佈、偏態、離群點等。
- **發掘隱藏關係**:變數間的相關性、因果線索。
- **識別數據品質問題**:缺失值、重複、異常。
- **為後續建模提供洞見**:選擇合適的特徵、轉換方法、模型假設。
本章將以實務導向,結合案例說明常用工具與技巧,並提出最佳實踐建議。
---
## 3.2 探索性資料分析流程圖
> mermaid
yaml
flowchart TD
A[資料準備] --> B[描述性統計]
B --> C[可視化分析]
C --> D[相關性檢測]
D --> E[異常檢測]
E --> F[缺失值模式]
F --> G[洞見與報告]
G --> H[回饋至資料清洗]
流程說明:
1. **資料準備**:確認資料型態、轉換時間格式、處理類別變數等。
2. **描述性統計**:計算均值、中位數、標準差、四分位數、最大/最小值。
3. **可視化分析**:直方圖、箱型圖、散點圖、熱力圖等。
4. **相關性檢測**:Pearson、Spearman、Kendall 等相關係數,或卡方檢定。
5. **異常檢測**:IQR、Z‑score、Isolation Forest、Local Outlier Factor 等。
6. **缺失值模式**:缺失值矩陣、熱力圖、Missingness Pattern Plot。
7. **洞見與報告**:生成報告、撰寫摘要、提出改進建議。
---
## 3.3 描述性統計
### 3.3.1 直方圖與分佈
python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('credit_card_transactions.csv')
# 單變量分佈
sns.histplot(df['amount'], kde=True)
plt.title('交易金額分佈')
plt.xlabel('金額 (NT$)')
plt.ylabel('頻率')
plt.show()
- **KDE (Kernel Density Estimate)**:平滑分佈,方便觀察偏態。
- **箱型圖**:觀察離群點。
### 3.3.2 位置與離散度
| 統計量 | 公式 | 直觀意義 |
|-------|------|-----------|
| 均值 (μ) | ∑xᵢ / n | 中心趨勢 |
| 中位數 (Median) | 中央值 | 對極端值不敏感 |
| 標準差 (σ) | √(∑(xᵢ-μ)² / n) | 離散度 |
| 四分位距 (IQR) | Q₃ - Q₁ | 中央 50% 數據範圍 |
### 3.3.3 交叉表 (Cross‑tabulation)
python
# 交叉表: 交易時間段 vs 付款方式
cross_tab = pd.crosstab(df['time_of_day'], df['payment_method'])
print(cross_tab)
交叉表可快速揭示不同類別變數之間的相對頻率。
---
## 3.4 可視化技術
| 目的 | 圖表 | 典型應用 |
|------|------|-----------|
| 單變量 | 直方圖、箱型圖、密度圖 | 分佈、離群點 |
| 雙變量 | 散點圖、條形圖、熱力圖 | 相關性、分群 |
| 多變量 | 相關矩陣熱力圖、散點圖矩陣、PCA 降維散點圖 | 全局關聯、維度降低 |
### 3.4.1 相關矩陣熱力圖
python
corr = df.corr()
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('相關係數熱力圖')
plt.show()
- **注意**:對於類別變數,需先轉為數值型或使用 Cramér's V。
### 3.4.2 散點圖矩陣 (Pairplot)
python
sns.pairplot(df[['amount', 'age', 'balance']], hue='default_flag')
plt.show()
- **應用**:觀察多維度關係與分群趨勢。
---
## 3.5 相關性分析
### 3.5.1 相關係數
| 類型 | 公式 | 適用情境 |
|------|------|-----------|
| Pearson | r = Σ((x-μₓ)(y-μᵧ)) / √(Σ(x-μₓ)² Σ(y-μᵧ)²) | 連續且線性 |
| Spearman | ρ = 1 - 6 Σdᵢ² / (n(n²-1)) | 連續或有序,非線性 |
| Kendall | τ = (C - D) / [n(n-1)/2] | 小樣本、強噪音 |
### 3.5.2 卡方檢定 (Chi‑square)
python
from scipy.stats import chi2_contingency
contingency_table = pd.crosstab(df['age_group'], df['default_flag'])
chi2, p, dof, ex = chi2_contingency(contingency_table)
print('p-value:', p)
- **解讀**:p‑value < 0.05 表示兩變數獨立性被拒絕。
---
## 3.6 異常檢測與離群點
### 3.6.1 基於統計的 IQR 方法
python
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['amount'] < Q1 - 1.5*IQR) | (df['amount'] > Q3 + 1.5*IQR)]
print(outliers)
### 3.6.2 基於機器學習的 Isolation Forest
python
from sklearn.ensemble import IsolationForest
clf = IsolationForest(contamination=0.01, random_state=42)
clf.fit(df[['amount', 'balance']])
df['anomaly'] = clf.predict(df[['amount', 'balance']])
# -1 表示離群點
- **選擇**:IQR 直觀且快速;Isolation Forest 更適合高維度。
---
## 3.7 缺失值模式分析
### 3.7.1 缺失值矩陣
python
import missingno as msno
msno.matrix(df)
plt.show()
- **解讀**:顏色深淺代表缺失比例;可視化缺失與其他變數的關聯。
### 3.7.2 缺失機制分類
| 缺失類型 | 例子 | 影響 |
|-----------|------|------|
| MCAR (Missing Completely at Random) | 隨機刪除 | 無偏差 |
| MAR (Missing at Random) | 基於已觀測變數 | 可使用多重插補 |
| MNAR (Missing Not at Random) | 基於未觀測變數 | 需模型調整 |
---
## 3.8 案例實作:信用卡詐欺檢測數據集
> **目標**:在 Kaggle 典型的信用卡詐欺數據集上執行 EDA,並提出數據前處理策略。
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('creditcard.csv')
# 1. 觀察類別變數
print(df['Class'].value_counts())
# 2. 數值分佈
sns.boxplot(x='Class', y='Amount', data=df)
plt.show()
# 3. 相關矩陣熱力圖(只取前三列示範)
corr = df.iloc[:, :5].corr()
plt.figure(figsize=(5,4))
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
**分析結論**:
- 詐欺樣本極少(約 0.17%),表明類別不平衡。
- 交易金額在詐欺樣本中普遍偏高。
- `V1~V28` 為 PCA 變數,彼此高度相關。
**前處理建議**:
- **重採樣**:SMOTE 或 ADASYN。
- **特徵縮放**:`StandardScaler`。
- **缺失值**:檢查並填補(大多數列為完整)。
---
## 3.9 EDA 最佳實踐
| 建議 | 詳細說明 |
|------|-----------|
| **結合統計與視覺** | 先用統計摘要確認基本分佈,再用圖表進行深度探索 |
| **文件化** | 使用 Jupyter Notebook 或 R Markdown,保存所有程式碼、圖表與解讀 |
| **迭代** | EDA 是循環過程,發現新問題後回到資料準備階段 |
| **跨團隊協作** | 與資料工程、業務人員討論洞見,確保實務可行 |
| **工具選型** | Pandas/NumPy(基礎)、Seaborn/Plotly(圖表)、MissingNo(缺失視覺)、Scikit‑learn(機器學習) |
---
## 3.10 小結
- **探索性資料分析** 為資料科學的「門檻」:它將「未知」轉化為「可量化」的洞見。
- 透過 **描述性統計**、**可視化**、**相關性檢定**、**異常檢測** 及 **缺失值分析**,能夠完整把握資料特性,為後續建模奠定堅實基礎。
- 良好的 EDA 實踐不僅提升模型效果,還能節省數據清洗與工程成本,並為決策者提供直觀說明。
---
## 3.11 下一章預告
> **第四章:機器學習基礎**
> 本章將帶您從 EDA 走向 **模型訓練**:探索監督式與非監督式學習方法,並學習如何選擇合適的模型與評估指標。
---
> *本章已完成,請在「數據洞見:從原始數據到決策智慧」整體架構中確認章節連結。*