ich möchte gerne herausfinden, welche Verteilung meine Spalte in meiner Datenbank hat. Ist sie also beispielsweise 'uniform'/'norm' oder 'truncnorm' verteilt. Dafür gibt es den Kolmogorov Test. Das habe ich schon rausbekommen. Es gibt allerdings 2 Möglichkeiten (wenn nicht sogar mehr).
Möglichkeit 1:
Code: Alles auswählen
t = (column, _tabelle)
cur.execute("Select id, %s From %s " % t)
output = {}
for row in cur:
output.update({row[0]: float(row[1])})
var, std, mean, length = np.var(output.values()), np.std(output.values()), np.mean(output.values()), len(output.values())
mini, maxi = min(output.values()), max(output.values())
a, b = (min(output.values()) - mean) / std, (max(output.values()) - mean) / std
uniform, norm = np.random.uniform(mini, maxi, length), np.random.normal(mean, std, length)
print stats.ks_2samp(output.values(), truncnorm.rvs(a, b, mean, std, length))
print stats.ks_2samp(output.values(), norm)
print stats.ks_2samp(output.values(), uniform)
Möglichkeit 2:
Code: Alles auswählen
stats.kstest(output.values(),'trunc')
column , "NEU",stats.kstest(output.values(),ss.randint.cdf,args=(0,10))
column , "NEU",stats.kstest(output.values(),'uniform')
Ich teste quasi meine Spalte gegen zuvor bekannte Verteilungen, die in der Methode kstest schon vordefiniert sind ('trunc'/'norm'...)
Was denkt ihr, lieber neue Verteilung samplen und dann mit ks_2samp oder direkt kstest? Ich habe beides mal ausprobiert, die Ergebnisse sind wie zu erwarten unterschiedlich mit beiden Verfahren...