日々学び、感謝し、成長する

データとハートを活かす人事を目指した成長奮闘記(?)です

ピープル・アナリティクスケーススタディ:重回帰分析に挑戦!②ステップワイズ法で説明変数を絞る!

f:id:millebon:20210425092058p:plain

 

重回帰分析で出した変数を調整していく

前回のブログのお題で重回帰分析を行いました。

しかし、ここで終わりではありません。前回は学術研究で関連性のあると思われる指標をすべて説明変数に加えて分析を行いましたが、各変数のp値を見ても5%以下となっているものは”MEANTI”のみです。

 

f:id:millebon:20210425142231p:plain

P値が5%以下は1変数のみ

では、どう調整するのか?AIHRの”Statistics in HR”のこの課題の解説ビデオで紹介されていたのが、AICという指標を参考にする方法です。

 

AICというのは(Akaike’ s Information Criterion:赤池情報量基準)のことで、元統計数理研究所所長の赤池弘次さんという日本人の方が考案したものだそうです。

 

Wikipediaで調べると、「モデルの複雑さとデータの適合度のバランス」を取るためにモデルの良さを評価するための指標だということです。

 

変数(や次数)を増やすと、分析したデータには適合するけれどもじゃあ、同じような状況にこのモデルが使えるかというとかが適合(Overfitting)が起こり、使えなくなる。

 

どれくらいの数に抑えるかということの一つの解を与えてくれるのがAICで最小のモデルであれば多くの場合良いモデルが選択できるそうです。

 

また変数の調整方法ですが、ステップワイズ法を用いていました。ステップワイズ法には、増減法(forward-backward:最も単純なモデルから変数を増やしていって探していく)、減増法(backward-foward:すべての変数を投入してそこから減らしていき最適な変数を探していく)がありますが、今回は学術的に考えうる変数をすべて使って行った重回帰分析の結果を使うので、減増法で行います。

 

ステップワイズ法をPythonで実践するのは大変。。

しかし、Pythonには利用できるパッケージ等を含めてもステップワイズ法を実装できる関数がありません(見つかったら教えてください)。。

 

ということでこちらのブログを参考にさせていただき、自作関数を作りました。

future-chem.com

私のPythonのレベルからですとゼロからこんな関数は作れないので、本当に感謝、感謝です🙇‍♂️。

===============================================

desc_list = ['CLGENDER', 'CLWORKEXP', 'CSMnetworking', 'CSMmobility', 'MEANTI', 'MEANPERSONALINIT']
def stepAIC(descs_l):
      import copy
     descriptors = descs_l
     f_model = ols(formula='MEANINNOVATION~ ' + ' + '.join(descriptors),  data=data_2).fit()
    best_aic = f_model.aic
    best_model = f_model
    while descriptors:
          desc_selected = ''
          flag = 0
          for desk in descriptors:
               used_desks = copy.deepcopy(descriptors)
               used_desks.remove(desk)
        formula = 'MEANINNOVATION ~ ' + ' + '.join(used_desks)
        model = ols(formula=formula, data=data_2).fit()
        if model.aic < best_aic:
             best_aic = model.aic
             best_model = model
            desc_selected = desk
            flag = 1

     if flag:
         descriptors.remove(desc_selected)
   else:
        break
    return best_model

model_a = stepAIC(desc_list)
print(model_a.summary())

===============================================

注意:

この間の続きですのですでに”from statsmodels.formula.api import ols”をimport済みです。

 

でてきた結果がこちらです。Rを使って分析したAIHRの解説ビデオとも合致しました!

 

f:id:millebon:20210425141523p:plain

ステップワイズ法(AIC基準)で変数調整後

変数は6つなったものから4つに絞られましたね。

どの値もP値が改善され、一番大きいCLWORKEXPでも5.6%となりました(なぜかサマリーの表が古めかしくなりましたが。。)。

 

ただ、AICについてはもともと191.5だったので、189.9への変更がどこまで大きいといえるのかは難しいところですが。。(まだまだ勉強が必要です)

 

次回は重回帰分析で分析できる前提の最後にあった”残差のばらつき”についてご紹介したいと思います。こちらもPythonでは苦労しました。。