在单一测试中,我需要检查数组值的分布是否一致。例如:
数组中的 = [1, 0, 1, 0, 1, 1, 0, 0]
价值观分布均匀。由于有四个" 1"和四个" 0"
对于较大长度的阵列,分布更均匀"
如何证明正在测试的阵列具有均匀分布?
注意:数组是使用random.randint(min,max,len)
numpy.random
创建的
答案 0 :(得分:7)
您可以将Kolmogorove-Smirnov Test用于继续和离散分布。此功能由scipy.stats.kstest
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html#scipy.stats.kstest提供。
In [12]:
import scipy.stats as ss
import numpy as np
In [14]:
A=np.random.randint(0,10,100)
In [16]:
ss.kstest(A, ss.randint.cdf, args=(0,10))
#args is a tuple containing the extra parameter required by ss.randint.cdf, in this case, lower bound and upper bound
Out[16]:
(0.12, 0.10331653831438881)
#This a tuple of two values; KS test statistic, either D, D+ or D-. and p-value
这里得到的P值是0.1033,因此我们得出结论,数组A
与均匀分布没有显着差异。考虑P值的方法是,它假设零假设为真,测量使得检验统计量与观察到的极值(这里:元组中的第一个数字)极端的概率。在KS测试中,我们实际上具有零假设,A
与均匀分布没有区别。 p值0.1033通常不被认为足以拒绝零假设。通常P值必须小于0.05或0.01才能拒绝空值。如果此示例中的此p值小于0.05,那么我们将说A
与均匀分布明显不同。
使用scipy.stats.chisquare()
的替代方法:
In [17]:
import scipy.stats as ss
import numpy as np
In [18]:
A=np.random.randint(0, 10, 100)
In [19]:
FRQ=(A==np.arange(10)[...,np.newaxis]).sum(axis=1)*1./A.size #generate the expect frequecy table.
In [20]:
ss.chisquare(FRQ) #If not specified, the default expected frequency is uniform across categories.
Out[20]:
(0.084000000000000019, 0.99999998822800984)
第一个值是chisquare,第二个值是P值。