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.
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 :
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
# Scater Plot
pairs(~ price + age + distancemrt + stores, data = rumah, lower.panel=NULL)Interpretasi Korelasl Variabel terhadap Price :
# 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 :
## model regresi ##
modelreg <- lm(price ~ age + distancemrt +stores , data = rumah)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.
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.
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.
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.
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.
modelreg2$coefficients#> (Intercept) age distancemrt stores
#> 42.471499798 -0.306442232 -0.005166015 1.338746223
Interpretasi model :
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.
Nilai p − value untuk setiap variabel < 0.05, hal ini menunjukkan bahwa baik age, distancemrt, maupun stores segara signifikan mempengaruhi price real estate.
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.