关于数据科学你需要了解的20种统计学方法
入门向统计学方法,及其场景与应用
前言
原文作者:Sarowar Jahan Saurav,原文链接
数据科学是一个跨学科领域,结合了数学、统计学、计算机科学与领域知识,旨在从数据中提取有价值的洞察。虽然机器学习算法常常成为焦点,但坚实的统计基础同样关键。在本文中,我们将介绍每位数据科学家都应熟悉的20种进阶统计方法。每个方法均包含简要说明、实际应用场景和Python代码示例。
本文涉及具体概念较少,有兴趣深入了解的朋友可以自行深挖。
正文
1. 贝叶斯推断(Bayesian Inference)
定义
贝叶斯推断利用贝叶斯定理,根据新获得的证据不断更新对某一假设的概率估计。与频率派方法不同,贝叶斯方法允许引入先验知识,并随着观察数据不断修正这些信念。
应用示例
垃圾邮件过滤:可将邮件是垃圾邮件的先验概率与邮件内容(如出现的关键词)结合,实时更新邮件为垃圾邮件的概率。
代码示例(使用 PyMC3 或 PyMC)
!pip install pymc3 # 或 pymc
import pymc3 as pm
import numpy as np
# 假设观察到20次抛硬币,有12次正面(head)、8次反面(tail)
observed_heads = 12
observed_tails = 8
with pm.Model() as model:
# 对硬币偏向(theta)的先验分布:Beta分布
theta = pm.Beta('theta', alpha=1, beta=1)
# 似然函数:观察到的正面次数符合二项分布
y = pm.Binomial('y', n=observed_heads + observed_tails, p=theta, observed=observed_heads)
# 采样后验分布
trace = pm.sample(2000, tune=1000, cores=1, chains=2)
pm.summary(trace)
2. 最大似然估计(MLE)
定义
最大似然估计是一种参数估计方法,用于寻找在给定模型下最可能生成观测数据的参数值。
应用示例
分布拟合:估计正态分布的均值和方差,使其尽可能拟合你的数据。
代码示例(使用 scipy.stats)
import numpy as np
from scipy.stats import norm
# 生成模拟数据
data = np.random.normal(loc=5, scale=2, size=1000)
# 用最大似然法估计均值和标准差
mu_hat, std_hat = norm.fit(data)
print(f"估计的均值 (mu): {mu_hat:.2f}")
print(f"估计的标准差 (sigma): {std_hat:.2f}")
3. 假设检验(t检验)
定义
假设检验是指设立一个原假设(例如:两组无差异)与备择假设,并通过样本数据进行检验。t检验特别用于判断两组数据的均值是否显著不同。
应用示例
A/B测试:检验新网站布局(B组)是否显著提升了平均会话时长,相较于旧布局(A组)。
代码示例(双样本t检验)
import numpy as np
from scipy.stats import ttest_ind
# 生成模拟数据
group_A = np.random.normal(5, 1, 50)
group_B = np.random.normal(5.5, 1.2, 50)
stat, pvalue = ttest_ind(group_A, group_B)
print(f"T统计量: {stat:.2f}, p值: {pvalue:.4f}")
if pvalue < 0.05:
print("拒绝原假设(两组存在显著差异)")
else:
print("无法拒绝原假设(未发现显著差异)")
4. 方差分析(ANOVA)
定义
方差分析用于比较三个或以上组别的均值是否存在显著差异,是多组数据均值比较的标准方法。
应用示例
市场营销实验:比较三种不同广告策略对销售额的影响是否显著不同。
代码示例(使用 f_oneway 进行单因素方差分析)
import numpy as np
from scipy.stats import f_oneway
# 模拟三组销售数据
group1 = np.random.normal(10, 2, 30)
group2 = np.random.normal(12, 2, 30)
group3 = np.random.normal(14, 2, 30)
f_stat, p_val = f_oneway(group1, group2, group3)
print(f"F统计量: {f_stat:.2f}, p值: {p_val:.4f}")5. 主成分分析(Principal Component Analysis, PCA)
定义
主成分分析是一种降维方法,通过将数据投影到新的正交轴(主成分)上,最大限度保留原始数据中的方差。这些主成分彼此独立,可以帮助简化模型、去除冗余、提升可视化效率。
应用示例
图像压缩:将高维的图像像素数据压缩到低维空间,以加速处理和存储。
代码示例(使用 sklearn.decomposition.PCA)
import numpy as np
from sklearn.decomposition import PCA
# 模拟数据:100 个样本,每个样本 10 个特征
X = np.random.rand(100, 10)
# 将数据降至 2 维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
print("解释方差比例(每个主成分):", pca.explained_variance_ratio_)
print("降维后形状:", X_reduced.shape)
6. 因子分析(Factor Analysis)
定义
因子分析是一种统计建模方法,将观测到的变量视为由少量潜在因子(未观测到的隐藏变量)通过线性组合而成,常用于降维、发现潜在结构、心理测量研究等。
应用示例
心理测量学:从调查问卷中提取潜在的人格维度或心理特征,例如“外向”、“责任感”等。
代码示例(使用 factor_analyzer 库)
!pip install factor_analyzer
import numpy as np
from factor_analyzer import FactorAnalyzer
# 模拟数据:100 个样本,6 个变量
X = np.random.rand(100, 6)
# 提取两个因子,使用 varimax 旋转以增强解释性
fa = FactorAnalyzer(n_factors=2, rotation='varimax')
fa.fit(X)
# 查看因子载荷(表示每个变量对因子的贡献)
print("因子载荷矩阵:\n", fa.loadings_)
7. 聚类分析(Cluster Analysis,K均值聚类)
定义
聚类是一种无监督学习方法,它将数据根据相似性划分为若干组(簇)。K-means 是最常用的聚类算法之一,通过最小化每个样本到所属簇中心的距离来迭代优化聚类结果。
应用示例
客户细分:根据客户的购买行为、消费金额等信息,将客户群体划分为多个有相似特征的子群体,便于个性化营销。
代码示例(使用 sklearn.cluster.KMeans)
import numpy as np
from sklearn.cluster import KMeans
# 模拟二维数据:200 个样本,每个 2 个特征
X = np.random.rand(200, 2)
# 使用 K-means 将数据分为 3 类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
print("聚类中心:", kmeans.cluster_centers_)
print("前10个样本的簇标签:", kmeans.labels_[:10])
8. 自助法(Bootstrapping)
定义
自助法是一种非参数重采样方法。通过对原始样本进行多次有放回抽样,构造多个样本子集,从而估计某一统计量(如均值、中位数等)的分布或置信区间,特别适用于样本量较小或无法明确分布假设的情况。
应用示例
均值置信区间估计:通过多次重采样,构建某个样本均值的 95% 置信区间。
代码示例(实现均值的自助置信区间)
import numpy as np
np.random.seed(42)
data = np.random.normal(50, 5, size=100) # 原始数据样本
def bootstrap_mean_ci(data, n_bootstraps=1000, ci=95):
means = []
n = len(data)
for _ in range(n_bootstraps):
sample = np.random.choice(data, size=n, replace=True)
means.append(np.mean(sample))
lower = np.percentile(means, (100 - ci) / 2)
upper = np.percentile(means, 100 - (100 - ci) / 2)
return np.mean(means), (lower, upper)
mean_estimate, (lower_ci, upper_ci) = bootstrap_mean_ci(data)
print(f"Bootstrap 估计均值: {mean_estimate:.2f}")
print(f"{95}% 置信区间: [{lower_ci:.2f}, {upper_ci:.2f}]")9. 时间序列分析(Time Series Analysis - ARIMA)
定义
ARIMA(自回归积分滑动平均)是一种经典的时间序列建模方法,主要用于对单变量时间序列进行建模和预测。它通过建模数据中的自相关性,拟合并预测未来趋势。
应用示例
销售预测:根据过去的销售数据预测未来的销售额,常用于库存管理和市场决策。
代码示例(使用 statsmodels.tsa.arima.model.ARIMA)
!pip install statsmodels
import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
# 模拟时间序列数据
np.random.seed(42)
data = np.random.normal(100, 5, 50)
time_series = pd.Series(data)
# 拟合 ARIMA 模型,参数 (p=1, d=1, q=1)
model = ARIMA(time_series, order=(1, 1, 1))
model_fit = model.fit()
# 预测未来 5 个时间点
forecast = model_fit.forecast(steps=5)
print("未来预测值:", forecast.values)
10. 生存分析(Survival Analysis)
定义
生存分析专注于“事件发生时间”的建模,例如用户流失、疾病复发或机器失效。它不仅考虑事件是否发生,还考虑多久之后发生,并能处理“删失数据”(如用户仍在使用产品)。
应用示例
客户流失预测:评估用户可能在多长时间后取消订阅,进而优化留存策略。
代码示例(使用 lifelines.KaplanMeierFitter)
!pip install lifelines
import numpy as np
import pandas as pd
from lifelines import KaplanMeierFitter
# 模拟生存时间和事件观察(1=事件发生,0=删失)
np.random.seed(42)
durations = np.random.exponential(scale=10, size=100) # 存活时间
event_observed = np.random.binomial(1, 0.8, size=100) # 是否观察到事件
# 拟合生存曲线
kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed=event_observed, label='测试组')
# 绘制生存函数
kmf.plot_survival_function()
11. 多元线性回归(Multivariate Regression / Multiple Linear Regression)
定义
多元线性回归是线性回归的一种推广,建模因变量与多个自变量之间的线性关系,是最常见的监督学习方法之一。
应用示例
房价建模:根据面积、房间数、地段等多个特征来预测房价。
代码示例(使用 sklearn.linear_model.LinearRegression)
import numpy as np
from sklearn.linear_model import LinearRegression
# 模拟数据:房价 = 100 + 2*房间数 + 0.5*面积 + 噪声
np.random.seed(42)
rooms = np.random.randint(1, 5, 100)
sqft = np.random.randint(500, 2500, 100)
price = 100 + 2*rooms + 0.5*sqft + np.random.normal(0, 50, 100)
# 特征矩阵和目标值
X = np.column_stack([rooms, sqft])
y = price
# 训练模型
model = LinearRegression()
model.fit(X, y)
print("回归系数(房间数,面积):", model.coef_)
print("截距项:", model.intercept_)
12. 岭回归 / 套索回归(Ridge / Lasso Regression)
定义
- 岭回归(Ridge):引入 L2 正则项,惩罚过大的模型系数,从而减少过拟合。
- 套索回归(Lasso):引入 L1 正则项,除了防止过拟合,还能将某些系数压缩为 0,实现特征选择。 二者都属于线性回归的正则化扩展,常用于处理特征较多或高度相关的数据。
应用示例
高维生物数据分析:如基因表达数据,存在大量高度相关特征,可使用 Lasso 自动选择关键变量。
代码示例(使用 sklearn.linear_model)
import numpy as np
from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import train_test_split
# 模拟高维数据
np.random.seed(42)
X = np.random.rand(100, 10)
y = X[:, 0]*5 + X[:, 1]*3 + np.random.normal(0, 0.1, 100)
# 划分训练与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 岭回归
ridge = Ridge(alpha=1.0).fit(X_train, y_train)
# 套索回归
lasso = Lasso(alpha=0.1).fit(X_train, y_train)
print("Ridge 回归系数:", ridge.coef_)
print("Lasso 回归系数:", lasso.coef_)13. 逻辑回归(Logistic Regression)
定义
逻辑回归用于二分类任务,通过学习特征与目标变量之间的关系,输出某一类的概率。其输出值经过 Sigmoid 函数压缩至 [0, 1] 区间,从而进行分类决策。
应用示例
信用卡欺诈检测:判断一笔交易是否为欺诈行为。
代码示例(使用 sklearn.linear_model.LogisticRegression)
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
np.random.seed(42)
X = np.random.rand(100, 5) # 100 个样本,5 个特征
y = np.random.randint(0, 2, 100) # 二分类标签(0 或 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
print("模型准确率:", accuracy)
14. 混合效应模型(Mixed Effects Models / Hierarchical Linear Models)
定义
混合效应模型结合了固定效应(对所有组通用)和随机效应(因组别而异),广泛应用于纵向数据或分组结构中。例如,不同学校、医院、工厂等场景中,可以控制“组”的影响。
应用示例
教育研究:分析多所学校的学生成绩,每所学校具有一个不同的基准线(随机截距)。
代码示例(使用 statsmodels.formula.api.mixedlm)
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
# 构建模拟数据:10 所学校,每校 20 名学生
np.random.seed(42)
school_ids = np.repeat(np.arange(10), 20)
scores = 50 + 5 * np.random.rand(200) + 2 * school_ids + np.random.normal(0, 5, 200)
df = pd.DataFrame({"score": scores, "school": school_ids})
# 混合线性模型:school 为随机效应,截距为固定效应
model = smf.mixedlm("score ~ 1", df, groups=df["school"])
result = model.fit()
# 输出结果摘要
print(result.summary())
15. 非参数检验(Mann-Whitney U 检验)
定义
非参数检验不依赖于数据的特定分布假设。Mann-Whitney U 检验是用于比较两个独立样本中是否存在显著中位数差异的常用方法,适用于数据不满足正态分布的情况。
应用示例
销售中位数比较:比较两家门店的日销售额中位数,而无需假设其数据为正态分布。
代码示例(使用 scipy.stats.mannwhitneyu)
import numpy as np
from scipy.stats import mannwhitneyu
# 生成指数分布模拟数据(非正态分布)
group_A = np.random.exponential(scale=1.0, size=30)
group_B = np.random.exponential(scale=1.2, size=30)
# 双尾检验两组是否有显著差异
stat, pvalue = mannwhitneyu(group_A, group_B, alternative='two-sided')
print(f"检验统计量: {stat:.2f}, p值: {pvalue:.4f}")16. 蒙特卡洛模拟(Monte Carlo Simulation)
定义
蒙特卡洛模拟是一种通过大量随机采样来估计某一过程在不确定性条件下的统计特性的方法。它常用于评估概率、优化问题或复杂系统的行为。
应用示例
风险分析:在劳动力成本、原材料价格等因素不确定时,模拟项目成本的超支概率。
代码示例:使用蒙特卡洛法估算 π 值
import numpy as np
np.random.seed(42)
n_samples = 1_000_000
xs = np.random.rand(n_samples)
ys = np.random.rand(n_samples)
# 判断落入单位圆内的点数
inside_circle = (xs**2 + ys**2) <= 1.0
pi_estimate = inside_circle.sum() * 4 / n_samples
print("估算的 π 值:", pi_estimate)
17. 马尔可夫链蒙特卡洛方法(Markov Chain Monte Carlo, MCMC)
定义
MCMC 是一类用于贝叶斯推断的采样方法(如 Metropolis-Hastings、Gibbs 采样),通过构造马尔可夫链来从复杂的后验分布中采样,适用于高维或非解析可积模型。
应用示例
参数估计:当模型结构复杂或为层级模型(Hierarchical Models)时,可使用 MCMC 获取参数的后验分布。
代码示例(使用 PyMC3)
import pymc3 as pm
import numpy as np
# 模拟数据
np.random.seed(42)
data = np.random.normal(0, 1, 100)
with pm.Model() as model:
mu = pm.Normal('mu', mu=0, sd=10)
sigma = pm.HalfNormal('sigma', sd=1)
# 似然函数
likelihood = pm.Normal('likelihood', mu=mu, sd=sigma, observed=data)
# MCMC采样
trace = pm.sample(1000, tune=500, chains=2)
pm.summary(trace)
18. 鲁棒回归(Robust Regression)
定义
鲁棒回归是一类对异常值(outliers)不敏感的回归方法,能够在数据存在干扰点的情况下仍然拟合出稳定的模型。常见方法包括 RANSAC 和 Huber 回归。
应用示例
金融数据建模:数据中可能存在极端值(如股票崩盘日),普通最小二乘回归(OLS)容易受其影响,需使用鲁棒方法。
代码示例(使用 RANSACRegressor)
import numpy as np
from sklearn.linear_model import RANSACRegressor, LinearRegression
# 模拟数据(线性关系 + 噪声)
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X.squeeze() + 2 + np.random.normal(0, 2, 100)
# 添加离群点
X_outliers = np.array([[8], [9], [9.5]])
y_outliers = np.array([50, 55, 60])
X = np.vstack((X, X_outliers))
y = np.concatenate((y, y_outliers))
# 应用鲁棒回归
ransac = RANSACRegressor(base_estimator=LinearRegression(), max_trials=100)
ransac.fit(X, y)
print("RANSAC 回归系数:", ransac.estimator_.coef_)
print("RANSAC 截距:", ransac.estimator_.intercept_)
19. Copula 函数建模(Copulas)
定义
Copula 是一种将多个变量的边缘分布与它们的联合分布分离建模的工具,能够捕捉变量间的非线性相关性结构。在金融、保险等领域广泛用于建模资产联合行为。
应用示例
投资组合风险分析:模拟多个股票在不同市场状态下的联合波动行为。
代码示例(使用 copulas 库建模高斯 Copula)
!pip install copulas
import numpy as np
from copulas.multivariate import GaussianMultivariate
# 模拟有相关性的双变量正态数据
X = np.random.normal(0, 1, (1000, 2))
X[:, 1] = 0.8 * X[:, 0] + np.random.normal(0, 0.6, 1000)
# 拟合 Copula 模型
model = GaussianMultivariate()
model.fit(X)
# 从拟合模型中生成新样本
sample = model.sample(5)
print("原始数据相关性:", np.corrcoef(X[:, 0], X[:, 1])[0, 1])
print("新样本相关性:", np.corrcoef(sample[:, 0], sample[:, 1])[0, 1])20. 广义可加模型(Generalized Additive Models, GAMs)
定义
广义可加模型是对线性模型的扩展,它允许自变量以非线性平滑函数的形式影响响应变量,但仍然保持“加性结构”。相比于传统线性回归,GAM 更具灵活性,同时仍具有良好的可解释性。
应用示例
健康数据建模:例如预测病人的预后结果时,年龄与健康指标可能存在非线性关系,GAM 能够更自然地捕捉这种变化趋势。
代码示例(使用 pyGAM 库)
!pip install pygam
import numpy as np
from pygam import LinearGAM, s
# 模拟数据:非线性关系
np.random.seed(42)
X = np.random.rand(200, 1) * 10
y = 2 + 3 * np.sin(X).ravel() + np.random.normal(0, 0.5, 200)
# 拟合 GAM,使用平滑函数 s(0) 表示 X 的非线性项
gam = LinearGAM(s(0)).fit(X, y)
# 预测
XX = np.linspace(0, 10, 100)
preds = gam.predict(XX)
# 模型摘要
print("模型系数及统计结果:")
gam.summary()
总结(Conclusion)
从贝叶斯推断(Bayesian Inference)与最大似然估计(MLE),到更复杂的模型如 Copula 函数和广义可加模型(GAM),以上 20 种进阶统计方法 构成了数据科学家强大而系统的工具箱。
无论你的目标是预测、推断,还是探索变量之间的复杂关系,这些方法都能提供坚实的技术支持。
本文中的代码片段仅为方法的入门演示。每个方法都值得进一步深入研究,以在现实世界中解决更为复杂的数据问题。掌握它们,不仅能增强你的建模能力,也能大幅提升你对数据本质的理解。