返回目錄
A
數據洞察:從資料到決策的科學方法 - 第 4 章
4. 可視化與探索性資料分析 (EDA)
發布於 2026-02-21 01:46
# 4. 可視化與探索性資料分析 (EDA)
> **探索性資料分析(Exploratory Data Analysis, EDA)** 是數據科學流程中不可或缺的一環。它不僅能幫助我們快速了解資料結構、分布、關聯,還能揭示潛在問題(如缺失值、離群值、偏態分布),為後續特徵工程與建模奠定基礎。以下將從理論、實務工具、常見圖形、實際範例以及最佳實務六個面向進行系統說明。
## 4.1 為何要做 EDA?
| 目的 | 重要性 |
|------|--------|
| **快速洞察** | 透過圖形直觀判斷資料品質與趨勢。 |
| **數據品質檢驗** | 及早發現缺失、重複、離群值等問題。 |
| **特徵選擇與轉換** | 了解各變數分布與相互關係,決定是否需標準化、編碼或構造新特徵。 |
| **模型假設檢驗** | 檢查線性、正態性、同質性等假設是否成立。 |
| **溝通橋樑** | 產生圖形報告,幫助非技術人員理解數據。
> **EDA 不是最終模型**。它是為模型建立前的「資料前端」,能顯著降低模型失敗率。若忽略 EDA,往往導致
> 1️⃣ 資料品質問題未被發現,
> 2️⃣ 特徵選擇失誤,
> 3️⃣ 交叉驗證結果偏差。
## 4.2 常見 EDA 圖形工具與語法
| 需求 | Python | R | 主要套件 |
|------|--------|---|--------|
| 統計摘要 | `pandas.describe()` | `summary()` | `pandas`, `dplyr` |
| 單變數分布 | `plt.hist()`, `sns.histplot()` | `hist()` | `matplotlib`, `seaborn` |
| 多變數關聯 | `sns.pairplot()`, `sns.scatterplot()` | `pairs()` | `seaborn`, `GGally` |
| 熱力圖 | `sns.heatmap()` | `heatmap()` | `seaborn` |
| 禪波圖 | `sns.boxplot()` | `boxplot()` | `seaborn` |
| 互動式 | `plotly.express`, `bokeh` | `plotly` | `plotly` |
| 自動報告 | `pandas_profiling`, `sweetviz` | `DataExplorer` | `pandas_profiling`, `sweetviz` |
> **建議**:對於初學者,先以 `pandas` + `seaborn` 開始;若需要互動式視覺化,加入 `plotly` 或 `bokeh`。
## 4.3 典型 EDA 步驟(Python 版)
python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 1. 載入資料
path = "data/sample.csv"
df = pd.read_csv(path)
# 2. 基本統計摘要
print(df.describe(include='all'))
# 3. 欠缺值檢測
missing = df.isnull().sum() / len(df) * 100
print(missing)
# 4. 單變數分布
sns.histplot(df["age"], bins=30, kde=True)
plt.title("年齡分佈")
plt.show()
# 5. 離群值箱形圖
sns.boxplot(x=df["sales"]) # 只需顯示 X 軸即可
plt.title("銷售額箱形圖")
plt.show()
# 6. 變數間關係矩陣
sns.pairplot(df["age", "income", "sales", "category"], hue="category")
plt.show()
# 7. 熱力圖
corr = df.corr()
sns.heatmap(corr, annot=True, cmap="coolwarm")
plt.title("相關係數熱力圖")
plt.show()
> **小技巧**:使用 `sns.displot()` 可一次畫出直方圖、核密度估計(KDE)以及直條圖;`sns.relplot()` 能分層顯示散點圖與回歸線。
## 4.4 常見圖形與其解析
| 圖形 | 何時使用 | 主要訊息 |
|------|----------|----------|
| **直方圖(Histogram)** | 單變數分布 | 顯示頻率與偏態(skewness) |
| **箱形圖(Boxplot)** | 離群值偵測 | 顯示中位數、四分位數與異常值 |
| **密度圖(KDE)** | 濃度估計 | 平滑化直方圖,適合比較多組分布 |
| **散點圖(Scatter Plot)** | 兩變數關聯 | 觀察線性或非線性趨勢 |
| **熱力圖(Heatmap)** | 多變數關聯 | 相關係數或統計值的矩陣視覺化 |
| **分組箱形圖** | 兩分類變數 | 比較各組的分佈差異 |
| **箱型分組圖(Violin Plot)** | 連續 + 分類 | 兼具箱形圖與密度圖資訊 |
| **雷達圖(Radar Chart)** | 多維度評估 | 觀察多變數相對表現 |
> **實務提醒**:選擇圖形時務必考慮觀眾。例如對業務人員可使用「雷達圖」展示多項 KPI;對技術人員可直接使用「散點圖」+「熱力圖」。
## 4.5 EDA 的進階技巧
1. **互動式 Dashboard**:
- `plotly Dash` 或 `Streamlit` 可快速搭建可調參數的交互式報告。
- 允許使用者即時篩選日期、分組或輸入閾值,觀察圖形變化。
2. **自動化報告**:
- `pandas_profiling` 產生包含統計摘要、相關係數、缺失值表格的 HTML 報告。
- `sweetviz` 可產生更精美的交互式報告,並包含「訓練集 vs 測試集」比較。
3. **統計檢定**:
- `scipy.stats`:t 檢定、ANOVA、Kolmogorov‑Smirnov 檢定等。
- 以圖形輔助說明,讓統計結果更易被理解。
4. **多尺度可視化**:
- 大數據可採 `Datashader` + `Bokeh` 進行高效渲染。
- 內建多級縮放,避免「點雜湊」問題。
5. **可解釋性指標**:
- 當有機會使用模型(如決策樹、隨機森林)時,先做「特徵重要性」與「SHAP」值的分布圖,與原始資料進行對比。
## 4.6 執行 EDA 的最佳實務
| 概念 | 建議 |
|------|------|
| **資料版本控制** | 用 Git 存儲 EDA 腳本,確保可重現。 |
| **參數化** | 把畫圖參數(顏色、尺寸、bin 數)放入 config,避免硬編碼。 |
| **色彩設計** | 使用色彩盲友好調色板(`colorblind` palette)與足夠對比度。 |
| **註解** | 在關鍵點加上文字說明,尤其是離群值與極端值。 |
| **資料清理前後對比** | 以「訓練集 vs 測試集」對照報告,追蹤缺失填補、標準化的影響。 |
| **文件化** | 所有圖形與說明均應寫進 README 或 Jupyter Notebook,並以 Markdown 與 LaTeX 搭配。
## 4.7 EDA 與特徵工程的關係
| 步驟 | EDA 產出 | 如何轉為特徵 |
|------|-----------|--------------|
| **分布偏態** | 直方圖、KDE | 取對數、Box‑Cox 變換 |
| **離群值** | 箱形圖、散點圖 | 影響:過濾、變換、創建「離群標誌」 |
| **缺失值** | 缺失率圖 | 決定填補策略(平均、中位數、迴歸填補) |
| **類別型變數** | 分組箱形圖 | One‑Hot 編碼、Target Encoding |
| **相關係數** | 熱力圖 | 刪除高度共線變數、PCA 或 ICA |
| **時間序列** | 時間走勢圖 | 產生滯後特徵、季節性特徵 |
> **結論**:通過 EDA,我們可提前把「資料不一致」變成「可量化的假設」,在特徵工程時就能針對性處理,從而減少模型訓練時間與提升預測準確度。
## 4.8 小結
- **EDA** 是數據科學的「第一線掃描器」;忽略它等同於在未知地形上開車。
- 使用 **Python** 或 **R** 的套件時,先選擇簡潔且可重複的圖形,逐步探索缺失、離群、分布與關聯。
- **互動式** 與 **自動化報告** 能大幅提升溝通效率與可重現性。
- EDA 的洞察直接影響 **特徵工程**、**模型假設**、**資料清洗**,因此其產出不僅是報告,更是下一階段決策的關鍵基礎。
> **一句話**:
> *把每一張圖都看作一次小實驗,讓資料在視覺化中說話,並在此基礎上設計更智能、更可靠的模型。*