聊天視窗

資料科學深度探究:從原理到實務 - 第 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,並在最後加上 `# ----` 以區隔。這不僅幫你整理思路,也方便日後重複執行。 --- > **結語**:統計學不是魔法,而是一套嚴謹的推論語言。只要把數據視為證據,並透過適當的假設檢定與參數估計,你就能將「噪聲」轉化為「洞察」。下一章將帶你進入機器學習的領域,從簡單的線性模型走向深度學習。祝學習愉快!