正規性の検定(概要とpython実装)

正規性の検定について

得られたデータが正規分布に従うか(正規性を有するか)を調べるための検定方法として、シャピロ-ウィルク検定や、コロモゴロフ-スルミノフ検定などがある。
データの正規性に関する情報は、t 検定やF検定などの種々の検定を行う際の前提条件となる。(下図参照)


シャピロ-ウィルク検定

データが正規分布に従う(正規分布からサンプリングされたものである)という帰無仮説を検定する。

コルモゴロフ-スルミノフ検定(KS検定)

  • 得られたデータの分布が「ある分布」と差があるかどうか検定する。
  • 1標本KS検定2標本KS検定に分けられる。

1標本KS検定

  • 主に正規分布および一様分布に関する適合度検定に利用される。
  • 正規分布への適合度を検定する場合においては、一般にはシャピロ-ウィルク検定のほうがより強力な手法。

2標本KS検定

二つの標本が同じ母集団からサンプリングされたものか(同じ分布に従うか)検定する。

コード(正規性の検定)

正規分布、コーシー分布から生成したデータに対して、帰無仮説を「データがある分布(正規分布)と差がない」とおき、有意水準0.05で検定を行う。

正規分布、コーシー分布を描画してみる

# 正規分布、コーシー分布を描画してみる
from scipy import stats
import numpy as np
from matplotlib import pyplot as plt

x = np.linspace(-5, 5, 100)
pdf_norm = stats.norm.pdf(x,loc=0)
pdf_cauchy = stats.cauchy.pdf(x)
plt.plot(x, pdf_norm, 'k',label='normal')
plt.plot(x, pdf_cauchy, 'r',label='cauchy')
plt.xlim(-5,5)
plt.legend(loc='best')
plt.title('normal and cauchy distribution')
plt.show()


シャピロ-ウィルク検定

from scipy import stats
import numpy as np
from matplotlib import pyplot as plt

# データの作成(正規分布とコーシー分布に従うデータを作成する)
#rvs:分布に従うランダムデータを作成する。
data_norm = stats.norm.rvs(size=500, loc=0)
data_cauchy = stats.cauchy.rvs(size=500)[]
#シャピロ-ウィルク検定実施
result_norm = stats.shapiro(data_norm)
result_cauchy = stats.shapiro(data_cauchy)
print('p value(norm):', result_norm.pvalue)
print('p value(cauchy):', result_cauchy.pvalue)
"""ourput
p value(norm): 0.577941358089447
p value(cauchy): 2.4382593279251817e-43
"""

data_norm:p値(norm) > 0.05 であるため、「data_norm は正規分布と一致している」 という帰無仮説は棄却されない

data_cauchy:p値(cauchy) < 0.05 であるため、帰無仮説は棄却され、「data_cauchy」 は正規分布と一致しているとは言えない

1標本KS検定

from scipy import stats
import numpy as np
from matplotlib import pyplot as plt

# データの作成(正規分布とコーシー分布に従うデータを作成する)
data_norm = stats.norm.rvs(size=500, loc=0)
data_cauchy = stats.cauchy.rvs(size=500)

#1標本KS検定実施
result_norm = stats.kstest(data_norm,'norm')
result_cauchy = stats.kstest(data_cauchy,'norm')
print('p value(norm):', result_norm.pvalue)
print('p value(cauchy):', result_cauchy.pvalue)
"""ourput
p value(norm): 0.17243145212245203
p value(cauchy): 4.901048037041263e-08
"""

data_norm:p値(norm) > 0.05であるため、「data_norm は 正規分布と一致している」 という帰無仮説は棄却されない。

data_cauchy:p値(cauchy) < 0.05であるため、帰無仮説は棄却され、「data_cauchy」 は正規分布と一致しているとは言えない。

おまけ)2標本KS検定

以下二つのパターンについて、データの分布が異なるか検定する。

  1. 正規分布と正規分布
  2. 正規分布とt分布(自由度1)

帰無仮説を「両方のデータが同じ分布に従う」 とおき、有意水準 0.05で検定を行う。

from scipy import stats
import numpy as np
from matplotlib import pyplot as plt

# データの作成(正規分布とt分布に従うデータを作成する)
data_norm1 = stats.norm.rvs(size=500, loc=0)
data_norm2 = stats.norm.rvs(size=500, loc=0)
data_t = stats.t.rvs(df=1, size=500)
result_nn = stats.ks_2samp(data_norm1, data_norm2)
result_nc = stats.ks_2samp(data_norm1, data_t)
print('p value(norm&norm):', result_nn.pvalue)
print('p value(norm&t):', result_nc.pvalue)
"""ourput
p value(norm&norm): 0.9603008958861495
p value(norm&t): 1.4103236484921267e-06
"""

正規分布と正規分布:p値(norm&norm) > 0.05であるため、「data_norm1とdata_norm2 同じ分布に従う」 という帰無仮説は棄却されない。

正規分布とt分布:p値(norm&t) < 0.05であるため、帰無仮説は棄却され、data_norm1とdata_tが同じ分布に従っているとは言えない。

参考

 

 

 

関連書籍