20 种重要统计学方法
本文约4600字,建议阅读9分钟
本文探讨每位数据科学家都应熟悉的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 服从贝塔分布,其中形状参数 alpha 等于 1,形状参数 beta 也等于 1
# 似然
y是二项分布变量,其参数为n等于观测到的正面次数加上观测到的反面次数,p等于theta,观测值为观测到的正面次数
# 后验采样
抽样过程持续两千年,调整阶段为一千次,单核运行,设置两条链,最终结果存储为变量trace
pm.summary(trace)
2. 最大似然估计(MLE)
是什么
MLE找到在特定统计模型下使观测数据似然最大化的参数值。
示例用例
分布拟合:估计最适合数据的正态分布的参数(均值、方差)。
代码片段
使用scipy.stats拟合正态分布:
import numpy as np
from scipy.stats import norm
# 生成合成数据
数据由随机正态分布生成,均值设定为5,标准差为2,总共包含1000个数值,这些数值分别记录下来,形成数组形式的数据集。
# 估计均值和标准差的最大似然估计
mu_hat, std_hat = 正态分布拟合得到的数据参数
预估中心值,即mu_hat,结果为两位小数,等于{mu_hat:.2f}
计算标准偏差值,结果为 std_hat,保留两位小数,输出显示
3. 假设检验(t检验)
是什么
假设分析包含确立一个零假说,即没有区别或作用,以及一个对立假说。t测试专门用于评估两组平均值之间是否有明显不同。
示例用例
A组与B组进行对比实验,检验新页面设计(B组)是否造成会话时长平均值出现明显差异,而A组则采用原有页面布局。
代码片段
采用scipy.stats包中的ttest_ind函数执行两组数据的t值分析,用以比较均值差异
import numpy as np
scipy.stats模块中包含ttest_ind函数
# 合成数据
group_A通过正态分布函数生成,均值为5,标准差为1,总共产生50个数值
group_B通过随机函数生成,均值为5.5,标准差为1.2,总共产生50个数值
统计量结果为 stat, 显著性检验的 p 值为 pvalue, 这是通过独立样本 t 检验得出的, 比较了 group_A 和 group_B 的数据差异
计算得出T统计量的具体数值为stat, 保留两位小数, p值的具体数值为pvalue, 保留四位小数
if pvalue < 0.05:
print("拒绝原假设(存在显著差异)。")
else:
print("未能拒绝原假设(无显著差异)。")
4. 方差分析(ANOVA)
是什么
方差分析用来判断至少三个群体平均值有无明显不同。
示例用例
营销实验:通过测量销售提升来评估三种不同广告策略的效果。
代码片段
使用scipy.stats.f_oneway:
import numpy as np
从scipy.stats模块中导入f_oneway函数
# 合成数据
第一组数据通过正态分布函数生成,均值为十,标准差为二,总共包含三十个数值
group2这个变量被赋值为从均值为12的标准差为2的正态分布中抽取的30个随机数,这些数值被存放在一个数组里
group3这个数组通过随机正态分布生成,均值为14,标准差为2,总共包含30个数据点
f_stat值等于执行单因素方差分析的结果,p_val值是相应的p值,这些值是通过比较三个组别group1、group2和group3得出的
输出F统计量的数值,保留两位小数,同时输出p值的数值,保留四位小数。
5. 主成分分析(PCA)
是什么
主成分分析可以将数据映射到全新的互相垂直的坐标轴上开元棋官方正版下载,也就是主要成分,以此减少数据的维度,并且这些坐标轴能够收集最多的数据波动。
示例用例
图像压缩:将高维像素数据减少为更少的特征以加快处理速度。
代码片段
使用sklearn.decomposition.PCA:
import numpy as np
从sklearn.decomposition库中导入PCA模块
# 合成数据:100个样本,10个特征
X = np.random.rand(100, 10)
pca = PCA(n_components=2)
X_reduced = 主成分分析拟合转换X的结果
输出解释方差比率,该比率表示主成分分析中每个主成分所解释的方差占比,具体数值由pca.explained_variance_ratio_提供。
输出降维之后的形态,X_reduced的尺寸为多少
6. 因子分析
是什么
因子分析把观察指标当作潜藏的、未被测量的成分的线性拼合来构建模型,经常用来减少数据维度,或者发现不易察觉的构造。
示例用例
心理测量学:从问卷数据中识别潜在的人格特质。
代码片段
使用factor_analyzer库:
!pip install factor_analyzer
import numpy as np
from factor_analyzer
调用因子分析器,生成合成数据,包含100个个体,每个个体有6个指标,数据通过因子分析法构建而成
X = np.random.rand(100, 6)
fa是一个因子分析器,设置了两个因子,并应用了方差最大化正交旋转方法
fa.fit(X)
输出因子载荷,具体数值为fa.loadings_
7. 聚类分析(K均值)
是什么
数据会通过聚类方法,按照相似程度被分到性质相同的群体里。K均值是一种运用中心点的常见聚类方法。
示例用例
客户细分:根据购买模式对客户进行分组。
代码片段
使用sklearn.cluster.KMeans:
import numpy as np
在sklearn.cluster模块中导入KMeans算法
# 合成数据:200个样本,2维
X = np.random.rand(200, 2)
kmeans是KMeans算法的一个实例,指定了三个聚类中心,同时设置了随机种子为42
kmeans.fit(X)
输出聚类中心点坐标,这些坐标由kmeans.cluster_centers_提供
输出聚类标识,前十个结果为kmeans.labels_的初始部分内容
8. 自助法(Bootstrapping)
是什么
自助法借助数据集中反复取样,能够估算统计量,比如均值、中位数,并分析其分布形态,同时也能反映不确定性。
示例用例
置信区间:为小数据集的均值估计95%的置信区间。
代码片段
展示一个简单的均值自助法:
import numpy as np
np.random.seed(42)
# 原始样本
数据由随机正态分布生成,均值为五十,标准差为五,总共有百个数值
计算数据集的均值置信区间,采用重采样方法,重复次数为一千次,置信水平为九十五百分位
means = []
n = len(data)
for _ in range(n_bootstraps):
样本值从数据集中随机选取,选取数量为n,允许重复选择,最终形成样本集
means.append(np.mean(sample))
lower值等于means数组中第((100减去置信区间乘以二)百分位数)的数值
上界等于均值数组按百分位数排序后,取100减去百分位置信区间一半的值
返回平均值,该值由所有计算结果的总和除以数量得出,同时提供一组界限,其中包含一个最小值和一个最大值
均值估算结果为mean_estimate, 其置信区间下限值为lower_ci, 上限值为upper_ci, 这些数据是通过bootstrap_mean_ci函数对data样本进行计算得出的
输出自助法平均值,结果保留两位小数,数值为{mean_estimate}
置信水平为九十五百分之一,对应的区间范围从下限值开始,到上限值结束,具体数值如下,下限为小数点后两位的值,上限也是小数点后两位的值,这个区间表示了估计的真实值可能存在的范围。
9. 时间序列分析(ARIMA)
是什么
ARIMA模型应用广泛,它能够分析时间序列数据的内部关联性,从而对单一变量的未来数值进行预测。
示例用例
销售预测:基于过去的表现预测未来销售。
代码片段
使用
statsmodels.tsa.arima.model:
!pip install statsmodels
import numpy as np
import pandas as pd
根据统计模型时间序列分析模块,导入自回归积分移动平均模型
# 合成时间序列数据
np.random.seed(42)
数据通过正态分布生成,均值为100,标准差为5,总共包含50个数值
time_series = pd.Series(data)
# 拟合ARIMA模型(p=1, d=1, q=1)
模型采用ARIMA方法构建,时间序列数据作为输入,参数设定为三个数字组合,具体为1个差分阶数,1个自回归阶数,以及1个移动平均阶数
model_fit = model.fit()
# 预测未来5个点
预测结果等于模型拟合后的预测函数,输入参数为五步,输出未来五期数据
输出预测结果,其具体数值为预测值集合
10. 生存分析
是什么
生存性统计方法研究时间与事件发生的关系,一般着重于某个时间点之后事件(例如用户离开)发生的可能性
示例用例
客户流失:估计客户在取消订阅之前会保持活跃的时间。
代码片段
使用lifelines:
!pip install lifelines
import numpy as np
import pandas as pd
从生存分析库中导入KaplanMeierFitter模型
# 合成生存时间和审查数据
np.random.seed(42)
持续时间是使用参数为10的指数分布随机生成的100个数值,每个数值代表一个持续时间,这些数值被存储在名为durations的变量中。
实验记录的数值等于一百次独立尝试中成功次数的分布情况,每次尝试成功的概率为八成,数值介于零到一百之间
kmf = KaplanMeierFitter()
kmf拟合持续时间数据,事件发生情况采用event_observed参数指定,分组标签设置为测试组,
kmf.plot_survival_function()
11. 多元回归(多元线性回归)
是什么
多元线性回归模型用于描述因变量与多个自变量之间的关系。
示例用例
定价模型:基于房屋面积、房间数量和位置预测房价。
代码片段
使用
sklearn中的线性回归模型,属于线性模型模块,具体为线性回归类,用于回归分析任务,通过最小化误差平方和来拟合数据,模型参数通过优化算法确定,支持多种损失函数选择,适用于预测连续数值类型的目标变量
import numpy as np
在sklearn.linear_model模块中导入LinearRegression类
合成数据的价格,等于100,加上房间数量乘以2,再加上面积乘以0.5,最后加上噪声
np.random.seed(42)
房间数量等于一百个随机取值,取值范围从一至五,使用整数生成
面积单位平方英尺等于随机整数函数取值范围从五百到两千五百之间的一百个结果
价格等于一百,加上房间数量乘以二,再加上平方英尺数乘以零点五,最后加上从均值为零,标准差为五十的正态分布中抽取的一百个数值的平均值
X等于将房间数量和面积数据并排组合在一起的结果
y = price
model = LinearRegression()
model.fit(X, y)
print("系数:", model.coef_)
输出截距值,该值为模型截距项的数值。
12. 岭回归/Lasso回归
代码片段
使用sklearn.linear_model:
import numpy as np
在sklearn.linear_model模块中,包含Ridge和Lasso这两个类
从sklearn.model_selection模块中导入train_test_split函数
# 合成数据
np.random.seed(42)
X = np.random.rand(100, 10)
y等于X第一列乘以五,加上X第二列乘以三,再加上标准差为0.1的正态分布随机数,共一百个
划分数据集,将X和y分成训练集和测试集,测试集占比为二十分之一,得到的结果分别是X_train、X_test、y_train和y_test
ridge对象采用参数alpha设为1.0进行初始化,接着使用训练数据集X_train和y_train进行拟合训练,最终得到拟合后的ridge模型
lasso模型以0.1为参数进行初始化,然后使用训练数据对模型进行适配,适配过程完成之后,将适配好的模型赋值给变量lasso
print("岭回归系数:", ridge.coef_)
输出Lasso回归的系数值,具体数值为lasso系数属性中存储的内容。
13. 逻辑回归
是什么
逻辑回归用于二分类问题,建模某一类别或事件存在的概率。
示例用例
信用卡欺诈检测:将交易分类为欺诈或合法。
代码片段
使用
sklearn中的LogisticRegression模块,属于线性模型类别,用于解决分类问题开yun体育app官网网页登录入口,通过逻辑回归算法实现预测功能,模型参数可以调整,包括正则化强度和求解器类型等,适合处理二分类或多分类任务,在数据科学领域应用广泛,具有较好的解释性和稳定性。
import numpy as np
从sklearn.linear_model模块中导入LogisticRegression类
from sklearn.model_selection import train_test_split
np.random.seed(42)
X = np.random.rand(100, 5)
y是随机生成的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)
评估结果等于模型对测试数据的性能表现,通过比对测试集样本的预测值与真实标签来完成,最终得到一个衡量准确度的数值
print("准确率:", accuracy)
14. 混合效应模型
是什么
混合型统计模型涵盖总体一致参数与群体专属变量,常应用于序列观测资料或类别划分信息。
示例用例
教育数据:测试多个学校的学生成绩,每个学校具有随机截距。
代码片段
使用statsmodels的mixedlm:
import pandas as pd
import numpy as np
导入统计建模库中的公式接口模块
# 合成数据:每个学生属于特定学校
np.random.seed(42)
school_ids通过重复数组中的每个元素20次得到,这个数组从0开始到9,一共有10个数字
分数等于五十加上五乘以随机数,再加上两倍的学校编号,最后加上均值为零标准差为五的正态分布随机数,总共两百个数据
创建一个数据框,其中包含成绩和学校编号两列,成绩列的数据来自scores列表,学校编号列的数据来自school_ids列表
模型构建为混合线性模型,因变量为分数,自变量包含截距项,数据来源为数据框df,分组依据为学校名称
result = model.fit()
print(result.summary())
15. 非参数检验(Mann-Whitney U检验)
是什么
非参数检验无需预设数据的具体分布形态。Mann-Whitney U检验是用来对比两组互不关联样本的方法。
示例用例
比较销售中位数时,无需考虑正态分布假设,两家店铺的数据可以此方法对比,结果更具普遍性。
代码片段
使用scipy.stats.mannwhitneyu:
import numpy as np
从scipy.stats模块中导入mannwhitneyu函数
# 合成数据
group_A由30个随机值组成,这些值通过指数分布函数生成,其尺度参数为1
group_B这个数组由30个数值组成,每个数值都通过指数分布函数生成,其尺度参数为1.2
统计量结果和P值通过曼-惠特尼U检验得出,该检验比较了A组与B组,并采用了双尾检验方法
统计结果为:数值为{stat},精确到两位小数,概率指标为{pvalue},精确到四位小数
16. 蒙特卡洛模拟
是什么
蒙特卡洛方法借助反复随机抽取数值,用以推断各种可能性发生的几率,整个过程涉及不确定性因素。
示例用例
风险评估:针对人工开销、物料价格等变动因素,估算工程预算可能增加的几率。
代码片段
使用蒙特卡洛方法估计π:
import numpy as np
np.random.seed(42)
n_samples = 10_000_00
随机生成n_samples个数值,分配给xs变量,这些数值在0到1之间均匀分布
ys是n_samples个随机数的集合
# 单位圆内的点
长方形内部坐标满足条件,横坐标平方加上纵坐标平方,其值等于半径平方,这个值小于等于半径平方,圆内点的特征,数学表达,计算方法,几何图形,解析几何<= 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)
数据由随机正态分布生成,均值为零,标准差为一,共包含一百个数值
with pm.Model() as model:
mu是一个正态分布变量,其均值参数为0,标准差参数为10
标准差采用半正态分布设定,参数名称为sigma,标准差值默认为1
可能性等于正态分布,参数为均值mu,标准差sigma,观测值为数据
抽样过程持续了一千次,调整阶段进行了五百次,采用了两条链进行计算
pm.summary(trace)
18. 鲁棒回归
是什么
鲁棒回归技巧,比如RANSAC和Huber回归,对于离群点的反应不如最小二乘法强烈。
示例用例
异常值数据:拟合包含极端值的数据模型,例如金融数据。
代码片段
使用
sklearn线性模型中的RANSAC回归估计器,是一种用于处理含有异常值的数据集的算法,通过迭代的方式,选择合适的样本点来构建模型,从而提高模型的鲁棒性kaiyun全站app登录入口,它能够有效地识别并排除离群点的影响,适用于非线性关系的拟合,在计算机视觉和地理信息等领域有广泛应用,其核心思想是在多次随机抽样中,找到最能代表整体数据趋势的子集,然后基于这个子集来训练模型,最终得到一个对整体数据具有较好拟合效果的结果
import numpy as np
从sklearn.linear_model模块中导入RANSACRegressor和LinearRegression这两个类
np.random.seed(42)
X是100行1列的数组,每个元素通过随机数乘以10得到
y等于三乘以x压缩维度后的结果,再加上二,再加上零到二之间正态分布的随机数,共一百个
# 添加异常值
X_outliers = 一个数组,里面包含三个元素,第一个元素是数字8,第二个元素是数字9,第三个元素是数字9.5
y_outliers是这样一个数组,里面包含了五十、五十五和六十这三个数值
X通过堆叠方式添加了X_outliers,形成了新的X结构
y, y_outliers, 两者合并, 结果赋值给 y
ransac是一个RANSAC回归估计器,它的基础模型是线性回归,最多尝试次数为100次
ransac.fit(X, y)
输出RANSAC系数,具体为ransac估计器参数中的系数部分
输出RANSAC算法的截距值,该值由算法估计器计算得出,具体数值为ransac.estimator_属性中的intercept_字段内容
19. Copulas
是什么
连接词揭示不同变量间的关联关系,且与各自的分布情况分离。这类工具在金融领域常用来分析多种资产回报的同步变化模式。
示例用例
投资组合中的风险,源于多种股票之间呈现非线性关联的现象,这些股票共同作用产生了复杂影响。
代码片段
使用copulas库中的高斯Copula:
!pip install copulas
import numpy as np
在copulas的多变量模块中找到高斯多变量类型
# 合成数据
X是1000行2列的数组,每个元素都从均值为0,标准差为1的正态分布中随机抽取,接着X的第二列等于0.8乘以第一列再加上1000个均值为0,标准差为0.6的正态分布随机数
模型是高斯多元分布模型
model.fit(X)
sample = model.sample(5)
输出原始关联度数值,该数值由X矩阵第一列与第二列数据计算得出,结果为矩阵左上角元素,通过np.corrcoef函数获得
输出样本关联度,其值为数组样本前两列相关系数矩阵对角线右侧元素,具体计算方式为样本第一列与第二列数据的相关系数
20. 广义加性模型(GAMs)
是什么
GAMs借助引入预测变量的非线性映射来拓展线性框架,并且维持了可加特性。这类模型相较于线性回归展现出更高的适应性,不过依然具备良好的解释能力。
示例用例
健康数据:将患者结果建模为年龄和其他变量的平滑非线性函数。
代码片段
使用pyGAM库:
!pip install pygam
import numpy as np
from pygam
import LinearGAM, s
# 合成数据
np.random.seed(42)
X是200行1列的数组,每个元素都乘以10,且每个元素都通过随机数生成
y等于2, 加上3乘以X的正弦值, 然后平滑处理, 再加上从均值为0, 标准差为0.5的正态分布中抽取的200个随机数
gam是线性GAM模型,使用0维样条拟合数据集X和y,完成适配过程
XX = np.linspace(0, 10, 100)
preds = gam.predict(XX)
print("系数:", gam.summary())
结论
掌握贝叶斯推断和最大似然估计,熟悉Copulas和GAMs等前沿知识,这二十种高级统计技巧是每位数据分析师必备的技能集合。这些代码仅作简单演示,每种方法都有广阔的探索空间,能够应对各种复杂的实际挑战,包括进行预测分析、开展统计推断以及建立复杂关联模型。