NumPy 泊松分布模拟与 Seaborn 可视化技巧

泊松分布

简介

泊松分布是一种离散概率分布,用于描述在给定时间间隔内随机事件发生的次数。它常用于模拟诸如客户到达商店、电话呼叫接入中心等事件。

参数

泊松分布用一个参数来定义:

λ:事件发生的平均速率,表示在单位时间内事件发生的平均次数。

公式

泊松分布的概率质量函数 (PMF) 给出了在指定时间间隔内发生 k 次事件的概率,计算公式为:

P(k) = e^(-λ) (λ^k) / k!

其中:

e^(-λ):表示没有事件发生的概率。
(λ^k):表示 k 次事件发生的概率。
k!:表示 k 个元素的阶乘,即 k × (k - 1) × (k - 2) × … × 2 × 1。

生成泊松分布数据

NumPy 提供了 random.poisson() 函数来生成服从泊松分布的随机数。该函数接受以下参数:

lam:事件发生的平均速率。
size:输出数组的形状。

示例:生成一个平均速率为 5 的事件在 10 个时间间隔内发生的次数:

import numpy as np

data = np.random.poisson(lam=5, size=10)
print(data)

可视化泊松分布

Seaborn 库提供了便捷的函数来可视化分布,包括泊松分布。

示例:绘制平均速率为 7 的事件在 1000 个时间间隔内发生的次数分布:

import seaborn as sns
import numpy as np

data = np.random.poisson(lam=7, size=1000)
sns.distplot(data)
plt.show()

正态分布与泊松分布的关系

当事件发生的平均速率 λ 很大时,泊松分布可以近似为正态分布。其均值 μ 为 λ,标准差 σ 为 sqrt(λ)。

示例:比较泊松分布和正态分布的形状:

import seaborn as sns
import numpy as np

lam = 50

# 生成泊松分布数据
data_poisson = np.random.poisson(lam=lam, size=1000)

# 生成正态分布数据
mu = lam
sigma = np.sqrt(lam)
data_normal = np.random.normal(loc=mu, scale=sigma, size=1000)

sns.distplot(data_poisson, label="Poisson")
sns.distplot(data_normal, label="Normal")
plt.legend()
plt.show()

练习

  1. 在一个小时内,一家商店平均收到 10 位顾客。模拟顾客到达商店的次数并绘制分布图。
  2. 比较不同平均速率下泊松分布形状的变化。
  3. 利用泊松分布来模拟一个呼叫中心每天接到的电话呼叫数量,并计算平均呼叫量和每天接听超过 30 个电话的概率。

解决方案

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

# 1. 模拟顾客到达商店的次数并绘制分布图
data = np.random.poisson(lam=10, size=1000)
sns.distplot(data)
plt.show()

# 2. 比较不同平均速率下泊松分布形状的变化
lam_values = [5, 10, 20, 50]
for lam in lam_values:
    data = np.random.poisson(lam=lam, size=1000)
    sns.distplot(data, label=f"λ={lam}")
plt.legend()
plt.show()

# 3. 模拟电话呼叫数量并计算平均呼叫量和每天接听超过 30 个电话的概率
calls_per_day = np.random.poisson(lam=150, size=365)
print("平均呼叫量:", calls_per_day.mean())
print("每天接听超过 30 个电话的概率:", (calls_per_day > 30).mean())

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

<think>嗯,用户想用numpy生成四个季度的旅游人数随机数据,每组50个,然后用seaborn画箱线图。首先,我需要考虑如何生成符合旅游人数特点的数据。旅游人数通常不会是正态分布的,可能集中在某个范围,并且有季节变化。比如,第一季度可能人少,第三季度可能人多。所以,我应该用不同的均值和标准差来生成每个季度的数据。 接下来,numpy的random模块可以生成随机数。假设每个季度的平均人数不同,比如第一季度均值为1000,第二季度1500,第三季度2000,第四季度1200。标准差可以设为均值的10%左右,这样数据不会太分散。然后,生成四个数组,每个有50个样本。 然后,需要将这些数据整理成DataFrame,方便seaborn处理。可能需要用pandas来创建,将每个季度的数据堆叠起来,并添加对应的季度标签列。 接下来是绘图部分。Seaborn的catplot函数可以用来画箱线图,设置x为季度,y为人数,类型是'box'。需要添加标题、x轴标签和y轴标签。可能需要调整图表样式,比如使用sns.set_theme()来美化外观。 还要注意生成的数据是否符合实际,比如人数应该是非负整数,可能需要取整或者使用泊松分布?不过numpy的normal生成的是浮点数,可以转换为整数。但用户可能只需要大致的数据分布,所以可能不需要严格整数。或者使用np.random.randint,但那样的话分布形状可能不同。需要根据用户需求判断,但用户没有特别说明,所以用正态分布加取整可能更合适。 另外,在代码中需要导入必要的库:numpy、pandas、seaborn、matplotlib.pyplot。然后生成数据,创建DataFrame,绘图,设置标题和标签,最后显示图表。 需要检查是否有引用相关的内容,用户提供的引用中有使用matplotlib和seaborn的例子,特别是引用3提到了seaborn的catplot函数,所以应该参考那个方法。因此,在代码中使用sns.catplot,并正确设置参数,比如x='季度', y='人数', kind='box',数据来源是DataFrame。 可能还需要调整图表的大小或样式,比如设置上下文或主题,让图表更美观。例如,sns.set_theme(style="whitegrid"),这样背景有网格线,看起来更清晰。 最后,确保代码中的每个步骤都有注释,方便用户理解。比如生成数据、创建DataFrame、绘制图表等步骤都需要注释说明。</think>以下是使用NumPy生成四个季度旅游人数随机数据,并通过Seaborn创建箱线图的完整实现步骤: ### 步骤说明 1. **数据生成**:使用正态分布模拟季度旅游人数 - 第一季度:均值为1000,标准差100 - 第二季度:均值为1500,标准差150 - 第三季度:均值为2000,标准差200 - 第四季度:均值为1200,标准差120 2. **数据结构化**:将数据转换为适合可视化的长格式DataFrame 3. **可视化绘制**:使用Seaborn的$catplot()$函数创建箱线图,并添加标注 ### 实现代码 ```python import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 设置随机种子保证可复现性 np.random.seed(2023) # 生成四个季度的模拟数据 quarters = ['Q1', 'Q2', 'Q3', 'Q4'] data = [ np.random.normal(loc=1000, scale=100, size=50), # 第一季度 np.random.normal(loc=1500, scale=150, size=50), # 夏季旺季 np.random.normal(loc=2000, scale=200, size=50), # 暑假高峰 np.random.normal(loc=1200, scale=120, size=50) # 第四季度 ] # 创建长格式DataFrame df = pd.DataFrame({ '季度': np.repeat(quarters, 50), '人数': np.concatenate(data) }) # 设置可视化主题 sns.set_theme(style="whitegrid", font="SimHei") # 创建箱线图 box = sns.catplot( x='季度', y='人数', kind='box', data=df, height=6, aspect=1.2, palette="Set2" ) # 添加标注 box.set( title='2023年各季度旅游人数分布', xlabel='旅游季度', ylabel='游客数量(人次)' ) plt.tight_layout() plt.show() ``` ### 代码解析 1. **数据模拟**:使用$np.random.normal()$生成符合不同季度特征的游客数据,夏季数据设置更大的方差反映波动性[^2] 2. **数据重塑**:通过$np.repeat()$和$np.concatenate()$构建符合Seaborn绘图要求的长格式数据 3. **可视化配置**: - `style="whitegrid"` 添加背景网格线增强可读性 - `palette="Set2"` 设置颜色方案区分不同季度 - `aspect=1.2` 控制图形宽高比例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值