聊天視窗

資料驅動決策:從數據探索到模型部署 - 第 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 章!