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.
<- read.csv("Chennai houseing sale.csv",
housing 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
.
<- lm(SALES_PRICE ~ REG_FEE + AREA + SALE_COND + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE,
model_1
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.
<- predict(model_1, newdata = housing)
pred_1
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.
<- lm(SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE,
model_2
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.
<- predict(model_2, newdata = housing)
pred_2
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.
- 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.
- 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.
- 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.
- 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.
<- lm(SALES_PRICE ~ REG_FEE + AREA + STREET + BUILDTYPE + UTILITY_AVAIL + PARK_FACIL + MZZONE + SALE_COND,
model_housing
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.
<- predict(model_housing, newdata = housing)
pred_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
- 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.
- 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.
- 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.
- 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.