bayesian-stats-modelling-tutorial分层模型实战:冰 cream 店数据分析案例

📅 2026/8/10 21:41:30
bayesian-stats-modelling-tutorial分层模型实战:冰 cream 店数据分析案例
bayesian-stats-modelling-tutorial分层模型实战冰 cream 店数据分析案例【免费下载链接】bayesian-stats-modelling-tutorialHow to do Bayesian statistical modelling using numpy and PyMC3项目地址: https://gitcode.com/gh_mirrors/ba/bayesian-stats-modelling-tutorialbayesian-stats-modelling-tutorial是一个使用numpy和PyMC3进行贝叶斯统计建模的开源项目本教程将通过冰 cream 店数据分析案例带您掌握分层模型的实战应用让您轻松上手贝叶斯统计建模。什么是分层模型在贝叶斯统计建模中分层模型是一种强大的工具它能够将数据中的层次结构融入模型中。简单来说分层模型假设不同组别的数据来自不同的分布而这些分布又共享一个更高层次的共同分布。这种结构允许我们在组间共享信息从而提高模型的准确性和泛化能力。例如在冰 cream 店数据中我们可以假设每个店铺的顾客喜好度p来自其所属店主的分布而每个店主的分布又来自一个总体分布。这种层次结构能够帮助我们更好地估计数据稀疏的店铺的参数。冰 cream 店数据介绍我们使用的数据集包含多个冰 cream 店的顾客数量和喜欢该店的顾客数量以及店铺所属店主的信息。数据位于data/ice_cream_shop.csv。通过分析这些数据我们可以构建分层模型来估计每个店铺的顾客喜好度并探究不同店主之间的差异。模型构建步骤数据预处理首先我们需要加载并预处理数据。我们可以使用项目中提供的数据加载函数from bayes_tutorial.data import load_ice_cream data load_ice_cream() data.head()这段代码会加载冰 cream 店数据并显示前几行。我们可以看到数据包含店铺名称、顾客数量、喜欢该店的顾客数量以及店主索引等信息。探索性数据分析在构建模型之前进行探索性数据分析是很重要的。我们可以计算每个店铺的朴素喜好度喜欢的顾客数/总顾客数并按店主分组查看import janitor import numpy as np naive_p ( data .join_apply( # 计算朴素喜好度 lambda x: x[num_favs] / x[num_customers] if x[num_favs] 0 else np.nan, new_column_namenaive_p ) ) ( naive_p .groupby(owner_idx) .agg({naive_p: [mean, count, std]}) )通过这段代码我们可以看到不同店主的店铺的平均喜好度、数量和标准差。这有助于我们了解数据的基本分布情况。模型假设与结构基于探索性数据分析的结果我们假设每个店铺的喜好度p来自其所属店主的分布而每个店主的分布又来自一个总体分布。为了方便建模我们使用logit变换将p转换到实数域然后使用正态分布来建模变换后的参数。上图展示了贝叶斯模型中的概率分布概念包括似然函数和先验分布。在我们的分层模型中每个店铺的logit(p)服从均值为店主logit(p)、标准差为店主特定标准差的正态分布而店主的logit(p)又服从一个总体正态分布。模型实现使用PyMC3实现分层模型的代码如下from bayes_tutorial.solutions.hierarchical import ice_cream_hierarchical_model model ice_cream_hierarchical_model(data)这个函数会构建一个包含层次结构的PyMC3模型。模型的详细结构可以在src/bayes_tutorial/solutions/hierarchical.py中找到。模型训练与评估模型训练使用MCMC方法训练模型import arviz as az import pymc3 as pm with model: trace pm.sample(2000, tune2000) trace az.from_pymc3( trace, coords{ p_shop_dim_0: data[shopname], logit_p_shop_dim_0: data[shopname], logit_p_owner_scale_dim_0: data[owner_idx].sort_values().unique(), p_owner_dim_0: data[owner_idx].sort_values().unique(), logit_p_owner_mean: data[owner_idx].sort_values().unique(), }, )这段代码会运行MCMC采样生成模型参数的后验分布样本。我们可以使用ArviZ库来可视化和分析这些样本。模型评估我们可以使用迹图trace plot来评估MCMC采样的收敛性az.plot_trace(trace, var_names[p_owner]);上图展示了不同店主的喜好度参数的采样迹图。如果迹图看起来像毛毛虫没有明显的趋势或结构说明采样收敛得很好。我们还可以绘制后验分布图来查看参数的不确定性az.plot_posterior(trace, var_names[p_owner]);结果分析与解释店主水平喜好度分析通过森林图forest plot可以直观地比较不同店主的喜好度az.plot_forest(trace, var_names[p_owner]);从结果中我们可以看到不同店主的店铺的平均喜好度存在显著差异。例如店主6、7和8的店铺普遍受到顾客喜爱而店主2、3和5的店铺则不太受欢迎。店主水平变异性分析除了平均喜好度我们还可以分析不同店主的店铺的变异性。通过绘制店主喜好度和标准差的联合后验分布我们可以看到哪些店主的店铺表现稳定哪些店主的店铺表现波动较大locations trace.posterior[p_owner].to_dataframe().unstack(-1) scales trace.posterior[logit_p_owner_scale].to_dataframe().unstack(-1) for i in range(9): plt.scatter(locations[(p_owner, i)], scales[(logit_p_owner_scale, i)], alpha0.3, labelf{i}) plt.xlabel(owner p) plt.ylabel(owner $\\sigma$) sns.despine() plt.legend();理想情况下店主希望位于图的右下角高喜好度且低变异性。店主7和6就属于这种情况而独立店铺店主8虽然喜好度高但变异性也较大。店铺水平分析分层模型的一个重要优势是能够对数据稀疏的店铺进行合理的估计。通过比较朴素估计、贝叶斯估计和店主水平估计我们可以看到贝叶斯估计会收缩到店主水平从而避免了极端的估计值。上图展示了贝叶斯分层模型的结构其中每个店铺的参数来自其所属店主的分布而店主的参数又来自总体分布。这种结构使得信息能够在不同层次之间共享从而提高估计的准确性。分层模型的优缺点分析优点能够处理数据稀疏的情况对小样本数据进行合理估计。能够捕捉数据中的层次结构提高模型的解释性。允许组间信息共享提高模型的泛化能力。缺点模型结构相对复杂实现和解释难度较大。需要更多的计算资源特别是在处理大规模数据时。假设组间存在层次结构如果实际数据不满足这一假设模型性能可能不佳。实际应用与扩展分层模型在许多领域都有广泛的应用例如教育评估估计不同学校、不同班级的学生表现。医疗研究分析不同医院、不同医生的治疗效果。市场研究探究不同地区、不同人群的消费偏好。在实际应用中我们可以根据具体问题扩展模型例如添加更多的层次结构、引入协变量等。项目中的docs/intermediate/hierarchical.ipynb提供了更详细的模型扩展方法。总结与展望通过冰 cream 店数据分析案例我们展示了分层模型在贝叶斯统计建模中的应用。分层模型能够有效地处理数据中的层次结构提高估计的准确性和泛化能力。虽然模型结构相对复杂但通过PyMC3等工具我们可以相对容易地实现和应用分层模型。未来我们可以进一步探索模型的改进方法例如使用更灵活的先验分布、引入非参数方法等。同时我们也需要注意模型的假设是否符合实际数据避免因模型误设而导致错误的结论。希望本教程能够帮助您更好地理解和应用分层模型。如果您有任何问题或建议欢迎在项目中提出issue或参与讨论。参考资料项目文档docs/index.md分层模型实现src/bayes_tutorial/solutions/hierarchical.pyPyMC3官方文档https://docs.pymc.io/ArviZ官方文档https://arviz-devs.github.io/arviz/【免费下载链接】bayesian-stats-modelling-tutorialHow to do Bayesian statistical modelling using numpy and PyMC3项目地址: https://gitcode.com/gh_mirrors/ba/bayesian-stats-modelling-tutorial创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考