R で Real estate valuation の線形重回帰分析

# はじめに
[こちらの記事](https://qiita.com/ryamamoto0406/items/8ac0bb8e5368a8cf8d6d)で基礎分析を行った、UCI 機械学習リポジトリの[Real estate valuation](https://archive.ics.uci.edu/ml/datasets/Real+estate+valuation+data+set)データについて回帰分析を行った。まずは重回帰を行い結果を見てみた。

※2021/02/25 改訂：コメントを受けse.seed、predictを使用したコードに追記した。

# データの読み込みとデータの分割
データを読み込み列名を変更、さらに train dataset と test dataset を分ける。

```R:コード
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`関数によって行う。

```R:コード
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を計算する関数を定義する。

```R:コード
RMSE = function(m, o) {
  tmp <- sqrt(mean((m-o)^2))
  return(tmp)
}
```

以上を用いてテストデータの RMSE を評価する。

```R:コード
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 を計算しながら最適な線形モデルを予測する。

```R:コード
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)を抜かして再度回帰分析を行う。

```R:コード
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を調べてみると、

```R:コード
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 さん、コメントありがとうございました。