Q-Q图原理及Python实现

一、累积分布函数与分位数

累积密度函数(CDF,Cumulative Distribution Function)即概率密度函数的积分,公式如下:

F(x) = P(X\leq x)

分位数z_{\alpha }是指满足 P(X\leq z_{\alpha })=\alpha 的数,例如上四分位数是指累积概率达到75%时所对应的值。

二、Q-Q图的定义

Q-Q图(Quantile-Quantile Plot,样本分位数-总体分位数)是一种散点图,它描述了样本分位数与观测值确实服从正态分布时所观察到的分位数之间的关系,可用来检验正态性假定是否成立。当各点近似分布在一条直线附近时,可认为正态性假设成立;反之,则不成立。

x_{1},x_{2},...,x_{n}为某一随机变量X的n个观测值,这些观测值按大小排序后表示为x_{(1)}\leq x_{(2)}\leq ...\leq x_{(n)},由经验分布函数可知,P(X< x_{(j)})=\frac{j-1}{n}P(X\leq x_{(j)}) = \frac{j}{n},为分析方便,作“连续性”修正,P(X\leq x_{(j)}) 近似为\frac{j-\frac{1}{2}}{n}(也可以近似为\frac{j-\frac{3}{8}}{n+\frac{1}{4}},效果更好,R语言绘制的Q-Q图就是采用这种修正方法)

作Q-Q的步骤如下:

  1. 把原始观测值排序,得到x_{(1)},x_{(2)},...,x_{(n)}和它们对应的概率值\frac{1-\frac{1}{2}}{n},\frac{2-\frac{1}{2}}{n},...,\frac{n-\frac{1}{2}}{n}
  2. 计算标准正态分位数q_{(1)},q_{(2)},...,q_{(n)},对于标准正态分布,分位数q_{(j)}由下述关系定义P\left ( Z\leq q_{(j)} \right )=\int_{-\infty}^{q_{(j)}}\frac{1}{\sqrt{2\pi }}e^{-z^{2}/2}dz=\frac{j-\frac{1}{2}}{n}
  3. 作观测值的点对(q_{(1)},x_{(1)}),(q_{(2)},x_{(2)}),...,(q_{(n)},x_{(n)})的图形,并检查结果的“直线性”(假设观测值x_{1},x_{2},...,x_{n}服从正态分布,则\frac{x_{(j)-\mu }}{\sigma }服从标准正态分布,累积概率相同时,由Q-Q图可知\frac{x_{(j)-\mu }}{\sigma } = q_{(j)},即x_{(j)} = \sigma q_{(j)} + \mu,由此可以看出若观测值近似服从标准正态分布,则各点应围绕y=x波动)

三、Python实现

复刻一下大佬的图

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF

plt.figure(1)
x = np.arange(-4, 4, 0.1)
y = stats.norm.cdf(x, 0, 1)
plt.plot(x, y,c='k',lw=1.2)
plt.yticks(np.arange(0, 1.2, 0.2))
plt.xticks(np.arange(-4, 5, 1))
plt.xlabel('数值')
plt.ylabel('累积分布')
plt.title('正态分布')

# 样本数据随机取自均值为3,标准差为2的正态分布
mu, sigma = 3, 2
np.random.seed(10086)
data = np.random.normal(mu,sigma,size=30)
ecdf = ECDF(data)
cdf = ecdf(data)
data.sort()
cdf.sort()

plt.figure(2)
plt.scatter(data,cdf,c='k',s=10)
plt.plot(data,cdf,c='k',lw=1.2)
plt.xlabel('数值')
plt.ylabel('累积分布')
plt.title('观测值累积分布')

plt.figure(3)
mu, sigma = 0, 1
np.random.seed(12345)
x = np.random.normal(mu,sigma,size=30)
x.sort()
plt.scatter(x,data,c='k',s=10)
z = np.polyfit(x, data, 1)
f = np.poly1d(z)
# 绘制拟合线
plt.plot(x,f(x))
plt.xlabel('正态总体分位数')
plt.ylabel('样本分位数')
plt.title('正态Q-Q图')

plt.show()

 

 四、参考文献

实用多元统计分析:第6版 /(美)约翰逊(Johnson,R.A.),(美)威克恩(Wichern,D.W.)著;陆璇,叶俊译.

QQ图判断一个分布是否为正态分布_陋室逢雨的博客-CSDN博客_qq图怎么看正态分布

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值