用Python可视化12种概率分布:从正态分布到幂律分布的代码实战
你是否曾在分析数据时,感觉那些抽象的数学公式和理论概念,与屏幕上冰冷的数字阵列之间,隔着一道难以逾越的鸿沟?作为一名数据分析师,我常常觉得,真正理解一种概率分布,不是靠背诵它的期望和方差公式,而是亲眼看到它的“形状”,感受它在不同参数下的“脾气”,并亲手用代码把它画出来。这就像认识一个新朋友,光听介绍不够,得一起喝杯咖啡,聊聊天,才能真正熟络起来。
今天,我们就来一场与12种核心概率分布的“咖啡之约”。我们将完全在Jupyter Notebook的环境中,借助Python的Matplotlib和Seaborn这两个强大的可视化库,一步步绘制出从最常见的正态分布,到充满神秘色彩的幂律分布。更重要的是,我们将超越简单的绘图,深入探讨如何解读这些图形,以及当面对真实世界那些不“听话”的数据时——比如网站访问量、城市人口规模——如何运用坐标轴变换等技巧,让隐藏在数据背后的分布规律清晰浮现。无论你是刚刚踏入数据分析大门的新手,还是希望巩固基础、提升实操能力的从业者,这篇文章都将为你提供一套可直接上手的代码工具箱和清晰的分析思路。
1. 环境准备与基础概念速览
在开始绘制绚丽的图表之前,我们需要一个稳定、整洁的工作环境。我强烈推荐使用Anaconda来管理你的Python环境,它能省去大量配置依赖库的麻烦。如果你已经安装好了,那么打开你的Jupyter Notebook,让我们从导入必要的库开始。
# 基础数据处理与科学计算库
import numpy as np
import pandas as pd
# 核心可视化库
import matplotlib.pyplot as plt
import seaborn as sns
# 设置可视化风格,让图表更美观
plt.style.use('seaborn-v0_8-whitegrid') # 使用seaborn的白色网格风格
sns.set_palette("husl") # 设置一个鲜艳的调色板
%matplotlib inline # 确保图表在Notebook中内嵌显示
# 概率分布相关函数从scipy.stats中导入
from scipy import stats
这里,scipy.stats 是我们的“百宝箱”,它几乎包含了所有我们需要用到的概率分布函数。numpy 用于高效地生成模拟数据,而 matplotlib 和 seaborn 则是我们的“画笔”和“颜料”。
在动笔(代码)之前,花两分钟理解两个核心概念,会让后续的所有操作事半功倍:
- 概率密度函数(PDF):对于连续分布(如正态分布),PDF描述的是随机变量落在某个点附近的可能性“密度”。曲线下的总面积等于1。我们通常用平滑的曲线来绘制它。
- 概率质量函数(PMF):对于离散分布(如泊松分布),PMF描述的是随机变量取某个特定值的确切概率。我们通常用离散的柱状图或点图来绘制它。
注意:
scipy.stats中的每个分布对象,都统一用.pmf()方法计算概率质量函数,用.pdf()方法计算概率密度函数,用.rvs()方法进行随机抽样。这种一致性让我们的代码非常清晰。
2. 绘制经典连续型概率分布
连续型分布描述的是取值充满一个区间的变量,比如人的身高、温度、股票收益率。我们先从最著名的“钟形曲线”开始。
2.1 正态分布:无处不在的“钟形曲线”
正态分布,也叫高斯分布,可能是世界上最著名的概率分布。它的核心由两个参数决定:均值(μ,决定中心位置)和标准差(σ,决定曲线的“胖瘦”或离散程度)。
# 创建图形和坐标轴
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 子图1:不同均值的影响(固定标准差)
mu_values = [-2, 0, 3]
sigma = 1
x = np.linspace(-6, 6, 1000)
for mu in mu_values:
pdf = stats.norm.pdf(x, loc=mu, scale=sigma)
axes[0].plot(x, pdf, lw=2, label=f'μ={mu}, σ={sigma}')
axes[0].set_title('不同均值 (μ) 对正态分布的影响')
axes[0].set_xlabel('x')
axes[0].set_ylabel('概率密度 f(x)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 子图2:不同标准差的影响(固定均值)
mu = 0
sigma_values = [0.5, 1, 2]
for sigma in sigma_values:
pdf = stats.norm.pdf(x, loc=mu, scale=sigma)
axes[1].plot(x, pdf, lw=2, label=f'μ={mu}, σ={sigma}')
axes[1].set_title('不同标准差 (σ) 对正态分布的影响')
axes[1].set_xlabel('x')
axes[1].set_ylabel('概率密度 f(x)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
运行这段代码,你会看到两个并排的图表。左边展示了均值如何像一只无形的手,将整个曲线沿着x轴左右平移。右边则生动地展示了标准差的作用:σ越小,曲线越“瘦高”,数据越集中在均值附近;σ越大,曲线越“矮胖”,数据越分散。
2.2 指数分布与伽马分布:描述“等待时间”
指数分布常用来描述独立随机事件发生的时间间隔,比如客服电话的接入间隔、设备的无故障运行时间。它有一个有趣的性质叫“无记忆性”,意味着未来的等待时间不受过去已等待时间的影响。伽马分布可以看作是多个独立指数分布变量之和的分布,形状更为灵活。


3077

被折叠的 条评论
为什么被折叠?



