Categoricalな独立変数と、Continuousな従属変数の関係測定(Kruskal-Wallis検定とANOVA)

独立変数がカテゴリカル変数で、従属変数が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を求めるとの解説があるので、どのやり方が正しいのか後で要学習(とりあえず簡単な方法を選択)



方法:

  1. ANOVA(分散分析) - 前提:正規分布。カテゴリごとの平均値を比較して有意差調べる
  2. Kruskal-Wallis検定 - ノンパラメトリック。カテゴリごとの中央値を比較して有意差を調べる。
  3. 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

機械学習Tips保管庫

データ解析、機械学習のための学習内容の保管庫。復習用。

0コメント

  • 1000 / 1000