Aktifkan library
library(ggplot2) #membuat plot
library(tidyverse) #wrangling data
library(lmtest) #cek asumsi
library(car) #cek fungsi vif
library(MLmetrics) #menghitung eror
library(GGally) #cek korelasi
library(rsample) #sampling data
options(scipen = 999, max.print = 1e+06) #Panjang angka dibelakang koma
Import Data
house <- read.csv("HousePrices_HalfMil.csv", sep=",", na.strings = c("N/A"))
house
Mengecek tipe data
glimpse(house)
## Rows: 500,000
## Columns: 16
## $ Area <int> 164, 84, 190, 75, 148, 124, 58, 249, 243, 242, 61, 18...
## $ Garage <int> 2, 2, 2, 2, 1, 3, 1, 2, 1, 1, 2, 2, 2, 3, 3, 3, 1, 3,...
## $ FirePlace <int> 0, 0, 4, 4, 4, 3, 0, 1, 0, 2, 4, 0, 0, 3, 3, 4, 0, 3,...
## $ Baths <int> 2, 4, 4, 4, 2, 3, 2, 1, 2, 4, 5, 4, 2, 3, 1, 1, 5, 3,...
## $ White.Marble <int> 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,...
## $ Black.Marble <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,...
## $ Indian.Marble <int> 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,...
## $ Floors <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1,...
## $ City <int> 3, 2, 2, 1, 2, 1, 3, 1, 1, 2, 1, 2, 1, 3, 3, 1, 3, 1,...
## $ Solar <int> 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1,...
## $ Electric <int> 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,...
## $ Fiber <int> 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,...
## $ Glass.Doors <int> 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,...
## $ Swiming.Pool <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,...
## $ Garden <int> 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0,...
## $ Prices <int> 43800, 37550, 49500, 50075, 52400, 54300, 34400, 5042...
Tipe data yang ada pada setiap variabel sudah sesuai, yaitu bertipe data numerik atau integer.
Mengecek data yang missing
colSums(is.na(house))
## Area Garage FirePlace Baths White.Marble
## 0 0 0 0 0
## Black.Marble Indian.Marble Floors City Solar
## 0 0 0 0 0
## Electric Fiber Glass.Doors Swiming.Pool Garden
## 0 0 0 0 0
## Prices
## 0
Masing-masing variabel tidak mempunyai data kosong atau tidak terdapat missing value.
Mengecek korelasi antar variabel
ggcorr(house, label = T, label_size = 3.5, hjust=1, layout.exp = 2)
Bisa dilihat bahwa 3 variabel yg mempunyai korelasi tertinggi dengan Prices adalah Floor, Fiber dan White Marble. Sedangkan variabel yg mempunyai korelasi terendah dengan Prices adalah Indian Marble.
Mengecek distribusi untuk masing-masing variabel
Variabel Area dipisah karena mempunyai isi nilai yg tinggi atau berbeda dengan variabel lainnya.
#Variabel Area
house %>%
select(Area) %>%
boxplot()
#Variabel Selain Area
house %>%
select(-c(Prices,Area)) %>%
boxplot()
Dari hasil visualisasi boxplot, tidak ditemukan outlier pada masing-masing variabel, sehingga data tersebut sudah dapat dianalisis lebih lanjut.
Pembuatan data test menggunakan random sampling
RNGkind(sample.kind = "Rounding")
set.seed(1616)
init <- initial_split(house,
prop = 0.8, #proporsi data sebanyak 0.8 (80%)
strata = Prices) #strata = target variable
house_train <- training(init) #membuat model
house_test <- testing(init) #mengetest model
Dikarnakan variabel Floor, Fiber dan White Marble merupakan variabel dengan nilai korelasi tertinggi dengan Prices, maka varibel-variabel tersebut kita jadikan sebagai variabel prediktor dalam membuat model regresi linear.
Membuat dan melihat summary dari model regresi
model_house1 <- lm(Prices~Floors+Fiber+White.Marble,house_train)
summary(model_house1)
##
## Call:
## lm(formula = Prices ~ Floors + Fiber + White.Marble, data = house_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17540.9 -3596.8 9.1 3586.5 17500.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24865.90 15.25 1630.5 <0.0000000000000002 ***
## Floors 14983.38 16.31 918.8 <0.0000000000000002 ***
## Fiber 11716.58 16.31 718.5 <0.0000000000000002 ***
## White.Marble 11522.57 17.29 666.3 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5157 on 399998 degrees of freedom
## Multiple R-squared: 0.8185, Adjusted R-squared: 0.8185
## F-statistic: 6.014e+05 on 3 and 399998 DF, p-value: < 0.00000000000000022
Dari hasil Summary model_house1 diatas didapat informasi yaitu:
1. Nilai Adjusted R-Squared adalah 0.8185 atau 81.8% model tersebut dapat menjelaskan variasi nilai dari Prices.
2. Nilai p-value dari dari masing-masing varibel prediktor kurang dari 0.05 (p-value < 0.05), maka bisa dianggap masing-masing variabel prediktor (Floor, Fiber, White.Marble) signifikan atau berpengaruh terhadap variabel target (Prices)
3. Setiap variabel mempunyai nilai tambah untuk target variabel, untuk lebih lengkapnya bisa dilihat pada formula berikut ini
\[ Prices = 24865.90 + (14983.38\times Floors) + (11716.58\times Fiber) + (11522.57\times White\ Marble) \]
Selain menentukan variabel prediktor menggunakan nilai korelasi, penentuan variabel prediktor juga dapat menggunakan stepwise regression yang dapat menentukan variabel prediktor terbaik bedasarkan nilai AIC (Akaike Information Criterion).
Membuat dan melihat summary dari model regresi
#Mengambil semua variabel prediktor dan menyeleksinya menggunakan stepwise dengan direction "both"
model_house_full <- lm(Prices~.,house_train)
model_house2 <- step(model_house_full, direction = "both")
## Start: AIC=-15228107
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble +
## Indian.Marble + Floors + City + Solar + Electric + Fiber +
## Glass.Doors + Swiming.Pool + Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense
##
## Step: AIC=-15228107
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble +
## Floors + City + Solar + Electric + Fiber + Glass.Doors +
## Swiming.Pool + Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Df Sum of Sq RSS AIC
## - Swiming.Pool 1 0 0 -15228108
## - Garden 1 0 0 -15228108
## <none> 0 -15228107
## - Solar 1 6249733253 6249733253 3862679
## - Electric 1 156247074284 156247074284 5150246
## - FirePlace 1 449908400277 449908400277 5573290
## - Garage 1 600849493624 600849493624 5689011
## - Baths 1 1249308762837 1249308762837 5981813
## - Area 1 1287887001420 1287887001420 5993978
## - Black.Marble 1 1666118928272 1666118928272 6096976
## - Glass.Doors 1 1980203729458 1980203729458 6166057
## - City 1 3261303330667 3261303330667 6365629
## - White.Marble 1 13085049569172 13085049569172 6921369
## - Fiber 1 13805727501174 13805727501174 6942815
## - Floors 1 22499756119789 22499756119789 7138184
##
## Step: AIC=-15228108
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble +
## Floors + City + Solar + Electric + Fiber + Glass.Doors +
## Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Df Sum of Sq RSS AIC
## - Garden 1 0 0 -15228108
## <none> 0 -15228108
## + Swiming.Pool 1 0 0 -15228107
## - Solar 1 6249736612 6249736612 3862677
## - Electric 1 156247080099 156247080099 5150244
## - FirePlace 1 449908512688 449908512688 5573288
## - Garage 1 600850567647 600850567647 5689009
## - Baths 1 1249315026569 1249315026569 5981813
## - Area 1 1287888651671 1287888651671 5993976
## - Black.Marble 1 1666120395621 1666120395621 6096974
## - Glass.Doors 1 1980203949448 1980203949448 6166055
## - City 1 3261306931325 3261306931325 6365628
## - White.Marble 1 13085138478202 13085138478202 6921370
## - Fiber 1 13805931941846 13805931941846 6942819
## - Floors 1 22499758892623 22499758892623 7138182
##
## Step: AIC=-15228109
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble +
## Floors + City + Solar + Electric + Fiber + Glass.Doors
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Warning: attempting model selection on an essentially perfect fit is nonsense
## Df Sum of Sq RSS AIC
## <none> 0 -15228108
## + Garden 1 0 0 -15228108
## + Swiming.Pool 1 0 0 -15228108
## - Solar 1 6249818496 6249818496 3862681
## - Electric 1 156247427429 156247427429 5150242
## - FirePlace 1 449908735472 449908735472 5573286
## - Garage 1 600851498123 600851498123 5689008
## - Baths 1 1249317404624 1249317404624 5981811
## - Area 1 1287894456360 1287894456360 5993976
## - Black.Marble 1 1666123223867 1666123223867 6096973
## - Glass.Doors 1 1980220300264 1980220300264 6166057
## - City 1 3261310764218 3261310764218 6365626
## - White.Marble 1 13085163335973 13085163335973 6921369
## - Fiber 1 13805957605927 13805957605927 6942817
## - Floors 1 22499777306655 22499777306655 7138180
summary(model_house2)
##
## Call:
## lm(formula = Prices ~ Area + Garage + FirePlace + Baths + White.Marble +
## Black.Marble + Floors + City + Solar + Electric + Fiber +
## Glass.Doors, data = house_train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0000003176 0.0000000000 0.0000000000 0.0000000000 0.0000034002
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 1000.0000000050688413 0.0000000000465559 21479559782844
## Area 25.0000000000070486 0.0000000000001192 209778136038948
## Garage 1499.9999999996425686 0.0000000000104686 143285967167646
## FirePlace 749.9999999999911324 0.0000000000060489 123988754689341
## Baths 1249.9999999999893134 0.0000000000060500 206612446614282
## White.Marble 14000.0000000002419256 0.0000000000209372 668666644179607
## Black.Marble 5000.0000000000090949 0.0000000000209554 238601760808100
## Floors 15000.0000000000036380 0.0000000000171073 876817471794076
## City 3499.9999999999668034 0.0000000000104846 333822939671435
## Solar 250.0000000000266027 0.0000000000171075 14613484651970
## Electric 1250.0000000000256932 0.0000000000171074 73067882728683
## Fiber 11750.0000000001473381 0.0000000000171074 686836478766525
## Glass.Doors 4450.0000000001500666 0.0000000000171074 260121853248574
## Pr(>|t|)
## (Intercept) <0.0000000000000002 ***
## Area <0.0000000000000002 ***
## Garage <0.0000000000000002 ***
## FirePlace <0.0000000000000002 ***
## Baths <0.0000000000000002 ***
## White.Marble <0.0000000000000002 ***
## Black.Marble <0.0000000000000002 ***
## Floors <0.0000000000000002 ***
## City <0.0000000000000002 ***
## Solar <0.0000000000000002 ***
## Electric <0.0000000000000002 ***
## Fiber <0.0000000000000002 ***
## Glass.Doors <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.00000000541 on 399989 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 1.669e+29 on 12 and 399989 DF, p-value: < 0.00000000000000022
Dari hasil Summary model_house2 diatas didapat informasi yaitu:
1. Nilai AIC terbaik (terendah) adalah -15228109
2. Nilai Adjusted R-Squared adalah 1 atau 100% model tersebut dapat menjelaskan variasi nilai dari Prices.
3. Nilai p-value dari dari masing-masing varibel prediktor kurang dari 0.05 (p-value < 0.05), maka bisa dianggap masing-masing variabel prediktor signifikan atau berpengaruh terhadap variabel target (Prices)
4. Setiap variabel mempunyai nilai tambah untuk target variabel, untuk lebih lengkapnya bisa dilihat pada formula berikut ini
\[ Prices = 1000.00 + (25.00\times Area) + (1499.99\times Garage) + (749.99\times Fire\ Place) + (1249.99\times Baths) + (14000.00\times White\ Marble)\ + \]
\[ (5000.00\times Black\ Marble) + (15000.00\times Floors) + (3499.99\times City)\ + (250.00\times Solar) + (1250.00\times Electric)\ + \]
\[ (11750.00\times Fiber) + (4450.00\times Glass\ Doors) \]
Setelah membuat formula untuk target variabel, selanjutnya adalah mengevaluasi apakah formula tersebut sudah sesuai sesuai dengan cara membuat model dari masing-masing formula
Prediksi
pred_test1 <- predict(model_house1, newdata = house_test)
head(pred_test1)
## 3 29 64 65 67 79
## 48105.05 51565.86 48105.05 51565.86 51371.85 39849.28
Cek Eror
\[ RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2} \]
#Root Mean Squared Eror
RMSE(pred_test1, house_test$Prices)
## [1] 5147.273
Dengan mengecek eror menggunakan RMSE (Root Mean Squared Eror) dapat lihat bahwa model akan melenceng dari data aktual sebanyak 5147.273
Asumsi
Multikolinearitas
vif(model_house1)
## Floors Fiber White.Marble
## 1.000001 1.000004 1.000003
Nilai masing-masing variabel prediktor kurang dari 10, yang berarti antar masing-masing prediktor tidak memiliki kemiripan karakteristik
Normality
qqPlot(model_house1$residuals)
## 406693 176280
## 325381 140906
Dapat dilihat value (point) dari data mengikuti bentuk garis linear, yang berati data berdistribusi normal
Melihat grafik distribusi normal
plot(density(model_house1$residuals))
Dari hasil grafik/plot dapat dilihat bentuk dari grafik berbentuk seperti lonceng dengan titik puncak berada pada angka 0, jadi dapat dikatakan bahwa model berdistribusi normal
Heterodasticity
plot(model_house1$fitted.values, #prediksi
model_house1$residuals) #eror
Bentuk dari value (point) tidak membentuk sebuah pola tertentu
Pengecekan p-value, menggunakan bptest
bptest(model_house1)
##
## studentized Breusch-Pagan test
##
## data: model_house1
## BP = 3177.7, df = 3, p-value < 0.00000000000000022
Hasil bptest dari model didapat nilai p-value < 0.05 yang berarti asumsi tidak terpenuhi
Linearity
Pengecekan korelasi target variabel dengan prediktor variabel
ggcorr(house %>%
select(Floors,Fiber,White.Marble,Prices),
label = T, label_size = 3.5, hjust=1, layout.exp = 2)
Dapat dilihat nilai korelasi target dengan prediktor, memiliki nilai yang cukup tinggi.
data.frame(prediksi = model_house1$fitted.values,
error = model_house1$residuals) %>%
ggplot(aes(prediksi, error)) +
geom_hline(yintercept = 0) +
geom_point() +
geom_smooth()
Summary Model
*Setelah model_house1 diprediksi dan dicek nilai errornya menggunakan RMSE, didapat nilai 5147.273 yang berati model_house1 dapat melenceng sebesar nilai tersebut. Lalu pengecekan asumsi menggunakan Multikolinearitas, Normality, Heterodasticity, dan Linearity hasilnya tidak semua asumsi yang dilakukan terpenuhi.
Prediksi
pred_test2 <- predict(model_house2, newdata = house_test)
head(pred_test2)
## 3 29 64 65 67 79
## 49500 47300 43750 48100 50450 33950
Cek Eror
\[ RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2} \]
#Root Mean Squared Eror
RMSE(pred_test2, house_test$Prices)
## [1] 0.000000005409621
Dengan mengecek eror menggunakan RMSE (Root Mean Squared Eror) dapat lihat bahwa model yang akan melenceng dari data aktual sebanyak 0.000000005409621
Asumsi
Multikolinearitas
vif(model_house2)
## Area Garage FirePlace Baths White.Marble Black.Marble
## 1.000024 1.000053 1.000017 1.000043 1.331874 1.331864
## Floors City Solar Electric Fiber Glass.Doors
## 1.000011 1.000023 1.000028 1.000021 1.000026 1.000020
Nilai masing-masing variabel prediktor kurang dari 10, yang berarti antar masing-masing prediktor tidak memiliki kemiripan karakteristik
Normality
qqPlot(model_house2$residuals)
## [1] 1 2
Dapat dilihat value (point) dari data mengikuti bentuk garis linear, yang berati data berdistribusi normal walaupun ada nilai yg outlier
plot(density(model_house2$residuals))
Dari hasil grafik/plot dapat dilihat bahwa model berdistribusi normal dengan yang sangat kecil
Heterodasticity
plot(model_house2$fitted.values, #prediksi
model_house2$residuals) #eror
bptest(model_house2)
##
## studentized Breusch-Pagan test
##
## data: model_house2
## BP = 11.235, df = 12, p-value = 0.5089
Hasil bptest dari model didapat nilai p-value > 0.05 yang berarti asumsi terpenuhi
Linearity
ggcorr(house %>%
select(Area,Garage,FirePlace,Baths,White.Marble,Black.Marble,Floors,City,Solar,Electric,Fiber,Glass.Doors,Prices),
label = T, label_size = 3.5, hjust=1, layout.exp = 2)
Dapat dilihat hasil pengecekan korelasi terdapat beberapa variabel prediktor yg berhubungan dengan variabel target (berwarna orange) dan yang tidak berhubungan (berwarna biru)
data.frame(prediksi = model_house2$fitted.values,
error = model_house2$residuals) %>%
ggplot(aes(prediksi, error)) +
geom_hline(yintercept = 0) +
geom_point() +
geom_smooth()
Summary Model
*Setelah model_house2 diprediksi dan dicek nilai errornya menggunakan RMSE, didapat nilai 0.000000005409621 yang berati model_house2 dapat melenceng sebesar nilai tersebut. Lalu pengecekan asumsi menggunakan Multikolinearitas, Normality, Heterodasticity, dan Linearity hasilnya asumsi yang dilakukan terpenuhi walaupun terdapat outlier dimodel tersebut.
Model Performa
model <- c("model_house1", "model_house2")
R_Squared <- c(0.8185,1.0000)
RMSE <- c(5147.273,0.000000005409621 )
tabelmodel <- data.frame(model,R_Squared,RMSE)
print (tabelmodel)
## model R_Squared RMSE
## 1 model_house1 0.8185 5147.273000000000138
## 2 model_house2 1.0000 0.000000005409621
Berdasarkan pembuatan 2 model diatas (model_house1 dan model_house2) dapat disimpulkan bahwa:
1. R-Squared model_house1 memiliki nilai 0.8185 sedangkan model_house2 memiliki nilai 1, jadi dapat dikatakan berdasarkan nilai R-Squared untuk model_house2 lebih dipilih karena model dapat menjelas variasi nilai dari Prices sebesar 1 (100%)
2. Error Dari hasil pengujian Error dengan menggunakan RMSE (Root Mean Squared Eror) model_house1 memiliki nilai 5147.273 sedangkan model_house2 memiliki nilai 0.000000005409621, jadi dapat dikatakan berdasarkan nilai Error untuk model_house2 lebih dipilih karena kemungkinan model yang akan melenceng dari data aktual hanya sebesar 0.000000005409621
3. Asumsi Dari hasil asumsi untuk kedua model berdasarkan grafik dan test yang dilakukan, bahwa model_house2 lebih dipilih dibandingkan dengan model_house1
Jadi dapat disimpulkan dalam menentukan harga rumah, variabel yang penting dapat dilihat dari model_house2. Variabel yang penting tersebut yaitu Area, Garage, FirePlace, Baths, White.Marble, Black.Marble, Floors, City, Solar, Electric, Fiber dan Glass.Doors.