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


85

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

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

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

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

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


2
見たことがありprobplotますか?docs.scipy.org/doc/scipy/reference/generated/…–
Geoff

1
多くのオプションを備えたqqplotとprobplots:statsmodels.sourceforge.net/devel/…–
Josef

回答:


105

私はそれ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()

結果

ここに画像の説明を入力してください


時々私は、中央で狭くなり、最後にトランペットのようであるいくつかの点線の信頼線を見ました。これらの「ガイドライン」をプロットに追加できますか?
Norfeldt 2013

21
わかりましたが、これは確率プロットです(サンプルと理論上の分布)。qqプロットは、2つのサンプルを比較します。 itl.nist.gov/div898/handbook/eda/section3/qqplot.htm itl.nist.gov/div898/handbook/eda/section3/probplot.htm
リッキーロビンソン

7
@RickyRobinson多くの情報源(ウィキペディアを含む)がNISTハンドブックと矛盾しているようです。他のほとんどすべての情報源は、QQプロットの横軸に理論分位数があり、垂直軸にデータ分位数があると述べています。いずれにせよ、区別は学術的です。サンプルをプロットすることは、経験分布関数を使用することと本質的に同じです。いずれにせよ、ある分布の分位数を別の分布に対してプロットしていることになります。
ピーター

1
@RickyRobinsonに同意します。これは、この質問に対する正しい答えではありません。QQプロットと確率プロットは、どちらも1つの分布の分位数に対して別の分布の分位数であるにもかかわらず、異なります。
フロラン

48

使用するqqplotのは、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()

結果:

ここに画像の説明を入力してください

ドキュメントとその他の例はこちら


1
@ tommy.carstensen意図的にからscipyに分離されましたstatsmodels
SARose 2017年

3
ただのメモ。あなたの例は、標準正規分布の線を引きます。@Geoffの例のように、標準化された線(指定されたサンプルの標準偏差でスケーリングされ、平均が追加される)を取得するには、line = '45 'ではなくline =' s 'を設定する必要があります
Mike

この答えは+1。統計のために、より多くのリソースを単一のパッケージに集中させることが重要だと思います。statsmodels良い選択でしょう。
ケン

20

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

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


11
QQプロットの大きな利点の1つは1が、異なるサイズのサンプルを比較することができるということですので...このqqplotの実装は面白いです、異なるサイズ、とのサンプルを処理していないようだ
ロバート・Muil

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)


2

PythonとRの世界でのQQプロットと確率プロットに関する混乱を増すために、これはSciPyマニュアルの内容です。

probplot確率プロットを生成しますが、QQまたはPPプロットと混同しないでください。Statsmodelsには、このタイプのより広範な機能があります。statsmodels.api.ProbPlotを参照してください。」

試してみるscipy.stats.probplotと、実際にデータセットを理論上の分布と比較していることがわかります。QQプロット、OTOHは、2つのデータセット(サンプル)を比較します。

Rは、機能を持っているqqnormqqplotqqline。Rヘルプ(バージョン3.6.3)から:

qqnormはジェネリック関数であり、デフォルトのメソッドはyの値の正規QQプロットを生成します。qqline「理論上の」、デフォルトでは通常の分位数-分位数プロットに線を追加します。このプロットは、確率分位数、デフォルトでは第1および第3四分位数を通過します。

qqplot 2つのデータセットのQQプロットを生成します。

つまり、Rは、デフォルト設定qqnormscipy.stats.probplot提供されるのと同じ機能を提供しますdist=norm。しかし、彼らがそれをqqnorm呼び、それが「通常のQQプロットを生成する」ことになっているという事実は、ユーザーを簡単に混乱させる可能性があります。

最後に、警告の言葉。これらのプロットは、適切な統計的検定に代わるものではなく、説明のみを目的として使用する必要があります。


2

サンプルの大きさはどれくらいですか?OpenTURNSライブラリを使用して、ディストリビューションに対してデータをテストする別のオプションがあります。以下の例では、一様分布から1.000.000の数値のサンプルxを生成し、正規分布に対してテストします。xを次のように再形成すると、データに置き換えることができます。x= [[x1], [x2], .., [xn]]

import openturns as ot

x = ot.Uniform().getSample(1000000)
g = ot.VisualTest.DrawQQplot(x, ot.Normal())
g

私のJupyterNotebookには、次のように表示されます。 ここに画像の説明を入力してください

スクリプトを書いている場合は、より適切に行うことができます

from openturns.viewer import View`
import matplotlib.pyplot as plt
View(g)
plt.show()

1

ボケが使える

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
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"で指定された正規分布に対するグラフ測定値を描画します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.