独立変数がカテゴリカル変数で、従属変数がContinuous変数の際、各カテゴリと従属変数の関係を調べる方法について。
参考サイト:
- https://rdrr.io/github/kassambara/rstatix/man/kruskal_effsize.html
https://www.researchgate.net/post/Anyone_know_how_to_calculate_eta_squared_for_a_Kruskal-Wallis_analysis
日本語サイトでは、検定統計量をz変換してr2を求めるとの解説があるので、どのやり方が正しいのか後で要学習(とりあえず簡単な方法を選択)
方法:
- ANOVA(分散分析) - 前提:正規分布。カテゴリごとの平均値を比較して有意差調べる
- Kruskal-Wallis検定 - ノンパラメトリック。カテゴリごとの中央値を比較して有意差を調べる。
- z検定, t検定 - カテゴリ数が2つの時。前提:正規分布。
Kruskal-Wallis検定のコード例:
以下では、サンプルサイズがでかいとどうやっても有意差でるので、同時に効果量を調べて、効果量で判別している。
下のケースでは、特徴量を32個のうち28個選択され、スコア自体にはそんなに影響を与えなかった。変数の数を減らして、計算コストを下げるとかの効果があるかもしれない。
対象データ:kaggle House Prices
以下は対象カテゴリ変数と従属変数(SalePrice)のboxplot
上記boxplotの各変数とSalePriceをKruskal-Wallis検定かけて、効果量が中以上の変数のみ取り出す。
# クラスカル=ウォリス検定(有意水準0.95)かけて、効果量が中以上の変数のみ抽出
# 効果量計算関数
def effect_size(H, k, n):
'''
H: H統計量
k: カテゴリ数
n: データ数
'''
eta2 = (H - k + 1)/(n - k)
return eta2
# クラスカル=ウォリス検定かけて有意水準と効果量で振るい分け
signi_list = []
for i in range(len(categorical_list)):
grouped = train_df.groupby(categorical_list[i])
result = stats.kruskal(*(x[1]['SalePrice'] for x in grouped)) # kruskal-wallis検定
if result.pvalue < 0.05:
H = result.statistic # H統計量
k = len(grouped.indices.keys()) # 変数内のカテゴリ数
n = train_df[categorical_list[i]].notnull().value_counts()[True] # データ数
e_size = effect_size(H, k, n) # 効果量計算
if e_size >= 0.14:
print(categorical_list[i],':効果量大 =',e_size)
# 効果量が大以上の変数を抽出
signi_list.append(categorical_list[i])
elif 0.06 < e_size < 0.14:
print(categorical_list[i],'効果量:中 =',e_size)
# 効果量が中以上の変数を抽出
signi_list.append(categorical_list[i])
# categorical変数の対象を効果量が中以上の変数のみにする
categorical_list = signi_list
結果:
MSZoning :効果量大 = 0.18286611490976087
Alley :効果量大 = 0.3542743936588864
LotShape 効果量:中 = 0.10161687686225783
Neighborhood :効果量大 = 0.5885243037495679
HouseStyle 効果量:中 = 0.1228852797813639
Exterior1st :効果量大 = 0.2007228900330421
Exterior2nd :効果量大 = 0.18644816024673835
MasVnrType :効果量大 = 0.1883113004178751
ExterQual :効果量大 = 0.46733522276156625
Foundation :効果量大 = 0.3326841477863293
BsmtQual :効果量大 = 0.44315232830444373
BsmtExposure 効果量:中 = 0.095879442129514
BsmtFinType1 :効果量大 = 0.20693244913726966
HeatingQC :効果量大 = 0.2424580115685051
KitchenQual :効果量大 = 0.4522538374255991
FireplaceQu 効果量:中 = 0.10186322338271923
GarageType :効果量大 = 0.30309869494857017
GarageFinish :効果量大 = 0.3657033514101918
Fence 効果量:中 = 0.10771894120949653
MSSubClass :効果量大 = 0.3581562422871058
OverallQual :効果量大 = 0.6600708779393203
OverallCond :効果量大 = 0.15903892940060307
FullBath :効果量大 = 0.409590769148877
HalfBath 効果量:中 = 0.12170120572909664
BedroomAbvGr 効果量:中 = 0.06479703331962565
TotRmsAbvGrd :効果量大 = 0.28204777671437053
Fireplaces :効果量大 = 0.27735995631688476
GarageCars :効果量大 = 0.4800734749114767
0コメント