数据科学是一个跨学科的领域,结合了数学、统计学、计算机科学和领域专业知识,从数据中提取见解。虽然机器学习算法经常成为焦点,但对统计方法的深刻理解同样至关重要。在本文中,我们来探讨一下每位数据科学家都应该了解的20种高级统计技巧。每种方法都会简要介绍,附带一个实用案例,并且会提供一段Python代码来展示其应用。
贝叶斯推理是什么
贝叶斯推理使用贝叶斯定理根据更多证据或信息的出现来更新假设的概率。与频率派方法不同,贝叶斯方法允许你结合先验知识,并用观察到的数据更新这些先验知识。
示例场景
- 垃圾邮件过滤:我们对一封邮件是否是垃圾邮件的初步判断可以结合新信息(如邮件中的词汇),以此来更新邮件是垃圾邮件的概率。
代码片段
下面是一个使用PyMC3 或 PyMC 进行抛硬币的贝努利试验的贝叶斯参数估计的简单例子。
!pip install pymc3 # 或者安装pymc
# 导入 pymc3 作为 pm 和 numpy 作为 np
import pymc3 as pm
import numpy as np
# 假设我们观察到了20次硬币抛掷,其中有12次正面,8次反面
observed_heads = 12
observed_tails = 8
with pm.Model() as 模型_:
# 硬币偏好的先验概率(theta)
theta = pm.Beta('theta', alpha=1, beta=1)
# 似然
y = pm.Binomial('y', n=正面次数 + 反面次数, p=theta, observed=正面次数)
# 后验抽样
pm.sample(2000, tune=1000, cores=1, chains=2)
打印 pm 的 summary 并传入 trace 参数
2. 极大似然估计(MLE)它是啥
MLE 找到使观察到的数据在某一统计模型下最有可能的参数值。
示例用法
- 拟合分布:找到最适合您数据的常态分布的参数(均值和方差)。
示例
以下是一个使用 scipy.stats
拟合正态分布模型的示例:
# 导入numpy库作为np
import numpy as np
# 从scipy.stats模块导入norm函数
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检验主要用于比较两组均值是否显著不同。
示例用法
- AB测试:测试新网站布局(B组)与旧布局(A组)相比,平均会话时长是否有显著差异。
代码片段
使用 scipy.stats.ttest_ind
进行两样本 t 检验(两样本 t 检验是一种用于比较两个样本均值差异的统计方法):
import numpy as np # 导入numpy
from scipy.stats import ttest_ind # 导入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("原假设不能被支持(不存在明显差异)。")
方差分析(ANOVA)
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. 主成分分析(Principal Component Analysis,简称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) # 创建一个主成分分析器,将主成分数量设置为2
X_reduced = pca.fit_transform(X) # 对数据X进行降维处理
print("方差解释率:", pca.explained_variance_ratio_)
print("降维后的维度:", X_reduced.shape)
6. 因子分析
什么是因子分析
简单来说,因子分析将观察到的变量建模为潜在(未被观测的)因子的线性组合形式,常用来进行降维或揭示隐藏的结构。
示例用法
- 心理测量学:从问卷数据中识别隐藏的人格特征。
代码片段
使用 factor_analyzer
库进行:
安装一个名为factor_analyzer的Python包
!pip install factor_analyzer
import numpy as np
从factor_analyzer导入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-means)
什么是
聚类是根据相似性将数据分成同质的群组(簇)。K-means是一种流行的基于中心点的聚类技术。
示例用法
- 客户细分:根据购买模式对客户进行细分。
这段代码
这里用到 sklearn.cluster.KMeans
,这是一个聚类算法。
import numpy as np
from sklearn.cluster import KMeans
# 我们导入了numpy库和KMeans聚类算法
# 合成数据:200 个样本,2D 图
X = np.random.rand(200, 2)
kmeans = KMeans(n_clusters=3, random_state=42) # 这里我们创建了一个KMeans对象,设置了聚类数量为3,随机状态为42
kmeans.fit(X) # 然后我们使用fit方法让模型适应数据X
print("聚类的中心:", kmeans.cluster_centers_)
print("聚类的标签:前10个", kmeans.labels_[:10])
8. 自举 (自举启动的含义可能对部分读者不够明确,此处解释“自举”概念)
它是什麼
Bootstrapping是指從您的數據集中重複進行有放回的抽樣,以估計(例如均值或中位數)的分布及其不確定性。
示例用法
- 置信区间:估算小样本数据均值的95%置信区间。
代码片段 演示求平均值的简单启动过程。
import numpy as np
导入numpy库并命名为np。
np.random.seed(42)
data = np.random.normal(50, 5, size=100) # 这是原始样本数据
def 自举均值置信区间计算(data, 自举次数=1000, 置信水平=95):
均值列表 = []
n = len(data)
for _ in range(自举次数):
样本 = np.random.choice(data, size=n, replace=True)
均值列表.append(np.mean(样本))
置信下限 = np.percentile(均值列表, (100-置信水平)/2)
置信上限 = np.percentile(均值列表, 100 - (100-置信水平)/2)
return np.mean(均值列表), (置信下限, 置信上限)
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
在Python环境中,你可以使用以上命令安装lifelines库。
import numpy as np
import pandas as pd
从lifelines导入KaplanMeierFitter # 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() # 这行代码是用来绘制KMF的生存函数图 (Zhè háng dǎnmó shì yǐlái shǐyòng huìzhù KMF de shēngcún huánghán tú)
11. 多元线性回归
这是什么
多重线性回归用来描述一个因变量和多个自变量之间的关系。
示例用法
- 房价预测模型:根据房屋面积、房间数量和地理位置预测房价。
代码片段:
使用 sklearn.linear_model.LinearRegression
进行操作:
# 导入必要的库
import numpy as np
# 从sklearn中导入线性回归模型
from sklearn.linear_model import LinearRegression
# 下面是一个合成数据的例子:房价 = 100 + 2*房间数 + 0.5*面积 + 随机误差
np.random.seed(42)
房间数 = np.random.randint(1, 5, 100)
面积 = np.random.randint(500, 2500, 100)
房价 = 100 + 2*房间数 + 0.5*面积 + np.random.normal(0, 50, 100)
# 计算房间数量和平方英尺的特征矩阵
X = np.column_stack([rooms, sqft])
# 定义价格为目标变量
y = price
model = 线性回归模型()
model.拟合(X, y)
print("模型的系数为:", model.coef_)
print("模型的截距为:", model.intercept_)
- 岭回归和LASSO 回归
这是什么
- 岭回归 添加了 L2 惩罚来减少过拟合现象,通过将系数缩小。
- Lasso 回归 添加了 L1 惩罚,这可以将一些系数缩减为零,从而实现有效的特征选择。
示例用法
- 高维度基因表达数据:基因表达数据,其中包含许多相关特征。
代码片段
使用 sklearn.linear_model
:
导入 numpy as np
from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import train_test_split
# 这里导入了numpy库,并从sklearn的linear_model模块中导入了Ridge和Lasso回归模型,同时从model_selection模块中导入了train_test_split函数,用于数据集的划分。
# 生成数据
# 设置随机种子
np.random.seed(42)
# 生成一个100行10列的随机数组
X = np.random.rand(100, 10)
# 计算y值,加入噪声
y = X[:, 0]*5 + X[:, 1]*3 + np.random.normal(0, 0.1, 100)
# 将数据集分为训练集和测试集,其中测试集占20%
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) # 我们使用带有alpha参数为1.0的岭回归模型对训练数据进行拟合
lasso = Lasso(alpha=0.1).fit(X_train, y_train) # 然后使用alpha参数为0.1的Lasso模型进行拟合
print("岭系数:", ridge.coef_)
print("LASSO系数:", lasso.coef_)
13. Logistic回归
什么是逻辑回归
逻辑回归用来做二分类任务,预测某个类别的存在几率。
示例用法
- 信用卡欺诈识别:将交易分为欺诈或正常。
代码
用 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) # 生成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)
以下代码用于训练逻辑回归模型。
准确率 = model.score(X_test, y_test)
输出 '准确率为:', 准确率
14. 混合效应模型分析
它是什麼
混合效應模型(或稱層次線性模型)包括固定效應(對所有組都一致的)和隨機效應(每個組特有的)。它們常用于縱向或分組數據中。
(Note: "longitudinal" is often kept in its original form in academic contexts in Chinese, so it was left untranslated. If it needs to be translated, it would typically be "縱向".)
示例用法
- 教育数据:多个学校的考试分数,每个学校都有一个随机偏差值。
代码片段
使用 statsmodels
的 mixedlm
模型:
# 导入pandas库,用于数据分析
import pandas as pd
# 导入numpy库,用于数值计算
import numpy as np
# 导入statsmodels的公式API,用于统计模型构建
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}) # 创建一个包含分数和学校ID的DataFrame df。
model = smf.mixedlm("score ~ 1", df, groups=df["school"]) # 定义一个混合效应模型,使用分数作为因变量,学校作为分组变量。
result = model.fit() # 拟合模型并获取结果。
print(result.summary()) # 打印模型的总结结果。
15. 非参数检验(曼-惠特尼 U 检验)
它是什么
非参数检验不对数据的分布做任何特定假设。常用于比较两个独立样本的Mann-Whitney U检验。
示例用途
- 中位数比较:比较两家商店销售额的中位数,而不需要假设它们符合正态分布。
代码片段
使用 scipy.stats.mannwhitneyu
:
import numpy as np # NumPy 是一个用于处理数组的强大库
from scipy.stats import mannwhitneyu # scipy.stats 提供了 Mann-Whitney U 检验的实现
# 合成数据,
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 = 10_000_000 # 设置样本数量
xs = np.random.rand(n_samples) # 生成样本的x坐标
ys = np.random.rand(n_samples) # 生成样本的y坐标
# 单位圆内的点
inside_circle = (xs**2 + ys**2) <= 1.0 # 判断点是否在单位圆内
pi_estimate = inside_circle.sum() * 4 / n_samples # 计算π的估计值
估计的π是,pi_estimate。
17. 马尔可夫链蒙特卡罗 (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) # 生成一个均值为0,标准差为1,大小为100的正态分布数据
with pm.Model() as model:
mu = pm.Normal('mu', mu=0, sd=10)
sigma = pm.HalfNormal('sigma', sd=1)
似然 = pm.Normal('likelihood', mu=mu, sd=sigma, observed=data)
轨迹 = pm.sample(1000, tune=500, chains=2)
pm.summary(trace) 可以用来生成 trace 的摘要信息。
18. 鲁棒回归
什么是它?
鲁棒回归方法(例如,RANSAC、Huber回归)相比普通的最小二乘法,更能抵抗异常值的影响。
示例用法
- 含有离群点的数据:将模型拟合到包含极端值的数据中,比如在金融行业中。
下面是一段代码
这里使用了 sklearn.linear_model.RANSACRegressor
(一种鲁棒回归算法):
import numpy as np # 导入numpy库
from sklearn.linear_model import RANSACRegressor, LinearRegression # 导入RANSAC回归器和线性回归模型
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 3 * X.squeeze() + 2 + np.random.normal(0, 2, 100)
# 添加一些异常值
异常值X = np.array([[8], [9], [9.5]])
异常值y = np.array([50, 55, 60])
X = np.vstack((X, 异常值X)) # 将异常值X添加到X中
y = np.concatenate((y, 异常值y)) # 将异常值y添加到y中
ransac = RANSACRegressor(base_estimator=LinearRegression(), max_trials=100)
ransac.fit(X, y)
print("RANSAC 系数值:", ransac.model_.coef_)
print("RANSAC 截距值:", ransac.model_.intercept_)
第19条 系动词
它是什麼
隨機變量之間相互依存的關係的連接詞捕捉了這種依存關係,而獨立于各自的邊際分布特徵。在金融界,它們常用來建模資產回報之間的聯合分布。
示例用法
- 投资组合的风险:模拟多个股票间展示非线性依赖关系。
代码片段:
一个使用copulas
库中的高斯copula模型的简单示例:
!pip install copulas
导入 numpy as np
从 copulas.multivariate 导入 GaussianMultivariate
# 以下生成合成数据
X = np.random.normal(0, 1, (1000, 2))
X[:,1] = 0.8 * X[:,0] + np.random.normal(0, 0.6, 1000) # 相关性注释
模型 = GaussianMultivariate()
模型.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)
# 生成200行1列的随机数,并乘以10
X = np.random.rand(200, 1) * 10
# 计算y值,包括正弦转换和随机噪声
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())
结论部分
从理解贝叶斯推断和MLE,到高级概念如柯普ulas和广义加性模型,这20种高级统计方法构成了一个全面的工具包,是每位数据科学家的得力工具。这里的代码片段只是简单示例,但每种方法都可以深入研究以应对复杂的现实问题——无论是预测、推断,还是建模复杂的关系网络。
开心地分析吧!加油!
更多阅读:如果你觉得这篇帖子对你有帮助,不妨分享一下并留下你的评论!记得,掌握了这些统计技巧不仅会让你变得更强大的数据科学家,还能让你更有信心地解释和分享由数据驱动的见解。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章