Matplotlib 简介和安装
Matplotlib是Python中最常用的绘图库之一,它提供了大量的创建高质量图形的函数和API,可以用于绘制2D和3D图形、图像、动画等。它支持各种可视化类型的绘制,包括线图、散点图、直方图、等高线图、等等。Matplotlib既可以基于交互式的IPython环境使用,也可以嵌入到应用程序中。
Matplotlib可以通过多种方式进行安装,其中比较常用的方式是使用pip工具,执行以下命令即可:
pip install matplotlib
如果需要使用具体的绘图类型,还需要安装其他扩展库,例如:
pip install scipy
pip install numpy
阅读更多:Matplotlib 教程
Scipy的基本概念
Scipy是Python中科学计算的核心库之一,它构建在Numpy之上,扩展了Numpy库的功能。Scipy提供了许多与科学计算相关的模块,其中就包括了我们要讲述的统计分布。Scipy对各种分布的概率密度函数、累积分布函数、分位数函数都进行了实现,并且提供了大量的统计函数,如偏度、峰度、正态分布的PP图和QQ图,以及进行假设检验的功能,如t检验、Wilcoxon秩和检验、Kruskal-Wallis检验等。
Scipy中的分布类型主要包括连续分布和离散分布两大类。连续分布主要指实数范围内的分布,如正态分布、t分布、F分布等。离散分布主要指有限或无限个确定取值的分布,如泊松分布、二项分布、超几何分布等。
Scipy的概率密度函数和累积分布函数
对于每一种分布类型,Scipy提供了概率密度函数(pdf)和累积分布函数(cdf)两种函数。概率密度函数描述了某个变量取各个取值的概率密度分布,通过与选定区间的面积相乘可以计算在该区间内取值的概率。累积分布函数描述了某个变量小于等于某一取值的概率分布,也就是该变量产生的随机样本小于等于某一取值的概率。
以正态分布为例,我们可以使用scipy.stats.norm函数创建一个正态分布对象,然后可以通过该对象调用pdf和cdf函数得到相应的概率密度函数和累积分布函数。
# 导入必要的库
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# 创建正态分布对象
mu, sigma = 0, 0.1
norm = stats.norm(mu, sigma)
# 绘制正态分布概率密度函数
x = np.linspace(-3, 3, 1000)
pdf = norm.pdf(x)
plt.plot(x, pdf)
# 绘制正态分布累积分布函数
cdf = norm.cdf(x)
plt.plot(x, cdf)
Scipy的分位数函数和随机样本生成函数
除了概率密度函数和累积分布函数,Scipy还提供了分位数函数和随机样本生成函数两种函数。分位数函数可以计算给定概率情况下,变量的取值,例如正态分布的分位数函数是ppf,可以计算给定概率情况下对应的正态分布取值。随机样本生成函数可以生成符合某种分布的随机样本,例如正态分布的随机样本生成函数是rvs,可以生成符合正态分布的随机样本。
以正态分布为例,我们可以使用ppf函数计算给定概率情况下对应的取值,使用rvs函数生成随机样本。
# 计算正态分布0.95分位数对应的取值
ppf_val = norm.ppf(0.95)
print('0.95分位数对应的取值:', ppf_val)
# 生成100个符合正态分布的随机样本
r = norm.rvs(size=100)
程序运行结果如下:
0.95分位数对应的取值: 1.6448536269514722
Scipy中的连续分布示例
正态分布
正态分布是一种重要的概率分布,它描述了许多自然界现象,例如测量误差、各种测量成果、各种物理量等等。正态分布是可重复、稳定、对称的连续型概率分布,其概率密度函数具有如下形式:
f(x)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}}
其中\mu为均值,\sigma为标准差。正态分布的cdf、ppf和rvs函数可以分别使用norm.cdf、norm.ppf和norm.rvs进行调用。
下面我们通过绘制概率密度函数、累积分布函数以及选择不同的参数\mu和\sigma,来展示正态分布在Scipy中的应用。
# 定义均值和标准差
mu1, sigma1 = 0, 0.5
mu2, sigma2 = 0, 1
mu3, sigma3 = 0, 2
# 创建不同标准差下的正态分布
norm1 = stats.norm(mu1, sigma1)
norm2 = stats.norm(mu2, sigma2)
norm3 = stats.norm(mu3, sigma3)
# 绘制不同标准差下的正态分布概率密度函数
x = np.linspace(-5, 5, 1000)
pdf1 = norm1.pdf(x)
pdf2 = norm2.pdf(x)
pdf3 = norm3.pdf(x)
plt.plot(x, pdf1, label='sigma=0.5')
plt.plot(x, pdf2, label='sigma=1')
plt.plot(x, pdf3, label='sigma=2')
plt.legend()
# 绘制均值为0,标准差为1时的正态分布累积分布函数
cdf = norm2.cdf(x)
plt.plot(x, cdf)
t分布
t分布是一种常用的连续概率分布,它类似于正态分布,但是对于小样本情况下的均值检验和方差检验有更好的适用性。t分布的概率密度函数具有如下形式:
f(x)=\frac{\Gamma\left(\frac{\nu+1}{2}\right)}{\sqrt{\nu \pi} \Gamma\left(\frac{\nu}{2}\right)}\left(1+\frac{x^{2}}{\nu}\right)^{-\frac{\nu+1}{2}}
其中\nu为自由度参数,表示样本量减去1。t分布的cdf、ppf和rvs函数可以分别使用t.cdf、t.ppf和t.rvs进行调用。
下面我们通过绘制概率密度函数、累积分布函数以及选择不同的自由度参数,来展示t分布在Scipy中的应用。
# 定义不同自由度参数的t分布
df1, df2, df3 = 2, 5, 10
t1 = stats.t(df1)
t2 = stats.t(df2)
t3 = stats.t(df3)
# 绘制不同自由度下的t分布概率密度函数
x = np.linspace(-5, 5, 1000)
pdf1 = t1.pdf(x)
pdf2 = t2.pdf(x)
pdf3 = t3.pdf(x)
plt.plot(x, pdf1, label='df=2')
plt.plot(x, pdf2, label='df=5')
plt.plot(x, pdf3, label='df=10')
plt.legend()
# 绘制自由度为10的t分布累积分布函数
cdf = t3.cdf(x)
plt.plot(x, cdf)
F分布
F分布是一种连续概率分布,通常在统计上用于比较两个统计样本的方差比。F分布的概率密度函数具有如下形式:
f(x)=\frac{\sqrt{\frac{(v_1 x)^{v_1} v_2^{v_2}}{(v_1 x+v_2)^{v_1+v_2}}}}{x B\left(\frac{v_1}{2},\frac{v_2}{2}\right)}
其中v_1和v_2为自由度参数。F分布的cdf、ppf和rvs函数可以分别使用f.cdf、f.ppf和f.rvs进行调用。
下面我们通过绘制概率密度函数、累积分布函数以及选择不同的自由度参数,来展示F分布在Scipy中的应用。
# 定义不同自由度参数的F分布
dfn1, dfd1, dfn2, dfd2 = 3, 10, 10, 3
f1 = stats.f(dfn1, dfd1)
f2 = stats.f(dfn2, dfd2)
# 绘制不同自由度下的F分布概率密度函数
x = np.linspace(0, 5, 1000)
pdf1 = f1.pdf(x)
pdf2 = f2.pdf(x)
plt.plot(x, pdf1, label='dfn=3, dfd=10')
plt.plot(x, pdf2, label='dfn=10, dfd=3')
plt.legend()
# 绘制自由度为3和10的F分布累积分布函数
cdf1 = f1.cdf(x)
cdf2 = f2.cdf(x)
plt.plot(x, cdf1, label='dfn=3, dfd=10')
plt.plot(x, cdf2, label='dfn=10, dfd=3')
plt.legend()
Scipy中的离散分布示例
二项分布
二项分布是一种常用的离散型概率分布,它描述了在一定的总体大小、确定的次数和概率下,进行n次试验,成功次数k的概率。二项分布的概率质函数具有如下形式:
f(k;n,p)=\Pr(k;n,p)=\Pr(X=k)=\binom{n}{k} p^{k}(1-p)^{n-k}
其中n表示试验次数,p为每次试验成功的概率,k为成功的次数。二项分布的pmf、cdf和rvs函数可以分别使用binom.pmf、binom.cdf和binom.rvs进行调用。
下面我们通过绘制概率质量函数、累积分布函数以及选择不同的参数n和p,来展示二项分布在Scipy中的应用。
# 定义不同参数下的二项分布
n1, p1 = 5, 0.5
n2, p2 = 10, 0.3
n3, p3 = 20, 0.8
binom1 = stats.binom(n1, p1)
binom2 = stats.binom(n2, p2)
binom3 = stats.binom(n3, p3)
# 绘制不同参数下的二项分布概率质量函数
k1 = np.arange(n1+1)
k2 = np.arange(n2+1)
k3 = np.arange(n3+1)
pmf1 = binom1.pmf(k1)
pmf2 = binom2.pmf(k2)
pmf3 = binom3.pmf(k3)
plt.stem(k1, pmf1, label='n=5, p=0.5')
plt.stem(k2, pmf2, label='n=10, p=0.3')
plt.stem(k3, pmf3, label='n=20, p=0.8')
plt.legend()
# 绘制不同参数下的二项分布累积分布函数
cdf1 = binom1.cdf(k1)
cdf2 = binom2.cdf(k2)
cdf3 = binom3.cdf(k3)
plt.plot(k1, cdf1, label='n=5, p=0.5')
plt.plot(k2, cdf2, label='n=10, p=0.3')
plt.plot(k3, cdf3, label='n=20, p=0.8')
plt.legend()
泊松分布
泊松分布是一种常用的离散型概率分布,它描述了在一定时间或空间内观察到事件的次数。泊松分布的概率质函数具有如下形式:
f(k;\lambda)=\frac{\lambda^{k}}{k !} e^{-\lambda}
其中\lambda表示单位时间或单位空间内事件发生的平均值,k为观察到事件的次数。泊松分布的pmf、cdf和rvs函数可以分别使用poisson.pmf、poisson.cdf和poisson.rvs进行调用。
下面我们通过绘制概率质量函数、累积分布函数以及选择不同的参数\lambda,来展示泊松分布在Scipy中的应用。
# 定义不同参数下的泊松分布
mu1, mu2, mu3 = 1, 3, 10
poisson1 = stats.poisson(mu1)
poisson2 = stats.poisson(mu2)
poisson3 = stats.poisson(mu3)
# 绘制不同参数下的泊松分布概率质量函数
k1 = np.arange(10)
k2 = np.arange(20)
k3 = np.arange(30)
pmf1 = poisson1.pmf(k1)
pmf2 = poisson2.pmf(k2)
pmf3 = poisson3.pmf(k3)
plt.stem(k1, pmf1, label='mu=1')
plt.stem(k2
极客教程