Chennai Housing Sales Price

Pengantar

Latar Belakang

Sebagian orang mungkin kesulitan menentukan harga jual propertinya. Jika memberikan harga yang tinggi takut tidak laku, sebaliknya jika memberi harga yang rendah takut rugi. Hal ini terjadi karena banyak faktor yang mempengaruhi harga jual sebuah properti. Oleh karena itu kita dapat membuat sebuah model Linear Regression untuk menjawab permasalahan ini.

Kita akan menggunakan dataset Chennai Housing Sales Price untuk mengetahui harga jual sebuah properti atau dalam kasus ini adalah rumah. Kita akan membuat beberapa model dan akan mengevaluasinya. Kita akan memilih model terbaik yang akan kita gunakan untuk memprediksi harga jual sebuah rumah.

Tentang Dataset

Dataset Chennai Housing Sales Price terdiri dari 7.109 baris dan 22 kolom yang terdiri dari.

PRT_ID: Nomor ID rumah
AREA: Lokasi rumah
INT_SQFT: Luas rumah
DATE_SALE: Tanggal rumah terjual
DIST_MAINROAD: Jarak rumah ke jalan utama
N_BEDROOM: Jumlah kamar tidur
N_BATHROOM: Jumlah kamar mandi
N_ROOM: Jumlah ruangan
SALE_COND: Kondisi penjualan
PARK_FACIL: Fasilitas parkir
DATE_BUILD: Tanggal rumah dibangun
BUILDTYPE: Tipe bangunan
UTILITY_AVAIL: Fasilitas sekitar
STREET: Material jalan depan rumah
MZZONE: Zona rumah
REG_FEE: Biaya registrasi setelah penjualan
COMMIS: Biaya komisi setelah penjualan
SALES_PRICE: Harga rumah

Set Up

Sebelum melakukan data wrangling kita perlu untuk memanggil library yang dibutuhkan.

library(tidyverse)
library(GGally)
library(reactable)
library(MLmetrics)
library(lmtest)
library(car)

Data Wrangling

Yang pertama kita lakukan adalah menginput dataset Chennai Housing Sales Price dan menyimpannya ke dalam variabel housing. Kita juga menggunakan stringsAsFactors = T untuk mengubah tipe data character menjadi factor.

housing <- read.csv("Chennai houseing sale.csv",
                    stringsAsFactors = T)

reactable(housing)

Setelah itu kita melakukan glimpse() untuk melihat apakah tipe data sudah sesuai.

glimpse(housing)
## Rows: 7,109
## Columns: 22
## $ PRT_ID        <fct> P03210, P09411, P01812, P05346, P06210, P00219, P09105, …
## $ AREA          <fct> Karapakkam, Anna Nagar, Adyar, Velachery, Karapakkam, Ch…
## $ INT_SQFT      <int> 1004, 1986, 909, 1855, 1226, 1220, 1167, 1847, 771, 1635…
## $ DATE_SALE     <fct> 04-05-2011, 19-12-2006, 04-02-2012, 13-03-2010, 05-10-20…
## $ DIST_MAINROAD <int> 131, 26, 70, 14, 84, 36, 137, 176, 175, 74, 78, 143, 137…
## $ N_BEDROOM     <int> 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 2, 1, 1, 1, 3, 3, 2, 1, 1,…
## $ N_BATHROOM    <int> 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1,…
## $ N_ROOM        <int> 3, 5, 3, 5, 3, 4, 3, 5, 2, 4, 4, 3, 3, 3, 5, 5, 4, 2, 3,…
## $ SALE_COND     <fct> AbNormal, AbNormal, AbNormal, Family, AbNormal, Partial,…
## $ PARK_FACIL    <fct> Yes, No, Yes, No, Yes, No, No, No, No, No, Yes, No, No, …
## $ DATE_BUILD    <fct> 15-05-1967, 22-12-1995, 09-02-1992, 18-03-1988, 13-10-19…
## $ BUILDTYPE     <fct> Commercial, Commercial, Commercial, Others, Others, Comm…
## $ UTILITY_AVAIL <fct> AllPub, AllPub, ELO, NoSewr , AllPub, NoSeWa, AllPub, Al…
## $ STREET        <fct> Paved, Gravel, Gravel, Paved, Gravel, No Access, No Acce…
## $ MZZONE        <fct> A, RH, RL, I, C, RH, RL, RM, RM, I, RM, RM, RL, RH, RM, …
## $ QS_ROOMS      <dbl> 4.0, 4.9, 4.1, 4.7, 3.0, 4.5, 3.6, 2.4, 2.9, 3.1, 4.0, 2…
## $ QS_BATHROOM   <dbl> 3.9, 4.2, 3.8, 3.9, 2.5, 2.6, 2.1, 4.5, 3.7, 3.1, 3.2, 3…
## $ QS_BEDROOM    <dbl> 4.9, 2.5, 2.2, 3.6, 4.1, 3.1, 2.5, 2.1, 4.0, 3.3, 4.5, 3…
## $ QS_OVERALL    <dbl> 4.330, 3.765, 3.090, 4.010, 3.290, 3.320, 2.670, 3.260, …
## $ REG_FEE       <int> 380000, 760122, 421094, 356321, 237000, 409027, 263152, …
## $ COMMIS        <int> 144400, 304049, 92114, 77042, 74063, 198316, 33955, 2352…
## $ SALES_PRICE   <int> 7600000, 21717770, 13159200, 9630290, 7406250, 12394750,…

Kolom QS_ROOMS, QS_BATHROOM, QS_BEDROOM, QS_OVERALL akan kita buang karena memiliki informasi yang sama dengan variabel lainnya.

housing <- 
      housing %>% 
      select(-c(PRT_ID, DATE_SALE, DATE_BUILD, QS_ROOMS, QS_BATHROOM, QS_BEDROOM, QS_OVERALL)) %>% 
      head(150) %>% 
      filter(!N_BATHROOM %in% NA)

Langkah selanjutnya melihat apakah terdapat missing value dengan menggunakan anyNA().

anyNA(housing)
## [1] FALSE

Tidak terdapat missing value pada dataset.

Exploratory Data Analysis

Yang pertama kita lakukan dalam proses Exploratory Data Analysis adalah summary(). Kita dapat melihat persebaran data antar variabel dan karakteristik dataset yang kita punya.

summary(housing)
##          AREA       INT_SQFT    DIST_MAINROAD      N_BEDROOM    
##  Karapakkam:30   Min.   : 507   Min.   :  0.00   Min.   :1.000  
##  Chrompet  :29   1st Qu.:1021   1st Qu.: 49.00   1st Qu.:1.000  
##  Adyar     :24   Median :1401   Median : 96.00   Median :1.000  
##  KK Nagar  :19   Mean   :1381   Mean   : 94.39   Mean   :1.577  
##  Velachery :17   3rd Qu.:1709   3rd Qu.:137.00   3rd Qu.:2.000  
##  Anna Nagar:15   Max.   :2492   Max.   :200.00   Max.   :4.000  
##  (Other)   :15                                                  
##    N_BATHROOM        N_ROOM            SALE_COND  PARK_FACIL      BUILDTYPE 
##  Min.   :1.000   Min.   :2.000   Family     :34   No :77     Comercial : 0  
##  1st Qu.:1.000   1st Qu.:3.000   AdjLand    :30   Noo: 0     Commercial:48  
##  Median :1.000   Median :4.000   AbNormal   :29   Yes:72     House     :45  
##  Mean   :1.208   Mean   :3.658   Partial    :29              Other     : 2  
##  3rd Qu.:1.000   3rd Qu.:4.000   Normal Sale:26              Others    :54  
##  Max.   :2.000   Max.   :6.000   Ab Normal  : 1                             
##                                  (Other)    : 0                             
##  UTILITY_AVAIL       STREET   MZZONE     REG_FEE           COMMIS      
##  All Pub: 0    Gravel   :62   A :12   Min.   :154109   Min.   :  6190  
##  AllPub :36    No Access:40   C :14   1st Qu.:277702   1st Qu.: 74464  
##  ELO    :39    NoAccess : 0   I :11   Median :352830   Median :123638  
##  NoSeWa :34    Pavd     : 1   RH:40   Mean   :376733   Mean   :135805  
##  NoSewr :40    Paved    :46   RL:34   3rd Qu.:438477   3rd Qu.:193397  
##                               RM:38   Max.   :917550   Max.   :313674  
##                                                                        
##   SALES_PRICE      
##  Min.   : 3572250  
##  1st Qu.: 8488790  
##  Median :10346400  
##  Mean   :10945076  
##  3rd Qu.:13063450  
##  Max.   :23307000  
## 

Kita menggunakan ggcorr() untuk melihat korelasi antar variabel.

ggcorr(housing, label = T, hjust = 1, layout.exp = 2)

Dari gambar di atas kita dapat melihat REG_FEE memiliki nilai korelasi paling tinggi dengan variabel SALES_PRICE yaitu 0,9. Sedangkan variabel yang memiliki korelasi paling rendah dengan SALES_PRICE adalah N_BATHROOM dan DIST_MAINROAD sebesar 0,1.

Modeling

Kita akan membuat model untuk menjawab kasus di atas. Kita akan menjadikan kolom SALES_PRICE sebagai target.

Model 1

Berdasarkan Exploratory Data Analysis yang telah kita lakukan kolom REG_FEE memiliki korelasi signifikan terhadap SALES_PRICE. Sedangkan variabel kategorik lainnya kita masukkan sebagai prediktor kecuali STREET. Dalam kasus ini kita menganggap kolom STREET tidak terlalu memiliki korelasi signifikan terhadap SALES_PRICE.

model_1 <- lm(SALES_PRICE ~ REG_FEE + AREA + SALE_COND + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE, 
              housing)

summary(model_1)
## 
## Call:
## lm(formula = SALES_PRICE ~ REG_FEE + AREA + SALE_COND + BUILDTYPE + 
##     UTILITY_AVAIL + PARK_FACIL + MZZONE, data = housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2597554  -669925        0   682730  2076580 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           5.523e+06  1.479e+06   3.736 0.000285 ***
## REG_FEE               1.198e+01  1.230e+00   9.742  < 2e-16 ***
## AREAAnna Nagar        3.895e+06  4.194e+05   9.288 7.09e-16 ***
## AREAChrompet          5.433e+05  3.338e+05   1.628 0.106164    
## AREAKarapakkam       -9.061e+05  2.977e+05  -3.044 0.002858 ** 
## AREAKK Nagar          7.099e+05  4.071e+05   1.744 0.083709 .  
## AREAT Nagar           3.841e+06  4.053e+05   9.478 2.47e-16 ***
## AREATNagar            3.295e+06  1.130e+06   2.917 0.004205 ** 
## AREAVelachery         9.913e+05  3.641e+05   2.723 0.007410 ** 
## SALE_CONDAbNormal     5.429e+05  1.205e+06   0.451 0.653069    
## SALE_CONDAdjLand      6.588e+05  1.213e+06   0.543 0.587881    
## SALE_CONDFamily       3.840e+05  1.185e+06   0.324 0.746369    
## SALE_CONDNormal Sale  6.666e+05  1.208e+06   0.552 0.582218    
## SALE_CONDPartial      8.152e+04  1.212e+06   0.067 0.946499    
## BUILDTYPEHouse       -2.961e+06  2.998e+05  -9.876  < 2e-16 ***
## BUILDTYPEOther       -2.616e+06  8.192e+05  -3.193 0.001786 ** 
## BUILDTYPEOthers      -2.276e+06  2.699e+05  -8.435 7.54e-14 ***
## UTILITY_AVAILELO     -9.706e+04  2.651e+05  -0.366 0.714946    
## UTILITY_AVAILNoSeWa   1.115e+05  2.656e+05   0.420 0.675475    
## UTILITY_AVAILNoSewr   9.242e+04  2.520e+05   0.367 0.714442    
## PARK_FACILYes         4.848e+05  1.930e+05   2.512 0.013284 *  
## MZZONEC               3.934e+05  4.096e+05   0.960 0.338699    
## MZZONEI               5.571e+05  4.495e+05   1.239 0.217609    
## MZZONERH              7.913e+05  3.812e+05   2.076 0.039996 *  
## MZZONERL              1.388e+06  3.986e+05   3.482 0.000689 ***
## MZZONERM              1.710e+06  4.147e+05   4.122 6.85e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1019000 on 123 degrees of freedom
## Multiple R-squared:  0.9389, Adjusted R-squared:  0.9265 
## F-statistic: 75.66 on 25 and 123 DF,  p-value: < 2.2e-16

Ada beberapa informasi yang dapat kita temukan berdasarkan hasil di atas. Contohnya ketika REG_FEE naik satu satuan maka menaikkan SALES_PRICE sebesar 1,198e+01. Kita juga dapat melihat signifikansi prediktor terhadap target berdasarkan nilai Pr(>|t|) dan jumlah bintang di sebelahnya.

Setelah membuat model kita melakukan fungsi predict() untuk memprediksi nilai SALES_PRICE pada data yang baru.

pred_1 <- predict(model_1, newdata = housing)

head(pred_1)
##        1        2        3        4        5        6 
## 10197554 19858959 12887064  9540675  6601337 11951334

Kita perlu melakukan evaluasi setelah melakukan tahap di atas. Kita dapat melihat nilai Adjusted R-squared yang akan semakin besar jika prediktor yang digunakan menghasilkan prediksi yang lebih baik dan RMSE nilai error yang diharapkan kecil.

summary(model_1)$adj.r.squared
## [1] 0.9265292
RMSE(y_pred = pred_1, y_true = housing$SALES_PRICE)
## [1] 925791.2

Model 2

Selanjutnya kita membuat model kedua. Pada model ini kita membuang kolom SALE_COND dengan anggapan bahwa kolom tersebut tidak memiliki korelasi yang cukup signifikan terhadap variabel target kita. Kita akan melihat apakah model ini memiliki performa yang lebih baik daripada model yang pertama.

model_2 <- lm(SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE, 
              housing)

summary(model_2)
## 
## Call:
## lm(formula = SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + 
##     UTILITY_AVAIL + PARK_FACIL + MZZONE, data = housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2450761  -561407   -51716   589616  2246546 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           6.959e+06  5.860e+05  11.875  < 2e-16 ***
## REG_FEE               1.127e+01  1.070e+00  10.532  < 2e-16 ***
## AREAAnna Nagar        3.880e+06  3.875e+05  10.012  < 2e-16 ***
## AREAChrompet          6.317e+05  3.164e+05   1.996 0.048074 *  
## AREAKarapakkam       -1.037e+06  2.824e+05  -3.672 0.000355 ***
## AREAKK Nagar          5.597e+05  3.856e+05   1.451 0.149176    
## AREAT Nagar           3.700e+06  3.790e+05   9.763  < 2e-16 ***
## AREATNagar            4.130e+06  1.065e+06   3.878 0.000169 ***
## AREAVelachery         9.195e+05  3.341e+05   2.752 0.006806 ** 
## STREETNo Access      -8.536e+05  2.257e+05  -3.783 0.000239 ***
## STREETPavd            1.528e+04  1.034e+06   0.015 0.988232    
## STREETPaved          -6.183e+05  2.027e+05  -3.050 0.002794 ** 
## BUILDTYPEHouse       -3.115e+06  2.826e+05 -11.025  < 2e-16 ***
## BUILDTYPEOther       -3.013e+06  7.726e+05  -3.900 0.000156 ***
## BUILDTYPEOthers      -2.415e+06  2.563e+05  -9.424 2.95e-16 ***
## UTILITY_AVAILELO     -1.568e+05  2.493e+05  -0.629 0.530424    
## UTILITY_AVAILNoSeWa   6.263e+04  2.507e+05   0.250 0.803123    
## UTILITY_AVAILNoSewr  -3.781e+04  2.423e+05  -0.156 0.876284    
## PARK_FACILYes         4.666e+05  1.806e+05   2.584 0.010923 *  
## MZZONEC               4.072e+05  3.900e+05   1.044 0.298512    
## MZZONEI               6.040e+05  4.222e+05   1.431 0.155055    
## MZZONERH              6.514e+05  3.580e+05   1.820 0.071218 .  
## MZZONERL              1.353e+06  3.790e+05   3.571 0.000506 ***
## MZZONERM              1.598e+06  3.873e+05   4.126 6.69e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 968600 on 125 degrees of freedom
## Multiple R-squared:  0.9439, Adjusted R-squared:  0.9336 
## F-statistic: 91.49 on 23 and 125 DF,  p-value: < 2.2e-16

Sama seperti model pertama kita melakukan prediksi terlebih dahulu.

pred_2 <- predict(model_2, newdata = housing)

head(pred_2)
##        1        2        3        4        5        6 
## 10050761 20052657 13365573  9424819  7050052 12058644

Kita akan melihat nilai Adjusted R-squared dan RMSE kembali.

summary(model_2)$adj.r.squared
## [1] 0.9336124
RMSE(y_pred = pred_2, y_true = housing$SALES_PRICE)
## [1] 887159.3

Jika dibandingkan dengan model yang pertama nilai Adjusted R-squared lebih besar dan nilai RMSE lebih kecil. Artinya model yang kedua memiliki performa yang lebih baik dalam melakukan prediksi variabel target yang kita punya.

Uji Asumsi

Setelah membuat model kita perlu cek beberapa asumsi dengan tujuan untuk memastikan apakah model yang digunakan sudah baik atau belum.

  1. Linearity

Cek asumsi ini dapat dilakukan dengan menggunakan ggcorr() untuk melihat korelasi antar variabel seperti yang sudah kita lakukan di tahap Exploratory Data Analysis.

ggcorr(housing, label = T, hjust = 1, layout.exp = 2)

Atau bisa juga dengan Linearity Hypothesis Test menggunakan fungsi cor.test().

cor.test(housing$SALES_PRICE, housing$REG_FEE)
## 
##  Pearson's product-moment correlation
## 
## data:  housing$SALES_PRICE and housing$REG_FEE
## t = 21.821, df = 147, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8299970 0.9073892
## sample estimates:
##       cor 
## 0.8741322

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Korelasi tidak signifikan
H1 : Korelasi signifikan

Kesimpulan : Variabel berkorelasi signifikan, uji asumsi kita terpenuhi.

  1. Normality of Residuals

Pada tahap ini kita akan cek apakah error/residual yang dihasilkan berdistribusi normal atau tidak. Pertama kita dapat menggunakan fungsi hist() pada model kita.

hist(model_2$residuals)

Kita juga bisa menggunakan shapiro.test().

shapiro.test(model_2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  model_2$residuals
## W = 0.99375, p-value = 0.769

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Error/residual berdistribusi normal
H1 : Error/residual tidak berdistribusi normal

Kesimpulan : Error/residual berdistribusi normal, uji asumsi kita terpenuhi.

  1. Homoscedasticity

Selanjutnya cek asumsi ini diharapkan error yang dihasilkan tidak berpola/menyebar secara random/konstan. Bisa dilakukan dengan menggunakan plot seperti di bawah ini.

plot(x = model_2$fitted.values, 
     y = model_2$residuals)

abline(h = 0, col = "red")

Atau bisa juga dengan Breusch-Pagan Hypothesis Test menggunakan fungsi bptest().

bptest(model_2)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_2
## BP = 38.588, df = 23, p-value = 0.02201

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Variansi error menyebar konstan (Homoscedasticity)
H1 : Variansi error menyebar tidak konstan/membentuk pola (Heteroscedasticity)

Kesimpulan : Variansi error menyebar tidak konstan (Heteroscedasticity), uji asumsi tidak terpenuhi.

  1. Multicollinearity

Cek asumsi yang terakhir adalah Multicollinearity. Kita mencoba melihat apakah ada korelasi antar prediktor yang sangat kuat hingga satu atau minus satu. Hal ini untuk menghindari variabel redundan pada model. Kita menggunakan fungsi vif() untuk mengetahui hal ini.

vif(model_2)
##                   GVIF Df GVIF^(1/(2*Df))
## REG_FEE       3.885267  1        1.971108
## AREA          6.842463  7        1.147250
## STREET        1.774559  3        1.100310
## BUILDTYPE     2.719434  3        1.181444
## UTILITY_AVAIL 1.715162  3        1.094084
## PARK_FACIL    1.293682  1        1.137402
## MZZONE        2.917431  5        1.113013

Jika
Nilai VIF > 10 : Ada multicollinearity
Nilai VIF < 10 : Tidak ada multicollinearity

Kesimpulan : Tidak ada multicollinearity, uji asumsi terpenuhi.

Model Evaluation

Kita sudah membuat dua model dan melihat performanya. Kita mencoba membuat satu model lagi dan melihat bagaimana perbandingan terhadap dua model sebelumnya.

Model 3

Pada model ini semua variabel bertipe factor akan menjadi prediktor dan REG_FEE tetap digunakan sebagai prediktor bertipe numerik yang memiliki korelasi signifikan.

model_housing <- lm(SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE + SALE_COND, 
                    housing)

summary(model_housing)
## 
## Call:
## lm(formula = SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + 
##     UTILITY_AVAIL + PARK_FACIL + MZZONE + SALE_COND, data = housing)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2418411  -638937        0   547054  2124122 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           6.934e+06  1.450e+06   4.784 4.94e-06 ***
## REG_FEE               1.127e+01  1.177e+00   9.575  < 2e-16 ***
## AREAAnna Nagar        4.027e+06  3.968e+05  10.149  < 2e-16 ***
## AREAChrompet          6.339e+05  3.177e+05   1.996 0.048248 *  
## AREAKarapakkam       -1.079e+06  2.853e+05  -3.783 0.000243 ***
## AREAKK Nagar          6.898e+05  3.901e+05   1.768 0.079528 .  
## AREAT Nagar           3.808e+06  3.863e+05   9.859  < 2e-16 ***
## AREATNagar            3.818e+06  1.078e+06   3.541 0.000568 ***
## AREAVelachery         1.014e+06  3.490e+05   2.906 0.004366 ** 
## STREETNo Access      -8.401e+05  2.276e+05  -3.692 0.000336 ***
## STREETPavd            5.018e+05  1.051e+06   0.478 0.633865    
## STREETPaved          -6.288e+05  2.042e+05  -3.079 0.002575 ** 
## BUILDTYPEHouse       -3.109e+06  2.864e+05 -10.855  < 2e-16 ***
## BUILDTYPEOther       -2.854e+06  7.762e+05  -3.677 0.000354 ***
## BUILDTYPEOthers      -2.397e+06  2.568e+05  -9.334 6.63e-16 ***
## UTILITY_AVAILELO     -1.405e+05  2.544e+05  -0.553 0.581615    
## UTILITY_AVAILNoSeWa   1.103e+05  2.570e+05   0.429 0.668427    
## UTILITY_AVAILNoSewr   2.773e+04  2.432e+05   0.114 0.909392    
## PARK_FACILYes         4.344e+05  1.906e+05   2.279 0.024440 *  
## MZZONEC               4.090e+05  3.883e+05   1.053 0.294290    
## MZZONEI               5.362e+05  4.249e+05   1.262 0.209440    
## MZZONERH              6.554e+05  3.613e+05   1.814 0.072165 .  
## MZZONERL              1.283e+06  3.795e+05   3.381 0.000974 ***
## MZZONERM              1.514e+06  3.953e+05   3.830 0.000206 ***
## SALE_CONDAbNormal     7.713e+04  1.153e+06   0.067 0.946789    
## SALE_CONDAdjLand      2.345e+05  1.159e+06   0.202 0.840014    
## SALE_CONDFamily      -1.641e+05  1.134e+06  -0.145 0.885230    
## SALE_CONDNormal Sale  2.056e+05  1.156e+06   0.178 0.859169    
## SALE_CONDPartial     -3.548e+05  1.158e+06  -0.306 0.759798    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 961100 on 120 degrees of freedom
## Multiple R-squared:  0.947,  Adjusted R-squared:  0.9346 
## F-statistic: 76.58 on 28 and 120 DF,  p-value: < 2.2e-16

Kita lakukan prediksi terlebih dahulu.

pred_housing <- predict(model_housing, newdata = housing)

head(pred_housing)
##        1        2        3        4        5        6 
## 10018411 20257195 13332274  9336812  7048668 11746825

Sama seperti sebelumnya kita perlu mengetahui nilai Adjusted R-squared dan RMSE untuk mengetahui performa model yang kita buat.

summary(model_housing)$adj.r.squared
## [1] 0.9346338
RMSE(y_pred = pred_housing, y_true = housing$SALES_PRICE)
## [1] 862522.5

Nilai Adjusted R-squared lebih besar sedangkan nilai RMSE lebih kecil. Ini mengindikasikan model_housing merupakan model paling baik di antara kedua model yang telah kita buat sebelumnya.

Uji Asumsi

  1. Linearity
ggcorr(housing, label = T, hjust = 1, layout.exp = 2)

cor.test(housing$SALES_PRICE, housing$REG_FEE)
## 
##  Pearson's product-moment correlation
## 
## data:  housing$SALES_PRICE and housing$REG_FEE
## t = 21.821, df = 147, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8299970 0.9073892
## sample estimates:
##       cor 
## 0.8741322

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Korelasi tidak signifikan
H1 : Korelasi signifikan

Kesimpulan : Variabel berkorelasi signifikan, uji asumsi kita terpenuhi.

  1. Normality of Residuals
hist(model_housing$residuals)

shapiro.test(model_housing$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  model_housing$residuals
## W = 0.99589, p-value = 0.9539

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Error/residual berdistribusi normal
H1 : Error/residual tidak berdistribusi normal

Kesimpulan : Error/residual berdistribusi normal, uji asumsi kita terpenuhi.

  1. Homoscedasticity
plot(x = model_housing$fitted.values, 
     y = model_housing$residuals)

abline(h = 0, col = "red")

bptest(model_housing)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_housing
## BP = 40.221, df = 28, p-value = 0.06318

Jika
P-value >= Alpha (0,05), maka gagal tolak H0.
P-value < Alpha (0,05), maka tolak H0.

Keterangan
H0 : Variansi error menyebar konstan (Homoscedasticity)
H1 : Variansi error menyebar tidak konstan/membentuk pola (Heteroscedasticity)

Kesimpulan : Variansi error menyebar konstan (Homoscedasticity), uji asumsi terpenuhi.

  1. Multicollinearity
vif(model_housing)
##                   GVIF Df GVIF^(1/(2*Df))
## REG_FEE       4.774729  1        2.185115
## AREA          9.516257  7        1.174601
## STREET        1.960723  3        1.118758
## BUILDTYPE     2.989855  3        1.200259
## UTILITY_AVAIL 1.943567  3        1.117120
## PARK_FACIL    1.463358  1        1.209693
## MZZONE        3.553098  5        1.135170
## SALE_COND     2.732382  5        1.105743

Jika
Nilai VIF > 10 : Ada multicollinearity
Nilai VIF < 10 : Tidak ada multicollinearity

Kesimpulan : Tidak ada multicollinearity, uji asumsi terpenuhi.

Kesimpulan

Jika dilihat berdasarkan korelasi antar variabel SALES_PRICE memiliki nilai korelasi paling tinggi dengan variabel REG_FEE. model_housing adalah model terbaik yang dapat kita gunakan untuk memprediksi harga jual sebuah rumah jika menggunakan dataset Chennai Housing Sales Price. Model tersebut memiliki nilai Adjusted R-squared terbesar dan nilai RMSE terkecil. Dari ketiga model yang telah kita buat model_housing memiliki jumlah variabel prediktor terbanyak.