線形回帰について ーデータクレンジング編その②
線形回帰のデータクレンジング編その①の続きです。
前回は、
ざっと欠損値の確認、及び外れ値の処理について、確認した。
外れ値をquantileで削ることで、幾分か分布が緩やかになった。
もう一度その分布をみておく。
いい感じですね。
そして、再度、クリーンになった(ハズ)のデータの統計量を再度確認。
data_cleaned.describe()
この統計量の各項目について、散布図で示してみる。
具体的には、値段と走行距離 値段と排気量 値段と年式 の3パターン。
それぞれ見てみると…
plt.scatter(data_cleaned["Year"] , data_cleaned["Price"]) plt.title('Year and Price')
plt.scatter(data_cleaned["Price"] , data_cleaned["Mileage"]) plt.title('Mileage and Price')
plt.scatter(data_cleaned["EngineV"] , data_cleaned["Price"]) plt.title('EngineV and Price')
どれも、線形性を持っている!!とは十分に言えない…(曲線的)
そこで、対数変換を行う。
対数変換=指数分布において、対数変換を行うと、直線的なグラフになる。
log_price = np.log(data_cleaned["Price"]) data_cleaned["log_price"] = log_price
若干微妙なやつもあるが、まぁさっきのよりかは直線的だ。
では、ここで、線形回帰の特性について記載する。
①線形性であること→対数変換したんで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を省いておく。
続きは次回で!