Количественный квантовый график с использованием SciPy
Как бы вы создали qq-график с использованием Python?
Предполагая, что вы имеете большой набор измерений и используете какую-либо функцию построения графика, которая принимает значения XY в качестве входных данных. Функция должна отображать квантиля измерений с соответствующими квантилями некоторого распределения (нормальное, однородное...).
Полученный сюжет позволяет нам затем оценить в нашем измерении следующее предполагаемое распределение или нет.
http://en.wikipedia.org/wiki/Quantile-quantile_plot
Оба R и Matlab предоставляют готовые функции для этого, но мне интересно, какой будет самый чистый метод для реализации в Python.
Ответы
Ответ 1
Я думаю, что 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()
Результат
![enter image description here]()
Ответ 2
Использование qqplot
of 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()
Результат:
![enter image description here]()
Документация и другие примеры здесь
Ответ 3
Если вам нужно сделать график QQ одного образца по сравнению с другим, в statsmodels входит qqplot_2samples(). Как и Рикки Робинсон в комментарии выше, это то, о чем я думаю, как график QQ, и график вероятности, который является образцом против теоретического распределения.
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html
Ответ 4
Теперь он существует в пакете statsmodels:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot.html
Ответ 5
Я придумал это. Возможно, вы можете улучшить его. Особенно метод генерации квантилей распределения кажется мне громоздким.
Вы можете заменить 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)
Ответ 6
Вы можете использовать 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)