統計的な検定を用いた特徴量の選択
表題の内容について学習する上で参考にしたものをまとめます。
各変数についてEDAを行ない、以下のようなユースケースが発生したことを想定しています。yが目的変数、xが説明変数の一つです。
ここで説明変数 X (soldout) はyに対して、有意な特徴量なのかどうやって判断するねん!っていうのが主題です。
検定の考え方を適用
統計的な考え方で、xの値によるyの差分が有意な差があるかどうかを判断します。ここで出てくるのが検定の考え方です。
2値検定の分類
下記のチャートのように、目的変数の分布によって適応する検定の方法が変わります。
使用する検定の判断方法
①正規分布かの判断方法
ヒストグラムを描く
左のグラフでは左右対称の分布をしており正規分布に近しい、右のグラフでは左に分布が偏っており、正規分布とは言えない。
X (soldout) と y のヒストグラムを描写。正規分布にしたがっているとは言えない。
正規性の検定を行う
より厳密に正規分布かをジャッジするときに活用(詳細は割愛)
・コルモゴロフ=スミルノフ検定
・リリフォース検定
・シャピロ=ウィルク検定
・適合度の検定
などが知られている。
②等分散かの判断方法
F検定を行う
X (soldout) と y で等分散性の検定を行う
#soldoutの値ごとにyの値を格納
a = train[train['soldout'] == 0]['y']
b = train[train['soldout'] == 1]['y']
# 等分散性の検定を行う。
scipy.stats.bartlett(a,b)
有意水準を5%とすると、p値が0.37より帰無仮説を棄却できない。等分散性の検定では、帰無仮説を二つの群の分散は等しい。と置いているので、分散が異なるとは言えない ( ≒ 等分散である )という結果が得られる。
差の検定の実施
③2標本のt検定
等分散を前提にしているため、equal_var = True
#ライブラリのimport
import scipy.stats as st
#t検定の実施
t, p = st.ttest_ind(a, b, equal_var=True)
#検定結果を出力
print('対応なしt検定')
print(f'p値 = {p:.3f}')
print(f't値 = {t:.2f}')
④welchのt検定
分散が違うことを前提にしているため、equal_var = False
#ライブラリのimport
import scipy.stats as st
#welchのt検定の実施
t, p = st.ttest_ind(a, b, equal_var=False)
#検定結果を出力
print('welchのt検定')
print(f'p値 = {p:.3f}')
print(f't値 = {t:.2f}')
⑤ノンパラメトリック法
・ウィルコクソンの順位和検定
・マンホイットニーのU検定(メディアン検定)
x(soldout)とyは正規分布にしたがわなかったため、今回はマンホイットニーのU検定を採用して、検定を行う。
#ライブラリのimport
import scipy.stats as st
#マンホイットニーのU検定を行う
st,p = st.mannwhitneyu(a, b, alternative='two-sided')
#検定結果を出力
print('マンホイットニーのU検定')
print(f'p値 = {p:.3f}')
有意水準を5%とすると、p > 0.05より帰無仮説(Xの値に対してyは同じである)を棄却できない。つまり、X(soldout)はyに対して、有意な特徴量ではない。という結論が導けた。
参考リンク
感想
モデリングのために、特徴量の選択するときに、それぞれの説明変数に対して、箱ひげ図とか書いて、差ありそう。差なさそう。を感で選んで、評価指標によって入れる外すを決めてたので、ちゃんとしたアプローチをしたく、まとめました。
ランダムフォレスト系なら全部突っ込んでも、問題なかったりするけど、重回帰、ロジ回帰あたりは影響出たりする印象があるので、参考になれば。
個人的には、統計でやってることがデータサイエンスの文脈で繋がってきておもしろかったです。
この記事が気に入ったらサポートをしてみませんか?