Квантиль-Квантильный график c использованием SciPy
Как бы вы создали QQ-plot с помощью Python?
предполагая, что у вас есть большой набор измерений и вы используете некоторую функцию построения графика, которая принимает XY-значения в качестве входных данных. Функция должна построить график квантилей измерений против соответствующих квантилей некоторого распределения (нормального, равномерного...).
полученный график позволяет нам затем оценить в нашем измерении следует за предполагаемым распределением или не.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Как R, так и Matlab предоставляют готовые функции для этого, но мне интересно, какой самый чистый метод для реализации в Python будет.
7 ответов:
думаю, что
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()результат
используя
qqplotofstatsmodels.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()результат:
документация и другие примеры здесь
Если вам нужно сделать график QQ одного образца против другого, statsmodels включает qqplot_2samples (). Как и Рикки Робинсон в комментарии выше, это то, что я думаю о графике QQ против вероятностного графика, который является образцом против теоретического распределения.
теперь он существует в пакете statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.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)
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 рисует график измерений против нормального распределения, который speofied в dist= "норма"
вы можете использовать боке
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)


Comments