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()

 Q-Q图原理及Python实现_第1张图片

 四、参考文献

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

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

你可能感兴趣的:(python)