Wie würden Sie einen Qq-Plot mit Python 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 Verteilung (normal, einheitlich ...) darstellen.
Das resultierende Diagramm lässt uns dann in unserer Messung die angenommene Verteilung beurteilen oder nicht.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Sowohl R als auch Matlab stellen dafür fertige Funktionen zur Verfügung, aber ich frage mich, was die sauberste Methode für die Implementierung in Python wäre.
Ich denke, dass scipy.stats.probplot
das tut, was Sie wollen. Siehe Dokumentation für weitere Details.
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
Die Verwendung von qqplot
von statsmodels.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 mehr Beispiele sind hier
Wenn Sie einen QQ-Plot eines Samples gegenüber einem anderen durchführen müssen, enthält statsmodels qqplot_2samples (). Wie Ricky Robinson in einem Kommentar oben, denke ich, dass dies ein QQ-Diagramm im Vergleich zu einem Wahrscheinlichkeits-Diagramm ist, das eine Stichprobe gegen eine theoretische Verteilung darstellt.
Es existiert jetzt im Paket statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
Ich habe mir das ausgedacht. Vielleicht kannst du es verbessern. Insbesondere die Methode, die Quantile der Verteilung zu erzeugen, erscheint mir umständlich.
Sie können np.random.normal
durch eine beliebige andere Distribution aus np.random
ersetzen, 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)
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)
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()
Probplot zeichnet hier die Graphenmessungen gegen die Normalverteilung, die in dist = "norm" angegeben sind.