Pada kesempatan kali ini kita akan melakukan Analisis Regresi menggunakan data HousePricing yang didapatkan melalui Kagle. Data tersebut berisikan variabel yang dapat mempengaruhi harga rumah
house <- read.csv("C:/Users/ADAM/Downloads/Compressed/archive/HousePrices_HalfMil.csv")
str(house)
## 'data.frame': 500000 obs. of 16 variables:
## $ Area : int 164 84 190 75 148 124 58 249 243 242 ...
## $ Garage : int 2 2 2 2 1 3 1 2 1 1 ...
## $ FirePlace : int 0 0 4 4 4 3 0 1 0 2 ...
## $ Baths : int 2 4 4 4 2 3 2 1 2 4 ...
## $ White.Marble : int 0 0 1 0 1 0 0 1 0 0 ...
## $ Black.Marble : int 1 0 0 0 0 1 0 0 0 0 ...
## $ Indian.Marble: int 0 1 0 1 0 0 1 0 1 1 ...
## $ Floors : int 0 1 0 1 1 1 0 1 1 0 ...
## $ City : int 3 2 2 1 2 1 3 1 1 2 ...
## $ Solar : int 1 0 0 1 1 0 0 0 0 1 ...
## $ Electric : int 1 0 0 1 0 0 1 1 0 0 ...
## $ Fiber : int 1 0 1 1 0 1 1 0 0 0 ...
## $ Glass.Doors : int 1 1 0 1 1 1 1 1 0 0 ...
## $ Swiming.Pool : int 0 1 0 1 1 1 0 1 1 1 ...
## $ Garden : int 0 1 0 1 1 1 1 0 0 0 ...
## $ Prices : int 43800 37550 49500 50075 52400 54300 34400 50425 29575 22300 ...
Berikut adalah penjelasan dari setiap variable nya
Area: Luas tanah pada bangunan
Garage: Type garasi
FirePlace: Type perapian dalam rumah
Baths: Type Kamar mandi
White.Marble: Type marmer putih dalam rumah
Black.Marble: Type marmer hitam dalam rumah
Indian.Marble: Type marmer india dalam rumah
Floors: Type lantai
City: Kota lokasi rumah
Solar: Tenaga surya / tidak
Electric: Terdapat aliran listrik / tidak
Fiber: Atap fiber / tidak
Glass.Doors: Pintu yang terbuat dari kaca / tidak
Swiming.Pool: Terdapat kolam renang / tidak
Garden: Terdapat taman / tidak
Prices: Harga rumah
#cek missing value
anyNA(house)
## [1] FALSE
#melihat korelasi antar variable
library(GGally)
ggcorr(house, label = T, label_size = 2, hjust = 1, layout.exp = 2)
Terlihat pada gambar tersebut jika lantai rumah (Floors) sangat berpengaruh terhadap harga rumah (Prices)
Pada tahap ini kita akan mencoba membuat model regresi antar variabel Prices dengan Floors, dikarenakan korelasi yang cukup tinggi antar kedua variable
Dikarenakan ada beberapa variable yang seharusnya bertipe kategori namun masih bertype numeric, maka kita harus mengubah tipe data tersebut kedalam kategori
#lihat daftar nama variabel yang akan dirubah
names(house)[2:15]
## [1] "Garage" "FirePlace" "Baths" "White.Marble"
## [5] "Black.Marble" "Indian.Marble" "Floors" "City"
## [9] "Solar" "Electric" "Fiber" "Glass.Doors"
## [13] "Swiming.Pool" "Garden"
house[names(house)[2:15]] = lapply(house[names(house)[2:15]], as.factor)
str(house)
## 'data.frame': 500000 obs. of 16 variables:
## $ Area : int 164 84 190 75 148 124 58 249 243 242 ...
## $ Garage : Factor w/ 3 levels "1","2","3": 2 2 2 2 1 3 1 2 1 1 ...
## $ FirePlace : Factor w/ 5 levels "0","1","2","3",..: 1 1 5 5 5 4 1 2 1 3 ...
## $ Baths : Factor w/ 5 levels "1","2","3","4",..: 2 4 4 4 2 3 2 1 2 4 ...
## $ White.Marble : Factor w/ 2 levels "0","1": 1 1 2 1 2 1 1 2 1 1 ...
## $ Black.Marble : Factor w/ 2 levels "0","1": 2 1 1 1 1 2 1 1 1 1 ...
## $ Indian.Marble: Factor w/ 2 levels "0","1": 1 2 1 2 1 1 2 1 2 2 ...
## $ Floors : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 2 2 1 ...
## $ City : Factor w/ 3 levels "1","2","3": 3 2 2 1 2 1 3 1 1 2 ...
## $ Solar : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 1 1 2 ...
## $ Electric : Factor w/ 2 levels "0","1": 2 1 1 2 1 1 2 2 1 1 ...
## $ Fiber : Factor w/ 2 levels "0","1": 2 1 2 2 1 2 2 1 1 1 ...
## $ Glass.Doors : Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 2 1 1 ...
## $ Swiming.Pool : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 2 2 2 ...
## $ Garden : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 2 1 1 1 ...
## $ Prices : int 43800 37550 49500 50075 52400 54300 34400 50425 29575 22300 ...
#pembuatan model
mod1 <- lm(Prices ~ Floors, data = house)
mod1
##
## Call:
## lm(formula = Prices ~ Floors, data = house)
##
## Coefficients:
## (Intercept) Floors1
## 34558 15003
summary(mod1)
##
## Call:
## lm(formula = Prices ~ Floors, data = house)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27211 -6986 -11 6592 28542
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 34557.66 19.00 1819 <2e-16 ***
## Floors1 15003.39 26.89 558 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9507 on 499998 degrees of freedom
## Multiple R-squared: 0.3837, Adjusted R-squared: 0.3837
## F-statistic: 3.113e+05 on 1 and 499998 DF, p-value: < 2.2e-16
Jika dilihat dari Multiple R-squared nya, model ini masih sangat lemah dikarenakan variable prediktor yang digunakan bertipe kategorikal. Selanjutnya kita akan coba menggunakan seluruh variable yang akan diseleksi otomatis dengan teknik stepwise regresion
mod2 <- lm(Prices ~., data = house)
mod2_back <- step(mod2, direction = "backward",trace = 0)
Berdasarkan kedua model tersebut, dimana model tersebut menggunakan metode stepwise backward untuk memilih variabel agar memberi nilai AIC terkecil, terdapat indikasi terjadi model overfitted, hal ini dapat dilihat dari nilai Adjusted R Squared yang sempurna = 1
hist(mod2_back$residuals, breaks = 20)
Jika dilihat persebarannya, model dari backward stepwise terbukti tidak terdistribusi dengan baik, karena terlalu berkumpul di angka 0
tryCatch({
shapiro.test(mod2_back$residuals)
},
warning =
function(w) {message("sample size must be between 3 and 5000")},
error =
function(e) {message("sample size must be between 3 and 5000")})
## sample size must be between 3 and 5000
head(mod2_back$residuals)
## 1 2 3 4 5
## -8.344602e-05 5.049946e-07 -3.748786e-07 1.851977e-09 1.199718e-08
## 6
## -8.005082e-08
Berdasarkan eror dari Uji Shapiro model tersebut tidak bisa dilakukan uji Shapiro Test dikarenakan terdapat nilai nilai sample yang dibawah 3 atau nilai negatif. Sedangkan untuk Uji Shapiro sendiri, nilai sample harus berkisar dari 3 - 5000
library(lmtest)
bptest(mod2_back)
##
## studentized Breusch-Pagan test
##
## data: mod2_back
## BP = 19.34, df = 20, p-value = 0.4998
Berdasarkan uji Heteroscedasticity model yang dibentuk dengan teknik stepwise backward tidak memiliki pola (Heteroscedasticity) P-value > 0.05 dimana semua pola yang ada sudah berhasil ditangkap oleh model yang dibuat.
library(car)
vif(mod2_back)
## GVIF Df GVIF^(1/(2*Df))
## Area 1.000034 1 1.000017
## Garage 1.000096 2 1.000024
## FirePlace 1.000095 4 1.000012
## Baths 1.000142 4 1.000018
## White.Marble 1.331413 1 1.153869
## Black.Marble 1.331420 1 1.153872
## Floors 1.000030 1 1.000015
## City 1.000098 2 1.000025
## Solar 1.000027 1 1.000014
## Electric 1.000024 1 1.000012
## Fiber 1.000029 1 1.000015
## Glass.Doors 1.000033 1 1.000017
Berdasarkan uji Variance Inflation Factor, model tersebut tidak memiliki variable yang berindikasi multicolinearity dikarenakan nilai Vif tidak ada yang melebihi angka 10
Berdasarkan beberapa Asumsi Uji Statistik diatas dan beberapa pertimbangan lainnya, data HousePricing ini tidak cocok apabila dijadikan model menggunakan metode Multiple Linear regresi, dikarenakan banyak variable yang terdiri dari tipe kategorikal.
Namun apabila menggunakan Linear Regresi biasa yang hanya terdiri dari 2 variabel, model tersebut masih cocok dan mungkin dapat digunakan untuk kedepannya