返回目錄
A
資料驅動決策:從數據探索到模型部署 - 第 2 章
第 2 章:資料探索與視覺化
發布於 2026-02-27 15:19
# 第 2 章:資料探索與視覺化
資料科學的靈魂不只是模型與算法,更在於對資料本身的直覺感受。這一章將帶領你從 **「看見」** 開始,學會如何用圖形化方式揭露隱藏在數值背後的關係與趨勢。
---
## 2.1 為什麼探索性分析(EDA)要先行
> **探索性分析**,簡單來說,就是給資料「一把放大鏡」——
> 先觀察、再思考、再提出假說。若不先觀察,模型的假設就可能像「盲人摸象」般偏頗。
>
> 透過可視化,我們能快速判斷:
> - 資料分布是否偏斜?
> - 是否存在極端值?
> - 兩個變數之間是否存在線性或非線性關係?
> - 數據是否有分群趨勢?
在實務中,這一步往往能節省大量「重複實驗」的成本——一次好的視覺化,往往能讓你在後續的模型選擇與參數調整上,少走不少彎路。
---
## 2.2 基礎可視化工具箱
| 工具 | 特色 | 典型使用場景 |
|------|------|--------------|
| **Matplotlib** | 靈活、可高度客製化 | 需要自定義圖形佈局時 |
| **Seaborn** | 內建統計視覺化,簡潔語法 | 直觀展示分佈、關係、熱圖 |
| **Plotly** | 互動式、可嵌入網頁 | 製作動態報表或產品原型 |
> 在日常工作中,我們往往會把 **Seaborn** 當作「速成工具」先行探索,再把結果轉移到 **Matplotlib** 進行最終美化。
---
## 2.3 散佈圖(Scatter Plot)——關係的第一眼
python
import seaborn as sns
import matplotlib.pyplot as plt
# 讀取範例資料
tips = sns.load_dataset("tips")
# 兩變數之間的關係
plt.figure(figsize=(8,6))
sns.scatterplot(x="total_bill", y="tip", data=tips, hue="day", style="smoker")
plt.title("小費 vs 總額:天氣與是否吸煙的影響")
plt.xlabel("總額 (USD)")
plt.ylabel("小費 (USD)")
plt.legend(title="是否吸煙")
plt.show()
> **小技巧**:使用 `hue` 與 `style` 參數,能一次呈現多維資訊,避免在後續再製作過多子圖。
---
## 2.4 直方圖與核密度估計(Histogram & KDE)——分佈的心跳
python
plt.figure(figsize=(8,4))
sns.histplot(data=tips, x="total_bill", bins=20, kde=True, color="steelblue")
plt.title("總額分佈:觀察偏斜與峰值")
plt.xlabel("總額 (USD)")
plt.ylabel("頻數")
plt.show()
- **偏斜**:若左側長尾,代表大部分顧客較少消費。
- **峰值**:多峰可能暗示多個顧客族群,值得進一步聚類分析。
---
## 2.5 箱形圖(Box Plot)——極端值的警鐘
python
plt.figure(figsize=(6,8))
sns.boxplot(data=tips, y="tip", color="lightgreen")
plt.title("小費的箱形圖:檢視離群值")
plt.ylabel("小費 (USD)")
plt.show()
> **洞察**:箱形圖會自動將**四分位距(IQR)**之外的點標示為離群值。若離群點過多,請檢查資料輸入或考慮是否需要轉換。
---
## 2.6 熱力圖(Heatmap)——關係矩陣的視覺化
python
corr = tips.corr()
plt.figure(figsize=(8,6))
sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("變數相關係數矩陣")
plt.show()
- **正相關**(顏色偏紅)表示兩變數往同方向變動。
- **負相關**(顏色偏藍)則相反。
- 若相關係數接近 0,可能需要考慮特徵工程或刪除。
---
## 2.7 降維可視化(PCA / t-SNE)——高維資料的「縮影」
> **PCA(主成份分析)**:保留最大變異的線性組合,適用於線性關係。
> **t‑SNE**:保留局部結構,適用於非線性聚類。
python
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import pandas as pd
# 假設 df 為高維特徵表
X = df.select_dtypes(include=["number"]).values
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.figure(figsize=(6,5))
plt.scatter(X_pca[:,0], X_pca[:,1], alpha=0.6)
plt.title("PCA 2D 視覺化")
plt.xlabel("主成份 1")
plt.ylabel("主成份 2")
plt.show()
# t‑SNE
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
plt.figure(figsize=(6,5))
plt.scatter(X_tsne[:,0], X_tsne[:,1], alpha=0.6)
plt.title("t‑SNE 2D 視覺化")
plt.xlabel("t‑SNE 1")
plt.ylabel("t‑SNE 2")
plt.show()
> **注意**:t‑SNE 參數(如 perplexity)對結果影響大,建議多試幾組,選擇「最能說服業務的圖」。
---
## 2.8 小結:視覺化的三大功用
1. **發現異常**:離群值、缺失值與分佈偏斜都能被視覺化迅速捕捉。
2. **驗證假說**:變數間的線性/非線性關係可直觀檢驗,減少先入為主的偏差。
3. **溝通橋樑**:圖形化報告能讓非技術同仁快速理解,促進跨部門合作。
> **未來展望**:在下一章,我們將把「觀察」轉化為「行動」——利用探索結果做特徵選擇、工程與模型構建。
---
> **挑戰題**:請挑選一個你手頭的資料集,運用上述視覺化技巧,撰寫一份 1‑頁的「資料洞察報告」給你的業務同仁,並指出至少兩項你認為值得進一步探索的問題。
---
**完成**:恭喜你完成第 2 章!