聊天視窗

數據驅動決策:從原始資料到洞察的全流程 - 第 4 章

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

發布於 2026-02-22 14:02

# 第 4 章:探索性資料分析(EDA) > **先前章節回顧**:在資料清洗完成後,資料量維持 92%,模型準確率提升 3.8%。此章將在此基礎上,進行深入的資料探索,為後續特徵工程與建模奠定堅實的基礎。 --- ## 4.1 章節定位 探索性資料分析(Exploratory Data Analysis, EDA)是資料科學流程中的關鍵步驟,目的在於: - **快速洞察資料結構**:了解每個變數的分佈、缺失情形、極端值等。 - **發現潛在關係**:尋找變數間的線性或非線性關聯。 - **檢驗假說**:驗證業務假設是否與資料一致。 - **引導特徵工程**:根據觀察結果選擇合適的特徵轉換或萃取方法。 在實務中,良好的 EDA 能節省大量時間,避免「試錯」式的模型開發。 ## 4.2 基礎統計描述 統計描述是 EDA 的起點,能快速掌握資料的中心趨勢、離散程度與分佈形態。 | 變數 | 觀測數量 | 平均值 | 中位數 | 標準差 | 最小值 | 最大值 | |------|----------|--------|--------|--------|--------|--------| | `price` | 10,000 | 250.3 | 200 | 80 | 20 | 1,200 | | `discount` | 10,000 | 0.15 | 0.10 | 0.08 | 0 | 0.75 | | `order_count` | 10,000 | 5.2 | 3 | 2.7 | 1 | 20 | > **Python 例子**: python import pandas as pd df = pd.read_csv('sales_cleaned.csv') summary = df.describe().T[['count', 'mean', 'median', 'std', 'min', 'max']] print(summary) > **解讀技巧**: > - **偏態**:若 `mean > median`,分佈右偏;若 `mean < median`,左偏。 > - **離群值警訊**:`max` 與 `mean` 差距過大,或 `std` 超過 2 倍時,值得進一步檢查。 ## 4.3 資料視覺化:單變量 視覺化可以將統計數字轉化為直觀圖像,常用工具:Matplotlib、Seaborn、Plotly。 ### 4.3.1 直方圖 & 密度圖 python import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 4)) sns.histplot(df['price'], kde=True, bins=30, color='skyblue') plt.title('Price Distribution') plt.xlabel('Price ($)') plt.ylabel('Frequency') plt.show() ### 4.3.2 箱型圖(Boxplot) python plt.figure(figsize=(6, 4)) sns.boxplot(x=df['region'], y=df['price'], palette='pastel') plt.title('Price by Region') plt.xlabel('Region') plt.ylabel('Price ($)') plt.show() > **觀察重點**: > - **四分位距 (IQR)**:IQR = Q3 - Q1;離群值常以 1.5*IQR 為界。 > - **箱體上下端**:分別代表 25% 和 75% 分位數。 > - **外部點**:可能是異常值,需核對原始資料。 ## 4.4 多變量探索 多變量分析能揭示不同特徵間的相互關係,常用方法包括相關係數矩陣、熱力圖、散點圖矩陣(Pairplot)等。 ### 4.4.1 相關係數矩陣 python corr = df.corr(method='pearson') print(corr) > **範例**: > - `price` 與 `discount` 可能呈現負相關。 > - `order_count` 與 `price` 可能呈現正相關。 ### 4.4.2 熱力圖 python plt.figure(figsize=(10, 8)) sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f') plt.title('Correlation Heatmap') plt.show() ### 4.4.3 散點圖矩陣(Pairplot) python sns.pairplot(df[['price', 'discount', 'order_count']], hue='region', palette='Set2') plt.show() > **使用提示**: > - 在 `hue` 參數中加入類別變數,可觀察不同類別下的關聯模式。 > - 若資料量過大,可採用 `sample()` 先抽樣。 ## 4.5 進階 EDA 技術 ### 4.5.1 分類變數可視化 - **計數圖(Countplot)**:展示各類別頻次。 - **條形圖(Barplot)**:配合聚合函式(如平均值)可展示不同類別的指標。 python plt.figure(figsize=(8, 4)) sns.countplot(x='status', data=df, palette='viridis') plt.title('Order Status Count') plt.xlabel('Status') plt.ylabel('Count') plt.show() ### 4.5.2 交叉表(Cross‑Tabulation) python cross = pd.crosstab(df['region'], df['status'], normalize='index') print(cross) > **交叉表** 可以快速了解類別之間的比例關係。 ### 4.5.3 時間序列 EDA 對於有時間戳的資料,建議先轉為 Datetime 格式,然後使用 `lineplot`、`lag plot`、`seasonal_decompose` 等。 python df['order_date'] = pd.to_datetime(df['order_date']) monthly = df.set_index('order_date').resample('M').agg({'price':'sum', 'order_count':'sum'}) sns.lineplot(data=monthly, palette='crest') plt.title('Monthly Sales Trend') plt.show() ### 4.5.4 非線性關聯檢測 - **分位數迴歸(Quantile Regression)**:觀察不同分位數下的迴歸斜率。 - **交叉驗證(Cross‑Validation)**:對於非線性模型,先在 EDA 階段做簡單可視化(如 `scatter + loess`)以判斷是否需要非線性轉換。 ## 4.6 EDA 案例研究:線上零售商業場景 ### 4.6.1 背景 一個跨境電商平台想了解「高價產品是否會因大折扣而減少銷量」的假設。 ### 4.6.2 探索流程 1. **資料準備**:使用已清洗完成的 `sales_cleaned.csv`。 2. **單變量檢查**:箱型圖顯示某些 `price` 離群值,且直方圖呈現右偏。 3. **多變量相關**:相關係數矩陣顯示 `price` 與 `discount` 的負相關係數為 -0.35。 4. **分組分析**:計數圖與條形圖顯示 `discount` 高於 0.5 的 `region` 數量極少,可能不具代表性。 5. **離群值處理**:IQR 計算後發現 3% 的 `price` 超過 1.5*IQR,進行資料核對後發現為測試樣本,於建模時可移除。 6. **結論**:EDA 驗證了「價格高、折扣低時銷量高」的假設,並指出 `region` 之間價格差異顯著,建議在特徵工程中加入區域折扣補償項。 ## 4.7 實務操作建議 | 項目 | 建議 | 說明 | |------|------|------| | 資料量 | 抽樣後可視化 | 若資料量 > 50k,先使用 `df.sample(5000)` 進行快速畫圖。 | 時間成本 | 30 分鐘內完成基本 EDA | 以統計描述、直方圖、箱型圖、熱力圖為主。 | 版本控制 | EDA Notebook / Jupyter | 透過 Git 管理,並設定 `requirements.txt` 保障重現性。 | 註解 | 圖表註解簡潔 | 標題、x/y 軸、顏色映射必須能讓讀者一眼明白。 | 交叉驗證 | 在 EDA 時做小規模交叉驗證 | 可先用 `train_test_split` 進行 70/30 分割,確認分佈是否保持一致。 ## 4.8 小結 - **統計描述 + 視覺化** 是快速掌握資料特徵的「速成手段」。 - **相關係數熱力圖** 能快速找出潛在關聯,並形成假說。 - **多變量可視化**(Pairplot、散點圖)有助於捕捉非線性關係。 - **進階技術**(交叉表、時間序列 EDA)適用於分類特徵與時間戳資料。 - EDA 的成果直接影響 **特徵工程** 與 **模型選擇**,因此應當在專案初期投入足夠時間。 --- ## 4.9 參考文獻 - Tukey, J. W. (1977). *Exploratory Data Analysis*. Addison‑Wesley. - McKinney, W. (2010). *Data Analysis with Python and Pandas*. O'Reilly Media. - Vandehey, T. (2018). *Visualizing Data with Seaborn*. DataCamp. - Han, J., Kamber, M., & Pei, J. (2011). *Data Mining: Concepts and Techniques*. Elsevier. - 資料可視化最佳實踐:<https://seaborn.pydata.org/tutorial.html> --- > **後續章節**:在本章完成後,將進入「特徵工程(Feature Engineering)」,將 EDA 觀察結果轉化為具體的特徵轉換與創建策略。