返回目錄
A
數據科學:從原始資料到策略洞察 - 第 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,從資料中挖掘關鍵洞察,並為後續模型開發與決策提供有力支撐。