蒙特霍尔悖论的可视化分析:基于Plotly的数据科学实践
mlcourse.ai Open Machine Learning Course 项目地址: https://gitcode.com/gh_mirrors/ml/mlcourse.ai
引言
蒙特霍尔问题是一个著名的概率谜题,源自美国电视节目《Let's Make a Deal》。这个问题看似简单,却常常引发激烈的争论,因为它违背了许多人的直觉判断。本文将借助Plotly这一强大的可视化工具,通过数据科学的方法来深入分析这个经典问题。
问题描述
想象你参加一个游戏节目,面前有三扇门:
- 一扇门后是一辆汽车(大奖)
- 另外两扇门后是山羊
游戏流程如下:
- 你选择一扇门(比如1号门)
- 主持人(知道门后的情况)会打开另一扇有山羊的门
- 然后问你是否想换到剩下的那扇未打开的门
- 你的最终选择决定了你是否能赢得汽车
理论分析
从概率论的角度来看:
- 坚持初始选择:获胜概率为1/3(约33.3%)
- 改变初始选择:获胜概率为2/3(约66.6%)
- 随机选择(抛硬币决定是否换门):获胜概率为1/2(50%)
这个结果常常让人感到困惑,因为直觉上似乎换不换门应该没有区别。下面我们将通过模拟实验和可视化来验证这些理论概率。
实验设计与实现
我们设计了6个核心函数来模拟游戏过程:
1. 游戏初始化函数
def newGame():
# 随机放置汽车和山羊
position = random.randint(1, 4)
if position == 1:
return {"door1": "car", "door2": "goat", "door3": "goat"}
elif position == 2:
return {"door1": "goat", "door2": "car", "door3": "goat"}
else:
return {"door1": "goat", "door2": "goat", "door3": "car"}
2. 玩家选择函数
def guestChoice():
# 玩家随机选择一扇门
door_choice = random.randint(1, 4)
return f"door{door_choice}"
3. 主持人开门函数
def openOneDoor(game, chosen_door):
# 主持人必须打开一扇有山羊且未被玩家选择的门
all_doors = ["door1", "door2", "door3"]
options = game.copy()
if game[chosen_door] != "car":
# 如果玩家初始选择是山羊,主持人只能打开另一扇山羊门
for door in all_doors:
if door != chosen_door and game[door] != "car":
options[door] = "open"
return options
else:
# 如果玩家初始选择是汽车,主持人随机打开一扇山羊门
goat_doors = [door for door in all_doors if door != chosen_door]
options[random.choice(goat_doors)] = "open"
return options
4. 玩家决策函数
def guestChange(game, chosen_door, change):
game_with_open = openOneDoor(game, chosen_door)
if change == "Y":
# 换门:选择既不是初始选择也不是主持人打开的门
for door in game_with_open:
if game_with_open[door] != "open" and door != chosen_door:
return door
else:
# 不换门:保持初始选择
return chosen_door
5. 结果验证函数
def checkResult(game, chosen_door, change):
final_choice = guestChange(game, chosen_door, change)
return "WIN" if game[final_choice] == "car" else "LOSE"
6. 批量实验函数
def result(n=400, step=1):
list_N, win_change, win_nochange, win_rand = [], [], [], []
for N in range(1, n+1, step):
count_y = count_n = count_rand = 0
for _ in range(N):
game = newGame()
chosen_door = guestChoice()
# 三种策略分别统计
count_y += checkResult(game, chosen_door, "Y") == "WIN"
count_n += checkResult(game, chosen_door, "N") == "WIN"
count_rand += checkResult(game, chosen_door,
"Y" if random.randint(2) == 0 else "N") == "WIN"
list_N.append(N)
win_change.append(count_y / N * 100)
win_nochange.append(count_n / N * 100)
win_rand.append(count_rand / N * 100)
return list_N, win_change, win_nochange, win_rand
可视化分析
我们使用Plotly创建了多种可视化图表来展示实验结果:
1. 折线图展示胜率变化
def plotResult(change, nochange, rand, game=None, plot="line", ...):
# 创建三种策略的轨迹
trace_change = go.Scatter(x=game, y=change, name="换门策略")
trace_nochange = go.Scatter(x=game, y=nochange, name="不换门策略")
trace_rand = go.Scatter(x=game, y=rand, name="随机策略")
layout = go.Layout(title="蒙特霍尔问题胜率随实验次数变化",
xaxis=dict(title="实验次数"),
yaxis=dict(title="胜率(%)"))
fig = go.Figure(data=[trace_change, trace_nochange, trace_rand], layout=layout)
iplot(fig)
2. 箱线图展示分布
def plotResult(..., plot="box"):
# 创建箱线图数据
data = [go.Box(y=change, name="换门策略", boxpoints="all", jitter=jitter, pointpos=pointpos),
go.Box(y=nochange, name="不换门策略", boxpoints="all", jitter=jitter, pointpos=pointpos),
go.Box(y=rand, name="随机策略", boxpoints="all", jitter=jitter, pointpos=pointpos)]
layout = go.Layout(title="蒙特霍尔问题胜率分布")
fig = go.Figure(data=data, layout=layout)
iplot(fig)
3. 小提琴图展示概率密度
def plotResult(..., plot="violin"):
# 创建小提琴图数据
fig = ff.create_violin([change, nochange, rand],
["换门策略", "不换门策略", "随机策略"],
colors=["#1f77b4", "#ff7f0e", "#2ca02c"],
show_legend=True)
iplot(fig)
4. 分布图展示频率
def plotResult(..., plot="dist"):
# 创建分布图数据
hist_data = [change, nochange, rand]
group_labels = ["换门策略", "不换门策略", "随机策略"]
fig = ff.create_distplot(hist_data, group_labels, bin_size=bin_size, show_rug=show_rug)
fig.update_layout(title_text="蒙特霍尔问题胜率分布")
iplot(fig)
实验结果解读
通过2000次模拟实验,我们观察到:
- 换门策略:随着实验次数增加,胜率稳定在66.6%左右
- 不换门策略:胜率稳定在33.3%左右
- 随机策略:胜率稳定在50%左右
这些结果完美验证了理论预测。可视化图表清晰地展示了:
- 不同策略的胜率随实验次数的收敛过程
- 最终胜率的分布特征
- 各策略之间的显著差异
结论与启示
蒙特霍尔问题是一个绝佳的教学案例,它展示了:
- 概率直觉的局限性:人类的直觉在概率判断上常常出错
- 模拟实验的价值:通过计算机模拟可以验证理论结果
- 数据可视化的力量:Plotly等工具能帮助我们直观理解复杂概念
这个案例也提醒数据科学家:
- 不要过度依赖直觉判断
- 实验验证是检验理论的重要手段
- 好的可视化能极大提升分析的说服力
通过这个项目,我们不仅深入理解了蒙特霍尔悖论,还掌握了使用Plotly进行数据可视化的实用技能。这种结合理论分析、实验模拟和可视化展示的方法,可以广泛应用于各种数据科学问题的研究中。
mlcourse.ai Open Machine Learning Course 项目地址: https://gitcode.com/gh_mirrors/ml/mlcourse.ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考