Python数据可视化:箱线图与Bootstrap重采样对比分析

部署运行你感兴趣的模型镜像

一、案例背景

本案例通过生成5种不同分布(正态、对数正态、指数、Gumbel、三角分布)的随机数据,并使用Bootstrap重采样方法生成新数据集。通过箱线图对比原始数据与重采样数据的分布差异,学习Matplotlib高级绘图技巧。

二、代码解析

1. 数据生成

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

random_dists = ['Normal(1, 1)', 'Lognormal(1, 1)', 'Exp(1)', 'Gumbel(6, 4)', 'Triangular(2, 9, 11)']
N = 500  # 样本量

# 生成原始数据
norm = np.random.normal(1, 1, N)
logn = np.random.lognormal(1, 1, N)
expo = np.random.exponential(1, N)
gumb = np.random.gumbel(6, 4, N)
tria = np.random.triangular(2, 9, 11, N)

# Bootstrap重采样(使用相同索引)
bootstrap_indices = np.random.randint(0, N, N)
data = [
    norm, norm[bootstrap_indices],
    logn, logn[bootstrap_indices],
    expo, expo[bootstrap_indices],
    gumb, gumb[bootstrap_indices],
    tria, tria[bootstrap_indices],
]
  • Bootstrap原理:通过对原始数据有放回地随机抽样生成新数据集,用于评估统计量的稳定性。
  • 每个分布生成500个样本,重采样使用相同索引保证代码简洁。

2. 箱线图绘制

fig, ax1 = plt.subplots(figsize=(10,6))
bp = ax1.boxplot(data, notch=False, sym='+', vert=True, whis=1.5)

# 样式设置
plt.setp(bp['boxes'], color='black')  # 箱体边框
plt.setp(bp['whiskers'], color='black')  # 须线
plt.setp(bp['fliers'], color='red', marker='+')  # 离群值

ax1.yaxis.grid(True, color='lightgrey', alpha=0.5)  # 水平网格
ax1.set(title='Distribution Comparison', xlabel='Distribution', ylabel='Value')
  • 参数说明
    • whis=1.5:须线范围为1.5倍IQR(四分位距)。
    • sym='+':离群点标记为红色+号。

3. 高级美化技巧

3.1 交替填充颜色
box_colors = ['darkkhaki', 'royalblue']
for i in range(len(data)):
    box_coords = np.column_stack([bp['boxes'][i].get_xdata(), bp['boxes'][i].get_ydata()])
    ax1.add_patch(Polygon(box_coords, facecolor=box_colors[i%2]))  # 交替颜色
  • 通过i%2实现原始数据重采样数据颜色交替(黄褐色 vs 宝蓝)。

3.2 标记中位数与均值

medians = [np.median(dataset) for dataset in data]
for i, med_line in enumerate(bp['medians']):
    ax1.plot(*med_line.get_xydata().T, color='black')  # 中位线
    ax1.plot(np.mean(med_line.get_xdata()), np.mean(data[i]), 
             color='w', marker='*', markeredgecolor='k')  # 均值星号

 

4. 坐标轴与图例优化

# X轴标签旋转45度
ax1.set_xticklabels(np.repeat(random_dists, 2), rotation=45, fontsize=8)

# 顶部添加中位数标签
for tick in range(len(data)):
    ax1.text(tick+1, 0.95, f'{medians[tick]:.2f}', transform=ax1.get_xaxis_transform(),
             color=box_colors[tick%2], weight='bold', ha='center', size=8)

# 自定义图例
fig.text(0.8, 0.08, 'Original Data', color='black', backgroundcolor=box_colors[0])
fig.text(0.8, 0.05, 'Bootstrap Sample', color='white', backgroundcolor=box_colors[1])
fig.text(0.8, 0.02, '*: Mean', color='black')

 

三、关键输出结果

分析结论

  1. 重采样数据的分布范围与原数据基本一致。
  2. 均值(星号)与中位数(顶部标签)位置反映分布偏态(如指数分布右偏)。
  3. 三角分布因范围限制,箱线图呈现紧凑形态。

四、核心知识点

  1. 箱线图组成

    • 箱体:Q1~Q3
    • 中位线:箱体内横线
    • 须线:1.5*IQR范围内的数据
    • 离群值:须线外的数据点
  2. Bootstrap应用场景

    • 小样本统计量估计
    • 模型稳定性评估
  3. Matplotlib高级操作

    • 通过Patch对象自定义图形
    • 坐标轴变换(get_xaxis_transform()
    • 文本标注与图例排版

五、优化建议

  1. 可对Bootstrap结果进行多轮采样,绘制误差线。
  2. 添加统计学检验(如KS检验)量化差异。
  3. 使用seaborn库简化部分样式代码。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值