it-swarm.com.de

Quantile-Quantile-Darstellung mit SciPy

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.

64
John

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

enter image description here

83
Geoff

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:

enter image description here

Dokumentation und mehr Beispiele sind hier

31
Akavall

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.

http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html

15
ccap
3
grasshopper

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)
2
John

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)
1
sushmit
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.

0
Ravi G