web-dev-qa-db-ja.com

SciPyを使用した分位点-分位プロット

Pythonを使用してどのようにqq-plotを作成しますか?

多数の測定値があり、入力としてXY値をとるプロット関数を使用していると仮定します。この関数は、測定値の分位数を、ある分布(正規、均一...)の対応する分位数に対してプロットする必要があります。

結果のプロットにより、仮定された分布に従うかどうかを測定で評価できます。

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

RとMatlabはどちらもこのための既製の関数を提供しますが、Pythonで実装するための最もクリーンな方法は何だろうと思っています。

71
John

scipy.stats.probplotはあなたが望むことをするだろうと思います。詳細については、 documentation を参照してください。

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

89
Geoff

statsmodels.apiqqplotを使用することも別のオプションです。

非常に基本的な例:

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

ドキュメントとその他の例は here です

35
Akavall

あるサンプルと別のサンプルのQQプロットを行う必要がある場合、statsmodelsにはqqplot_2samples()が含まれます。上記のコメントのリッキー・ロビンソンのように、これは理論上の分布に対するサンプルである確率プロットに対するQQプロットとして考えているものです。

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

16
ccap

現在、statsmodelsパッケージに含まれています。

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

3
grasshopper

これを思いついた。たぶんあなたはそれを改善することができます。特に、分布の分位数を生成する方法は、私にとって面倒です。

np.random.normalnp.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)
2
John

ボケを使用できます

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)
1
sushmit
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"で特定されたグラフ測定値と正規分布を描画します。

1
Ravi G