В качестве дополнения к ответу @unutbu вы также можете указать параметры распределения для тестового распределения в kstest.Предположим, что у нас было несколько выборок из переменной (и назвали их datax), и мы хотели проверить, не могли ли эти выборки быть получены из логнормального, униформного или нормального.Обратите внимание, что для статистики scipy способ ввода входных параметров для каждого распределения немного варьируется.Теперь, благодаря "args" (кортежу или последовательности) в kstest, можно предоставить аргументы для дистрибутива scipy.stats, с которым вы хотите проверить.
:) Я также добавил возможность использовать тест с двумя выборками, на случай, если вы захотите сделать это любым из способов:
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)
, который дает в качестве вывода что-то вроде:
два образца KS: {'lognorm': {'KS': 0.023499999999999965, 'p-значение': 0.63384188886455217}, 'норма': {'KS': 0.10600000000000004, 'p-значение': 2.918766666723155e-10},'iform ': {' KS ': 0.15300000000000002,' p-value ': 6.443660021191129e-21}}
один образец KS: {' lognorm ': {' KS ': 0.01763415915126032,' p-значение ': 0,56275820961065193},' норма ': {' KS ': 0,10792612430093562,' p-значение ': 0,0},' униформа ': {' KS ': 0,14910036159697559,' p-значение ': 0,0}}
Примечание: Для равномерного распределения scipy.stats a и b принимаются как a = loc и b = loc + scale (см. документация ).