返回目錄
A
數據驅動決策:從原始資料到洞察的全流程 - 第 4 章
第 4 章:探索性資料分析(EDA)
發布於 2026-02-22 14:02
# 第 4 章:探索性資料分析(EDA)
> **先前章節回顧**:在資料清洗完成後,資料量維持 92%,模型準確率提升 3.8%。此章將在此基礎上,進行深入的資料探索,為後續特徵工程與建模奠定堅實的基礎。
---
## 4.1 章節定位
探索性資料分析(Exploratory Data Analysis, EDA)是資料科學流程中的關鍵步驟,目的在於:
- **快速洞察資料結構**:了解每個變數的分佈、缺失情形、極端值等。
- **發現潛在關係**:尋找變數間的線性或非線性關聯。
- **檢驗假說**:驗證業務假設是否與資料一致。
- **引導特徵工程**:根據觀察結果選擇合適的特徵轉換或萃取方法。
在實務中,良好的 EDA 能節省大量時間,避免「試錯」式的模型開發。
## 4.2 基礎統計描述
統計描述是 EDA 的起點,能快速掌握資料的中心趨勢、離散程度與分佈形態。
| 變數 | 觀測數量 | 平均值 | 中位數 | 標準差 | 最小值 | 最大值 |
|------|----------|--------|--------|--------|--------|--------|
| `price` | 10,000 | 250.3 | 200 | 80 | 20 | 1,200 |
| `discount` | 10,000 | 0.15 | 0.10 | 0.08 | 0 | 0.75 |
| `order_count` | 10,000 | 5.2 | 3 | 2.7 | 1 | 20 |
> **Python 例子**:
python
import pandas as pd
df = pd.read_csv('sales_cleaned.csv')
summary = df.describe().T[['count', 'mean', 'median', 'std', 'min', 'max']]
print(summary)
> **解讀技巧**:
> - **偏態**:若 `mean > median`,分佈右偏;若 `mean < median`,左偏。
> - **離群值警訊**:`max` 與 `mean` 差距過大,或 `std` 超過 2 倍時,值得進一步檢查。
## 4.3 資料視覺化:單變量
視覺化可以將統計數字轉化為直觀圖像,常用工具:Matplotlib、Seaborn、Plotly。
### 4.3.1 直方圖 & 密度圖
python
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4))
sns.histplot(df['price'], kde=True, bins=30, color='skyblue')
plt.title('Price Distribution')
plt.xlabel('Price ($)')
plt.ylabel('Frequency')
plt.show()
### 4.3.2 箱型圖(Boxplot)
python
plt.figure(figsize=(6, 4))
sns.boxplot(x=df['region'], y=df['price'], palette='pastel')
plt.title('Price by Region')
plt.xlabel('Region')
plt.ylabel('Price ($)')
plt.show()
> **觀察重點**:
> - **四分位距 (IQR)**:IQR = Q3 - Q1;離群值常以 1.5*IQR 為界。
> - **箱體上下端**:分別代表 25% 和 75% 分位數。
> - **外部點**:可能是異常值,需核對原始資料。
## 4.4 多變量探索
多變量分析能揭示不同特徵間的相互關係,常用方法包括相關係數矩陣、熱力圖、散點圖矩陣(Pairplot)等。
### 4.4.1 相關係數矩陣
python
corr = df.corr(method='pearson')
print(corr)
> **範例**:
> - `price` 與 `discount` 可能呈現負相關。
> - `order_count` 與 `price` 可能呈現正相關。
### 4.4.2 熱力圖
python
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Correlation Heatmap')
plt.show()
### 4.4.3 散點圖矩陣(Pairplot)
python
sns.pairplot(df[['price', 'discount', 'order_count']], hue='region', palette='Set2')
plt.show()
> **使用提示**:
> - 在 `hue` 參數中加入類別變數,可觀察不同類別下的關聯模式。
> - 若資料量過大,可採用 `sample()` 先抽樣。
## 4.5 進階 EDA 技術
### 4.5.1 分類變數可視化
- **計數圖(Countplot)**:展示各類別頻次。
- **條形圖(Barplot)**:配合聚合函式(如平均值)可展示不同類別的指標。
python
plt.figure(figsize=(8, 4))
sns.countplot(x='status', data=df, palette='viridis')
plt.title('Order Status Count')
plt.xlabel('Status')
plt.ylabel('Count')
plt.show()
### 4.5.2 交叉表(Cross‑Tabulation)
python
cross = pd.crosstab(df['region'], df['status'], normalize='index')
print(cross)
> **交叉表** 可以快速了解類別之間的比例關係。
### 4.5.3 時間序列 EDA
對於有時間戳的資料,建議先轉為 Datetime 格式,然後使用 `lineplot`、`lag plot`、`seasonal_decompose` 等。
python
df['order_date'] = pd.to_datetime(df['order_date'])
monthly = df.set_index('order_date').resample('M').agg({'price':'sum', 'order_count':'sum'})
sns.lineplot(data=monthly, palette='crest')
plt.title('Monthly Sales Trend')
plt.show()
### 4.5.4 非線性關聯檢測
- **分位數迴歸(Quantile Regression)**:觀察不同分位數下的迴歸斜率。
- **交叉驗證(Cross‑Validation)**:對於非線性模型,先在 EDA 階段做簡單可視化(如 `scatter + loess`)以判斷是否需要非線性轉換。
## 4.6 EDA 案例研究:線上零售商業場景
### 4.6.1 背景
一個跨境電商平台想了解「高價產品是否會因大折扣而減少銷量」的假設。
### 4.6.2 探索流程
1. **資料準備**:使用已清洗完成的 `sales_cleaned.csv`。
2. **單變量檢查**:箱型圖顯示某些 `price` 離群值,且直方圖呈現右偏。
3. **多變量相關**:相關係數矩陣顯示 `price` 與 `discount` 的負相關係數為 -0.35。
4. **分組分析**:計數圖與條形圖顯示 `discount` 高於 0.5 的 `region` 數量極少,可能不具代表性。
5. **離群值處理**:IQR 計算後發現 3% 的 `price` 超過 1.5*IQR,進行資料核對後發現為測試樣本,於建模時可移除。
6. **結論**:EDA 驗證了「價格高、折扣低時銷量高」的假設,並指出 `region` 之間價格差異顯著,建議在特徵工程中加入區域折扣補償項。
## 4.7 實務操作建議
| 項目 | 建議 | 說明 |
|------|------|------|
| 資料量 | 抽樣後可視化 | 若資料量 > 50k,先使用 `df.sample(5000)` 進行快速畫圖。
| 時間成本 | 30 分鐘內完成基本 EDA | 以統計描述、直方圖、箱型圖、熱力圖為主。
| 版本控制 | EDA Notebook / Jupyter | 透過 Git 管理,並設定 `requirements.txt` 保障重現性。
| 註解 | 圖表註解簡潔 | 標題、x/y 軸、顏色映射必須能讓讀者一眼明白。
| 交叉驗證 | 在 EDA 時做小規模交叉驗證 | 可先用 `train_test_split` 進行 70/30 分割,確認分佈是否保持一致。
## 4.8 小結
- **統計描述 + 視覺化** 是快速掌握資料特徵的「速成手段」。
- **相關係數熱力圖** 能快速找出潛在關聯,並形成假說。
- **多變量可視化**(Pairplot、散點圖)有助於捕捉非線性關係。
- **進階技術**(交叉表、時間序列 EDA)適用於分類特徵與時間戳資料。
- EDA 的成果直接影響 **特徵工程** 與 **模型選擇**,因此應當在專案初期投入足夠時間。
---
## 4.9 參考文獻
- Tukey, J. W. (1977). *Exploratory Data Analysis*. Addison‑Wesley.
- McKinney, W. (2010). *Data Analysis with Python and Pandas*. O'Reilly Media.
- Vandehey, T. (2018). *Visualizing Data with Seaborn*. DataCamp.
- Han, J., Kamber, M., & Pei, J. (2011). *Data Mining: Concepts and Techniques*. Elsevier.
- 資料可視化最佳實踐:<https://seaborn.pydata.org/tutorial.html>
---
> **後續章節**:在本章完成後,將進入「特徵工程(Feature Engineering)」,將 EDA 觀察結果轉化為具體的特徵轉換與創建策略。