6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

重回帰分析の中身をみて欲しいと頼まれたときは

Posted at

#はじめに
社外のデータサイエンティスト講座も無事に卒業し、本業において機械学習の適用などを進めています。そんな中ある日、『重回帰分析をやってみたんだけど中身を見て欲しい』と相談を受けました。

徐々に私の認知度が高まってきたのだろうか..(まんざらではない)

「よっしゃ、やったります!」と二つ返事で請け負い、今年統計検定2級も取ったし、イケるっしょの精神で分析結果を見始め、先日レビュー結果を返しました。

ただ、まだまだ駆け出しデータサイエンティストの自分、この程度の提案で十分だったのか不安が残ります・・・。

そこで、ここに記事として残すことで衆目にさらし、指摘が入れば是正し、より良い手順で重回帰分析を評価できるようになりたいと思います。

どうぞご一読下さい。

#はじめに伝えた、重回帰分析の一般的な傾向

まずはじめに以下の事を伝えました。

  • 特徴量(変数)を増やすほど決定係数R2は増加する。
  • すなわち、学習データに精度良くFittingできる。
  • しかし、多重共線性が認められる場合には回帰係数が極めて大きな値、負の値になるなど、説明のしづらい回帰結果が得られることとなる。
  • 未知のデータに対し極端な値を算出する可能性もある。

そうして上記を理解してもらったうえで、何でもかんでも特徴量を拾おうとせず、分析結果を見ながら組み合わせを選んでいきましょう。と説明。
そして、次の3つの項目を確認するよう伝えました。

ここからはコンビニの売上(目的変数)を例に話を進めます。(出てくる数字は適当です)
image.png

#確認するべき指標① 回帰係数
数字の大小はともかく、この値の正負が直感と一致しているかは要確認です。例えば、来店人数が増えるごとに目的変数(売上)が減少するような分析結果になっている場合、これは実務を考えると説明がつかないですよね。

なんでもかんでも特徴量に入れてしまうと多重共線性の影響で上記のような現象が起きかねません。
image.png

#確認するべき指標② P値
回帰係数は直感的に分かる人が多いですが、P値はちょっと統計をかじっていないと見落とされている可能性があります。例えば、エクセルで売り上げを目的変数に来店人数、土地面積、レジ数で重回帰分析をしてみたとします。

この時の重回帰分析結果が割と良さそうでも、「待った」をかけなくてはいけません。

ここで出てくるP値は「説明変数が影響を与えていない確率」を示しており、確率が高い(1に近い)ということは、「その説明変数、あまり意味ないよ」となります。一般的に0.05以下であれば「説明変数が影響を与えていない」を棄却し、特徴量として意味のある変数と認定します。

image.png

統計的に判断をする、バイアスは排除する、が大事なのかなと思います。潔く相手に「その特徴量意味なさそうです」と伝えましょう。

image.png

#確認するべき指標③ VIF
VIFは説明変数間の多重共線性を評価しており、一般的に10を超えると多重共線性が見られると言われている。(VIFの解釈は、他の変数を加えたことで単回帰をした場合の係数の推定量の分散が、何倍大きくなったかを表している。)

これはPythonでサクッと確認することができます。相談相手が「VIF??」という場合には、下記コードを参考にしてください。

import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor

df_all = pd.read_excel('sample.xlsx',sheet_name="Sample")

cols = df_all.select_dtypes(include=[np.number]).columns #数値を扱っている列だけを抽出
cols_x = cols[1:] #目的変数cols[0]を外しています
data_x = df_all[cols_x]
#vifを計算する
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(data_x.values, i) for i in range(data_x.shape[1])]
vif["features"] = data_x.columns
 
#vifを計算結果を出力する
print(vif)
 
#vifをグラフ化する
plt.plot(vif["VIF Factor"])

このような感じ↓で結果が確認できます。ただ私は、10を超えたら絶対にダメ、無意味!とは思っていません。あくまで目安程度に考えており、10ちょっと超え程度であれば要経過観察くらいの気持ちです。もちろん、正則化や特徴量の再検討は提案しますが。

image.png

#さいごに

情報量が少ない、データの内容が偏っている場合は、どんなに頑張っても良い回帰結果は得られません。
その場合は「来店人数との相関が弱そうな、駐車できる車の数も入れてみましょう」といった形で別の切り口を提案していくべきかと思います。(車の数という切り口は、なんとも微妙だと思っていますが..)
物量関係のデータが多いなら価格などの質を表現できるようなデータですかね。

エクセルの分析ツールは便利ですので、ちょっとした知識をプラスしてみんなが自由自在に使いこなせるようになるといいですね!

読んでいただきありがとうございました。

6
5
0

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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?