1 Introduction

Real estate merupakan salah satu kebutuhan pokok bagi individu. Penentuan harga real estate umumnya dipengaruhi oleh berbagai hal. Sehingga diperlukan suatu metode terkait bagaimana memprediksikan harga real estate berdasarkan beberapa variabel tertentu.

2 Data Preparation

rumah <- read.csv('realestate.csv', stringsAsFactors = T,sep=";")
head(rumah)
dim(rumah)
#> [1] 414   5

Kita memiliki 414 record data dengan 4 kolom inti. Berikut adalah deskripsi dari masing-masing kolom inti tersebut :

  • Price : Harga real estate (perseribu dollar)
  • Age : Usia real estate (tahun)
  • Distancemrt : Jarak real estate dengan mrt (km)
  • Stores : Jumlah stores dari real estate
summary(rumah)
#>        No             age          distancemrt          stores      
#>  Min.   :  1.0   Min.   : 0.000   Min.   :  23.38   Min.   : 0.000  
#>  1st Qu.:104.2   1st Qu.: 9.025   1st Qu.: 289.32   1st Qu.: 1.000  
#>  Median :207.5   Median :16.100   Median : 492.23   Median : 4.000  
#>  Mean   :207.5   Mean   :17.713   Mean   :1083.89   Mean   : 4.094  
#>  3rd Qu.:310.8   3rd Qu.:28.150   3rd Qu.:1454.28   3rd Qu.: 6.000  
#>  Max.   :414.0   Max.   :43.800   Max.   :6488.02   Max.   :10.000  
#>      price       
#>  Min.   :  7.60  
#>  1st Qu.: 27.70  
#>  Median : 38.45  
#>  Mean   : 37.98  
#>  3rd Qu.: 46.60  
#>  Max.   :117.50

3 Eksplorasi Data

3.1 Korelasi

# Scater Plot
pairs(~ price + age + distancemrt + stores, data = rumah, lower.panel=NULL)

Interpretasi Korelasl Variabel terhadap Price :

  • Sekilas terlihat tidak ada indikasi hubungan antara price dan age
  • Ada indikasi hubungan negative antara price dan distancemrt
  • Ada indikasi hubungan positif antara price dan stores
  • Ada indikasi hubungan negating antara distancemrt dan stores
# Headmap
rumahnum=rumah[,-1]
library(ggcorrplot)
corr <- round(cor(rumahnum), 3)
corr
#>                age distancemrt stores  price
#> age          1.000       0.026  0.050 -0.211
#> distancemrt  0.026       1.000 -0.603 -0.674
#> stores       0.050      -0.603  1.000  0.571
#> price       -0.211      -0.674  0.571  1.000
p.mat <- cor_pmat(rumahnum)
p.mat
#>                       age
#> age         0.00000000000
#> distancemrt 0.60317465756
#> stores      0.31411408087
#> price       0.00001560426
#>                                                                  distancemrt
#> age         0.60317465756200761006766697391867637634277343750000000000000000
#> distancemrt 0.00000000000000000000000000000000000000000000000000000000000000
#> stores      0.00000000000000000000000000000000000000000289094988121831568319
#> price       0.00000000000000000000000000000000000000000000000000000004639825
#>                                                        stores
#> age         0.31411408086638653580635605067072901874780654907
#> distancemrt 0.00000000000000000000000000000000000000000289095
#> stores      0.00000000000000000000000000000000000000000000000
#> price       0.00000000000000000000000000000000000034134833405
#>                                                                        price
#> age         0.00001560425504797073779569838158920447312993928790092468261719
#> distancemrt 0.00000000000000000000000000000000000000000000000000000004639825
#> stores      0.00000000000000000000000000000000000034134833404962111973440092
#> price       0.00000000000000000000000000000000000000000000000000000000000000
ggcorrplot(corr,hc.order = TRUE,type = "lower", p.mat = p.mat,lab=T)

Berdasarkan plot korelasi tersebut, korelasi yang signifikan adalah :

  • price dengan stores
  • Price dengan age
  • Price dengan distancemrt
  • Stores dengan distancemrt

4 Model Regresi

## model regresi ##
modelreg <- lm(price ~ age + distancemrt +stores , data = rumah)

4.1 Uji Heterokedastisitas

Uji heteroskedastisitas bertujuan untuk menguji apakah dalam suatu model regresi terdapat ketidaksamaan variansi residual antara suatu pengamatan ke pengamatan yang lain. Jika varian dari residual satu pengamatan ke pengamatan yang lain tetap/konstan, maka disebut homoskedastisitas dan jika berbeda akan disebut heteroskedastisitas. Model regresi yang baik adalah model regresi homoskedastisitas atau tidak terjadi heteroskedastisitas karena data ini menghimpun daya mewakili berbagai ukuran.

Ingat, yang kita inginkan adalah varian dari residual satu pengamatan ke pengamatan yang lain tetap/konstan dan titik-titik data menyebar tidak membentuk suatu pola.

Uji asumsi heteroskedastisitas pada kasus regresi berganda dapat dilakukan dengan melihat standardized residul vs Predicted values. Kita dapat melakukan plotting untuk menguji heteroskedastisitas model yakni dengan menjalankan plot(modelreg, 3).

plot(modelreg, 3) # diagnostik plot untuk asumsi homogenitas

> Dari plot di atas, terlihat bahwa titik-titik data menyebar membentuk suatu pola, sehingga dapat disimpulkan secara visual bahwa terjadi heteroskedastisitas. Model regresi ini belum memenuhi asumsi kesamaan variansi residual.

4.2 Uji Autokorelasi

Uji autokorelasi dalam analisis regresi mengacu pada pengujian apakah terdapat korelasi atau hubungan antara nilai residual (kesalahan) dari model regresi dengan nilai residual pada waktu sebelumnya atau pada observasi sebelumnya. Dalam konteks regresi, autokorelasi juga dikenal sebagai “ketergantungan serial” karena melibatkan hubungan antara observasi dalam urutan waktu tertentu. Asumsi dasar dalam regresi adalah bahwa residual harus saling tidak berkorelasi dan berdistribusi acak. Namun, jika terdapat autokorelasi pada residual, maka asumsi ini tidak terpenuhi, dan hasil analisis regresi dapat menjadi bias dan tidak dapat diandalkan.

Hipotesis : H0: Tidak terdapat autokorelasi pada residual H1: Terdapat autokorelasi pada residual

Tingkat Signifikansi : α = 1% = 0.01

Wilayah Kritik : Tolak H0 jika p − value < α

library(car)
durbinWatsonTest(modelreg)
#>  lag Autocorrelation D-W Statistic p-value
#>    1     -0.06059551      2.114929   0.266
#>  Alternative hypothesis: rho != 0

Durbin-Watson Test adalah salah satu uji paling sederhana yang digunakan untuk mendeteksi autokorelasi dalam regresi linear. Berdasaran result diatas, diperoleh nilai p − value = 0.218. Karena p − value > α, maka gagal tolak H0, artinya tidak terdapat autokorelasi pada residual.

4.3 Uji Multikolinearitas

Uji Multikolinearitas bertujuan untuk menguji dan mengetahui apakah dalam suatu model regresi ditemukan adanya korelasi yang tinggi atau sempurna antar variabel independen. Jika terdapat multikolinearitas, interpretasi hasil regresi menjadi sulit karena adanya redundansi informasi antar-variabel prediktor. Oleh karena itu, yang kita inginkan adalah tidak ada indikasi multikolinearitas.

library(car)
vif(modelreg)
#>         age distancemrt      stores 
#>    1.007349    1.577579    1.580431

Kriteria Pengujian : jika VIF(variance inflation factor ) ≥ 10 maka terdapat multikolinieritas. Semua nilai VIF berdasarkan result diatas tidak ada yang lebih besar dari 10 sehingga tidak terdapat indikasi multikolinieritas.

4.4 Uji Normalitas

Uji Normalitas merupakan sebuah uji yang dilakukan dengan tujuan untuk menilai sebaran data pada sebuah kelompok data atau variabel, apakah sebaran data tersebut berdistribusi normal ataukah tidak. Uji asumsi normalitas pada kasus regresi berganda dapat dilakukan dengan melihat Q – Q plot.

plot(modelreg, 2) # diagnostik plot untuk asumsi normalitas

Dari plot di atas, terlihat bahwa ada sebagian titik-titik data yang tidak berada di garis diagonalnya.Sehingga dapat disimpulkan secara visual bahwa asumsi normalitas belum terpenuhi.

Untuk lebih memastikan lebih detail terkait apakah uji normalitas ini terpenuhi atau tidak, kita dapat menguji kembali dengan menggunakan uji Shapiro-Wilk.

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

Tingkat Signifikansi : α = 1% = 0.01

Wilayah Kritik : Tolak H0 jika p − value < α

shapiro.test(modelreg$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  modelreg$residuals
#> W = 0.87858, p-value < 0.00000000000000022

Karena p − value < α, maka tolak H0, artinya residual berdistribusi tidak normal.

Berdasarkan pengujian yang telah dilakukan, model regresi belum sepenuhnya memenuhi asumsi yang diharapkan. Sehingga kita perlu menangani model ini dan mengusahakan supaya asumsi terpenuhi.

5 Penanganan Asumsi

Kode dibawah ini ingin menunjukkan box plot dari variabel residual dalam model regresi. Box plot menampilkan persebaran dan distribusi data residual secara visual dengan garis tengah kotak sebagai median, kotak menunjukkan kuartil pertama dan ketiga, serta whisker sebagai batas atas dan bawah.

resid = modelreg$residual
datares = data.frame(resid)
ggplot(datares, aes(y = resid)) + geom_boxplot()

out <- boxplot.stats(resid)$out
out_ind <- which(resid %in% c(out))
out_ind
#>  [1]  17  48 106 114 127 129 149 167 221 229 271 286 313 345 362 380 390

Pada kode diatas kita membuat vektor out yang berisi nilai-nilai pencilan (outliers) dari variabel residual dalam model regresi. Selanjutnya, kode out_ind mengidentifikasi posisi (indeks) dari nilai-nilai tersebut dalam vektor resid. Dengan demikian, out_ind akan berisi indeks-indeks yang menunjukkan letak nilai-nilai pencilan dalam data residual. Hal ini membantu untuk lebih lanjut mengeksplorasi dan menganalisis nilai-nilai yang berpotensi berpengaruh pada hasil analisis regresi secara lebih detail.

Sekarang, kita akan membuat model baru yang tidak mengandung outlier pada residualnya. Dengan melakukan hal tersebut, kita menghilangkan pengaruh nilai-nilai pencilan yang dapat mempengaruhi hasil analisis regresi secara tidak tepat.

rumah2 = rumah[-out_ind,]
modelreg2 <- lm(price ~ age + distancemrt +stores , data = rumah2)
# Uji Heterokedastisitas
plot(modelreg2, 3)

> Dari gambar di atas, terlihat bahwa titik-titik data menyebar dan tidak memilki pola tertentu. Sehingga dapat disimpulkan secara visual bahwa asumsi homogenitas terpenuhi.

# Uji Autokorelasi
durbinWatsonTest(modelreg2)
#>  lag Autocorrelation D-W Statistic p-value
#>    1      0.02284754      1.942919   0.592
#>  Alternative hypothesis: rho != 0

p − value = 0.558, p − value > α, maka gagal tolak H0. Sehingga bisa disimpulkan bahwa tidak terdapat autokorelasi pada residual.

# Uji Multikolinearitas
vif(modelreg2)
#>         age distancemrt      stores 
#>    1.006007    1.555529    1.555871

Semua nilai VIF nya tidak ada yang lebih besar dari 10 sehingga tidak terjadi multikolinieritas

# Uji Normalitas
plot(modelreg2, 2)

Dari gambar Q-Q Plot,diatas, terlihat bahwa titik-titik data berada di garis diagonalnya, sehingga dapat disimpulkan bahwa secara visual asumsi normalitas terpenuhi.

shapiro.test(modelreg2$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  modelreg2$residuals
#> W = 0.99146, p-value = 0.02187

Oleh karena p − value > α, maka gagal tolak H0. Sehingga dapat disimpulkan bahwa pada tingkat signifikansi 99% (α = 1%) terdapat cukup bukti untuk menyatakan residual berdistribusi normal.

6 Summary Model

modelreg2$coefficients
#>  (Intercept)          age  distancemrt       stores 
#> 42.471499798 -0.306442232 -0.005166015  1.338746223

Interpretasi model :

  • Persamaan Regresi : Price Real Estate = 42.47 − 0.306age − 0.0051distancemrt + 1.33stores
  • b1 = −0.306 menunjukkan bahwa ketika usia (age) meningkat satu tahun, harga (price) properti cenderung menurun sebesar 0.3064422 unit, jika variabel lainnya tetap konstan.
  • b2 = −0.0051 menunjukkan bahwa ketika jarak ke stasiun MRT (distancemrt) meningkat satu satuan (misalnya satu meter), harga (price) properti cenderung menurun sebesar 0.0051660 unit, jika variabel lainnya tetap konstan.
  • b3 = 1.33 menunjukkan bahwa ketika jumlah toko (stores) di sekitar properti bertambah satu, harga (price) properti cenderung meningkat sebesar 1.3387462 unit, jika variabel lainnya tetap konstan.

7 Uji F

Apakah age, distancemrt dan stores secara bersama-sama mempengaruhi price real estate?

Hipotesis : H0: Age, distancemrt dan stores secara bersama-sama tidak mempengaruhi price real estate H1: Minimal ada satu variabel bebas X yang mempengaruhi price real estate

Tingkat Signifikansi : α = 1% = 0.01

Wilayah Kritik : Tolak H0 jika p − value < α

summary(modelreg2)
#> 
#> Call:
#> lm(formula = price ~ age + distancemrt + stores, data = rumah2)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -18.9243  -4.4723  -0.9535   4.4979  19.2832 
#> 
#> Coefficients:
#>               Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) 42.4714998  1.0204502  41.620 <0.0000000000000002 ***
#> age         -0.3064422  0.0303657 -10.092 <0.0000000000000002 ***
#> distancemrt -0.0051660  0.0003308 -15.616 <0.0000000000000002 ***
#> stores       1.3387462  0.1424708   9.397 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 6.68 on 393 degrees of freedom
#> Multiple R-squared:  0.695,  Adjusted R-squared:  0.6926 
#> F-statistic: 298.4 on 3 and 393 DF,  p-value: < 0.00000000000000022

**F-statistic: 298.4 on 3 and 393 DF, p-value: < 0.00000000000000022** Karena p − value < α, maka tolak H0. Sehingga dapat disimpulkan bahwa minimal ada satu variabel bebas X yang mempengaruhi price real estate.

8 Uji T

Nilai p − value untuk setiap variabel < 0.05, hal ini menunjukkan bahwa baik age, distancemrt, maupun stores segara signifikan mempengaruhi price real estate.

9 Ukuran Kebaikan Model

summary_model <- summary(modelreg2)

# Mengakses nilai R-squared
r_squared <- summary_model$r.squared

# Menampilkan nilai R-squared
print(r_squared)
#> [1] 0.6949546

Nilai adjusted R-squared adalah 0.6926, yang berarti bahwa sekitar 69.26% variasi dalam variabel dependen (price) dijelaskan oleh variabel independen (age, distancemrt, dan stores) yang ada dalam modelreg2.