👇我的小册 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. 混合效应模型
是什么
混合效应模型(或分层线性模型)包括固定效应(对所有组通用)和随机效应(每组特有)。通常用于纵向数据或分组数据。
示例用例
教育数据:测试多个学校的学生成绩,每个学校具有随机截距。
代码片段
使用statsmodels
的mixedlm
:
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小时无理由退款,放心食用!