为何正态分布数据在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()
生成的分布曲线:
生成的概率图:
问题原因与解决方法
核心错误在于你传给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
相关产品推荐
相关产品推荐

