Подтвердить что ты не робот

Количественный квантовый график с использованием SciPy

Как бы вы создали qq-график с использованием Python?

Предполагая, что вы имеете большой набор измерений и используете какую-либо функцию построения графика, которая принимает значения XY в качестве входных данных. Функция должна отображать квантиля измерений с соответствующими квантилями некоторого распределения (нормальное, однородное...).

Полученный сюжет позволяет нам затем оценить в нашем измерении следующее предполагаемое распределение или нет.

http://en.wikipedia.org/wiki/Quantile-quantile_plot

Оба R и Matlab предоставляют готовые функции для этого, но мне интересно, какой будет самый чистый метод для реализации в Python.

4b9b3361

Ответ 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

Ответ 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)