線形回帰について ーデータクレンジング編その②

線形回帰のデータクレンジング編その①の続きです。


前回は、
ざっと欠損値の確認、及び外れ値の処理について、確認した。
外れ値をquantileで削ることで、幾分か分布が緩やかになった。
もう一度その分布をみておく。


f:id:kawam0t0:20200514205720p:plain

いい感じですね。
そして、再度、クリーンになった(ハズ)のデータの統計量を再度確認。

data_cleaned.describe()

f:id:kawam0t0:20200514205906p:plain

この統計量の各項目について、散布図で示してみる。
具体的には、値段と走行距離 値段と排気量 値段と年式 の3パターン。

それぞれ見てみると…

plt.scatter(data_cleaned["Year"] , data_cleaned["Price"])
plt.title('Year and Price')

f:id:kawam0t0:20200514210328p:plain

plt.scatter(data_cleaned["Price"] , data_cleaned["Mileage"])
plt.title('Mileage and Price')

f:id:kawam0t0:20200514210400p:plain

plt.scatter(data_cleaned["EngineV"] , data_cleaned["Price"])
plt.title('EngineV and Price')

f:id:kawam0t0:20200514210436p:plain

どれも、線形性を持っている!!とは十分に言えない…(曲線的)
そこで、対数変換を行う。
対数変換=指数分布において、対数変換を行うと、直線的なグラフになる。

log_price = np.log(data_cleaned["Price"])
data_cleaned["log_price"] = log_price

f:id:kawam0t0:20200514210636p:plainf:id:kawam0t0:20200514210649p:plainf:id:kawam0t0:20200514210646p:plain


若干微妙なやつもあるが、まぁさっきのよりかは直線的だ。
では、ここで、線形回帰の特性について記載する。

①線形性であること→対数変換したんでOK
②内相性がないこと
③正規性と同分散性があること→対数変換したんでOK
④自己相関性がないこと→これは時系列データではないのでOK
⑤多重共線性がないこと→それぞれの変数が関係しているか?ということで、これは怪しい…

この5つのどれかを持っているとき、
線形回帰は使わないほうが良い。

この⑤の奴が今回ちょっと危ない。なぜなら、さっき見た、値段に対して、年式・排気量・走行距離って
明らかに多重共線している気がするからだ。
ここで、では実際にどれくらいの多重共線性を保有しているのか、について調べる。

from statsmodels.stats.outliers_influence import variance_inflation_factor

variabels = data_cleaned[["Mileage" , "EngineV" , "Year"]]
vif = pd.DataFrame()
vif["VIF"] = [variance_inflation_factor(variabels.values , i) for i in range(variabels.shape[1])]

vif
#実行結果は↓

通常、多重共線性の値は>5ならOK。
それ以上なら多重共線性の事があるので、省く、が正しい。
ここでは、まぁいったんYearを省いておく。

f:id:kawam0t0:20200514212524p:plain


続きは次回で!