@unutbu による回答の補足として、kstest でテスト分布の分布パラメーターを提供することもできます。変数からいくつかのサンプルがあり (そしてそれらに datax という名前を付けました)、それらのサンプルが対数正規、一様、または正規から得られない可能性があるかどうかを確認したいとします。scipy stats では、分布ごとに入力パラメーターが取得される方法が少し異なることに注意してください。kstest の "args" (タプルまたはシーケンス) のおかげで、テスト対象の scipy.stats ディストリビューションに引数を提供できます。
:) どちらの方法でもやりたい場合に備えて、2 サンプル テストを使用するオプションも追加しました。
import numpy as np
from math import sqrt
from scipy.stats import kstest, ks_2samp, lognorm
import scipy.stats
def KSSeveralDists(data,dists_and_args,samplesFromDists=100,twosampleKS=True):
returnable={}
for dist in dists_and_args:
try:
if twosampleKS:
try:
loc=dists_and_args[dist][0]
scale=dists_and_args[dist][1]
expression='scipy.stats.'+dist+'.rvs(loc=loc,scale=scale,size=samplesFromDists)'
sampledDist=eval(expression)
except:
sc=dists_and_args[dist][0]
loc=dists_and_args[dist][1]
scale=dists_and_args[dist][2]
expression='scipy.stats.'+dist+'.rvs(sc,loc=loc,scale=scale,size=samplesFromDists)'
sampledDist=eval(expression)
D,p=ks_2samp(data,sampledDist)
else:
D,p=kstest(data,dist,N=samplesFromDists,args=dists_and_args[dist])
except:
continue
returnable[dist]={'KS':D,'p-value':p}
return returnable
a=lambda m,std: m-std*sqrt(12.)/2.
b=lambda m,std: m+std*sqrt(12.)/2.
sz=2000
sc=0.5 #shape
datax=lognorm.rvs(sc,loc=0.,scale=1.,size=sz)
normalargs=(datax.mean(),datax.std())
#suppose these are the parameters you wanted to pass for each distribution
dists_and_args={'norm':normalargs,
'uniform':(a(*normalargs),b(*normalargs)),
'lognorm':[0.5,0.,1.]
}
print "two sample KS:"
print KSSeveralDists(datax,dists_and_args,samplesFromDists=sz,twosampleKS=True)
print "one sample KS:"
print KSSeveralDists(datax,dists_and_args,samplesFromDists=sz,twosampleKS=False)
次のような出力が得られます。
2 つのサンプル KS: {'lognorm': {'KS': 0.0234999999999999965, 'p-value': 0.63384188886455217}, 'norm': {'KS': {'KS': 0.1060000000000004, 'p-value': 2.91876form666672310},'uni-15e ': {'KS': 0.15300000000000002, 'p 値': 6.443660021191129e-21}}
1 つのサンプル KS: {'lognorm': {'KS': 0.01763415915126032, 'p-value': 0.56275820961065193}, 'norm': {'KS': 0.10792612430093562, 'p-value': 0.0}, 'uniform': { 「KS」: 0.14910036159697559、「p 値」: 0.0}}
注: scipy.stats の一様分布の場合、a と b は a=loc および b=loc + スケールと見なされます (ドキュメントを参照)。