web-dev-qa-db-ja.com

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

データの正規性の検定として、Seabornで qq plot を実行する方法を誰かに教えてもらえますか?または、少なくともmatplotlibでは失敗します。

前もって感謝します

5
Harvs

ウィキペディアの記事を読んだ後、Q-Qプロットは2つの分布の分位数のプロットであることがわかりました。

numpy.percentileを使用すると、分布のパーセンタイルを取得できます。したがって、各分布でnumpy.percentileを呼び出して、結果を相互にプロットすることができます。

import numpy as np
import matplotlib.pyplot as plt

a = np.random.normal(5,5,250)
b = np.random.rayleigh(5,250)

percs = np.linspace(0,100,21)
qn_a = np.percentile(a, percs)
qn_b = np.percentile(b, percs)

plt.plot(qn_a,qn_b, ls="", marker="o")

x = np.linspace(np.min((qn_a.min(),qn_b.min())), np.max((qn_a.max(),qn_b.max())))
plt.plot(x,x, color="k", ls="--")

plt.show()

enter image description here

これがまだ最近かどうかはわかりませんが、どちらの回答も、scipyとseabornを使用してqq-plotを実行する方法を尋ねる質問に実際に対処していないことに気付きましたが、statsmodelsについては言及していません。実際、qq-plotsはscipyでprobplotという名前で利用できます。

from scipy import stats
import seaborn as sns
stats.probplot(x, plot=sns.mpl.pyplot)

Probplotのplot引数は、plotメソッドとtextメソッドを持つものであれば何でもかまいません。 Probplotは、サポートする理論上の分布の種類についても非常に柔軟です。

7
Ingo

Statsmodels.apiには、このジョブ用のプロッターがあります。

Sm.qqplot()をチェックしてください sm docs

上記と同じデータを使用したいくつかの例を次に示します。

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

 a = np.random.normal(5,5,250)
 sm.qqplot(a)
 plt.show()

SOはまだ画像を投稿させてくれません。ぜひお試しください。これは、正規分布に対してプロットされた正規分布を示しており、結果として(かなりくすんだ)直線になります。

b = np.random.rayleigh(5,250)
sm.qqplot(b)

これは、正規分布に対してプロットされたローリー距離を示しています。結果はわずかに凹状の曲線になります。

5
leonkato