从0开始机器学习--10.延申应用-数据分析DA(GMV,A/B测试,辛普森悖论,蒙特卡洛模拟,吉布斯采样,含2024数学建模国赛相关部分代码)

写在前面

经过之前9篇博文,我们对机器学习可以说已经有了个大致的了解和技术的掌握,那么机器学习在实际生活中,能起什么作用呢?数据分析岗位就是很对口的一项。这篇文章就涉及到一些数据分析需要了解的概念如什么是ABtest,大部分内容都是来自xhs的面经

1.python基础;
2.ai模型概念+基础;
3.数据预处理;
4.机器学习模型--1.聚类;2.降维;3.回归(预测);4.分类;
5.正则化技术;
6.神经网络模型--1.概念+基础;2.几种常见的神经网络模型;
7.对回归、分类模型的评价方式;
8.简单强化学习概念;
9.几种常见的启发式算法及应用场景;
10.机器学习延申应用-数据分析相关内容--1.A/B Test;2.辛普森悖论;3.蒙特卡洛模拟;
以及其他的与人工智能相关的学习经历,如数据挖掘、计算机视觉-OCR光学字符识别等。


本文目录

写在前面

什么是数据分析

商品成交总额 GMV(Gross Merchandise Value)

注意

如何看待 GMV 下跌?该怎么办?

ABtest

A/B实验的基本假定

A/B 测试的基本流程

最小样本量怎么算

有关因素

计算公式

示例

实验周期如何确定

1. 基于样本量计算

示例

2. 假设检验

3. 流量分配和转化率估算

4. 观察业务周期

5. 数据收敛性

6. 考虑用户生命周期

A/B 测试的应用场景:

A/B 测试如何检测分流的均匀性

1. 检查用户数量

2. 卡方检验(Chi-Square Test)

3. T 检验或 Z 检验

4. 检查用户属性的均匀性

5. 可视化检查

A/B 测试的常用方法

A/B 测试注意事项

相关概念:AA实验

AA实验和AB实验的差别

相关概念:因果推断

AB实验在因果推断中的作用

python代码示例

辛普森悖论(Simpson's Paradox)

如何理解辛普森悖论

例子

辛普森悖论的原因

辛普森悖论的应对策略

蒙特卡洛模拟(Monte Carlo Simulation)

蒙特卡洛模拟的核心思想

蒙特卡洛模拟的应用场景

示例(代码)

吉布斯采样

实战:2024数学建模国赛第二问题

另一个简单示例

总结


什么是数据分析

数据分析岗位主要负责通过处理和分析数据,帮助企业或组织做出数据驱动的决策。以下是数据分析岗位的一些核心职责:

  1. 数据收集与整理:从多个数据源获取数据(如数据库、API、Excel表格等),并进行清洗、整理(详见《3.数据预处理》《5.正则化技术》),以确保数据的完整性和准确性。
  2. 数据分析:使用统计方法、数学模型、以及机器学习算法(详见《4.机器学习模型》《6.神经网络模型》)分析数据,揭示数据中的趋势、模式和异常。这可以帮助企业发现问题、优化流程或预测未来趋势。
  3. 数据可视化:使用工具(如Excel、Tableau、Power BIMatplotlib(详见《1.python基础》)等)将分析结果转化为易于理解的图表和报告,以便决策者能够直观地理解数据背后的信息。
  4. 报表制作与解释:根据分析结果(详见《7.评估》),撰写数据报告,解释发现并提出可行性建议,支持业务决策。
  5. 协作与沟通:与其他部门(如市场、运营、产品等)紧密合作,理解他们的需求并通过数据提供支持。
  6. 数据建模与预测:利用统计模型或机器学习算法进行预测性分析,帮助企业预估未来的市场趋势或业务表现。
  7. 优化业务流程:通过分析发现问题所在,为企业优化运营策略提供数据支持,进而提高效率和降低成本。

数据分析师通常需要掌握数据分析工具(如Python、R、SQL)、数据可视化工具以及统计分析知识。这个岗位的核心目的是将复杂的数字转化为具有商业价值的洞察。

商品成交总额 GMV(Gross Merchandise Value)

指的是“商品成交总额”或“商品交易总额”,通常用于电子商务领域。GMV 表示一个平台或店铺在特定时期内,通过其销售的所有商品或服务的总价值,即在平台上成交的商品金额总和

计算公式为:\text{GMV} = \sum (\text{per-price} \times \text{total-volume})

注意

  • GMV 仅仅反映平台或商铺的交易总额,不等同于实际收入。它不考虑退货、取消订单、物流费用等因素
  • GMV 主要用于衡量平台的规模和市场活跃度,但未必反映平台的盈利能力
  • 电商平台如淘宝、京东、亚马逊等通常使用 GMV 作为衡量交易规模的指标

如何看待 GMV 下跌?该怎么办?

GMV(商品成交总额)下跌通常表明平台或店铺的销售业绩出现了下降。这可能是由于多种因素的综合作用,如市场需求、竞争加剧、运营问题等。如何看待 GMV 下跌以及应对措施,取决于具体的原因和行业背景。

1. 分析 GMV 下跌的原因

  • 市场需求下降:整体经济或行业环境不佳,消费者需求下降。
  • 竞争压力加大:竞争对手推出了更具吸引力的产品或营销策略。
  • 用户流失:用户对产品失去兴趣,客户忠诚度降低,或用户体验不佳。
  • 产品结构问题:产品更新不足或没有创新,未能跟上市场趋势。
  • 平台运营问题:物流、技术、售后服务等方面的问题影响了用户的购买体验。

通过数据分析工具(如用户行为分析、市场调研、竞品分析)找出核心问题。ABtest(见下)也是解决这个问题的很好的一个方法。

2. 应对 GMV 下跌的措施

   1. 提升产品与服务质量

  • 产品优化:重新评估产品的市场定位,推出新的产品,增加产品的吸引力。
  • 提高客户体验:从购买、支付、物流、售后服务等方面改善客户体验。

   2. 优化营销策略

  • 目标客户群体分析:重新细分市场,针对不同的客户群体制定差异化的营销策略。
  • 多渠道推广:通过社交媒体、电商平台、线下活动等多渠道的营销组合,扩大品牌曝光。
  • 促销活动:通过限时折扣、会员优惠等促销手段,刺激用户消费。

   3. 提高客户粘性

  • 客户忠诚度计划:推行会员制、积分系统等,增加客户的回购意愿。
  • 个性化推荐:利用大数据和 AI 提供个性化的商品推荐(可见专栏内《《数据挖掘》课程设计》-推荐算法),提高转化率。

   4. 拓展新市场

  • 地域扩展:探索新的地理市场,扩大业务覆盖范围。
  • 细分市场挖掘:发现新的需求点,针对不同的细分市场开发新产品。

   5. 提高运营效率

  • 库存与供应链优化:通过优化供应链管理,减少库存积压和浪费,提高运营效率。
  • 数据驱动决策:基于数据分析,优化产品供应、营销策略和客户管理。

ABtest

A/B 测试(A/B Testing;ab实验)是一种用于比较两个版本(A 和 B)的实验方法,目的是评估某个变化对目标指标的影响。通常,A 版本是当前的标准版本B 版本是包含改进或变化的新版本。通过统计分析,A/B 测试可以判断新版本是否在某个关键指标上优于当前版本。

A/B实验的基本假定

  • 随机性:用户在实验组和对照组之间随机分配,以消除潜在的偏差,确保两个组在各个方面(如用户特征、行为等)是可比的。
  • 独立性:各个用户之间的行为是独立的,前一个用户的选择不会影响后一个用户的选择。这使得实验结果不受用户间相互影响的干扰。
  • 相同的环境条件:在实验期间,影响用户行为的外部因素(如时间、地点、促销活动等)应保持一致,以便准确评估不同版本的效果。
  • 可测量性:必须有清晰的指标来衡量实验结果(如转化率、点击率等),以便进行比较和分析。
  • 样本量假设:实验设计需要足够的样本量,以确保统计结果具有显著性,能够检测到预期的效果增量。
  • 假设框架:需要清晰地定义原假设(无效假设)和备择假设,以便进行统计检验,决定是否拒绝原假设。
  • 数据分布假设:在某些情况下,可能会假设数据遵循特定的分布(如正态分布),以便使用特定的统计检验方法。

A/B 测试的基本流程

  1. 定义目标:确定希望通过实验评估的关键指标(kpi),如转化率、点击率、用户留存等。
  2. 制定假设:基于当前数据和观察,提出可能改善目标的假设,确保假设是可测试和可量化的。
  3. 设计实验:将用户随机分配到两个组:控制组(A 版本)和实验组(B 版本),并确保实验条件一致。
  4. 确定样本量:最小样本量、最小效应量、所需的统计显著性水平。
  5. 收集数据:在实验期间,收集两组的指标数据。
  6. 分析结果:通过统计方法(如假设检验、t 检验等),评估两组在目标指标上的差异是否显著。
  7. 得出结论:根据分析结果,决定是否推广 B 版本,或者保留 A 版本。

最小样本量怎么算

有关因素
  • 1. 显著性水平(α,通常设定为0.05):这是拒绝原假设时犯第一类错误(假阳性)的概率,即得出差异显著但实际上没有差异的概率。
  • 2. 统计功效(Power,通常设定为0.8或80%):这是拒绝原假设时不犯第二类错误(假阴性)的概率,即发现差异并正确地认为差异显著的能力。
  • 3. 最小可检测差异(Minimum Detectable Effect, MDE):这是希望检测的最小效果差异,即A组和B组之间的期望效果差异。
  • 4. 基线转化率(Baseline Conversion Rate):即A组的转化率或者基线转化率。
计算公式

最常用的计算最小样本量的公式是基于两样本Z检验的公式。具体公式如下:

示例

假设想要检测A组和B组转化率的差异,基线转化率为10%(0.1),想检测的最小差异为2%(0.02),显著性水平为0.05,统计功效为80%。

代入公式,计算后结果约为4822,即每组至少需要约4822个样本。

实验周期如何确定

实验周期(T)可以通过计算得到的样本量(n)和每天的流量(t)来决定:T = \frac n t

1. 基于样本量计算

通过计算所需的样本量来确定试验周期的长短。样本量的计算依赖于以下参数:

  • 显著性水平(α):通常设为 0.05,表示有 5% 的概率发生假阳性。
  • 统计功效(1-β):通常设为 0.8,表示 80% 的概率检测到真实的效果。
  • 最小检测效果(MDE):希望检测的最小效果大小,通常是一个业务上可接受的最小变化率。
  • 基准转化率:当前实验组或对照组的转化率。

使用这些参数,可以通过公式或在线计算器来确定每个组需要的样本量,然后根据每天的流量计算出试验所需的周期。

样本量计算公式

在比较两组的转化率时,计算每个组所需的样本量(n)的公式:n = \frac{2 \cdot (Z_{\alpha/2} + Z_{\beta})^2 \cdot \hat{p}(1 - \hat{p})}{(\Delta)^2}

参数解释:

  • n:每个组所需的样本量。
  • Z_{\alpha/2}:标准正态分布的临界值,对应于显著性水平 \alpha(通常为 0.05)。比如,Z_{\alpha/2} \approx 1.96 对应于 95% 的置信水平。
  • Z_{\beta}:标准正态分布的临界值,对应于统计功效 1-\beta(通常为 0.8,对应Z_{\beta} \approx 0.84)。
  • \hat{p}:基准转化率,即实验开始前的当前转化率。
  • \Delta:最小检测效果(MDE),即希望检测的最小转化率变化。
  • \hat{p}(1 - \hat{p}):这是基准转化率的方差,用于衡量随机误差。
示例

假设基准转化率为 10%,最小检测效果为 3%,显著性水平为 0.05,统计功效为 0.80,代入公式为:   n = \frac{2 \cdot (1.96 + 0.84)^2 \cdot 0.10(1 - 0.10)}{0.03^2},这会给出每组所需的样本量。

2. 假设检验

使用假设检验的方法,可以通过观察测试数据在不同时间点的统计显著性来确定试验周期。当数据在一段时间内持续达到预设的显著性水平时,可以考虑终止测试。主要步骤:

  • 每天检查累积数据的p值;
  • 当p值小于设定的显著性水平且持续不变时,可以结束测试。
3. 流量分配和转化率估算

如果没有现成的样本量计算工具,也可以通过估算每日流量和转化率来确定测试周期:

  • 每日访问量:估算每日有多少流量可以进入A/B测试的实验;
  • 基准转化率:了解当前用户的转化率;
  • 效果增量:确定你期望检测到的转化率变化。

假设你期望检测的最小效果增量是3%,每日的流量是5000用户,转化率基准是10%,那么需要通过假设检验判断多少天的周期才能保证检测出显著的效果增量。

4. 观察业务周期

A/B测试需要涵盖业务的完整周期,例如周末效应或其他季节性波动。如果某些天的流量或用户行为异常,例如节假日、促销等,应考虑将这些时段纳入测试中或延长测试周期,以确保结果能够代表不同时间段的业务表现。

5. 数据收敛性

通过观察测试结果的稳定性来确定测试是否结束。一般来说,当测试的结果波动较大时,说明还需要继续观察;当结果趋于稳定且没有剧烈变化时,可以考虑结束测试

6. 考虑用户生命周期

有些产品特征(如订阅、长期留存等)可能需要较长的用户生命周期才能检测到效果。这种情况下,A/B测试周期可能要涵盖更长时间,以观察长期效果。

A/B 测试的应用场景:

A/B 测试广泛应用于多个领域,尤其是在需要优化用户体验或提高业务指标的场景中。以下是一些典型的应用场景:

  • 1. 网页设计与用户体验优化:评估网页布局、按钮颜色、字体大小等设计调整是否提高了转化率、点击率、停留时间等用户行为。
  • 2. 产品功能测试:对比两种不同的产品功能或界面设计,评估哪种设计更受用户欢迎。
  • 3. 数字营销:在电子邮件营销、广告投放中,A/B 测试用于评估不同广告创意、邮件标题等是否影响用户点击和转化。
  • 4. 定价策略:测试不同的定价方案对用户购买决策的影响,从而确定最佳定价策略。
  • 5. 移动应用优化:比较两种不同的用户引导流程或功能布局,评估用户的交互体验、功能使用率等。
  • 6. 算法优化:测试新的推荐算法是否在用户留存、点击率等关键指标上优于现有算法。

A/B 测试如何检测分流的均匀性

这个问题也被称为辛普森悖论(见下)

分流的均匀性是指确保每个实验组中的用户数量大致相同,以避免样本不平衡可能对实验结果带来的偏差

1. 检查用户数量

首先,简单地检查每个实验组中的用户数量是否接近。例如,在两组实验中,A 组和 B 组的用户数应大致相等。

2. 卡方检验(Chi-Square Test)

对于更严格的统计检验,卡方检验(概率论与数理统计基础知识)是常用的工具,它可以用于检测是否存在统计显著的分组不均匀。假设每个组的用户比例应为相等的情况下,我们可以检验实际分布是否与预期一致。

\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}

其中:

  • O_i是每个组的实际观测值(即实际用户数)。
  • E_i是每个组的期望值(假设均匀分配下的用户数)。

检验步骤

  1. 计算每个组的实际用户数量O_i和期望的用户数量E_i
  2. 计算卡方统计量\chi^2
  3. 通过查阅卡方分布表,使用合适的显著性水平(通常为 0.05),查看卡方值是否显著。如果计算出的卡方值大于临界值,说明分流不均匀。

3. T 检验或 Z 检验

对于两组实验,可以使用 T 检验或 Z 检验来比较两个组用户的均值是否存在显著差异。如果两个组的用户特征均值(例如,用户年龄、活跃度等)没有显著差异,说明分流均匀。

4. 检查用户属性的均匀性

除了数量的均匀性,用户的其他属性(如性别、年龄、地区等)也应在分组中均匀分配。可以使用类似的方法,如卡方检验、T 检验,来比较每个组内用户属性的均值或分布是否一致。

5. 可视化检查

可以通过绘制柱状图或饼图来直观检查分流的均匀性。如果每个组的用户数量或关键属性的分布图形相似,则说明分流是均匀的

A/B 测试的常用方法

  • 1. t 检验:适用于对比两个组的均值(如转化率等连续型变量),判断两组之间的差异是否具有统计显著性。
  • 2. 卡方检验:适用于对比分类变量(如点击与未点击等),判断是否存在显著的组间差异。
  • 3. 置信区间:通过计算两组差异的置信区间,可以估计新版本相对旧版本的效果波动范围。
  • 4. 样本量计算:为确保实验具有足够的统计功效,需要在实验开始前计算所需的最小样本量,以避免过早得出结论或数据不足。

A/B 测试注意事项

  • 1. 样本代表性:实验样本必须是目标人群的代表,否则实验结果可能无法推广到全体用户。
  • 2. 随机分配并控制变量:保证用户随机分配到 A 和 B 版本,以消除潜在的偏差;尽量只改变一个变量,以确保能够准确归因
  • 3. 时间与季节性影响:注意实验运行时间可能影响结果,例如不同时间段的用户行为可能不同
  • 4. 多次测试问题(新奇效应):避免同时进行多个 A/B 测试,这样可能导致交互效应,影响测试结果的有效性。
  • 5. 数据泄露与干扰:实验中可能会存在外部干扰,或用户知道自己在实验组中,这可能影响他们的行为,进而影响实验结果。还需保证保护进入测试的用户的信息。

相关概念:AA实验

AA实验是一种A/B测试的变种,主要用于验证实验设计、测试工具和数据收集过程的有效性。它的基本思路是将相同的用户随机分配到两个相同的组(即A组和A组),并比较这两个组的结果。AA实验通常用于以下目的:

  • 基线验证:检查在没有任何变化的情况下,两个组是否会产生显著差异,以确认实验过程中的随机分配是否有效。
  • 工具可靠性质:确保数据收集工具和分析方法没有问题,能够准确地捕捉和分析数据。

AA实验和AB实验的差别

特征AA实验AB实验
目的验证实验设计和工具的有效性评估不同版本之间的效果差异
组成两个相同的组(A组和A组)一个实验组(A组)和一个对照组(B组)
预期结果预期结果之间没有显著差异  预期结果之间存在显著差异
应用场景在开始AB测试之前验证方法的可靠性评估新版本或变化的效果
数据分析比较两个组的结果,检验随机性和一致性比较两个组的转化率、用户行为等差异

AA实验用于确保实验过程和工具的有效性,而AB实验则用于比较两个不同版本之间的效果。AA实验是AB实验的重要前期步骤,有助于提高后续AB实验的信度和效度。

相关概念:因果推断

AB实验(A/B Testing)是一种实验设计方法,广泛应用于产品优化、营销策略等领域。它的核心目的是通过随机分配用户到不同的组来比较两个或多个版本之间的效果,从而进行因果推断

因果推断旨在确定某一因素(如新产品特性、营销策略)对结果(如用户转化率、销售额)的影响。它强调以下几点:

  • 随机性:通过随机分配,使得各组在处理前具有可比性,减少潜在的混杂因素。
  • 控制组与实验组:通过对照组的设置,可以更清晰地观察处理效应。

AB实验在因果推断中的作用

  • 1. 随机分配:AB实验通过随机将用户分配到实验组(A)和对照组(B),确保各组在其他特征上的一致性,从而减少选择偏差(selection bias)。
  • 2. 控制外部变量:随机化的设计使得外部变量对结果的影响得到控制,任何观察到的差异都可以归因于实验处理的影响。
  • 3. 明确的因果关系:通过对比实验组和对照组的结果,AB实验可以帮助确定特定改变是否引起了结果的变化,从而进行因果推断。
  • 4. 数据驱动决策:AB实验提供了实证数据,帮助决策者理解不同策略的效果,从而在业务中做出更具依据的决策。

AB实验是因果推断的重要工具,通过严格的实验设计和随机分配,帮助研究人员和决策者确定特定变化对结果的影响。它不仅为商业优化提供了实证支持,也为学术研究中的因果推断提供了有效的方法。

python代码示例

假设我们有两个广告页面 A 和 B,希望通过 A/B 测试比较哪个页面的转化率更高。我们可以使用 Python 的 scipy.stats 来进行 t 检验。

import numpy as np
from scipy import stats
# 假设 A 组有 1000 名用户,转化了 200 名用户
# B 组有 1000 名用户,转化了 250 名用户
conversions_A = 200
conversions_B = 250
total_A = 1000
total_B = 1000
# 计算转化率
conversion_rate_A = conversions_A / total_A
conversion_rate_B = conversions_B / total_B
# 计算标准误差
se_A = np.sqrt(conversion_rate_A * (1 - conversion_rate_A) / total_A)
se_B = np.sqrt(conversion_rate_B * (1 - conversion_rate_B) / total_B)
# 计算 z 值
z = (conversion_rate_B - conversion_rate_A) / np.sqrt(se_A**2 + se_B**2)
# 计算 p 值
p_value = stats.norm.sf(abs(z)) * 2  # 双尾检验
print(f"转化率 A: {conversion_rate_A:.4f}, 转化率 B: {conversion_rate_B:.4f}")
print(f"Z 值: {z:.4f}, P 值: {p_value:.4f}")
if p_value < 0.05:
    print("B 版本的转化率显著高于 A 版本")
else:
    print("没有足够的证据表明 B 版本优于 A 版本")
  • Z 值:表示两组之间差异的标准化值,数值越大表示差异越大。
  • P 值:表示结果的显著性。如果 P 值小于 0.05,则认为 B 版本的转化率显著高于 A 版本。

输出:

转化率 A: 0.2000, 转化率 B: 0.2500
Z 值: 2.6822, P 值: 0.0073
B 版本的转化率显著高于 A 版本

辛普森悖论(Simpson's Paradox)

辛普森悖论是统计学中的一种现象当数据在不同组别之间进行分组分析和总体分析时,可能会得出相反的结论。具体而言,在分组分析中显示的趋势,在数据合并后可能会消失或逆转。这表明仅从汇总数据得出的结论有时可能具有误导性

如何理解辛普森悖论

例子

假设某大学有两个专业A和B,进行录取率分析:

  • 专业A:有100人报考,录取40人,录取率40%。
  • 专业B:有50人报考,录取45人,录取率90%。

但是,如果将两组数据合并起来:总共有150人报考,总录取85人,录取率为 56.7%

从整体来看,录取率为56.7%,但分组分析显示,专业A的录取率为40%,专业B的录取率为90%。辛普森悖论说明,局部和整体分析的结果可以相差很大,甚至相互矛盾

辛普森悖论的原因

  • 1. 数据分组方式不当:不同组别之间的差异被忽略或处理不当,导致汇总分析与分组分析产生矛盾的结果。
  • 2. 样本量差异:组别之间的样本量存在显著差异时,整体数据会受到大样本组别的影响,掩盖了小样本组别的真实趋势。或未采用加权平均
  • 3. 混淆变量:未考虑某些混淆变量,这些变量在不同组别之间存在系统性差异,会导致合并后的结果与分组结果不一致。
  • 4. 相关性不等于因果关系

辛普森悖论的应对策略

  • 1. 分组分析:在分析数据时,分组分析有助于识别各组之间的差异,避免盲目合并数据。
  • 2. 控制混淆变量:识别潜在的混淆变量,并在分析时控制这些变量,避免偏差。
  • 3. 可视化数据:通过数据可视化,展示局部和整体的趋势,便于更直观地理解数据中可能存在的悖论。

蒙特卡洛模拟(Monte Carlo Simulation)

是一种通过随机抽样和统计分析来估计复杂系统或过程行为的技术。它的核心思想是使用大量随机样本来逼近一个问题的解,特别适用于那些存在不确定性或复杂度较高的问题。(蒙特卡洛搜索可见《8.强化学习》)

蒙特卡洛模拟的核心思想

  • 1. 随机抽样:利用随机数生成器模拟系统中不确定性因素的不同可能性,或者从一个已知的概率分布中生成随机样本。
  • 2. 多次重复:对系统或过程进行多次模拟,每次使用不同的随机样本,从而得到大量的结果
  • 3. 统计分析:通过对模拟结果进行统计分析,来估计系统或过程的平均表现、分布特性或者结果的概率。

蒙特卡洛模拟的应用场景

  • 计算复杂概率:当问题无法通过解析方法精确求解时,可以通过模拟大量随机样本来估计概率。例如,计算金融衍生品的价格、评估投资组合的风险等。
  • 多重不确定性:当系统有多个不确定变量(例如市场波动、气候变化等)时,蒙特卡洛模拟可以模拟这些变量的不同组合,帮助评估系统在不同情况下的表现。
  • 逼近积分和优化问题:当传统数值积分或优化方法难以应用时,蒙特卡洛方法通过随机抽样来逼近结果。

示例(代码)

假设我们要估计一个圆的面积。我们可以通过蒙特卡洛模拟来解决这个问题。

设想一个单位正方形,边长为 2,中心在原点,里面有一个半径为 1 的圆。我们可以通过以下步骤来估计圆的面积:

  1. 随机向正方形中投点。
  2. 计算每个点是否落在圆内。
  3. 重复多次,计算落在圆内的点占总投点数的比例。
  4. 由于圆的面积与正方形的面积(4)之比就是这个比例,因此可以估计出圆的面积。
import numpy as np
# 蒙特卡洛模拟估计圆的面积
def monte_carlo_circle_area(num_samples):
    inside_circle = 0
    # 生成num_samples个随机点
    for _ in range(num_samples):
        x, y = np.random.uniform(-1, 1, 2)  # 在正方形中随机取点
        if x**2 + y**2 <= 1:  # 判断是否在圆内
            inside_circle += 1
    # 圆的面积 = (圆内点数 / 总点数) * 正方形的面积
    return (inside_circle / num_samples) * 4  # 正方形的面积是4
# 执行蒙特卡洛模拟
num_samples = 100000
estimated_area = monte_carlo_circle_area(num_samples)
print(f"Estimated area of the circle: {estimated_area}")

输出:

Estimated area of the circle: 3.13888

吉布斯采样

吉布斯采样并不是单纯的多次随机采样取平均值,而是通过迭代逐步从每个变量的条件概率分布中进行采样,以逼近目标联合分布的样本。它是一种马尔可夫链(信息论基础知识,具体可见《8.强化学习》)蒙特卡罗方法(MCMC),主要目的是从复杂的多维联合分布中生成样本。

吉布斯采样特别适合在概率模型的联合分布难以直接采样时使用,但其条件分布比较容易计算的情况

特别适用于有很多变量,并且这些变量的联合分布(即所有变量一起的分布)很难直接采样的时候。它通过分步进行采样:每次只从其中一个变量的条件分布采样,而其他变量固定。这种分步采样的方法最终可以帮助我们从整个联合分布中得到合理的样本。

实战:2024数学建模国赛第二问题

我们将随机情况考虑到每次的生成计划中,通过采样的方式模拟随机成长或衰减的新情况。

import random
def group():
    # 加入随机销量成长率
    global sales,sales_min1,sales_min2,sales_min3,yields,costs,price
    for i in sales.keys():
        if i == 6 or i == 7:
            sales[6] = sales[6]*(1+random.uniform(0.05,0.1))
            sales[7] = sales[7]*(1+random.uniform(0.05,0.1))
        else:
            sales[i] = sales[i]*(1+random.uniform(-0.05,0.05))
    # 计算三个不同年份的最小销量预测
    sales_min1 = {k: v * 0.95 for k, v in sales.items()}
    #第二年
    for i in sales.keys():
        if i == 6 or i == 7:
            sales[6] = sales[6]*(1+random.uniform(0.05,0.1))
            sales[7] = sales[7]*(1+random.uniform(0.05,0.1))
        else:
            sales[i] = sales[i]*(1+random.uniform(-0.05,0.05))
    sales_min2 = {k: v * 0.95 for k, v in sales.items()}
    #第三年
    for i in sales.keys():
        if i == 6 or i == 7:
            sales[6] = sales[6]*(1+random.uniform(0.05,0.1))
            sales[7] = sales[7]*(1+random.uniform(0.05,0.1))
        else:
            sales[i] = sales[i]*(1+random.uniform(-0.05,0.05))
    sales_min3 = {k: v * 0.95 for k, v in sales.items()}
    # 加入随机产量变化
    yields = [i * (1 + random.uniform(-0.1, 0.1)) for i in yields]
    # 成本增加5%
    costs = [c * 1.05 for c in costs]
    # 价格调整
    for index, crop_type in enumerate(df['作物类型'].values):
        if crop_type == 1:
            prices[index] *= 1.05
        elif crop_type == 2:
            prices[index] *= (1 + random.uniform(0.01, 0.05))

另一个简单示例

import numpy as np
import matplotlib.pyplot as plt

# 设置随机数种子
np.random.seed(42)

# 二维正态分布的协方差矩阵
mu = np.array([0, 0])
sigma = np.array([[1, 0.8], [0.8, 1]])

# Gibbs采样的初始值
n_samples = 10000
x1 = np.zeros(n_samples)
x2 = np.zeros(n_samples)

# Gibbs采样过程
for i in range(1, n_samples):
    # 根据 X2 给定的条件分布采样 X1
    x1_cond_mu = mu[0] + sigma[0, 1] / sigma[1, 1] * (x2[i-1] - mu[1])
    x1_cond_sigma = np.sqrt(sigma[0, 0] - sigma[0, 1]**2 / sigma[1, 1])
    x1[i] = np.random.normal(x1_cond_mu, x1_cond_sigma)
    
    # 根据 X1 给定的条件分布采样 X2
    x2_cond_mu = mu[1] + sigma[1, 0] / sigma[0, 0] * (x1[i] - mu[0])
    x2_cond_sigma = np.sqrt(sigma[1, 1] - sigma[1, 0]**2 / sigma[0, 0])
    x2[i] = np.random.normal(x2_cond_mu, x2_cond_sigma)

# 可视化采样结果
plt.figure(figsize=(10, 5))

# 绘制散点图
plt.subplot(1, 2, 1)
plt.plot(x1, x2, 'o', alpha=0.2)
plt.title('Gibbs Sampling - Scatter Plot')
plt.xlabel('X1')
plt.ylabel('X2')

# 绘制直方图
plt.subplot(1, 2, 2)
plt.hist2d(x1, x2, bins=30, cmap='Blues')
plt.title('Gibbs Sampling - 2D Histogram')
plt.xlabel('X1')
plt.ylabel('X2')

plt.tight_layout()
plt.show()
  • 初始化

    • mu 是二维正态分布的均值向量,设为[0,0]。
    • sigma 是协方差矩阵,两个变量 X1 和 X2​ 之间具有 0.8 的相关性。
  • 吉布斯采样循环

    • 通过两个条件分布交替对 X1​ 和 X2​ 进行采样。对于每个 X1​,我们根据当前的 X2​ 进行采样;然后根据更新的 X1​,我们对 X2​ 进行采样。
  • 可视化结果

    • 左侧为采样的散点图,展示了采样结果的分布形态。
    • 右侧为二维直方图,显示采样结果的密度分布。

输出:


总结

数据分析岗位的核心任务是通过分析数据为业务提供决策支持,常常结合多种机器学习技术来发现数据中的规律和趋势。具体工作中,分析师需要处理的概念包括GMV(总交易额),用于衡量业务表现。A/B测试是一种常见的实验设计方法,用于比较不同方案的效果,避免像辛普森悖论这样的误导性结果。蒙特卡洛模拟则帮助分析师在不确定性条件下评估不同场景的可能性,而吉布斯采样等技术则用于从复杂的概率分布中进行高效采样。这些工具和方法都是数据分析师日常工作中提升分析深度和精度的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值