聊天視窗

資料科學實戰:從數據到洞察 - 第 3 章

第3章 探索性資料分析(EDA)

發布於 2026-02-27 05:21

# 第3章 探索性資料分析(EDA) > **核心觀念**:在任何資料科學專案中,EDA 是「洞察的起點」與「品質保證的過關測試」。透過圖表、統計指標與交互式視覺化,我們能快速驗證假設、發現異常、決定特徵處理方向。以下章節以剛剛完成清洗的金融交易資料為例,示範如何使用 Pandas、Matplotlib、Seaborn 進行完整的 EDA。 --- ## 3.1 為何進行 EDA | 目的 | 說明 | |------|------| | 需求確認 | 了解業務問題、資料結構、欄位含義 | | 資料品質驗證 | 檢查遺失、離群、重複、資料型別 | | 規劃特徵工程 | 先驗證變數間關係、分布特徵 | | 模型預備 | 針對模型假設(如正態、獨立性)做初步檢驗 | > **實務提醒**:EDA 的時間投入往往比模型訓練更長,因為它是「資料之門」。若忽略此步驟,往往會在後續模型階段因資料假設錯誤而失敗。 ## 3.2 典型圖表工具 | 工具 | 主要用途 | 典型圖表 | |------|----------|----------| | Matplotlib | 基礎繪圖、靜態圖 | 折線圖、長條圖、散佈圖 | | Seaborn | 統計視覺化、色彩調整 | Boxplot、Violin、Pairplot | | Pandas | 快速畫圖、快速摘要 | df.plot()、df.hist() | > **建議**:在實務中,先用 Pandas 取快照,再用 Seaborn 進行精緻化呈現。 ## 3.3 資料分布檢查 python import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 讀取已清洗資料 df = pd.read_csv('cleaned_transactions.csv') # 1. 變數摘要 print(df.describe(include='all')) # 2. 直方圖 df['transaction_amount'].hist(bins=50, figsize=(8,5), color='skyblue') plt.title('交易金額分布') plt.xlabel('金額 (元)') plt.ylabel('頻數') plt.show() # 3. 箱型圖(離群檢測) sns.boxplot(x=df['transaction_amount']) plt.title('交易金額離群檢測') plt.show() > **分析點**:觀察右偏分布是否需要對數轉換;離群值是否真的異常或是業務邏輯。 ## 3.4 相關性與協方差 python # 相關係數矩陣 corr = df.corr() plt.figure(figsize=(10,8)) sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f') plt.title('變數相關係數熱力圖') plt.show() > **解讀**:高相關係數(|r|>0.7)可能導致多重共線性,需要考慮特徵選擇或降維;負相關可揭示潛在反向影響。 ## 3.5 時序分析(如果有時間戳) python # 確保時間戳為 datetime df['transaction_time'] = pd.to_datetime(df['transaction_time']) # 設置索引 df.set_index('transaction_time', inplace=True) # 每日交易總額 daily = df['transaction_amount'].resample('D').sum() plt.figure(figsize=(12,4)) daily.plot() plt.title('每日交易總額時間序列') plt.ylabel('金額 (元)') plt.show() > **商業洞察**:發現週末或節假日的交易量波動,或是某個時段高峰,進而調整風控閾值。 ## 3.6 特徵工程前的洞察 | 特徵 | 觀察結果 | 可能處理方式 | |------|----------|--------------| | transaction_amount | 右偏、離群 | log 轉換、Winsorising | | customer_age | 正態分布 | 標準化 | | transaction_day_of_week | 星期一高峰 | 建立週期性 dummy | | merchant_category | 種類多元 | 進行 one‑hot 或 target encoding | > **注意**:EDA 的洞察不應該直接成為模型特徵,而是「決策點」。例如,若發現 `transaction_amount` 的 log 轉換後對模型表現更佳,就在特徵工程階段實作;若發現某些類別對結果無影響,可直接刪除。 ## 3.7 常見陷阱與實務小技巧 1. **過度擬合的可視化**:在大量資料上直接畫散佈圖會變得雜亂。可採用 `sns.scatterplot(alpha=0.3)` 或 `sns.jointplot(kind='hex')`。 2. **缺失值在圖表中的處理**:Matplotlib 會自動忽略 NaN,但 Seaborn 可能產生誤導。先使用 `df.dropna()` 或填補後再畫圖。 3. **顏色選擇**:對色盲友善的配色(如 Tableau 10)可提高報告可讀性。 4. **重複計算成本**:在大型資料集上,先使用 Pandas 的 `describe()` 與 `value_counts()` 取快照,再用分塊(chunk)方式進行可視化。 ## 3.8 實務案例:金融欺詐交易資料 1. **資料描述**:`cleaned_transactions.csv` 包含 200,000 條交易,欄位包括 `transaction_id, customer_id, transaction_amount, transaction_time, merchant_category, is_fraud`。 2. **EDA 步驟**: - 先檢查 `is_fraud` 分布,發現 1.2% 為欺詐。 - 觀察 `transaction_amount` 在欺詐與非欺詐的分布差異,發現欺詐交易金額偏高。 - 透過 `sns.boxplot(x='is_fraud', y='transaction_amount', data=df)` 直觀呈現。 - 時間序列顯示某段時間(假期前夕)欺詐率升高。 - 相關性矩陣發現 `merchant_category` 與 `is_fraud` 相關度較高,提出將類別做 target encoding。 3. **洞察成果**:基於 EDA 的結果,我們在特徵工程階段加入: - `log_amount`:交易金額取對數。 - `merchant_target_encoding`:每個商戶的欺詐率。 - `weekday`:交易週幾。 - `hour_bin`:時間段(0‑6、7‑12、13‑18、19‑23) 4. **後續步驟**:進入 4 章模型選擇,使用 LightGBM、XGBoost 與深度學習,並以 AUC、Precision‑Recall 為評估指標。 --- ## 3.9 小結 - **EDA 不是「一次性工作」**:資料流動時需定期重新檢視,確保洞察仍然有效。 - **圖表即是語言**:精心設計的視覺化能將複雜統計變成直觀商業洞察。 - **洞察轉化為特徵**:EDA 為特徵工程提供「線索」與「證據」,而不是直接生成模型。 - **品質先行**:即使後續模型表現優異,若資料品質不佳也會帶來風險,特別在金融領域。 > **下個章節**:4章將以這些洞察為基礎,實作特徵工程、模型訓練與評估,進一步將「資料到洞察」推向「洞察到決策」。