正規性の検定について
得られたデータが正規分布に従うか(正規性を有するか)を調べるための検定方法として、シャピロ-ウィルク検定や、コロモゴロフ-スルミノフ検定などがある。
データの正規性に関する情報は、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検定
以下二つのパターンについて、データの分布が異なるか検定する。
- 正規分布と正規分布
- 正規分布と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が同じ分布に従っているとは言えない。
参考
- K-S検定(コルモゴロフ-スミルノフ検定)と、その誤用について
|qiita - pythonで正規性の検定【コロモゴロフスミルノフ検定(KS検定)】
- 検定(4):適合度の検定
K-S検定|九州大学講義資料 - シャピロ–ウィルク検定(wikipedia)
- コルモゴロフ–スミルノフ検定(wikipedia)
関連書籍