Как бы вы создали qq-график с помощью Python?
Предполагая, что у вас есть большой набор измерений и вы используете какую-то функцию построения графиков, которая принимает значения XY в качестве входных данных. Функция должна строить квантили измерений против соответствующих квантилей некоторого распределения (нормального, равномерного ...).
Полученный график позволяет нам затем оценить, следует ли в наших измерениях предполагаемое распределение или нет.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
И R, и Matlab предоставляют для этого готовые функции, но мне интересно, каким будет самый чистый метод для реализации в Python.
python
statistics
scipy
Джон
источник
источник
probplot
? docs.scipy.org/doc/scipy/reference/generated/…Ответы:
Думаю,
scipy.stats.probplot
сделаю то, что ты хочешь. Смотрите документацию для более подробной информации.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()
Результат
источник
Использование
qqplot
вstatsmodels.api
другой вариант:Очень простой пример:
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()
Результат:
Документация и другие примеры здесь
источник
scipy
доstatsmodels
statsmodels
был бы хорошим выбором.Если вам нужно построить график QQ одного образца по сравнению с другим, statsmodels включает qqplot_2samples (). Как и Рики Робинсон в комментарии выше, это то, что я считаю графиком QQ против графика вероятности, который представляет собой образец против теоретического распределения.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
источник
Я это придумал. Может тебе удастся это улучшить. Особенно мне кажется обременительным метод создания квантилей распределения.
Вы можете заменить
np.random.normal
любой другой дистрибутив из,np.random
чтобы сравнить данные с другими дистрибутивами.#!/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)
источник
Теперь он существует в пакете statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
источник
Чтобы добавить путаницы вокруг графиков QQ и графиков вероятностей в мирах Python и R, вот что говорится в руководстве SciPy :
Если вы попробуете
scipy.stats.probplot
, вы увидите, что он действительно сравнивает набор данных с теоретическим распределением. Графики QQ, OTOH, сравнивают два набора данных (выборки).R имеет функции
qqnorm
,qqplot
иqqline
. Из справки R (версия 3.6.3):Короче говоря, R
qqnorm
предлагает те же функции, чтоscipy.stats.probplot
и настройки по умолчаниюdist=norm
. Но тот факт, что они назвали этоqqnorm
и что он должен «производить нормальный график QQ», может легко запутать пользователей.Наконец, одно предупреждение. Эти графики не заменяют надлежащего статистического тестирования и должны использоваться только в иллюстративных целях.
источник
Вы можете использовать боке
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 нарисуйте график измерений в зависимости от нормального распределения, которое указано в dist = "norm"
источник
Насколько велик ваш образец? Вот еще один вариант тестирования ваших данных на соответствие любому дистрибутиву с использованием библиотеки OpenTURNS . В приведенном ниже примере я генерирую образец x из 1.000.000 чисел из однородного распределения и проверяю его на соответствие нормальному распределению. Вы можете заменить x своими данными, если измените его как
x= [[x1], [x2], .., [xn]]
import openturns as ot x = ot.Uniform().getSample(1000000) g = ot.VisualTest.DrawQQplot(x, ot.Normal()) g
В моем Jupyter Notebook я вижу:
Если вы пишете сценарий, вы можете сделать это более правильно
from openturns.viewer import View` import matplotlib.pyplot as plt View(g) plt.show()
источник