跳转至

Lecture 5

1. 推断统计与预测统计 :material-assessment:

推断统计(Inferential Statistics) 是从样本数据中推断总体参数的统计方法。常用的方法有假设检验、置信区间、回归分析等。

预测统计(Predictive Statistics) 是从样本数据中预测未来数据的统计方法。常用的方法有回归分析、时间序列分析等。

两者的核心区别在于:

维度 推断统计 预测统计
目标 估计总体参数 预测未来值
关注点 参数是否显著 预测精度
典型方法 假设检验、置信区间 回归、时间序列
输出 p 值、置信区间 预测值、误差范围

2. Hypothesis Testing

2.1 假设检验的基本概念

假设检验(Hypothesis Testing) 是推断统计的核心方法,用于根据样本数据对总体参数做出判断。

  • 原假设(Null Hypothesis, \(H_0\):默认假设,通常表示"没有效果"或"没有差异"
  • 备择假设(Alternative Hypothesis, \(H_1\)\(H_a\):研究者想要证明的假设

假设检验的例子

  • \(H_0\):新药与安慰剂效果无差异
  • \(H_1\):新药效果优于安慰剂
  • \(H_0\)\(\mu = 50\)(总体均值等于 50)
  • \(H_1\)\(\mu \neq 50\)(总体均值不等于 50)

2.2 假设检验的完整流程

graph TD
    A[提出假设 H0 和 H1] --> B[选择显著性水平 α]
    B --> C[选择检验统计量]
    C --> D[计算检验统计量和 p 值]
    D --> E{p 值 < α ?}
    E -->|是| F[拒绝 H0]
    E -->|否| G[不拒绝 H0]
    F --> H[结论:结果具有统计显著性]
    G --> I[结论:证据不足以拒绝 H0]

步骤详解

  1. 提出假设:明确 \(H_0\)\(H_1\)(单尾或双尾)
  2. 选择显著性水平 \(\alpha\):通常为 0.05(5%),也可选择 0.01 或 0.10
  3. 选择检验方法:根据数据类型和分布选择合适的检验统计量
  4. 收集数据并计算:计算检验统计量和对应的 p 值
  5. 做出决策:比较 p 值与 \(\alpha\)

2.3 两类错误

\(H_0\) 为真 \(H_0\) 为假
拒绝 \(H_0\) 第一类错误(Type I) \(\alpha\) 正确(Power = \(1-\beta\)
不拒绝 \(H_0\) 正确 第二类错误(Type II) \(\beta\)
  • 第一类错误(假阳性)\(H_0\) 为真却拒绝了,概率为 \(\alpha\)
  • 第二类错误(假阴性)\(H_0\) 为假却没有拒绝,概率为 \(\beta\)

两类错误的权衡

在样本量固定的情况下,减少第一类错误(降低 \(\alpha\))会增加第二类错误(增大 \(\beta\)),反之亦然。要同时降低两类错误,唯一的办法是 增加样本量

2.4 p 值的正确理解

p 值 是在原假设为真的前提下,观测到当前样本结果(或更极端结果)的概率。

\[ p\text{-value} = P(\text{观测数据} \mid H_0 \text{为真}) \]

p 值的常见误解

  • ❌ p 值是 \(H_0\) 为真的概率
  • ❌ \(1-p\)\(H_1\) 为真的概率
  • ❌ p 值越小,效果越大
  • ✅ p 值是在 \(H_0\) 为真时,观测到当前或更极端数据的概率
  • ✅ p 值 < \(\alpha\) 意味着在 \(H_0\) 下观测到当前数据是"不寻常"的
p 值范围 解读
\(p < 0.01\) 非常强的证据反对 \(H_0\)
\(0.01 \leq p < 0.05\) 较强的证据反对 \(H_0\)
\(0.05 \leq p < 0.10\) 微弱的证据反对 \(H_0\)
\(p \geq 0.10\) 没有足够证据反对 \(H_0\)

2.5 常用检验方法

用于检验 均值 是否有显著差异,适用于小样本(\(n < 30\))或总体方差未知的情况。

单样本 t 检验:检验样本均值是否等于某个已知值

\[t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}\]

独立样本 t 检验:检验两组均值是否相等

\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\]

配对样本 t 检验:检验同一组样本前后两次测量的均值差异

Python
from scipy import stats

# 单样本 t 检验
t_stat, p_value = stats.ttest_1samp(data, popmean=50)

# 独立样本 t 检验
t_stat, p_value = stats.ttest_ind(group1, group2)

# 配对样本 t 检验
t_stat, p_value = stats.ttest_rel(before, after)

用于检验 分类变量 之间是否独立。

\[\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}\]

其中 \(O_i\) 是观测频数,\(E_i\) 是期望频数。

Python
1
2
3
4
5
6
7
from scipy.stats import chi2_contingency

# 构建列联表
contingency_table = pd.crosstab(df['gender'], df['purchase'])

chi2, p_value, dof, expected = chi2_contingency(contingency_table)
print(f"Chi2 = {chi2:.4f}, p-value = {p_value:.4f}")

用于检验 三组及以上 的均值是否有显著差异。

\[F = \frac{\text{组间方差}}{\text{组内方差}} = \frac{MS_{between}}{MS_{within}}\]
Python
1
2
3
4
5
from scipy.stats import f_oneway

# 单因素方差分析
f_stat, p_value = f_oneway(group1, group2, group3)
print(f"F = {f_stat:.4f}, p-value = {p_value:.4f}")

ANOVA 后的多重比较

ANOVA 只告诉你"至少有一组不同",但不告诉你哪组不同。事后需要进行 事后检验(Post-hoc Test),如 Tukey HSD 或 Bonferroni 校正。

3. 置信区间(Confidence Interval)

置信区间 提供了总体参数的估计范围,比单一点估计更有信息量。

\[ \text{CI} = \bar{x} \pm z_{\alpha/2} \cdot \frac{s}{\sqrt{n}} \]

其中 \(z_{\alpha/2}\) 是标准正态分布的临界值:

置信水平 \(\alpha\) \(z_{\alpha/2}\)
90% 0.10 1.645
95% 0.05 1.960
99% 0.01 2.576
Python
import numpy as np
from scipy import stats

data = [52, 48, 50, 53, 49, 51, 47, 50, 52, 48]
n = len(data)
mean = np.mean(data)
se = stats.sem(data)  # 标准误

# 95% 置信区间
ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=se)
print(f"均值 = {mean:.2f}")
print(f"95% CI = [{ci[0]:.2f}, {ci[1]:.2f}]")

置信区间的正确理解

"95% 置信区间"的含义是:如果重复抽样 100 次并构建 100 个置信区间,大约 95 个区间会包含真实的总体参数。它不是说"参数有 95% 的概率落在这个区间内"——参数是固定的,区间是随机的。

4. 回归分析基础

回归分析(Regression Analysis) 用于建模因变量(目标)与一个或多个自变量(特征)之间的关系。

4.1 简单线性回归

\[ \hat{y} = \beta_0 + \beta_1 x \]

其中 \(\beta_0\) 是截距,\(\beta_1\) 是斜率。使用 最小二乘法(OLS) 求解:

\[ \beta_1 = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sum(x_i - \bar{x})^2}, \quad \beta_0 = \bar{y} - \beta_1\bar{x} \]
Python
from sklearn.linear_model import LinearRegression
import numpy as np

X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2.1, 3.9, 6.2, 7.8, 10.1])

model = LinearRegression()
model.fit(X, y)

print(f"截距: {model.intercept_:.4f}")
print(f"斜率: {model.coef_[0]:.4f}")
print(f"R²: {model.score(X, y):.4f}")

4.2 模型评估指标

指标 公式 含义
\(R^2\) \(1 - \frac{SS_{res}}{SS_{tot}}\) 模型解释的方差比例,越接近 1 越好
MSE \(\frac{1}{n}\sum(y_i - \hat{y}_i)^2\) 均方误差
RMSE \(\sqrt{MSE}\) 均方根误差,与 \(y\) 同量纲
MAE $\frac{1}{n}\sum y_i - \hat{y}_i

4.3 多元线性回归与逻辑回归

\[\hat{y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p\]
Python
1
2
3
4
5
6
7
8
from sklearn.linear_model import LinearRegression

X = df[['age', 'income', 'education_years']]
y = df['spending']

model = LinearRegression()
model.fit(X, y)
print("各特征系数:", dict(zip(X.columns, model.coef_)))

多重共线性

当自变量之间高度相关时,回归系数的估计会变得不稳定。可通过 方差膨胀因子(VIF) 检测,VIF > 10 表示严重的多重共线性。解决方法:去除相关特征或使用 Ridge/Lasso 回归。

逻辑回归用于 分类问题,输出概率值:

\[P(y=1|x) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x)}}\]
Python
1
2
3
4
5
6
7
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

逻辑回归的输出经过 Sigmoid 函数 映射到 \([0, 1]\) 区间,适合二分类问题。对于多分类问题,可使用 Softmax 回归(多项逻辑回归)。