0
1

相関係数から多重共線性が発生してそうな組み合わせを抜き出す

Last updated at Posted at 2024-02-26

多重共線性が発生していそうな組み合わせを抜き出す

まず相関係数をcorr()メソッドで出してあげる

train_corr = train.corr()
train_corr = train_corr.mask(train_corr[train_corr.columns] == 1.0)
train_corr

実行結果(kaggleのNotebook画面)

スクリーンショット 2024-02-26 22.04.14.png

この実行結果からfor文を利用し、多重共線性が発生している要素の組み合わせを求める

今回の多重共線性が発生しているとする基準は相関係数が0.8より大きい要素の組み合わせとする。

# for文で実行した相関係数の値を格納するために宣言
corr_list = []

# for文開始を2行目から始めたい為、変数に1を渡し、後に配列番号として利用する。
# 2行目から開始したい理由としては同じ要素同士の相関係数は1になり、計算にリソースを取られた
# くないことに加えてfor文の中で1ずつ加算することによって必要のない計算はスキップできる。
ind_st = 1

# カラムでfor文を回す。最後の列は計算に含めたくなため、:-1で指定している
for col in train_corr.columns[:-1]:

    # カラムfor文の中でインデックスfor文を回すことで1列毎に対して指定した分の行を回すことができる
    for ind in train_corr.index[ind_st:]:
        # [col][ind]で列と行の相関係数を見ることで相関係数をtmpに渡す
        tmp = train_corr[col][ind]
        
        if tmp > 0.8:
            print(tmp)
            
            #appendの際に(())で二重括弧にしているのはタプル形式で変数に追加するため。
            corr_list.append((col, ind, tmp))
            
    #次の周回の時に一つ下の行で処理を行うために、1加算する
    ind_st += 1
    

実行結果

0.8256674841743408
0.8195299750050339
0.8254893743088425
0.882475414281462

これだけではどの組み合わせかわからないので、for文の中のif文で定義づけた、相関係数が0.8より大き要素名と、相関係数を渡した変数corr_listを呼び出す

corr_list

実行結果

[('YearBuilt', 'GarageYrBlt', 0.8256674841743408),
 ('TotalBsmtSF', '1stFlrSF', 0.8195299750050339),
 ('GrLivArea', 'TotRmsAbvGrd', 0.8254893743088425),
 ('GarageCars', 'GarageArea', 0.882475414281462)]

カラム名, インデックス名, 相関係数といった形がタプルとして保管されている。

ハマったところ

今回個人的にハマってわからなかった場所としては列x行総当たりのような処理。

for col in df.columns:
    for ind in df.index:

こういった書き方で1列に全行という処理ができることを学習した。
今後も使うことがあると思うのでメモ

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1