You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何正态分布数据在stats.probplot()中未呈现预期直线?

问题:scipy.stats.probplot生成的正态概率图未呈直线

我在使用scipy.stats.probplot()函数时遇到问题:正态分布样本未如预期呈现直线。原本想以该图像为指导对数据做归一化处理,但尝试zscore和对数变换后都没效果,于是用合成的正态分布值测试,结果依然异常。

复现步骤与代码:

import math
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
norm = stats.norm.pdf(x, mu, sigma)

plt.plot(x, norm)
plt.show()
_ = stats.probplot(norm, plot=plt, sparams=(0, 1))
plt.show()

生成的分布曲线:
Distribution curve

生成的概率图:
Probability plot


问题原因与解决方法

核心错误在于你传给probplot的是正态分布的概率密度函数(PDF)值,但probplot的输入要求是服从目标分布的样本数据,而非PDF计算结果。

stats.norm.pdf(x, mu, sigma)生成的是x轴各点对应的概率密度值,这些值本身是钟形曲线的纵坐标,并不服从正态分布,自然无法在概率图上呈现直线。

修正后的代码:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

mu = 0
sigma = 1
# 生成1000个服从标准正态分布的样本数据
norm_samples = np.random.normal(mu, sigma, 1000)

# 绘制样本的直方图(查看分布)
plt.hist(norm_samples, bins=30, density=True, alpha=0.6)
# 叠加正态分布PDF曲线
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, stats.norm.pdf(x, mu, sigma), 'r')
plt.show()

# 生成概率图
_ = stats.probplot(norm_samples, plot=plt, sparams=(0, 1))
plt.show()

修正后,概率图会呈现预期的直线,因为输入的是真正服从正态分布的样本数据。


内容的提问来源于stack exchange,提问作者Márcio A. Freitas Jr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:46:10