聊天視窗

決策的數據語言:從原始數據到洞察力 - 第 4 章

第 4 章 探索性資料分析

發布於 2026-03-03 09:06

# 第 4 章 探索性資料分析 > **目的**:在模型建構之前,先透過圖形與統計量快速掌握資料結構、分布與關聯,為後續分析奠定堅實基礎。 --- ## 4.1 為什麼要做探索性資料分析(EDA) | 目的 | 說明 | |------|------| | **資料質量檢查** | 找出缺失值、異常值與重複觀測。 | | **分布理解** | 確認變數是否符合正態分布、檢視偏態。 | | **關聯發現** | 量化特徵之間的線性或非線性關係。 | | **假設生成** | 為統計推斷或機器學習模型提供初步假設。 | | **溝通橋樑** | 以可視化方式向非技術利益相關者說明資料特徵。 | > **小提醒**:EDA 不是最後一步,而是模型選擇與特徵工程的起點。 --- ## 4.2 基本統計量與直方圖 > **核心統計量**:平均值、媒體、標準差、四分位數、極值。 python import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 範例資料載入 df = pd.read_csv('data/transactions.csv') # 取出金額欄位 amount = df['amount'] # 基本統計量 print(amount.describe()) # 直方圖 + KDE sns.histplot(amount, kde=True, bins=30, color='steelblue') plt.title('交易金額分布') plt.xlabel('金額 (NT$)') plt.ylabel('頻率') plt.show() ### Q-Q 圖 檢查是否接近正態分布。 python import scipy.stats as stats stats.probplot(amount, dist='norm', plot=plt) plt.title('Q-Q 圖') plt.show() > **實務技巧**:若 Q‑Q 圖明顯偏離對角線,考慮對數轉換或使用非參數模型。 --- ## 4.3 盒鬚圖(Boxplot)與異常檢測 python sns.boxplot(x=amount, color='lightgreen') plt.title('交易金額盒鬚圖') plt.xlabel('金額 (NT$)') plt.show() > **說明**:盒鬚圖即四分位數、最大/最小值與離群值。離群值通常以 1.5 × IQR 外的點表示。 > **實務**:在金融風險評估中,異常交易往往代表欺詐或系統錯誤,需進一步人工審查。 --- ## 4.4 相關矩陣與熱力圖 python # 只保留數值型變數 num_df = df.select_dtypes(include=['int64', 'float64']) # 相關係數矩陣 corr = num_df.corr(method='pearson') # 熱力圖 sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1) plt.title('特徵相關矩陣') plt.show() | 變數 | 相關係數範例 | |------|--------------| | `amount` vs `fee` | 0.73 | | `amount` vs `customer_age` | -0.05 | > **解讀**:正相關表示兩者同時升高;負相關則相反。若相關係數接近 0,可能存在非線性關係或無直接關聯。 > **進階**:使用 Spearman(秩相關)或 Kendall(一致性)可捕捉非線性趨勢。 --- ## 4.5 分群視覺化:層級聚類與 K‑means ### 層級聚類(Dendrogram) python from scipy.cluster.hierarchy import dendrogram, linkage # 以 `amount`、`fee`、`time_of_day` 建立距離矩陣 X = num_df[['amount', 'fee', 'time_of_day']].values Z = linkage(X, method='ward') plt.figure(figsize=(10, 4)) _dendrogram = dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12.) plt.title('層級聚類 Dendrogram') plt.xlabel('樣本編號') plt.ylabel('距離') plt.show() ### K‑means 直方圖 python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, random_state=42) labels = kmeans.fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6) plt.title('K‑means 聚類結果 (前兩維)') plt.xlabel('amount') plt.ylabel('fee') plt.show() > **使用場景**:客戶細分、風險分層、異常交易分群。 --- ## 4.6 時間序列探索 python # 轉成時間序列索引 df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) # 日交易總額 daily = df['amount'].resample('D').sum() plt.plot(daily.index, daily.values) plt.title('每日交易總額趨勢') plt.xlabel('日期') plt.ylabel('金額 (NT$)') plt.show() ### 自相關圖(ACF)與偏自相關圖(PACF) python from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plot_acf(daily, lags=30) plt.title('自相關圖 (ACF)') plt.show() plot_pacf(daily, lags=30) plt.title('偏自相關圖 (PACF)') plt.show() > **解讀**:週期性顯現在自相關圖中。若 ACF 在 7、14 等滯後處有顯著峰值,代表存在一週週期。 --- ## 4.7 交叉表與分層分析 python # 交易類型與付款方式的交叉表 ct = pd.crosstab(df['payment_method'], df['transaction_type'], normalize='index') ct.plot(kind='barh', stacked=True, figsize=(8, 6)) plt.title('付款方式與交易類型分佈') plt.xlabel('比例') plt.ylabel('付款方式') plt.legend(title='交易類型', bbox_to_anchor=(1.05, 1)) plt.tight_layout() plt.show() > **分層**:可進一步用 `groupby` 針對不同客戶族群(如年齡、地區)進行統計,發現潛在的偏差。 --- ## 4.8 實務案例:零售交易數據的 EDA | 步驟 | 目標 | 主要工具 | |------|------|----------| | 1. 資料載入 | 讀取 CSV/DB | pandas, sqlalchemy | | 2. 缺失值檢查 | 了解缺失比例 | pandas.isnull, matplotlib heatmap | | 3. 分布可視化 | 判斷分布形態 | seaborn histplot, kde | | 4. 相關性 | 估計特徵關聯 | seaborn heatmap, scipy.stats | | 5. 時間趨勢 | 發現季節性 | pandas resample, matplotlib line | | 6. 分群分析 | 針對高價值客戶 | scikit‑learn KMeans | | 7. 報告輸出 | 生成 PDF/HTML | pandas‑excelwriter, matplotlib, seaborn | > **關鍵發現**:在 2023 年 11 月節慶期間,`transaction_amount` 平均提升 35%;支付方式為 `Apple Pay` 的交易比例增加 12%;高價值客戶(前 10%)的交易頻率比低價值客戶高 3 倍。 --- ## 4.9 執行流程與最佳實踐 1. **版本化資料**:使用 DVC 或 Git LFS 管理原始資料。 2. **Jupyter Notebook 或 Polars Notebook**:便於即時可視化與迭代。 3. **重現性**:將分析腳本封裝為 Python 模組,使用 `pytest` 進行單元測試。 4. **可讀性**:統一命名規則,使用 `snake_case`;所有圖表都加上標題、坐標軸名稱與圖例。 5. **存取權限**:在雲端資料倉儲(Snowflake、Redshift)上設置 RBAC;在程式碼中使用環境變數或 Secret Manager 讀取憑證。 6. **資料隱私**:對客戶敏感欄位進行匿名化或加密,並在 EDA 報告中使用聚合統計以避免個人資料外泄。 --- ## 4.10 小結 - **EDA 是資料科學的門檻**:透過可視化與統計量,快速掌握資料特性。 - **圖表是語言**:正確選擇圖形能把複雜資訊簡化,並與非技術人士溝通。 - **可重複性與合規**:結合版本控制、測試與資料治理,確保分析可追溯且符合法規。 - **下一步**:在第 5 章中,我們將把 EDA 的發現轉化為統計推斷,進一步驗證假設。 --- > **實務小建議**:在每個 EDA 項目完成後,務必將關鍵圖表與統計表格匯出為 PDF,並在報告中標註資料來源、處理步驟與可能的偏差,以提升決策透明度。