統計と機械学習

Pythonで数量化1類(多重共線性の話)

統計と機械学習

[PR]当サイトはアフィリエイト広告を利用しています。

以前このブログで作物の高さを数量化1類で分析しました。

このとき多重共線性について書いたのですが、化成肥料も液肥もなしの場合の話をしていなかったので今回記事にします。

詳細は以前の記事に譲るとして、まず前回の分析対象のデータは以下となっていたのでした。

化成なし化成あり液肥なし液肥2週に一回液肥週1日照短い日照長い作物高さ
011001051
011001052
100101050
100101051
100011051
100011049
011000160
011000161
100100161
100100162
100010160
100010161

このとき多重共線性で「化成なし」「化成あり」「液肥なし」「日照短い」を削除して分析しました。

今回の記事では以下のデータを用います。

化成なし化成あり液肥なし液肥2週に1液肥週1日照短い日照長い作物高さ
011001051
011001052
100101050
100101051
100011051
100011049
011000160
011000161
100100161
100100162
100010160
100010161
101001045
101001044

データが二行追加されています。

化成なし、液肥なし、日照短いが1になっているデータです。

早速ですがこのデータが入ることで多重共線性のために削除するデータは以下となります。

(1)化成なし

(2)液肥なし

(3)日照短い

以上3列です。

解説していきます。

(1)化成なし

これは化成ありと足し合わせると必ず1になるので削除します。

(2)液肥なし

液肥週1と液肥2週に1と液肥なしを足すと必ず1なので削除します。

(3)日照短い

日照長いと短いを足すと必ず1なので削除します。

これではなぜ化成ありを残したのか説明できていません。

そこを説明していきます。

前回は液肥なしが1なら必ず化成ありが0でした。その逆も然りです。足すと必ず1だったのです。

このため化成ありを削除してもよかったわけです。

しかし今回は液肥なしが1でも化成なしが1になることもあれば、化成ありが1になるときもあります

つまり液肥なしの値だけでは化成のあるなしを説明できないのです。

足すと必ず1になるという前提が崩れています。

こうなると化成ありなしのどちらかを使わないときちんと状態を説明できなくなります。

多重共線性での削除をしてはいけなくなります。

以上より分析するために残す列は以下。

化成あり液肥2週に1液肥週1日照長い作物高さ
100051
100052
010050
010051
001051
001049
100160
100161
010161
010162
001160
001161
000045
000044

化成ありは化成なしの列に置き換えてもいいです。それでもすべての状態を説明できますからね。

そしてこれを分析するプログラムが以下。

#pandas v1.2.0
#Copyright (c) 2008-2021 the pandas development team.
#Released under the BSD 3-Clause License
#https://pandas.pydata.org/pandas-docs/stable/getting_started/overview.html

#scikit-learn v0.24.0
#Copyright (c) 2007 - 2020 scikit-learn developers.
#Released under the BSD 3-Clause License
#https://github.com/scikit-learn/scikit-learn/blob/main/COPYING

import pandas as pd
from sklearn import linear_model
df = pd.read_csv("input.csv", encoding="shift-jis")
x = df.iloc[:, :-1]
y = df.iloc[:, -1]
clf = linear_model.LinearRegression()
clf.fit(x, y)
a = clf.coef_
b = clf.intercept_
print("説明変数:", x)
print("回帰係数:", a)
print("切片:", b)
print("決定係数:", clf.score(x, y))

出力は以下。

説明変数: 化成あり 液肥2週に1 液肥週1 日照長い

0 1 0 0 0

1 1 0 0 0

2 0 1 0 0

3 0 1 0 0

4 0 0 1 0

5 0 0 1 0

6 1 0 0 1

7 1 0 0 1

8 0 1 0 1

9 0 1 0 1

10 0 0 1 1

11 0 0 1 1

12 0 0 0 0

13 0 0 0 0

回帰係数: [ 6.41666667 6.41666667 5.66666667 10.16666667]

切片: 44.5

決定係数: 0.9866222222222222

前回の記事では液肥2週に1の係数が0、液肥週1の係数が-0.75、日照長いが約10.1667で、ほとんど日照の影響が作物高さに影響するという結果だったことを考えると、化成ありと液肥ありの場合に正の影響が増えたことがわかります。肥料も作物高さに影響するということになりました。

まあ仮のデータなので実際にこの通りに作物が成長するとは限りません。

今回は多重共線性について少し解説してみました。

やはり自分で作物を育ててみて実験してみたいところです。