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



Как бы вы создали QQ-plot с помощью Python?



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



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



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



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

1369   7  

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()

результат

enter image description here

используя 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

документация и другие примеры здесь

Если вам нужно сделать график QQ одного образца против другого, statsmodels включает qqplot_2samples (). Как и Рикки Робинсон в комментарии выше, это то, что я думаю о графике QQ против вероятностного графика, который является образцом против теоретического распределения.

http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.gofplots.qqplot_2samples.html

теперь он существует в пакете 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

    Ничего не найдено.