返回目錄
A
資料科學深度探究:從原理到實務 - 第 3 章
第三章:統計學基礎與假設檢定
發布於 2026-02-26 09:39
# 第三章:統計學基礎與假設檢定
> **「數據不是數字,統計是把它們說話的藝術。」** – 這句話在本章將被一一拆解。
---
## 3.1 統計學概念回顧
| 重要概念 | 定義 | 典型應用 |
|---|---|---|
| **母體** | 所有可能觀測值的集合 | 生產線產品品質、學生成績分布 |
| **樣本** | 從母體抽取的有限子集 | 100名顧客滿意度調查 |
| **參數** | 母體特徵的數值描述 | σ\(\)(母體標準差) |
| **統計量** | 根據樣本計算的參數估計 | ɑ(樣本平均) |
| **偏差** | 期望值與真實參數之差 | 低偏差=高信賴 |
| **一致性** | 隨樣本量增大,統計量趨向真實參數 | ɑ → μ |
> **提醒**:在實務中,往往只能得到樣本,統計學的核心就是把樣本推廣回母體。若忘了這一步,所有分析都失去意義。
---
## 3.2 參數估計
1. **點估計**:一個數值作為參數的估計。
2. **區間估計**:提供一個範圍,說明參數在此範圍內的概率。
### 3.2.1 樣本平均與樣本標準差
python
import numpy as np
np.random.seed(42)
# 產生一組服從正態分布的樣本
sample = np.random.normal(loc=50, scale=5, size=200)
# 點估計
sample_mean = sample.mean()
sample_std = sample.std(ddof=1) # ddof=1 代表自由度調整
print('樣本平均:', sample_mean)
print('樣本標準差:', sample_std)
> **小技巧**:`ddof=1` 能確保樣本標準差是無偏估計。若用 `ddof=0`,則會低估。
---
## 3.3 假設檢定
### 3.3.1 單樣本 t 檢定
> **假設**:母體平均數 μ = 50,觀察到的樣本平均是否顯著偏離 50?
python
from scipy import stats
# 零假設 H0:μ = 50
t_stat, p_value = stats.ttest_1samp(sample, 50)
print('t-statistic:', t_stat)
print('p-value:', p_value)
> 若 `p-value < 0.05`,則拒絕零假設,表明樣本平均數在統計上顯著不同。
### 3.3.2 雙樣本 t 檢定
比較兩個獨立群體的平均數是否相同。
python
# 生成另一組樣本
sample2 = np.random.normal(loc=52, scale=5, size=180)
t_stat, p_val = stats.ttest_ind(sample, sample2, equal_var=False)
print('雙樣本 t-statistic:', t_stat)
print('雙樣本 p-value:', p_val)
> `equal_var=False` 為 Welch's t-test,適用於方差不相等的情況。
### 3.3.3 卡方檢定(獨立性)
python
# 兩類產品的合格率
data = np.array([[120, 30], # 產品A 合格/不合格
[100, 40]]) # 產品B 合格/不合格
chi2, p, dof, exp = stats.chi2_contingency(data)
print('卡方統計量:', chi2)
print('p-value:', p)
---
## 3.4 置信區間
python
# 95% 置信區間
ci_low, ci_high = stats.t.interval(alpha=0.95, df=len(sample)-1, loc=sample_mean, scale=sample_std/np.sqrt(len(sample)))
print('95% CI for mean:', ci_low, '~', ci_high)
> 置信區間比單純 p-value 更具解釋性:它告訴你「平均值在這個範圍內的可能性 95%」。
---
## 3.5 相關與回歸
### 3.5.1 皮爾森相關係數
python
# 兩變量示例
x = np.random.normal(0, 1, 200)
y = 0.5 * x + np.random.normal(0, 0.5, 200)
pearson_r, _ = stats.pearsonr(x, y)
print('皮爾森相關係數:', pearson_r)
### 3.5.2 簡單線性回歸
python
import statsmodels.api as sm
X = sm.add_constant(x) # 加上截距項
model = sm.OLS(y, X).fit()
print(model.summary())
> **警告**:線性回歸假設殘差正態分布且同方差。若違反,請考慮轉換或更複雜的模型。
---
## 3.6 多變量統計
### 3.6.1 主成份分析(PCA)
python
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# 輸入隨機多維資料
X = np.random.randn(150, 5)
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
principal_components = pca.fit_transform(X_scaled)
print('第一主成份方差占比:', pca.explained_variance_ratio_[0])
> 透過 PCA 可降低維度,保留大部分資訊,特別適合高維圖像或基因資料。
---
## 3.7 代碼範例:完整分析流程
python
# 步驟 1: 資料載入
import pandas as pd
df = pd.read_csv('iris.csv') # 假設有此檔案
# 步驟 2: 前處理
from sklearn.model_selection import train_test_split
X = df.drop('species', axis=1)
y = df['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 步驟 3: 標準化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 步驟 4: 建模(多項式邏輯回歸)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=200)
model.fit(X_train_scaled, y_train)
# 步驟 5: 評估
from sklearn.metrics import classification_report, confusion_matrix
pred = model.predict(X_test_scaled)
print(classification_report(y_test, pred))
print(confusion_matrix(y_test, pred))
> **重點**:每一步都要記錄版本與隨機種子,才能確保可重複。
---
## 3.8 重複實驗設計
1. **設定隨機種子**:`np.random.seed(42)`。
2. **資料分層抽樣**:確保各類別比例保持。
3. **多次交叉驗證**:`KFold(n_splits=5, shuffle=True, random_state=42)`。
4. **結果可視化**:利用 Seaborn 的 `boxplot` 或 `violinplot` 展示模型表現分布。
---
## 3.9 讀者練習
1. 使用 `seaborn` 的 `tips` 資料集,計算「tip」與「total bill」的相關係數,並繪製散佈圖。
2. 對 `Boston` 房價資料,實作 5 折交叉驗證的線性回歸,報告平均 R²。
3. 以 `wine` 資料集做主成份分析,將前兩個主成份畫成散點圖,觀察不同葡萄酒種類的聚類。
> **提示**:在 Jupyter Notebook 中將每個步驟拆成單獨 cell,並在最後加上 `# ----` 以區隔。這不僅幫你整理思路,也方便日後重複執行。
---
> **結語**:統計學不是魔法,而是一套嚴謹的推論語言。只要把數據視為證據,並透過適當的假設檢定與參數估計,你就能將「噪聲」轉化為「洞察」。下一章將帶你進入機器學習的領域,從簡單的線性模型走向深度學習。祝學習愉快!