Wie würden Sie mit Python ein QQ-Diagramm erstellen?
Angenommen, Sie haben eine große Anzahl von Messungen und verwenden eine Plotfunktion, die XY-Werte als Eingabe verwendet. Die Funktion sollte die Quantile der Messungen gegen die entsprechenden Quantile einer bestimmten Verteilung (normal, einheitlich ...) auftragen.
Das resultierende Diagramm lässt uns dann bewerten, ob unsere Messung der angenommenen Verteilung folgt oder nicht.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Sowohl R als auch Matlab bieten hierfür vorgefertigte Funktionen, aber ich frage mich, welche Methode für die Implementierung in Python am saubersten wäre.
python
statistics
scipy
John
quelle
quelle
probplot
? docs.scipy.org/doc/scipy/reference/generated/…Antworten:
Ich denke, das
scipy.stats.probplot
wird tun, was Sie wollen. Weitere Informationen finden Sie in der Dokumentation .import numpy as np import pylab import scipy.stats as stats measurements = np.random.normal(loc = 20, scale = 5, size=100) stats.probplot(measurements, dist="norm", plot=pylab) pylab.show()
Ergebnis
quelle
Die Verwendung
qqplot
vonstatsmodels.api
ist eine weitere Option:Sehr einfaches Beispiel:
import numpy as np import statsmodels.api as sm import pylab test = np.random.normal(0,1, 1000) sm.qqplot(test, line='45') pylab.show()
Ergebnis:
Dokumentation und weitere Beispiele finden Sie hier
quelle
scipy
zustatsmodels
statsmodels
wäre eine gute Wahl.Wenn Sie ein QQ-Diagramm eines Samples gegen ein anderes erstellen müssen, enthält statsmodels qqplot_2samples (). Wie Ricky Robinson in einem Kommentar oben ist dies das, was ich als QQ-Diagramm gegen ein Wahrscheinlichkeitsdiagramm betrachte, das eine Stichprobe gegen eine theoretische Verteilung ist.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
quelle
Ich habe mir das ausgedacht. Vielleicht kannst du es verbessern. Insbesondere die Methode zur Erzeugung der Quantile der Verteilung erscheint mir umständlich.
Sie können durch
np.random.normal
jede andere Distribution von ersetzennp.random
, um Daten mit anderen Distributionen zu vergleichen.#!/bin/python import numpy as np measurements = np.random.normal(loc = 20, scale = 5, size=100000) def qq_plot(data, sample_size): qq = np.ones([sample_size, 2]) np.random.shuffle(data) qq[:, 0] = np.sort(data[0:sample_size]) qq[:, 1] = np.sort(np.random.normal(size = sample_size)) return qq print qq_plot(measurements, 1000)
quelle
Es existiert jetzt im Paket statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
quelle
import numpy as np import pylab import scipy.stats as stats measurements = np.random.normal(loc = 20, scale = 5, size=100) stats.probplot(measurements, dist="norm", plot=pylab) pylab.show()
Hier zeichnen Probplot die Graphenmessungen gegen die Normalverteilung, die in dist = "norm" speofied sind.
quelle
Um die Verwirrung um QQ-Diagramme und Wahrscheinlichkeitsdiagramme in der Python- und R-Welt zu vergrößern, heißt es im SciPy-Handbuch :
Wenn Sie es ausprobieren
scipy.stats.probplot
, werden Sie feststellen, dass tatsächlich ein Datensatz mit einer theoretischen Verteilung verglichen wird. QQ-Diagramme, OTOH, vergleichen zwei Datensätze (Proben).R hat Funktionen
qqnorm
,qqplot
undqqline
. Aus der R-Hilfe (Version 3.6.3):Kurz gesagt, Rs
qqnorm
bieten die gleiche Funktionalität wiescipy.stats.probplot
die Standardeinstellungdist=norm
. Aber die Tatsache, dass sie es genannt habenqqnorm
und dass es "ein normales QQ-Diagramm erzeugen" soll, kann Benutzer leicht verwirren.Zum Schluss noch ein warnendes Wort. Diese Diagramme ersetzen keine ordnungsgemäßen statistischen Tests und sollten nur zur Veranschaulichung verwendet werden.
quelle
Sie können Bokeh verwenden
from bokeh.plotting import figure, show from scipy.stats import probplot # pd_series is the series you want to plot series1 = probplot(pd_series, dist="norm") p1 = figure(title="Normal QQ-Plot", background_fill_color="#E8DDCB") p1.scatter(series1[0][0],series1[0][1], fill_color="red") show(p1)
quelle