Kolmogrov Test in Python

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
asahdkhaled
User
Beiträge: 29
Registriert: Samstag 28. Oktober 2017, 22:07

Mittwoch 22. November 2017, 22:27

Hallo,
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)
Sprich, ich nehme meine ursprüngliche Spalte (output.values()) und erzeuge verschiedene neue Verteilungen. Beispielsweise erzeuge ich mit Hilfe des Mittelwerts und der Standardabweichung und erzeuge mit np.random.normal() eine neue Verteilung. Dann teste ich die beiden Verteilungen gegeneinander und schaue, ob sie gleich sind von der Verteilung. Dadurch könnte ich herausfinden, ob meine Verteilung ähnlich ist zu der Normalverteilung die ich erzeugt habe. Aber macht das Sinn und ist der Test dann noch gültig, oder verfälscht das das Ergebnis?

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...
Antworten