聊天視窗

數據洞察:從資料到決策的科學方法 - 第 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 的洞察直接影響 **特徵工程**、**模型假設**、**資料清洗**,因此其產出不僅是報告,更是下一階段決策的關鍵基礎。 > **一句話**: > *把每一張圖都看作一次小實驗,讓資料在視覺化中說話,並在此基礎上設計更智能、更可靠的模型。*