目录
什么是P-P图与Q-Q图
分位数
百分位数
Q-Q图步骤与原理
Shapiro-Wilk检验
绘制Q-Q图
绘制P-P图
什么是P-P图与Q-Q图
P-P图和Q-Q图都是用于检验样本的概率分布是否服从某种理论分布。
P-P图的原理是检验实际累积概率分布与理论累积概率分布是否吻合。若吻合,则散点应围绕在一条直线周围,或者实际累积概率与理论累积概率之差分布在对称于以0为水平轴的带内。
Q-Q图的原理是检验实际分位数与理论分位数是否吻合。若吻合,则散点应围绕在一条直线周围,或者实际分位数与理论分位数之差分布在对称于以0为水平轴的带内。
P-P图和Q-Q图都是用于检验样本的概率分布是否服从某种理论分布。当检验样本的分布为正态分布时,Q-Q图中直线斜率为待检测数据的标准差,截距为均值。
特点 | P-P图 | Q-Q图 |
---|---|---|
用途 | 评估累积概率分布函数(CDF)的拟合程度。 | 评估样本分布与理论分布的拟合程度。 |
横坐标 | 标准化的观测值(累积概率) | 理论分布的分位数 |
纵坐标 | 样本观测值的累积概率 | 理论分布的分位数 |
判定标准 | 直观看出CDF的拟合情况,直线越接近对角线越好。 | 点在45度对角线上越接近,拟合越好。 |
形状分析 | 对于偏斜、尖峰等分布形状的评估较为直观。 | 主要用于检验是否符合正态分布,对称性等。 |
数据量要求 | 对数据量要求不敏感,适用于各种分布的评估。 | 在小样本下效果较好,对数据量要求较高。 |
分位数
分位数, 指的就是连续分布函数中的一个点,这个点对应概率p。若概率0<p<1,随机变量X或它的概率分布的分位数Za,是指满足条件p(X≤Za)=α的实数。
百分位数
百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。
Q-Q图步骤与原理
1)将数据升序排列,根据各点在该组数据中的位置,算出累积概率,计算累积概率时(若共n个数),第i个数的累积概率不是i/n,而是用(i-0.5)/n。这可能是为了避免最后一个数的累积概率为1时,反算出的积分上限为正无穷。;
2)根据累积概率,反算出若为标准正态分布,高斯函数的积分上限;
3)积分上限为横坐标,数据点为纵坐标,画出数据分布的QQ图;
4)根据数据的均值与标准差,画出若该组数据为正态分布的QQ图。
P-P图与Q-Q图类似,把分位数换成累积概率。
Shapiro-Wilk检验
Shapiro-Wilk检验是一种用于检验样本数据是否来自正态分布的统计方法。该检验是由Samuel Shapiro和Martin Wilk于1965年提出的。它基于一个假设,即如果样本数据来自正态分布,那么样本数据的顺序统计量应该与对应的理论累积分布函数之间存在线性关系。
Shapiro-Wilk检验的零假设是数据来自正态分布。如果检验结果的p值小于所选定的alpha级别,那么否定假设被拒绝,意味着样本数据不是来自正态分布。反之,如果p值大于选定的alpha级别,则不能拒绝零假设,即数据可能来自正态分布。
绘制Q-Q图
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文标签乱码
plt.rcParams['axes.unicode_minus'] = False
# 生成一个示例数据集,这里使用随机数据
np.random.seed(0)
data = np.random.normal(loc=50, scale=5, size=40) # 均值=50,标准差=5
# 正态性检验 - Shapiro-Wilk检验,
# Shapiro-Wilk检验基于W统计量,对数据是否符合正态分布进行评估,适用于各种样本大小
stat, p = stats.shapiro(data)
print("Shapiro-Wilk正态性检验统计量:", stat)
print("Shapiro-Wilk正态性检验p值:", p)
plt.figure(figsize=(6, 6))
# 绘制概率图(probability plot)
# stats.probplot函数通过最小二乘法来估计一组数据的分位数对,并利用线性回归技术求出分位数图上的理论值与实际值的直线方程。
stats.probplot(data, plot=plt, dist='norm', fit=True, rvalue=True)
plt.title('Probability Plot (Q-Q Plot)')
plt.legend()
plt.grid(True)
plt.tight_layout()
# 显示图形
plt.show()
Shapiro-Wilk正态性检验统计量: 0.9782676696777344
Shapiro-Wilk正态性检验p值: 0.6254295110702515
绘制P-P图
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文标签乱码
plt.rcParams['axes.unicode_minus'] = False
# 生成一个示例数据集,这里使用随机数据
np.random.seed(0)
data = np.random.normal(loc=50, scale=5, size=40) # 均值=50,标准差=5
# 正态性检验 - Shapiro-Wilk检验,
# Shapiro-Wilk检验基于W统计量,对数据是否符合正态分布进行评估,适用于各种样本大小
stat, p = stats.shapiro(data)
print("Shapiro-Wilk正态性检验统计量:", stat)
print("Shapiro-Wilk正态性检验p值:", p)
plt.figure(figsize=(6, 6))
# Create a P-P plot
stats.probplot(data, plot=plt)
# Customize the plot if needed
plt.title('P-P Plot')
plt.xlabel('Theoretical Quantiles')
plt.ylabel('Sample Quantiles')
# Show the plot
plt.show()