knitr::opts_chunk$set(echo = TRUE)

Business Question

Pada Linear Regressi ini, dilakukan pembuatan model linear regression untuk menjawab pertanyaan sebagai berikut :

  1. Variabel apa saja yang berpengaruh signifikan dalam memprediksi harga dari rumah

  2. Berapa prediksi harga rumah dengan menggunakan variabel prediktor

Import Data

house <- read.csv("HousePrices_HalfMil.csv")
head(house)
##   Area Garage FirePlace Baths White.Marble Black.Marble Indian.Marble Floors
## 1  164      2         0     2            0            1             0      0
## 2   84      2         0     4            0            0             1      1
## 3  190      2         4     4            1            0             0      0
## 4   75      2         4     4            0            0             1      1
## 5  148      1         4     2            1            0             0      1
## 6  124      3         3     3            0            1             0      1
##   City Solar Electric Fiber Glass.Doors Swiming.Pool Garden Prices
## 1    3     1        1     1           1            0      0  43800
## 2    2     0        0     0           1            1      1  37550
## 3    2     0        0     1           0            0      0  49500
## 4    1     1        1     1           1            1      1  50075
## 5    2     1        0     0           1            1      1  52400
## 6    1     0        0     1           1            1      1  54300

Data Wrangling

Pada bagian ini, perlu dicek apakah terdapat outliers yang ada di dataset

boxplot(house)

Dari visualisasi boxplot diatas, maka dapat disimpulkan tidak terdapat outliers pada data set. Selanjutnya akan dicek apakah terdapat missing value dalam dataset. Setelah dilakukan pengecekkan tidak ada missing value pada dataset.

colSums(is.na(house))
##          Area        Garage     FirePlace         Baths  White.Marble 
##             0             0             0             0             0 
##  Black.Marble Indian.Marble        Floors          City         Solar 
##             0             0             0             0             0 
##      Electric         Fiber   Glass.Doors  Swiming.Pool        Garden 
##             0             0             0             0             0 
##        Prices 
##             0

Pada tahap EDA,variabel garden, Swiming.Pool, Solar dikeluarkan dari dataset karena tidakada korelasi antara ketiga variabel tersebut pda variable Price.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
house_clean <- house %>% 
  mutate_if(is.factor,as.integer) %>% 
  select(-Garden,-Swiming.Pool,- Solar,)

glimpse(house_clean)
## Rows: 500,000
## Columns: 13
## $ Area          <int> 164, 84, 190, 75, 148, 124, 58, 249, 243, 242, 61, 189, …
## $ Garage        <int> 2, 2, 2, 2, 1, 3, 1, 2, 1, 1, 2, 2, 2, 3, 3, 3, 1, 3, 2,…
## $ FirePlace     <int> 0, 0, 4, 4, 4, 3, 0, 1, 0, 2, 4, 0, 0, 3, 3, 4, 0, 3, 3,…
## $ Baths         <int> 2, 4, 4, 4, 2, 3, 2, 1, 2, 4, 5, 4, 2, 3, 1, 1, 5, 3, 5,…
## $ White.Marble  <int> 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ Black.Marble  <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1,…
## $ Indian.Marble <int> 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,…
## $ Floors        <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1,…
## $ City          <int> 3, 2, 2, 1, 2, 1, 3, 1, 1, 2, 1, 2, 1, 3, 3, 1, 3, 1, 3,…
## $ Electric      <int> 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,…
## $ Fiber         <int> 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0,…
## $ Glass.Doors   <int> 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,…
## $ Prices        <int> 43800, 37550, 49500, 50075, 52400, 54300, 34400, 50425, …

Selanjutnya sebelum melakukan pembuatan model regresi, perlu dilakukan cek korelasi variabel prediktor terhadap Prices sebagai variabel target, dari cek korelasi diatas, di dapatkan insight fiber dan floors memiliki korelasi yang cukup kuat (mendekati 1) dengan variable prices.

library(GGally)
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggcorr(house_clean, label = T, label_size = 2.5, cex = 2.6)

Dari uji korelasi diatas, di dapatkan insight fiber dan floors memiliki korelasi yang cukup kuat (mendekati 1) dengan variable prices. Pada data tersebut dapat dilihat jika ketiga variabel Indian.Marble, Black.Marble dan White Marble saling berkorelasi sehingga terjadi multicollinearity, sehingga perlu di take out ketiga variabel. Multicollinearity tidak sesuai dengan asumsi dari regresi linear bahwa masing masing variabel prediktor tidak memiliki korelasi yang tinggi

library(dplyr)
house_clean <- house_clean%>% 
  select(-White.Marble,-Black.Marble,Indian.Marble)

Linear Model Prediction

Selanjutnya akan membuat model dengan price sebagai target variabel dengan Floors sebagai variabel prediktor

model_house_clean_floors <- lm(formula = Prices ~ Floors , data = house_clean)
summary(model_house_clean_floors)
## 
## Call:
## lm(formula = Prices ~ Floors, data = house_clean)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -27211  -6986    -11   6592  28542 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 34557.66      19.00    1819   <2e-16 ***
## Floors      15003.39      26.89     558   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9507 on 499998 degrees of freedom
## Multiple R-squared:  0.3837, Adjusted R-squared:  0.3837 
## F-statistic: 3.113e+05 on 1 and 499998 DF,  p-value: < 2.2e-16

Berdasarkan summary model diatas, maka variabel Floors dapat menjelaskan variance pada variabel prices sebesar 38 % dan angka ini belum maksimal sehingga perlu ditambah variabel lainnya untuk menaikan nilai Adjusted R-squared , namun variabel floor cukup signifikan dalam menjelaskan variance pada variabel price karena nilai p value < 0.05.

Pada tahap berikutnya akan dilakukan prediksi harga rumah dengan variabel floors

floors_predict <- as.data.frame(predict(object = model_house_clean_floors, newdata = house_clean))

colnames(floors_predict) <- "prediksi dengan variabel floors"

head(floors_predict)
##   prediksi dengan variabel floors
## 1                        34557.66
## 2                        49561.05
## 3                        34557.66
## 4                        49561.05
## 5                        49561.05
## 6                        49561.05

Pada tabel diatas, dapat di interpretasikan di kolom pertama, rumah yang tidak bertingkat (floors = 0), diprediksikan dengan harga USD 34558, sementara rumah yang bertingkat (floors =1 ) memiliki prediksi harga USD 49561

Pada tahap berikutnya akan dibuat model regresi linear dengan menggunakan variabel prediktor

model_house_clean_all <- lm(formula = Prices ~ . , data = house_clean)
summary(model_house_clean_all)
## 
## Call:
## lm(formula = Prices ~ ., data = house_clean)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4671  -4377    -87   4373   4669 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.059e+04  2.707e+01   391.3   <2e-16 ***
## Area           2.512e+01  7.236e-02   347.1   <2e-16 ***
## Garage         1.497e+03  6.359e+00   235.4   <2e-16 ***
## FirePlace      7.528e+02  3.674e+00   204.9   <2e-16 ***
## Baths          1.258e+03  3.673e+00   342.4   <2e-16 ***
## Indian.Marble -9.502e+03  1.101e+01  -862.9   <2e-16 ***
## Floors         1.500e+04  1.039e+01  1443.8   <2e-16 ***
## City           3.499e+03  6.365e+00   549.7   <2e-16 ***
## Electric       1.255e+03  1.039e+01   120.8   <2e-16 ***
## Fiber          1.175e+04  1.039e+01  1130.6   <2e-16 ***
## Glass.Doors    4.448e+03  1.039e+01   428.1   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared:  0.908,  Adjusted R-squared:  0.908 
## F-statistic: 4.934e+05 on 10 and 499989 DF,  p-value: < 2.2e-16

Berdasarkan summary model diatas, maka semua variabel prediktor dapat menjelaskan variansi dari variabel price sebesar 90,08 % dan angka ini cukup baik. Selain itu semua variabel prediktor signifikan secara statistik dalam menjelaskan variansi pada variabel target price.

Selanjutnya dilakukan prediksi harga price dengan menggunakan semua variabel prediktor

pred_model_house_interval <- predict(
      object = model_house_clean_all,
      newdata = house_clean,
      interval = "prediction",
      level = 0.95
)

head(pred_model_house_interval)
##        fit      lwr      upr
## 1 48166.26 40966.42 55366.11
## 2 37670.29 30470.44 44870.14
## 3 45144.37 37944.53 52344.21
## 4 49959.03 42759.17 57158.89
## 5 47778.69 40578.84 54978.53
## 6 58923.15 51723.30 66122.99

Berdasarkan summary diatas dapat disimpulkan bahwa dengan confidence interval 95 %, untuk data di baris pertama, harga rumah di prediksi berada di range USD 40966 sampai USD 55366 dengan menggunakan semua variabel prediktor pada model model_house_clean_all

Feature Selection

Berikutnya dilakukan Step Wise Regression untuk memilih variabel yang akan dilakukan sebagai prediksi harga rumah dan juga sebagai bahan rekomendasi dalam model improvment dalam melakukan regresi.

Backward

Pada tahap pertama akan dilakukan feature selection dengan metode backward untuk mendapat nilai AIC terbaik dengan cara mengurangi variabel prediktor

model_house_backward <- step(object = model_house_clean_all, direction = "backward", trace = 0)
summary(model_house_backward)
## 
## Call:
## lm(formula = Prices ~ Area + Garage + FirePlace + Baths + Indian.Marble + 
##     Floors + City + Electric + Fiber + Glass.Doors, data = house_clean)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4671  -4377    -87   4373   4669 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.059e+04  2.707e+01   391.3   <2e-16 ***
## Area           2.512e+01  7.236e-02   347.1   <2e-16 ***
## Garage         1.497e+03  6.359e+00   235.4   <2e-16 ***
## FirePlace      7.528e+02  3.674e+00   204.9   <2e-16 ***
## Baths          1.258e+03  3.673e+00   342.4   <2e-16 ***
## Indian.Marble -9.502e+03  1.101e+01  -862.9   <2e-16 ***
## Floors         1.500e+04  1.039e+01  1443.8   <2e-16 ***
## City           3.499e+03  6.365e+00   549.7   <2e-16 ***
## Electric       1.255e+03  1.039e+01   120.8   <2e-16 ***
## Fiber          1.175e+04  1.039e+01  1130.6   <2e-16 ***
## Glass.Doors    4.448e+03  1.039e+01   428.1   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared:  0.908,  Adjusted R-squared:  0.908 
## F-statistic: 4.934e+05 on 10 and 499989 DF,  p-value: < 2.2e-16

Forward

Pada tahap pertama akan dilakukan feature selection dengan metode forward untuk mendapat nilai AIC terbaik dengan asumsi tidak ada variabel prediktor (regeresi dengan variabel target), kalu ditambahkan dengan variabel prediktor sampai mendapat AIC terbesar

#model tanpa prediktor
model_house_non <- lm(Prices ~ 1, house_clean)
# model forward
model_house_forward <- step(object = model_house_non, direction = "forward",scope = list(lower = model_house_non, upper = model_house_clean_all), trace = 0)

# Summary
summary(model_house_forward)
## 
## Call:
## lm(formula = Prices ~ Floors + Fiber + Indian.Marble + City + 
##     Glass.Doors + Area + Baths + Garage + FirePlace + Electric, 
##     data = house_clean)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4671  -4377    -87   4373   4669 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    1.059e+04  2.707e+01   391.3   <2e-16 ***
## Floors         1.500e+04  1.039e+01  1443.8   <2e-16 ***
## Fiber          1.175e+04  1.039e+01  1130.6   <2e-16 ***
## Indian.Marble -9.502e+03  1.101e+01  -862.9   <2e-16 ***
## City           3.499e+03  6.365e+00   549.7   <2e-16 ***
## Glass.Doors    4.448e+03  1.039e+01   428.1   <2e-16 ***
## Area           2.512e+01  7.236e-02   347.1   <2e-16 ***
## Baths          1.258e+03  3.673e+00   342.4   <2e-16 ***
## Garage         1.497e+03  6.359e+00   235.4   <2e-16 ***
## FirePlace      7.528e+02  3.674e+00   204.9   <2e-16 ***
## Electric       1.255e+03  1.039e+01   120.8   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared:  0.908,  Adjusted R-squared:  0.908 
## F-statistic: 4.934e+05 on 10 and 499989 DF,  p-value: < 2.2e-16

Setelah melakukan dua metode diatas , selanjutnya dapat dibandingkan antara multiple R Squared dan RMSE untuk menentukan model yang terbaik

summary(model_house_backward)$adj.r.squared
## [1] 0.9079901
summary(model_house_forward)$adj.r.squared
## [1] 0.9079901

R squared antara dua model sama di 94,4% dimana kedua model memiliki variabel prediktor yang mampu menjelaskan 94.4 % variance dari variabel price sementara 0,05 % dijelaskan oleh variabel lain diluar model ini.

prediksi_house_backward <- predict(model_house_backward, newdata = house_clean)
prediksi_house_forward <- predict(model_house_forward, newdata = house_clean)
library(MLmetrics)
## 
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
## 
##     Recall
RMSE(y_pred = prediksi_house_backward, y_true = house_clean$Prices)
## [1] 3673.375
RMSE(y_pred = prediksi_house_forward, y_true = house_clean$Prices)
## [1] 3673.375

Berdasarkan perhitungan diatas, dapat didapatkan insight kedua model memiliki RMSE dan R squared yang sama namun menghapus variabel swimming pool dan garden, jika dihubungkan dengan korelasi antar dua variabel prediktor tersebut ke variabel target maka kedua variabel tersebut tidak memiliki korelasi dengan price (corr = 0), sehingga model backward dan forward dapat dipilih antara keduanya

Selanjutnya adalah melakukan prediksi dengan model yang dipilih yaitu backward

house_clean$prediksi_backward <- prediksi_house_backward

head(house_clean)
##   Area Garage FirePlace Baths Indian.Marble Floors City Electric Fiber
## 1  164      2         0     2             0      0    3        1     1
## 2   84      2         0     4             1      1    2        0     0
## 3  190      2         4     4             0      0    2        0     1
## 4   75      2         4     4             1      1    1        1     1
## 5  148      1         4     2             0      1    2        0     0
## 6  124      3         3     3             0      1    1        0     1
##   Glass.Doors Prices prediksi_backward
## 1           1  43800          48166.26
## 2           1  37550          37670.29
## 3           0  49500          45144.37
## 4           1  50075          49959.03
## 5           1  52400          47778.69
## 6           1  54300          58923.15

##Model Evaluation

Normality of residuals

hist(model_house_backward$residuals)

shapiro.test(model_house_backward$residuals[0:"5000"])
## 
##  Shapiro-Wilk normality test
## 
## data:  model_house_backward$residuals[0:"5000"]
## W = 0.81338, p-value < 2.2e-16

Pada uji normalitas diatas dengan menggunakan Shapiro- Wilk, didapatkan p value yang lebih kecil dari 0,05 sehingga fail to reject to reject Ho sehingga error berdistribusi normal. berikut adalah hipotesis untuk uji normalitas

H0: residual berdistribusi normal

H1: residual tidak berdistribusi normal

Conclucion

1.Pada pembuatan model regresi untuk memprediksi harga rumah dengan atribut yanng ada,didapatkan multiple R squared sebesar 0,9048, dimana semua variabel prediktor dapat menjelaskan variance dari variabel prices sebesar 90,48 %

2.Semua variabel prediktor secara signifikan mempengaruhi variabel prices karena memiliki p value dibawah 0.05

3.Terdapat multicolinearity pada variabel White.Marble, Black Marble sehingga tidak sesuai asumsi dari linear regression sehingga perlu di take out dari model