聊天視窗

數據科學:從原始資料到策略洞察 - 第 3 章

第 3 章:探索性資料分析

發布於 2026-02-25 09:47

# 第 3 章:探索性資料分析 探索性資料分析(Exploratory Data Analysis,簡稱 EDA)是資料科學流程中極為重要的一環。透過統計描述、視覺化與分佈分析,我們不僅能快速瞭解資料結構、品質與潛在關係,還能為後續特徵工程、模型選擇與假設檢定奠定基礎。本章將以實務為導向,示範常用方法、工具及實際範例,協助讀者在日常業務問題中快速產出洞察。 --- ## 3.1 章節概覽 | 內容 | 目的 | |------|------| | 統計描述 | 快速取得均值、中位數、標準差等統計量 | | 視覺化技巧 | 以圖表呈現資料分佈、關聯與異常 | | 分佈分析 | 檢測正態性、異常值與多重共線性 | | 工具介紹 | 建議使用的 Python 套件與最佳實踐 | --- ## 3.2 統計描述 統計描述提供對資料的「量化概覽」。常見指標包括: | 指標 | 定義 | |------|------| | **平均值** (`mean`) | 所有數值之和除以樣本數 | | **中位數** (`median`) | 排序後中間位置的數值 | | **標準差** (`std`) | 測量數據波動程度 | | **變異係數** (`coef_of_variation`) | `std / mean`,衡量相對變動 | | **偏度** (`skewness`) | 分佈左右不對稱程度 | | **峰度** (`kurtosis`) | 分佈尖銳或平坦程度 | ### 3.2.1 Python 例子 ```python import pandas as pd import numpy as np # 讀取範例資料 url = 'https://raw.githubusercontent.com/selva86/datasets/master/mtcars.csv' mtcars = pd.read_csv(url) # 計算描述統計 desc = mtcars.describe().T # 轉置方便閱讀 # 加入偏度與峰度 from scipy.stats import skew, kurtosis for col in mtcars.select_dtypes(include='number').columns: desc.loc[col, 'skew'] = skew(mtcars[col]) desc.loc[col, 'kurtosis'] = kurtosis(mtcars[col]) print(desc[['mean','median','std','skew','kurtosis']]) ``` 執行後可見每個數值欄位的統計量,快速判斷哪裡可能存在異常或非正態分佈。 --- ## 3.3 資料視覺化技巧 視覺化是理解資料分佈與關係最直觀的方式。以下列出常用圖表與實作技巧。 ### 3.3.1 直方圖與 KDE - **直方圖**:展示連續變數的頻率分佈。 - **KDE(Kernel Density Estimate)**:平滑版的概率密度函數。 ```python import matplotlib.pyplot as plt import seaborn as sns # 直方圖 + KDE plt.figure(figsize=(10,6)) sns.histplot(mtcars['hp'], kde=True, color='steelblue') plt.title('馬力 (HP) 直方圖與 KDE') plt.xlabel('HP') plt.ylabel('頻率') plt.show() ``` ### 3.3.2 箱型圖 - 用於顯示中位數、四分位數、離群值。 - 1.5 * IQR 以上的值視為離群。 ```python plt.figure(figsize=(8,5)) sns.boxplot(y=mtcars['mpg'], color='lightgreen') plt.title('每加侖英里數 (MPG) 箱型圖') plt.ylabel('MPG') plt.show() ``` ### 3.3.3 散佈圖矩陣(Pair Plot) - 探索兩兩變數之間的關係。 - 可以加入回歸線、分群顏色。 ```python sns.pairplot(mtcars[['mpg','hp','wt']], hue='cyl', diag_kind='kde') plt.show() ``` ### 3.3.4 熱力圖(Correlation Matrix) ```python corr = mtcars.corr() plt.figure(figsize=(10,8)) sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f') plt.title('相關係數熱力圖') plt.show() ``` --- ## 3.4 資料分佈分析 ### 3.4.1 正態性檢定 - **Shapiro–Wilk**:對樣本量小於 50 的資料較為敏感。 - **Kolmogorov–Smirnov**:可與指定分佈(如正態)比較。 ```python from scipy.stats import shapiro, kstest, norm stat, p = shapiro(mtcars['mpg']) print(f'Shapiro–Wilk p-value: {p:.4f}') # 與正態分佈比較 stat, p = kstest(mtcars['mpg'], 'norm', args=(mtcars['mpg'].mean(), mtcars['mpg'].std())) print(f'KS test p-value: {p:.4f}') ``` - **判斷**:若 p < 0.05,則拒絕「正態」假設。 ### 3.4.2 異常值檢測 - 使用箱型圖中的 IQR 方法: - 下界 = Q1 - 1.5*IQR - 上界 = Q3 + 1.5*IQR - 也可使用 Z-score(標準化值): |z| > 3 通常視為離群。 ```python from scipy import stats z_scores = np.abs(stats.zscore(mtcars.select_dtypes(include='number'))) outliers = (z_scores > 3).any(axis=1) print('異常值數量:', outliers.sum()) ``` ### 3.4.3 多重共線性檢測 - **Variance Inflation Factor (VIF)**:VIF > 5 或 10 表示共線性問題。 ```python from statsmodels.stats.outliers_influence import variance_inflation_factor X = mtcars[['hp','wt','cyl']] X = sm.add_constant(X) vif_data = pd.DataFrame() vif_data['feature'] = X.columns vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(vif_data) ``` --- ## 3.5 特徵工程視角 在進行特徵工程前,透過 EDA 能夠判斷哪些特徵值得保留、轉換或刪除。以下列出關鍵指標: | 視角 | 說明 | |------|------| | **變異係數** | 選擇相對變動大的特徵進行標準化 | | **相關係數矩陣** | 判斷目標變數與特徵之間的線性關聯 | | **特徵分箱** | 把連續特徵切成類別,以減少噪聲 | | **離群值處理** | 在轉換前先清除或補值離群值 | --- ## 3.6 工具與套件 | 套件 | 主要功能 | |------|----------| | `pandas` | 資料表操作與描述統計 | | `numpy` | 數值運算與陣列處理 | | `matplotlib` | 基礎繪圖 | | `seaborn` | 高階統計圖表與美化 | | `plotly` / `altair` | 互動式視覺化 | | `scipy.stats` | 統計檢定、Z-score、VIF 等 | | `statsmodels` | 統計模型與診斷 | 建議以 `pandas` + `seaborn` + `scipy` 的組合進行大部分 EDA,若需要互動式報表,可考慮 `plotly` 或 `altair`。 --- ## 3.6 小結 1. **統計描述**:先瞭解資料的核心統計量,快速定位問題變數。 2. **視覺化**:用圖表直觀呈現分佈、離群值與關聯,並結合色彩與樣式提升可讀性。 3. **分佈分析**:正態性、離群值與多重共線性檢測為後續建模的重要先決條件。 4. **特徵工程前瞭解**:透過 EDA 明確知道哪些特徵值得保留、轉換或刪除。 5. **工具選擇**:Python 生態中已有完整且成熟的 EDA 套件,建議熟悉 `pandas`、`seaborn`、`scipy` 等。 透過本章示範的範例與方法,讀者應能在實務專案中快速執行 EDA,從資料中挖掘關鍵洞察,並為後續模型開發與決策提供有力支撐。