はじめに
こちらの記事で基礎分析を行った、UCI 機械学習リポジトリのReal estate valuationデータについて回帰分析を行った。まずは重回帰を行い結果を見てみた。
※2021/02/25 改訂:コメントを受けse.seed、predictを使用したコードに追記した。
データの読み込みとデータの分割
データを読み込み列名を変更、さらに train dataset と test dataset を分ける。
library(openxlsx)
df <- read.xlsx("./Real_estate_valuation_data_set.xlsx")
coln <- colnames(df) #列名を保存しておく
colnames(df) <- c("No","X1","X2","X3","X4","X5","X6","Y") #新しい名前を付けておく
library(rsample)
set.seed(1234) #値の再現を確認するときは乱数シードを設定
df_split <- initial_split(df, prop = 0.8) #train:test = 8:2 の割合で分ける
df_train <- training(df_split)
df_test <- testing(df_split)
線形重回帰分析(全変数使用)
重回帰分析をlm
関数によって行う。
df_train.lm <- lm(Y~X1+X2+X3+X4+X5+X6, df_train)
summary(df_train.lm)
Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = df_train)
Residuals:
Min 1Q Median 3Q Max
-35.039 -4.967 -0.893 4.069 74.441
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.301e+04 7.142e+03 -1.821 0.0695 .
X1 4.310e+00 1.692e+00 2.547 0.0113 *
X2 -2.904e-01 4.298e-02 -6.756 6.58e-11 ***
X3 -4.679e-03 7.677e-04 -6.094 3.11e-09 ***
X4 9.980e-01 2.111e-01 4.727 3.41e-06 ***
X5 2.675e+02 4.899e+01 5.460 9.45e-08 ***
X6 -1.898e+01 5.126e+01 -0.370 0.7115
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 8.769 on 325 degrees of freedom
Multiple R-squared: 0.5978, Adjusted R-squared: 0.5904
F-statistic: 80.5 on 6 and 325 DF, p-value: < 2.2e-16
調整済みの決定係数が 0.5904 であった。特別良くもないが悪くもない結果だった。分析結果からテストデータを予測する関数を定義する。
また、評価用としてRMSEを計算する関数を定義する。
RMSE = function(m, o) {
tmp <- sqrt(mean((m-o)^2))
return(tmp)
}
以上を用いてテストデータの RMSE を評価する。
df_test.y <- predict(df_train.lm, newdata = df_test)
df_test.rmse <- RMSE(df_test.y, df_test$Y)
df_test.rmse
[1] 9.312081
線形重回帰分析(一部変数使用)
step
関数を使って AIC を計算しながら最適な線形モデルを予測する。
air.lm <- step(df_train.lm)
Start: AIC=1448.63
Y ~ X1 + X2 + X3 + X4 + X5 + X6
Df Sum of Sq RSS AIC
- X6 1 10.5 25002 1446.8
<none> 24992 1448.6
- X1 1 498.9 25491 1453.2
- X4 1 1718.0 26710 1468.7
- X5 1 2292.8 27285 1475.8
- X3 1 2855.8 27848 1482.5
- X2 1 3509.4 28501 1490.2
Step: AIC=1446.77
Y ~ X1 + X2 + X3 + X4 + X5
Df Sum of Sq RSS AIC
<none> 25002 1446.8
- X1 1 493.7 25496 1451.3
- X4 1 1744.1 26746 1467.2
- X5 1 2353.7 27356 1474.6
- X2 1 3499.2 28501 1488.2
- X3 1 5357.0 30359 1509.2
変数X6を抜かしたモデルの方が AIC の値としては改善されるよう。なので、X6(longitude)を抜かして再度回帰分析を行う。
df_train.lm2 <- lm(Y~X1+X2+X3+X4+X5, df_train)
summary(df_train.lm2)
Call:
lm(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = df_train)
Residuals:
Min 1Q Median 3Q Max
-34.976 -5.064 -0.884 4.128 74.681
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.531e+04 3.507e+03 -4.365 1.71e-05 ***
X1 4.284e+00 1.688e+00 2.537 0.0116 *
X2 -2.896e-01 4.288e-02 -6.755 6.59e-11 ***
X3 -4.475e-03 5.355e-04 -8.358 1.87e-15 ***
X4 1.003e+00 2.104e-01 4.769 2.80e-06 ***
X5 2.694e+02 4.864e+01 5.540 6.25e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 8.758 on 326 degrees of freedom
Multiple R-squared: 0.5976, Adjusted R-squared: 0.5914
F-statistic: 96.83 on 5 and 326 DF, p-value: < 2.2e-16
調整済みの決定係数が 0.5914 なので、モデルとしては少し改善された。RMSEを調べてみると、
df_test.y2 <- predict(df_train.lm2, newdata = df_test)
df_test.rmse2 <- RMSE(df_test.y2, df_test$Y)
df_test.rmse2
[1] 9.307187
となり、こちらの値も微量ながら改善される。
おわりに
Real estate valuation の住宅価格を予測する重回帰分析を行ってみた。次回は回帰木などの分析を行ってみようと思う。
@dfghdfdjftyfghvgjhk さん、コメントありがとうございました。