本記事では、二値分類問題に応用できる、連続値を取る説明変数のうちどの説明変数が特徴として有効であるか知りたい場合に有用なマンホイットニーのU検定、通称「U検定」について説明します。
論よりコード、まずはPythonコードはこちら。
#Pythonコード
from scipy import stats
import pandas as pd
# カラムとp値を保持
feature_list = pd.DataFrame()
# 同一のカラムを持つdf1, df2があるとする
df1 = ....
df2 = ....
# カラム1つごとに確認
for col in df1.columns:
# 2つの連続値を比べる
statistics, pvalue = stats.mannwhitneyu(df1[col], df2[col])
# 出力例:) MannwhitneyuResult(statistic=49.0, pvalue=4.8490227224570924e-17)
# p値とカラム名をリストに保存
feature_list = feature_list.append(pd.DataFrame({'column':col, 'value':pvalue}, index=[len(feature_list)]))
# p値が小さいものから表示(小さいものほど度合いが高い)
print(feature_list.sort_values('value'))
U検定とは
マン-ホイットニーのU検定
独立した2組の標本が属している母集団の分布が等しいかどうかを検定するノンパラメトリック手法。
[11.1] マン-ホイットニーのU検定
つまり、正規分布しない(ノンパラメトリック)と思われる2つの分布に対して差があるかどうかを測るものであり、p値が小さいほど「2 群の母代表値に差がある」と言えます。
これを用いて一定のp値以上のものを特徴量として取捨選択すると、結果、効率的に特徴量を選択することができます。
Irisデータによるサンプル
ここからはirisデータを使ってp値とそのデータを可視化したものを確認します。
なお今回2値分類として話を進めるため、比較する品種をvirginicaとversicolorに絞ります。
import seaborn as sns
from scipy import stats
import numpy as np
import pandas as pd
# seabornのirisデータセットを読み込み
iris = sns.load_dataset('iris')
# カラムとp値を保持
feature_list = pd.DataFrame()
# カラム1つごとに確認
for col in iris.columns:
# virginicaとversicolorの各カラムの分布の差を調べる(U検定)
statistics, pvalue = stats.mannwhitneyu(iris[iris['species'] == 'virginica'][col], iris[iris['species'] == 'versicolor'][col])
# p値とカラム名をリストに保存
feature_list = feature_list.append(pd.DataFrame({'column':col, 'pvalue':pvalue}, index=[len(feature_list)]))
# p値が小さいものから表示(小さいものほど度合いが高い)
print(feature_list.sort_values('pvalue', ascending=False))
実行の結果、feature_listに入った結果は以下のようになりました。
column value
2 petal_length 4.566772e-17
3 petal_width 4.849023e-17
0 sepal_length 2.934503e-07
1 sepal_width 2.286071e-03
petal_lengthという属性値が一番p値が小さくなり、sepal_widthという属性値が一番p値が大きくなりました。では、ヒストグラムとして書き出してみるとこの違いはどう見えるでしょうか。
petal_lengthの場合
[fig.1] irisデータのpetal_lengthをヒストグラムで可視化(正規化済み)
p値も十分に小さいことから、差があると言える状態でしたが、可視化してみるとかなり差があるように見受けられます(重複する部分も大分小さい)。 分類に有効な特徴として使えそうですね。
では、一番大きかったsepal_widthはどうでしょうか。
sepal_widthの場合
[fig.2] irisデータのsepal_widthをヒストグラムで可視化(正規化済み)
p値が0.0022〜ということでよく使われる0.05よりも小さいことから差があると言えますが、先ほどのpetal_lengthの方と比べて大分大きいことからもわかるように、あまり差があるようには見えません。重なっている部分も多いですね。
こういった説明変数を特徴として使ってもあまり精度に寄与しないでしょう。
場合によっては使わない方が精度が出る場合もあります。
まとめ
U検定による分類問題に有効な特徴量の選択に関してお話しさせていただきました。
U検定はノンパラメトリック(正規分布していないと思われる分布に使える/していてもそれほど変わらない結果が得られる)手法です。正規分布するとわかっている場合はt検定が相応しいです。
#宣伝
ブログでデータサイエンス・統計にまつわる初心者目線のブログを書いています。
[とあるデータサイエンティストのブログ]
(https://an-engineer-note.com)
良ければお立ち寄りください。
それでは!