20 种重要统计学方法

👇我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。
👇我的小册 AI工具100个实战小案例:(100个AI工具实战小案例) ,原价299,限时早鸟价29,满100人涨10元。

数据科学是一个多学科领域,结合了数学、统计学、计算机科学和领域专业知识,以从数据中提取洞察。虽然机器学习算法常常成为焦点,但扎实的统计方法基础同样至关重要。在本文中,我们将探讨每位数据科学家都应熟悉的20种高级统计方法。每种方法都包括简要解释、示例用例以及一段Python代码来说明其用法。

1. 贝叶斯推断

是什么

贝叶斯推断使用贝叶斯定理,随着更多证据或信息的出现,更新假设的概率。与频率学派方法不同,贝叶斯方法允许你结合先验信念,并通过观察到的数据更新这些信念。

示例用例

垃圾邮件过滤:可以将电子邮件是垃圾邮件的先验信念与新证据(邮件中的词语)结合,以更新垃圾邮件的概率。

代码片段

以下是使用PyMC3或PyMC进行贝叶斯参数估计的简单示例(例如,抛硬币)。

!pip install pymc3  # 或 pymc
import pymc3 as pm
import numpy as np

# 假设我们观察到20次抛硬币,12次正面,8次反面
observed_heads = 12
observed_tails = 8

with pm.Model() as model:
    # 硬币偏倚的先验(theta)
    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)

是什么

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组)导致显著不同的平均会话时间。

代码片段

使用scipy.stats.ttest_ind进行双样本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)

是什么

ANOVA用于检验三个或更多组均值之间是否存在统计学上的显著差异。

示例用例

营销实验:通过测量销售提升来评估三种不同广告策略的效果。

代码片段

使用scipy.stats.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. 主成分分析(PCA)

是什么

PCA通过将数据投影到新的正交轴(主成分)上来降低数据的维度,这些轴能够捕捉最多的方差。

示例用例

图像压缩:将高维像素数据减少为更少的特征以加快处理速度。

代码片段

使用sklearn.decomposition.PCA

import numpy as np
from sklearn.decomposition import PCA

# 合成数据:100个样本,10个特征
X = np.random.rand(100, 10)
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

print("解释方差比例:", pca.explained_variance_ratio_)
print("降维后的形状:", X_reduced.shape)

6. 因子分析

是什么

因子分析将观测变量建模为潜在(未观测)因子的线性组合,通常用于降维或揭示隐藏结构。

示例用例

心理测量学:从问卷数据中识别潜在的人格特质。

代码片段

使用factor_analyzer库:

!pip install factor_analyzer
import numpy as np
from factor_analyzer import FactorAnalyzer

# 合成数据(100个样本,6个变量)
X = np.random.rand(100, 6)
fa = FactorAnalyzer(n_factors=2, rotation='varimax')
fa.fit(X)

print("因子载荷:\n", fa.loadings_)

7. 聚类分析(K均值)

是什么

聚类将数据划分为基于相似性的同质组(簇)。K均值是一种基于质心的流行聚类技术。

示例用例

客户细分:根据购买模式对客户进行分组。

代码片段

使用sklearn.cluster.KMeans

import numpy as np
from sklearn.cluster import KMeans

# 合成数据:200个样本,2维
X = np.random.rand(200, 2)
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)

print("聚类中心:", kmeans.cluster_centers_)
print("聚类标签:", 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"自助法均值估计: {mean_estimate:.2f}")
print(f"{95}% 置信区间: [{lower_ci:.2f}, {upper_ci:.2f}]")

9. 时间序列分析(ARIMA)

是什么

ARIMA(自回归积分滑动平均模型)是一种流行的模型,用于通过捕捉数据中的自相关性来预测单变量时间序列数据。

示例用例

销售预测:基于过去的表现预测未来销售。

代码片段

使用statsmodels.tsa.arima.model

!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. 生存分析

是什么

生存分析处理时间到事件的数据,通常关注事件(如客户流失)在特定时间后发生的概率。

示例用例

客户流失:估计客户在取消订阅之前会保持活跃的时间。

代码片段

使用lifelines

!pip install lifelines
import numpy as np
import pandas as pd
from lifelines import KaplanMeierFitter

# 合成生存时间和审查数据
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. 多元回归(多元线性回归)

是什么

多元线性回归模型用于描述因变量与多个自变量之间的关系。

示例用例

定价模型:基于房屋面积、房间数量和位置预测房价。

代码片段

使用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. 岭回归/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.coef_)
print("Lasso回归系数:", lasso.coef_)

13. 逻辑回归

是什么

逻辑回归用于二分类问题,建模某一类别或事件存在的概率。

示例用例

信用卡欺诈检测:将交易分类为欺诈或合法。

代码片段

使用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)
y = np.random.randint(0, 2, 100)  # 二分类标签

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. 混合效应模型

是什么

混合效应模型(或分层线性模型)包括固定效应(对所有组通用)和随机效应(每组特有)。通常用于纵向数据或分组数据。

示例用例

教育数据:测试多个学校的学生成绩,每个学校具有随机截距。

代码片段

使用statsmodelsmixedlm

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

# 合成数据:每个学生属于特定学校
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})
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. 蒙特卡洛模拟

是什么

蒙特卡洛模拟通过重复随机采样来估计不确定性下不同结果的概率。

示例用例

风险分析:在劳动力成本、原材料成本等不确定变量的情况下,预测项目成本超支的概率。

代码片段

使用蒙特卡洛方法估计π:

import numpy as np
np.random.seed(42)

n_samples = 10_000_00
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. 马尔可夫链蒙特卡洛(MCMC)

是什么

MCMC方法(例如Metropolis-Hastings、Gibbs采样)用于在贝叶斯推断中从后验分布生成样本,尤其是在直接采样困难时。

示例用例

参数估计:用于复杂的层次模型,其中直接积分不可行。

代码片段

使用PyMC3进行简单的MCMC:

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)
    trace = pm.sample(1000, tune=500, chains=2)

pm.summary(trace)

18. 鲁棒回归

是什么

鲁棒回归方法(例如RANSAC、Huber回归)对异常值的敏感性低于普通最小二乘法。

示例用例

异常值数据:拟合包含极端值的数据模型,例如金融数据。

代码片段

使用sklearn.linear_model.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. Copulas

是什么

Copulas捕捉随机变量之间的依赖结构,与其边缘分布分开。它们在金融中常用于建模资产收益的联合分布。

示例用例

投资组合风险:建模表现出非线性依赖关系的多只股票的联合行为。

代码片段

使用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)  # 相关性

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. 广义加性模型(GAMs)

是什么

GAMs通过允许预测变量的非线性函数扩展线性模型,同时保持可加性。它们比线性回归更灵活,但仍具有可解释性。

示例用例

健康数据:将患者结果建模为年龄和其他变量的平滑非线性函数。

代码片段

使用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 = LinearGAM(s(0)).fit(X, y)
XX = np.linspace(0, 10, 100)
preds = gam.predict(XX)

print("系数:", gam.summary())

结论

从理解贝叶斯推断和最大似然估计,到Copulas和GAMs等高级概念,这20种高级统计方法构成了每位数据科学家的全面工具包。这里的代码片段是简要示例,但每种方法都可以深入探索,以解决复杂的现实问题——无论是预测、推断还是建模复杂关系。

转自:数据studio

原文地址:https://medium.com/@sarowar.saurav10/20-advanced-statistical-approaches-every-data-scientist-should-know-ccc70ae4df28

作者:Sarowar Jahan Saurav

编辑:罗伯特

图片

最后推荐一下我们团队写的量化小册的内容,48篇内容!从Python安装,入门,数据分析,爬取股票基金的历史+实时数据,以及如何写一个简单量化策略,策略回测,如何看资金曲线统统都有介绍!非常超值!

欢迎订阅:原价299 早鸟价2杯咖啡钱,即可永久阅读。现在的价格非常非常低,只要2杯奶茶,就可以终身订阅+课程源码,还有永久陪伴群。48小时无理由退款,放心食用!

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值