Jak utworzyłbyś wykres qq za pomocą Pythona?
Zakładając, że masz duży zestaw pomiarów i używasz jakiejś funkcji kreślącej, która przyjmuje wartości XY jako dane wejściowe. Funkcja powinna wykreślić kwantyle pomiarów względem odpowiednich kwantyli pewnego rozkładu (normalnego, jednorodnego ...).
Wynikowy wykres pozwala nam następnie ocenić w naszym pomiarze, czy jest zgodny z założonym rozkładem, czy nie.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Zarówno R, jak i Matlab zapewniają gotowe funkcje do tego, ale zastanawiam się, jaka byłaby najczystsza metoda implementacji w Pythonie.
python
statistics
scipy
Jan
źródło
źródło
probplot
? docs.scipy.org/doc/scipy/reference/generated/…Odpowiedzi:
Myślę, że
scipy.stats.probplot
zrobi to, co chcesz. Więcej szczegółów można znaleźć w dokumentacji .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()
Wynik
źródło
Korzystanie
qqplot
zstatsmodels.api
to kolejna opcja:Bardzo podstawowy przykład:
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()
Wynik:
Dokumentacja i więcej przykładów są tutaj
źródło
scipy
dostatsmodels
statsmodels
byłby dobrym wyborem.Jeśli potrzebujesz wykonać wykres QQ jednej próbki względem drugiej, statsmodels zawiera qqplot_2samples (). Podobnie jak Ricky Robinson w powyższym komentarzu, myślę o tym jako o wykresie QQ kontra wykresie prawdopodobieństwa, który jest próbką względem rozkładu teoretycznego.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
źródło
Wymyśliłem to. Może możesz to poprawić. Szczególnie metoda generowania kwantyli rozkładu wydaje mi się uciążliwa.
Możesz zastąpić
np.random.normal
inną dystrybucję z,np.random
aby porównać dane z innymi dystrybucjami.#!/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)
źródło
Istnieje teraz w pakiecie statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
źródło
Aby dodać do zamieszania wokół wykresów QQ i wykresów prawdopodobieństwa w światach Python i R, oto co mówi podręcznik SciPy :
Jeśli spróbujesz
scipy.stats.probplot
, zobaczysz, że rzeczywiście porównuje zbiór danych z rozkładem teoretycznym. Wykresy QQ, OTOH, porównaj dwa zestawy danych (próbki).R ma funkcje
qqnorm
,qqplot
iqqline
. Z pomocy R (wersja 3.6.3):Krótko mówiąc, R
qqnorm
oferuje tę samą funkcjonalność, którascipy.stats.probplot
zapewnia ustawienie domyślnedist=norm
. Ale fakt, że go nazwaliqqnorm
i że ma on „tworzyć normalny wykres QQ” może łatwo zmylić użytkowników.Na koniec słowo ostrzeżenia. Te wykresy nie zastępują właściwych testów statystycznych i powinny być używane wyłącznie w celach ilustracyjnych.
źródło
Jak duża jest twoja próbka? Oto kolejna opcja przetestowania danych w dowolnej dystrybucji przy użyciu biblioteki OpenTURNS . W poniższym przykładzie generuję próbkę x zawierającą 1.000.000 liczb z rozkładu jednorodnego i testuję ją z rozkładem normalnym. Możesz zastąpić x swoimi danymi, jeśli zmienisz go na
x= [[x1], [x2], .., [xn]]
import openturns as ot x = ot.Uniform().getSample(1000000) g = ot.VisualTest.DrawQQplot(x, ot.Normal()) g
W moim notatniku Jupyter widzę:
Jeśli piszesz scenariusz, możesz zrobić to lepiej
from openturns.viewer import View` import matplotlib.pyplot as plt View(g) plt.show()
źródło
Możesz użyć bokeh
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)
źródło
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()
Tutaj probplot narysuj wykres pomiarów względem rozkładu normalnego, który jest wyrażony jako dist = "norma"
źródło