Email             :
Instagram     : https://www.instagram.com/dsciencelabs
RPubs            : https://rpubs.com/dsciencelabs/
Github           : https://github.com/dsciencelabs/
Telegram       : @dsciencelabs
Department  : Business Statistics
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.




1 Latar Belakang

Tujuan dari project ini adalah untuk memprediksi penjualan rumah di King County, Washington, AS menggunakan metode regresi linear berganda. Dataset terdiri dari data historis rumah yang dijual antara Mei 2014 hingga Mei 2015.

2 Persiapan Data

2.1 Packages

Sebelum kita melangkah lebih jauh dalam proses pengolahan data, sejatinya pada saat anda ingin menggunakan R (atau bahasa pemrograman lainnya), diperlukan beberapa packages untuk memudahkan kita dalam bekerja. Berikut adalah beberapa package, source code (fungsi) g_regression.R dan pengaturan warna yang digunakan:

# install.packages("devtools")                # untuk menggunakan packages diluar R (developer)
# devtools::install_github("edwinth/paletti") # install packges paletti dari github
source("g_regression.R")                      # jangan lupa download dan save fungsi ini (link diatas)
library(tidyverse)
library(dplyr)
library(GGally)
library(lubridate)
library(paletti)
library(gridExtra)
library(grid)
library(MLmetrics)
library(car)
library(lmtest)
library(scales)
library(nortest)


# WARNA
mycolor = c(
  dark_blue="#003f5c", 
  light_blue="#2f4b7c", 
  light_purple ="#665191",
  dark_pink="#a05195", 
  light_pink="#d45087", 
  light_red="#f95d6a", 
  dark_orange="#ff6347",
  light_orange="#ff7c43",
  semi_orange="#e79658",
  orange="#dda15a",
  cream="#b59378",
  dark_cream="#A57F5F",
  choc="#85664B",
  dark_choc="#6b5340"
)

mycolorfill = c(
  
  light_blue="#2f4b7c", 
  light_purple ="#665191",
  dark_pink="#a05195", 
  light_pink="#d45087", 
  light_red="#f95d6a", 
  dark_orange="#ff6347",
  
  semi_orange="#e79658",
  orange="#dda15a",
  cream="#b59378",
  dark_cream="#A57F5F",
  choc="#85664B",
  dark_choc="#6b5340",
  light_orange="#ff7c43"
)

mycolor_fill  <- get_scale_fill(get_pal(mycolorfill))
mycolor_color <- get_scale_color(get_pal(mycolor))
mycolor_hex <- get_hex(mycolor)

2.2 Import Data

Data yang digunakan dalam projek adalah KC_Housesales_Data, silahkan untuk download dan membaca sekilas mengenai latar belakang data tersebut sebelum memulai melakukan analisa.

house <- read.csv("data_input/kc_house_data.csv")
dim(house)
## [1] 21597    21
names(house)
##  [1] "id"            "date"          "price"         "bedrooms"     
##  [5] "bathrooms"     "sqft_living"   "sqft_lot"      "floors"       
##  [9] "waterfront"    "view"          "condition"     "grade"        
## [13] "sqft_above"    "sqft_basement" "yr_built"      "yr_renovated" 
## [17] "zipcode"       "lat"           "long"          "sqft_living15"
## [21] "sqft_lot15"

Berdasarkan data diatas, dataset yang digunakan memiliki 21597 observasi dan 21 variabel. Selain itu, Struktur data yang kita miliki sudah sesuai dengan kebutuhan.

2.3 Periksa Struktur Data

# str(house)
rmarkdown::paged_table(house)

2.4 Eliminasi Variabel

Dari struktur data diatas terdapat data id dan date. Variabel id tidak memberi informasi yang cukup penting untuk melakukan analisa regresi linear. Sehingga dapat variable ini diremove. Perlu dicatat bahwa dalam projek ini kita tidak mempertimbangkan tahun penjualan karena data diambil dari Mei 2014 hingga Mei 2015 sehingga perubahan wakti yang terjadi tidak signifikan mempengaruhi harga jual perumahan tersebut.

house <- house %>% 
  select(-id,-date) 

2.5 Deskrpisi Variabel

Berikut ini dilampirkan beberapa penjelasan singkat mengenai variabel yang digunakan dalam projek ini. Pada data yang hanya bernilai 1 dan 0 menandakan 1 = “Iya” dan 0 = “Tidak”

Area Area rumah
Garage Jumlah Garasi
FirePlace Jumlah Perapin
Baths Jumlah Kamar Mandi
White.Marble Apakah menggunkan keramik “White Marble”
Black.Marble Apakah menggunakan keramik “Black Marble”
Floors Apakah lantai sudah diflooring
City Lokasi Kota dari rumah
Solar Apakah terdapat tenaga surya
Electric Apakah terdapat listrik
Fiber Apakah menggunakan Fiber
Glass.Doors Apakah menggunakan pintu kaca
Swiming.Pool Apakah terdapat kolam renang
Garden Apakah terdapat taman
Prices Harga rumah. variabel yang akan diprediksi dalam analisis ini.


2.6 Periksa Data Hilang

Dalam setiap proses pengolahan data, sering sekali kita melakukan pemeriksaan data yang hilang (missing values) sebelum melakukan proses analisa. Secara sederhana anda dapat melakukan pemerikasaan dengan R, sebagai berikut:

colSums(is.na(house))
##         price      bedrooms     bathrooms   sqft_living      sqft_lot 
##             0             0             0             0             0 
##        floors    waterfront          view     condition         grade 
##             0             0             0             0             0 
##    sqft_above sqft_basement      yr_built  yr_renovated       zipcode 
##             0             0             0             0             0 
##           lat          long sqft_living15    sqft_lot15 
##             0             0             0             0

Anda beruntung, karena ternyata tidak ditemukan missing value pada dataset ini.

2.7 Ringkasan Data

summary(house)  
##      price            bedrooms        bathrooms      sqft_living   
##  Min.   :  78000   Min.   : 1.000   Min.   :0.500   Min.   :  370  
##  1st Qu.: 322000   1st Qu.: 3.000   1st Qu.:1.750   1st Qu.: 1430  
##  Median : 450000   Median : 3.000   Median :2.250   Median : 1910  
##  Mean   : 540297   Mean   : 3.373   Mean   :2.116   Mean   : 2080  
##  3rd Qu.: 645000   3rd Qu.: 4.000   3rd Qu.:2.500   3rd Qu.: 2550  
##  Max.   :7700000   Max.   :33.000   Max.   :8.000   Max.   :13540  
##     sqft_lot           floors        waterfront            view       
##  Min.   :    520   Min.   :1.000   Min.   :0.000000   Min.   :0.0000  
##  1st Qu.:   5040   1st Qu.:1.000   1st Qu.:0.000000   1st Qu.:0.0000  
##  Median :   7618   Median :1.500   Median :0.000000   Median :0.0000  
##  Mean   :  15099   Mean   :1.494   Mean   :0.007547   Mean   :0.2343  
##  3rd Qu.:  10685   3rd Qu.:2.000   3rd Qu.:0.000000   3rd Qu.:0.0000  
##  Max.   :1651359   Max.   :3.500   Max.   :1.000000   Max.   :4.0000  
##    condition        grade          sqft_above   sqft_basement       yr_built   
##  Min.   :1.00   Min.   : 3.000   Min.   : 370   Min.   :   0.0   Min.   :1900  
##  1st Qu.:3.00   1st Qu.: 7.000   1st Qu.:1190   1st Qu.:   0.0   1st Qu.:1951  
##  Median :3.00   Median : 7.000   Median :1560   Median :   0.0   Median :1975  
##  Mean   :3.41   Mean   : 7.658   Mean   :1789   Mean   : 291.7   Mean   :1971  
##  3rd Qu.:4.00   3rd Qu.: 8.000   3rd Qu.:2210   3rd Qu.: 560.0   3rd Qu.:1997  
##  Max.   :5.00   Max.   :13.000   Max.   :9410   Max.   :4820.0   Max.   :2015  
##   yr_renovated        zipcode           lat             long       
##  Min.   :   0.00   Min.   :98001   Min.   :47.16   Min.   :-122.5  
##  1st Qu.:   0.00   1st Qu.:98033   1st Qu.:47.47   1st Qu.:-122.3  
##  Median :   0.00   Median :98065   Median :47.57   Median :-122.2  
##  Mean   :  84.46   Mean   :98078   Mean   :47.56   Mean   :-122.2  
##  3rd Qu.:   0.00   3rd Qu.:98118   3rd Qu.:47.68   3rd Qu.:-122.1  
##  Max.   :2015.00   Max.   :98199   Max.   :47.78   Max.   :-121.3  
##  sqft_living15    sqft_lot15    
##  Min.   : 399   Min.   :   651  
##  1st Qu.:1490   1st Qu.:  5100  
##  Median :1840   Median :  7620  
##  Mean   :1987   Mean   : 12758  
##  3rd Qu.:2360   3rd Qu.: 10083  
##  Max.   :6210   Max.   :871200

3 Exploratory Data Analysis (EDA)

Karena fokus pada projek ini adalah melakukan prediksi dengan Regresi Linear berganda, perlu dilakukan analisa korelasi untuk setiap variabel yang ada.

3.1 Matriks Korelasi

ggcorr(house,label = T, size=3, label_size = 3, hjust=0.95)+
  labs(
    title="Matriks Korelasi Data set"
  )+
  theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title=element_text(size=8,face="bold"), 
    axis.text.y=element_blank()
  )

Berdasarkan matriks korelasi dari data input diatas, setiap variabel mempunyai pengaruh terhadap Price kecuali condition dan longitude. Kemudian variabel yang memiliki korelasi paling tinggi dengan Price adalah sqft_living dan grade.

3.2 Pencilan Harga Rumah

# length(boxplot(house$price)$out)
#house <- house %>% filter(!Prices %in% bx.plot.outlier)

ggplot(house, aes(x=price)) + 
 geom_histogram(aes(y=..density..), colour="black", fill="white")+
 geom_density(alpha=.2, fill="blue")+
  labs(title="Distribusi Harga Tanpa Outlier")+
  theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title=element_text(size=9,face="bold"), 
    axis.text.y=element_text(margin = margin(l=5)),
    axis.text.x.bottom = element_text(margin = margin(b=5))
  )+
  mycolor_fill()

Jika dilihat terdapat cukup banyak data yang memiliki harga yang jauh lebih tinggi dari data lainnya sehingga menyebabkan distribusi penyebaran harga rumah tidak normal. Sehinga saya memutuskan untuk membuang data dengan harga yang lebih dari USD 200 juta karena jika dilihat dari chart distribusi diatas untuk data yang memiliki harga diatas USD 200 juta sangat sedikit. berikut hasilnya:

house_clean <- house %>% 
  filter(price < 2000000)

ggplot(house_clean, aes(x=price)) + 
 geom_histogram(aes(y=..density..), colour="black", fill="white",binwidth = 50000)+
 geom_density(alpha=.2, fill="blue")+
   scale_x_continuous(name = "Harga",
                     labels = dollar)+
  labs(title="Distribusi Harga <Rp 200 Jutaan")+
  theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title=element_text(size=9,face="bold"), 
    axis.text.y=element_text(margin = margin(l=5)),
    axis.text.x.bottom = element_text(margin = margin(b=5))
  )+
  mycolor_fill()

4 Pemisahan Data

Untuk membangun model regresi lineat ini saya membagi data train:test dengan proporsi 80:20. Proporsi ini yang sudah sering digunakan dalam proses pemodelan machine learning.

# Train vs Test
set.seed(999)
idx_house <- sample(x=nrow(house_clean),size=nrow(house)*0.8)

house_train <- house_clean[idx_house,]
house_test <- house_clean[-idx_house,]

5 Pemodelan: Regresi Liniear

Modelling menggunakan metode regresi Linear ini dilakukan untuk memprediksi harga dari suatu rumah (Prices).

5.1 Prediktor Tunggal

Berdasarkan matriks korelasi sebelumnya, variabel sqft_living dan grade memiliki korelasi paling kuat dengan variabel Price. Mari kita coba:

Linear Regression with single predictor: sqft_living

lm_house_single_living <- lm(price~sqft_living,house_train)
summary(lm_house_single_living)
## 
## Call:
## lm(formula = price ~ sqft_living, data = house_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -942298 -137786  -21916  100326 1328560 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 55373.200   4130.460   13.41   <2e-16 ***
## sqft_living   225.525      1.855  121.57   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 209600 on 17275 degrees of freedom
## Multiple R-squared:  0.4611, Adjusted R-squared:  0.461 
## F-statistic: 1.478e+04 on 1 and 17275 DF,  p-value: < 2.2e-16

Jika dilihat berdasarkan P-Value variabel sqft_living sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%

Linear Regression with single predictor: grade

lm_house_single_grade <- lm(price~grade,house_train)
summary(lm_house_single_grade)
## 
## Call:
## lm(formula = price ~ grade, data = house_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -546914 -136914  -29518   95430 1407982 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -797566      10846  -73.54   <2e-16 ***
## grade         172448       1406  122.68   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 208700 on 17275 degrees of freedom
## Multiple R-squared:  0.4656, Adjusted R-squared:  0.4655 
## F-statistic: 1.505e+04 on 1 and 17275 DF,  p-value: < 2.2e-16

Jika dilihat berdasarkan P-Value variabel grade sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%.

Kesimpulan: Model Linear Regression menggunakan single predictor tidak cocok diterapkan untuk menentukan harga rumah pada dataset ini.

5.2 Prediktor Ganda

# Multiple Linear Regression
lm_house_all <- lm(price~., data=house_train)
summary(lm_house_all)
## 
## Call:
## lm(formula = price ~ ., data = house_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -813087  -86700  -10908   67846 1013081 
## 
## Coefficients: (1 not defined because of singularities)
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -1.037e+06  2.484e+06  -0.417   0.6764    
## bedrooms      -1.674e+04  1.628e+03 -10.279  < 2e-16 ***
## bathrooms      2.844e+04  2.801e+03  10.153  < 2e-16 ***
## sqft_living    1.001e+02  3.853e+00  25.991  < 2e-16 ***
## sqft_lot       2.149e-01  4.397e-02   4.886 1.04e-06 ***
## floors         2.977e+04  3.079e+03   9.668  < 2e-16 ***
## waterfront     2.710e+05  1.700e+04  15.944  < 2e-16 ***
## view           4.609e+04  1.852e+03  24.889  < 2e-16 ***
## condition      2.836e+04  2.006e+03  14.140  < 2e-16 ***
## grade          9.261e+04  1.859e+03  49.824  < 2e-16 ***
## sqft_above     7.832e+00  3.773e+00   2.076   0.0379 *  
## sqft_basement         NA         NA      NA       NA    
## yr_built      -2.169e+03  6.214e+01 -34.899  < 2e-16 ***
## yr_renovated   2.104e+01  3.154e+00   6.671 2.62e-11 ***
## zipcode       -4.105e+02  2.807e+01 -14.623  < 2e-16 ***
## lat            5.850e+05  9.132e+03  64.059  < 2e-16 ***
## long          -1.399e+05  1.116e+04 -12.532  < 2e-16 ***
## sqft_living15  4.428e+01  3.006e+00  14.733  < 2e-16 ***
## sqft_lot15    -2.794e-01  6.398e-02  -4.367 1.27e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 152900 on 17259 degrees of freedom
## Multiple R-squared:  0.7135, Adjusted R-squared:  0.7132 
## F-statistic:  2528 on 17 and 17259 DF,  p-value: < 2.2e-16

Hasil summary dari model lm_house_all memberikan banyak informasi. nilai Estimate menginterpretasikan nilai setiap koefisien, misalnya apabila rumah memiliki waterfront maka akan berkontribusi pada kenaikan harga rumah sebesar USD 276282.06. Tapi kalau dilihat yang aneh pada variabel bedrooms, jika jumlah kamar bertambah 1 maka harga rumah berkuran sebesar USD -15545.64, apakah didaerah sana orang gak suka kamar banyak? :)

Mari melihat nilai dari Pr(>|t|), nilai ini menunjukan seberapa besar suatu variabel berpengaruh untuk memprediksi Prices. jika nilainya Pr(>|t|) dibawah 0.05 maka dapat diasumsikan bahwa variabel memiliki pengaruh signifikan dan sebaliknya. Berdasarkan summary model diatas, variabel sqft_above dan sqft_basement memilki nilai P Value > 0.05 bahkan NA Value, sehingga variabel ini dapat di exclude dari prediktor. Namun saya masih kurang mengerti untuk mendektsi singularitas pada variabel sqft_basement, next saya update terkait ini.

Selain itu, jika dilihat nilai Adjusted R-squared:0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, tapi coba kita selesaikan.

5.3 Metode Bertahap (Stepwise Method)

step_backward <- step(lm_house_all,direction = "backward")
## Start:  AIC=412506.2
## price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + 
##     waterfront + view + condition + grade + sqft_above + sqft_basement + 
##     yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + 
##     sqft_lot15
## 
## 
## Step:  AIC=412506.2
## price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + 
##     waterfront + view + condition + grade + sqft_above + yr_built + 
##     yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15
## 
##                 Df  Sum of Sq        RSS    AIC
## <none>                        4.0345e+14 412506
## - sqft_above     1 1.0074e+11 4.0355e+14 412509
## - sqft_lot15     1 4.4581e+11 4.0390e+14 412523
## - sqft_lot       1 5.5806e+11 4.0401e+14 412528
## - yr_renovated   1 1.0403e+12 4.0449e+14 412549
## - floors         1 2.1850e+12 4.0564e+14 412598
## - bathrooms      1 2.4097e+12 4.0586e+14 412607
## - bedrooms       1 2.4700e+12 4.0592e+14 412610
## - long           1 3.6716e+12 4.0712e+14 412661
## - condition      1 4.6737e+12 4.0813e+14 412703
## - zipcode        1 4.9988e+12 4.0845e+14 412717
## - sqft_living15  1 5.0742e+12 4.0853e+14 412720
## - waterfront     1 5.9429e+12 4.0940e+14 412757
## - view           1 1.4481e+13 4.1793e+14 413114
## - sqft_living    1 1.5791e+13 4.1924e+14 413168
## - yr_built       1 2.8472e+13 4.3193e+14 413682
## - grade          1 5.8031e+13 4.6148e+14 414826
## - lat            1 9.5927e+13 4.9938e+14 416190
summary(step_backward)
## 
## Call:
## lm(formula = price ~ bedrooms + bathrooms + sqft_living + sqft_lot + 
##     floors + waterfront + view + condition + grade + sqft_above + 
##     yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + 
##     sqft_lot15, data = house_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -813087  -86700  -10908   67846 1013081 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -1.037e+06  2.484e+06  -0.417   0.6764    
## bedrooms      -1.674e+04  1.628e+03 -10.279  < 2e-16 ***
## bathrooms      2.844e+04  2.801e+03  10.153  < 2e-16 ***
## sqft_living    1.001e+02  3.853e+00  25.991  < 2e-16 ***
## sqft_lot       2.149e-01  4.397e-02   4.886 1.04e-06 ***
## floors         2.977e+04  3.079e+03   9.668  < 2e-16 ***
## waterfront     2.710e+05  1.700e+04  15.944  < 2e-16 ***
## view           4.609e+04  1.852e+03  24.889  < 2e-16 ***
## condition      2.836e+04  2.006e+03  14.140  < 2e-16 ***
## grade          9.261e+04  1.859e+03  49.824  < 2e-16 ***
## sqft_above     7.832e+00  3.773e+00   2.076   0.0379 *  
## yr_built      -2.169e+03  6.214e+01 -34.899  < 2e-16 ***
## yr_renovated   2.104e+01  3.154e+00   6.671 2.62e-11 ***
## zipcode       -4.105e+02  2.807e+01 -14.623  < 2e-16 ***
## lat            5.850e+05  9.132e+03  64.059  < 2e-16 ***
## long          -1.399e+05  1.116e+04 -12.532  < 2e-16 ***
## sqft_living15  4.428e+01  3.006e+00  14.733  < 2e-16 ***
## sqft_lot15    -2.794e-01  6.398e-02  -4.367 1.27e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 152900 on 17259 degrees of freedom
## Multiple R-squared:  0.7135, Adjusted R-squared:  0.7132 
## F-statistic:  2528 on 17 and 17259 DF,  p-value: < 2.2e-16

Metode Stepwise akan menyeleksi variabel-variabel yang memilki pengaruh signifikan terhadap prediktor. Lihat bagian Step: AIC=360919.5, semakin kecil nilai AIC, maka semakin disarankan variabel prediktor yang dipilih dan nilai AIC paling kecil berada dibagian paling bawah tampilan. Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:

6 Evaluasi Model

Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:

Formula:
lm(price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + waterfront + view + condition + grade + sqft_above + yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15, data=house_train)

lm_house_model <- lm(price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + waterfront + view + condition + grade + sqft_above + yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15, data=house_train)

6.1 Akurasi Vs Error

Cara evaluasi model di kasus regresi dapat menggunakan beberapa matriks penilaian, antara lain:

  • Akurasi: Model yang dibuat menggunakan multiple predictor sehingga nilai yang baik diinterpretasikan adalah nilai Adjusted R-squared. Dari hasi diatas, model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, akan dicoba lagi menggunakan metode lain dikesempatan berikutnya.

  • Error: Dalam hal ini anda dapat melakukan pemeriksaan error dengan beberapa parameter berikut:

    • Mean Absolute Error (MAE): Paling mudah untuk di interpretasikan karena dibandingkan dengan satuan data aktual.
    • Mean Absolute Percentage Error (MAPE): Punya interval berapa persentasi kesalahan model yang telah dibangun (0 sd 100%). Namun MAPE terdapat batasan, apabila pada data aktual memiliki nilai 0, MAPE akan inf.
    • Root Mean Square Error (RMSE): Baik digunakan untuk data2 yang nilai fluktuatif.

Berikut pengujian error model ini:

MAE <-   MAE(y_pred = predict(lm_house_all,house_test),
             y_true =  house_test$price)

MAPE <- MAPE(y_pred = predict(lm_house_all,house_test),
             y_true =  house_test$price)

RMSE <- RMSE(y_pred = predict(lm_house_all,house_test),
             y_true =  house_test$price)

data.frame("MAE"=MAE,"MAPE"=MAPE, "RMSE"=RMSE)

Hasil pengujian error menggunakan 3 metode diatas menunjukan nilainya tidak begitu baik, dimana semakin kecil nilai error maka semakin baik model yang dibuat. Jika berdasarkan nilai MAE, maka model ini memiliki error kurang lebih sekitar USD 106.946.

6.2 Pemeriksaan Asumsi

6.2.1 Linearitas

linearity <- data.frame(residual = lm_house_model$residuals, fitted = house_train$price)
linearity %>% 
  ggplot(aes(fitted, residual)) + 
  geom_point() + 
  geom_smooth(method = lm) + 
  geom_hline(aes(yintercept = 0)) + 
     theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title=element_text(size=9,face="bold"), 
    axis.text.y=element_text(margin = margin(l=5)),
    axis.text.x.bottom = element_text(margin = margin(b=5)))+
  mycolor_color()

Berdasarkan pengujian linearity terlihat bahwa model yang dibuat belum berhasil menangkap variansi data dengan baik, terlihat error atau jarak data dari mean cukup jauh.

6.2.2 Normalitas Residual

hist(lm_house_model$residuals)

#shapiro test
shapiro.test(lm_house_model$residuals[0:5000])
## 
##  Shapiro-Wilk normality test
## 
## data:  lm_house_model$residuals[0:5000]
## W = 0.91379, p-value < 2.2e-16
# Anderson-Darling normality test
nortest::ad.test(lm_house_model$residuals)
## 
##  Anderson-Darling normality test
## 
## data:  lm_house_model$residuals
## A = 247, p-value < 2.2e-16

Hipotesis:
- H0: Residual berdistribusi normal
- H1: Residual tidak berdistribusi normal

Kesimpulan Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model tidak berdistribusi normal.


6.2.3 Heteroskedastisitas

lmtest::bptest(lm_house_model)
## 
##  studentized Breusch-Pagan test
## 
## data:  lm_house_model
## BP = 2201.1, df = 17, p-value < 2.2e-16
linearity <- data.frame(residual = lm_house_model$residuals, fitted = house_train$price)
linearity %>% 
  ggplot(aes(fitted, residual)) + 
  geom_point() + 
  geom_smooth(method = "h") + 
  geom_hline(aes(yintercept = 0)) + 
     theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title=element_text(size=9,face="bold"), 
    axis.text.y=element_text(margin = margin(l=5)),
    axis.text.x.bottom = element_text(margin = margin(b=5)))+
  mycolor_color()

Hipotesis:

- H0: Data residual Homogen (tidak membentuk sebuah pola)
- H1: Data residual heteros (membentuk sebuah pola)

Kesimpulan
Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model bersifat heteros, dapat dilihat membentuk sebuah pola.

6.2.4 Multikolinieritas

Tidak terdapat Multicollinearity dari variabel yang digunakan pada model.

car::vif(lm_house_model)
##      bedrooms     bathrooms   sqft_living      sqft_lot        floors 
##      1.657668      3.224391      8.106072      2.156462      2.030586 
##    waterfront          view     condition         grade    sqft_above 
##      1.155342      1.355967      1.252260      3.258268      6.588403 
##      yr_built  yr_renovated       zipcode           lat          long 
##      2.449603      1.143842      1.668631      1.190396      1.840048 
## sqft_living15    sqft_lot15 
##      2.958889      2.177417

7 Prediksi: Data Testing

Berikut data hasil prediksi Price terhadap data test.
price : Harga asli
predict.fit : hasil prediksi fit value
predict.lower : hasil prediksi prekiraan harga terendah
predict.upper : hasil prediksi perkiraan harga tertinggi

predict_price <-  predict(
  lm_house_model,
  house_test,
  interval = "confidence",
  level = 0.95
)

house_predict <- cbind(house_test,predict_price)

house_predict %>% 
  select(
  price, predict.fit=fit, predict.lower=lwr, predict.upper=upr, bedrooms, bathrooms, sqft_living, sqft_lot, floors, waterfront, view, condition, grade, sqft_above, yr_built, yr_renovated, zipcode, lat, long, sqft_living15, sqft_lot15)

8 Kesimpulan

Model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Kemudian Hasil pengujian error menggunakan metode MAE menunjukan error kurang lebih sekitar USD 106.946. Pada pengujian asumsi, model ini hanya berhasil melewati pengujian Multicollinearity sedangkan pada gagal dalam pengujian Linearity, Normality dan Heteroscedasticity. Kesimpulannya, model ini masih kurang baik jika hendak digunakan untuk memprediksi harga rumah terkait dataset ini. Saya akan coba melakukan tunning atau menggunakan metode lainnya di kesempatan selanjutnya.