[Statistics][Python][統計]与えられたデータの分布について確認する

green and white line illustration python
Photo by Markus Spiske on Pexels.com

与えられたデータの分布について

データ解析の基礎となるが、与えられた(あるいは収集した)データがどのような分布を有するかである。ヒストグラムを描いてデータ分布の性状を確認することが重要であるが、例えば分布が正規分布やt分布とどれほど近い・離れているのかや、統計学的にその差は有意なのかを検定することは重要だろう。以下ではPythonのいくつかのライブラリーを用いてQQ plotの描写やコルモゴロフ・スミルノフ検定などを行う。

QQプロット

まずはQQプロットから。QQプロットとは、横軸(\(x\)軸)に正規分布やt分布など指定する分布のppf (percent point function)、縦軸(\(y\)軸)に手持ちのデータのppfを描写するものである。Statsmodelsのライブラリーで簡単に行うことができる。

statsmodels.graphics.gofplots.qqplot - statsmodels 0.14.1
import statsmodels.api as sm
sm.qqplot(data, dist=<scipy.stats._continuous_distns.norm_gen object>, distargs=(), a=0, loc=0, scale=1, fit=False, line=None, ax=None, **plotkwargs)

以下で上のコードの説明を簡単に行う。”data”は自分が調べたい\(1\)次元のデータ。”dist”は比較する分布。デフォルトでは標準正規分布になっている。指定できるのは以下。

確率分布stats
正規分布stats.norm
ベータ分布stats.beta
カイ二乗分布stats.chi2
F分布stats.f
ガンマ分布stats.gamma
t分布stats.t
一様分布stat.uniform
ベルヌーイ分布stats.bernoulli
二項分布stats.binom
ポアソン分布stats.poisson
指定可能な分布一覧。

“distargs”はdist.ppfが完全に呼び出されるように指定するためにdistに渡される引数のタプル。どういうことかというと、t分布などでは自由度が必要なので、これを指定する。”a”は期待順序統計量のプロット位置のオフセットなど。プロット位置は\(\displaystyle \frac{i-a}{nobs-2\cdot a+1}\ \ (i = 0, 1, \cdots, nobs+1)\)で与えられる。”loc”と”scale”は指定する分布の位置パラメータ、スケールパラメータ。”fit”がFalseの場合、loc、scale、distargs が分布に渡される。fitがTrueの場合、distのパラメータはdist.fitを使用して自動的にフィットする。分位数は標準化されたデータからフィットされたlocを引き、フィットされたscaleで割ったものから作られる。”line”はreference線を引く。

line: {None, "45", "s", "r", "q"}

から指定する。”45″を指定するとすると\(x = y\)、”s”は標準線。”r”は回帰直線、”q”は4分位にfitした直線。defalutはNoneになっている。

QQプロットの実例

データセットは何でも良い。seabornのirisデータセットを用いる。

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from scipy import stats
df = sns.load_dataset("iris")

sm.qqplot(df["sepal_length"],dist = stats.norm, fit = True, line = "45")
標準正規分布とデータとのfitting。

概ねよくfitしているように見える。t分布やその他自由に対象となる分布を指定すれば良い。もう一つ例をあげる。

sm.qqplot(df["sepal_length"], dist = stats.t, distargs = (4,), loc = 2, scale = 3,fit = False, line = "45")
t分布とデータとのfitting。

この例では全然fitしていない。

コルモゴロフ・スミルノフ検定

コルモゴロフ–スミルノフ検定 - Wikipedia

scpiyで行う。

kstest — SciPy v1.14.0 Manual
from scipy import stats
stats.kstest(df["sepal_length"], "norm")

結果はこちら。

KstestResult(statistic=0.999991460094529, pvalue=0.0)

この場合、帰無仮説は正規分布と異なる、になるのでirisデータセットのsepal_lengthはほぼ正規分布と考えて良い事がわかる。

正規分布との比較の場合、

stats.shapiro

とすればシャピロ・ウィルク検定を行うことができる。

関連リンク

統計モデルにどのような確率分布を採用するか

コメント

タイトルとURLをコピーしました