简介:我有一个超过30 000个值的列表,范围从0到47,例如[0,0,0,0,...,1,1,1,1,...,2,2,2,2, ......,47等]是连续分布.
问题:基于我的分布,我想计算任何给定值的p值(看到更大值的概率).例如,正如您所见,0的p值接近1,较高的数值的p值趋于0.
我不知道我是否正确,但是为了确定概率,我认为我需要将我的数据拟合到最适合描述我的数据的理论分布.我认为需要某种拟合优度测试来确定最佳模型.
有没有办法在Python中实现这样的分析(Scipy或Numpy)?你能举个例子吗?
谢谢!
scipy.stats分布直方图可制成的scipy.stats正常随机变量看到分布的样子.
% matplotlib inline
import pandas as pd
import scipy.stats as stats
d = stats.norm()
rv = d.rvs(100000)
pd.Series(rv).hist(bins=32, normed=True)
Run Code Online (Sandbox Code Playgroud)
其他发行版是什么样的?
我四处搜寻,令我惊讶的是,这个问题似乎没有得到解答.
我有一个Numpy数组,包含10000个测量值.我用Matplotlib绘制了直方图,通过目视检查,值似乎是正态分布的:

但是,我想验证这一点.我发现在scipy.stats.mstats.normaltest下实现了一个正态性测试,但结果却说不然.我得到这个输出:
(masked_array(data = [1472.8855375088663],
mask = [False],
fill_value = 1e+20)
, masked_array(data = [ 0.],
mask = False,
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
)
这意味着数据集正态分布的几率为0.我重新运行实验并再次测试它们获得相同的结果,在"最佳"情况下,p值为3.0e-290.
我用以下代码测试了该函数,它似乎做了我想要的:
import numpy
import scipy.stats as stats
mu, sigma = 0, 0.1
s = numpy.random.normal(mu, sigma, 10000)
print stats.normaltest(s)
(1.0491016699730547, 0.59182113002186942)
Run Code Online (Sandbox Code Playgroud)
如果我已正确理解并使用了该函数,则意味着这些值不是正态分布的.(老实说,我不知道为什么输出会有差异,即细节不多.)
我很确定这是一个正常的分布(虽然我的统计知识是基本的),我不知道替代方案是什么.如何查看有问题的概率分布函数?
编辑:
我的Numpy数组包含10000个值就像这样生成(我知道这不是填充Numpy数组的最佳方法),之后运行normaltest:
values = numpy.empty(shape=10000, 1))
for i in range(0, 10000):
values[i] = measurement(...) # The function returns a float
print normaltest(values)
Run Code Online (Sandbox Code Playgroud)
编辑2:
我刚刚意识到输出之间的差异是因为我无意中使用了两个不同的函数(scipy.stats.normaltest()和scipy.stats.mstats.normaltest()),但是由于相关部分它没有区别无论使用的功能如何,输出都是相同的.
编辑3:
使用askewchan的建议拟合直方图:
plt.plot(bin_edges, scipy.stats.norm.pdf(bin_edges, loc=values.mean(), scale=values.std())) …Run Code Online (Sandbox Code Playgroud)