Python实现Poisson/Gaussian分布并可视化分析入城车流量问题
针对入城车流量分析的Poisson/Gaussian分布实现方案
嘿,作为Python新手能想到用统计分布来分析车流量问题,这个思路超棒!我帮你整理了一个完整的实现方案,包含模拟流量变化、绘制可视化图表和常见分析计算,代码里加了详细注释,你跟着一步步来就行~
1. 所需依赖库
先安装好必要的工具包,打开终端执行:
pip install numpy matplotlib scipy
2. 完整代码实现
import numpy as np import matplotlib.pyplot as plt from scipy.stats import poisson, norm # -------------------------- 参数设置 -------------------------- avg_hourly_traffic = 3640 # 白天平均入城车流量(辆/小时) peak_multiplier = 1.5 # 早高峰峰值是平均流量的倍数 hours = 6 # 模拟时长:从早高峰到平峰共6小时(7:00-13:00) # 生成随时间递减的流量均值:早高峰最高,之后线性降到平均值 hourly_means = np.linspace(avg_hourly_traffic * peak_multiplier, avg_hourly_traffic, hours) # -------------------------- 生成模拟数据 -------------------------- # 用Poisson分布生成每小时的实际车流量(符合计数事件的统计规律) poisson_traffic = [poisson.rvs(mu=mean, size=100) for mean in hourly_means] # 每个小时模拟100次流量数据 # 用Gaussian分布近似Poisson(当λ很大时,正态分布N(λ, √λ)可以很好近似) gaussian_traffic = [norm.rvs(loc=mean, scale=np.sqrt(mean), size=100) for mean in hourly_means] # -------------------------- 绘制图表 -------------------------- plt.figure(figsize=(12, 8)) # 子图1:早高峰到平峰的流量变化趋势 plt.subplot(2, 2, 1) plt.plot(range(7, 7+hours), hourly_means, marker='o', color='darkblue') plt.title('Hourly Average Traffic Trend (7:00-13:00)') plt.xlabel('Hour of Day') plt.ylabel('Average Traffic Volume') plt.grid(True) # 子图2:早高峰时段(7:00)的流量分布直方图+理论曲线 plt.subplot(2, 2, 2) peak_traffic = poisson_traffic[0] plt.hist(peak_traffic, bins=15, density=True, alpha=0.6, color='orange', label='Simulated Traffic') # 绘制Poisson理论分布曲线 x = np.arange(min(peak_traffic), max(peak_traffic)+1) plt.plot(x, poisson.pmf(x, mu=hourly_means[0]), 'b-', label='Poisson Distribution') # 绘制Gaussian近似曲线 x_norm = np.linspace(min(peak_traffic), max(peak_traffic), 100) plt.plot(x_norm, norm.pdf(x_norm, loc=hourly_means[0], scale=np.sqrt(hourly_means[0])), 'r--', label='Gaussian Approximation') plt.title('Peak Hour (7:00) Traffic Distribution') plt.xlabel('Traffic Volume') plt.ylabel('Probability Density') plt.legend() plt.grid(True) # 子图3:平峰时段(13:00)的流量分布 plt.subplot(2, 2, 3) flat_traffic = poisson_traffic[-1] plt.hist(flat_traffic, bins=15, density=True, alpha=0.6, color='green', label='Simulated Traffic') x = np.arange(min(flat_traffic), max(flat_traffic)+1) plt.plot(x, poisson.pmf(x, mu=hourly_means[-1]), 'b-', label='Poisson Distribution') x_norm = np.linspace(min(flat_traffic), max(flat_traffic), 100) plt.plot(x_norm, norm.pdf(x_norm, loc=hourly_means[-1], scale=np.sqrt(hourly_means[-1])), 'r--', label='Gaussian Approximation') plt.title('Off-Peak Hour (13:00) Traffic Distribution') plt.xlabel('Traffic Volume') plt.ylabel('Probability Density') plt.legend() plt.grid(True) plt.tight_layout() plt.show() # -------------------------- 关键分析计算 -------------------------- print("=== 入城车流量分析结果 ===") # 1. 早高峰时段(7:00)流量超过5500辆的概率 peak_exceed_prob = poisson.sf(5500, mu=hourly_means[0]) print(f"早高峰(7:00)流量超过5500辆的概率: {peak_exceed_prob:.4f}") # 2. 平峰时段(13:00)流量低于3500辆的概率 flat_below_prob = poisson.cdf(3500, mu=hourly_means[-1]) print(f"平峰(13:00)流量低于3500辆的概率: {flat_below_prob:.4f}") # 3. 全天6小时的模拟平均流量 avg_simulated = np.mean([np.mean(hour_data) for hour_data in poisson_traffic]) print(f"6小时模拟平均流量: {avg_simulated:.0f}辆/小时(接近设定的平均值{avg_hourly_traffic})") # 4. 用高斯近似计算平峰流量在3400-3800之间的概率 gaussian_range_prob = norm.cdf(3800, loc=avg_hourly_traffic, scale=np.sqrt(avg_hourly_traffic)) - norm.cdf(3400, loc=avg_hourly_traffic, scale=np.sqrt(avg_hourly_traffic)) print(f"平峰流量在3400-3800之间的概率(高斯近似): {gaussian_range_prob:.4f}")
3. 代码解释与结果说明
- 参数设置:我们用
np.linspace生成了从早高峰峰值到平均流量的递减序列,完美匹配你说的“早高峰峰值高,随后逐渐递减”的场景,你可以随时调整peak_multiplier来模拟不同拥堵程度的高峰。 - 数据生成:Poisson分布是计数类事件(比如单位时间内的车辆数)的标准统计模型;当平均流量λ很大时,正态分布可以很好地近似Poisson分布,这也是我们同时生成两种数据的原因。
- 图表绘制:三个子图分别展示了流量趋势、早高峰和平峰的流量分布,你能直观看到模拟数据和理论分布的拟合效果。
- 分析计算:用
scipy.stats里的sf(生存函数,计算P(X>x))和cdf(累积分布函数,计算P(X≤x))直接解决你关心的概率问题,输出结果都做了清晰标注。
4. 新手友好扩展建议
- 如果你有真实的车流量数据,直接替换
poisson_traffic里的模拟数据就行,分析代码不用大改 - 可以增加晚高峰的流量变化逻辑,比如在17:00左右再设置一个峰值
- 尝试计算不同置信区间的流量范围,比如95%置信度下的合理流量区间
内容的提问来源于stack exchange,提问作者Giroud2
相关产品推荐
相关产品推荐

