knitr::opts_chunk$set(echo = TRUE)
Pada Linear Regressi ini, dilakukan pembuatan model linear regression untuk menjawab pertanyaan sebagai berikut :
Variabel apa saja yang berpengaruh signifikan dalam memprediksi harga dari rumah
Berapa prediksi harga rumah dengan menggunakan variabel prediktor
house <- read.csv("HousePrices_HalfMil.csv")
head(house)
## Area Garage FirePlace Baths White.Marble Black.Marble Indian.Marble Floors
## 1 164 2 0 2 0 1 0 0
## 2 84 2 0 4 0 0 1 1
## 3 190 2 4 4 1 0 0 0
## 4 75 2 4 4 0 0 1 1
## 5 148 1 4 2 1 0 0 1
## 6 124 3 3 3 0 1 0 1
## City Solar Electric Fiber Glass.Doors Swiming.Pool Garden Prices
## 1 3 1 1 1 1 0 0 43800
## 2 2 0 0 0 1 1 1 37550
## 3 2 0 0 1 0 0 0 49500
## 4 1 1 1 1 1 1 1 50075
## 5 2 1 0 0 1 1 1 52400
## 6 1 0 0 1 1 1 1 54300
Pada bagian ini, perlu dicek apakah terdapat outliers yang ada di dataset
boxplot(house)
Dari visualisasi boxplot diatas, maka dapat disimpulkan tidak terdapat outliers pada data set. Selanjutnya akan dicek apakah terdapat missing value dalam dataset. Setelah dilakukan pengecekkan tidak ada missing value pada dataset.
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
Pada tahap EDA,variabel garden, Swiming.Pool, Solar dikeluarkan dari dataset karena tidakada korelasi antara ketiga variabel tersebut pda variable Price.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
house_clean <- house %>%
mutate_if(is.factor,as.integer) %>%
select(-Garden,-Swiming.Pool,- Solar,)
glimpse(house_clean)
## Rows: 500,000
## Columns: 13
## $ Area <int> 164, 84, 190, 75, 148, 124, 58, 249, 243, 242, 61, 189, …
## $ Garage <int> 2, 2, 2, 2, 1, 3, 1, 2, 1, 1, 2, 2, 2, 3, 3, 3, 1, 3, 2,…
## $ FirePlace <int> 0, 0, 4, 4, 4, 3, 0, 1, 0, 2, 4, 0, 0, 3, 3, 4, 0, 3, 3,…
## $ Baths <int> 2, 4, 4, 4, 2, 3, 2, 1, 2, 4, 5, 4, 2, 3, 1, 1, 5, 3, 5,…
## $ White.Marble <int> 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 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, 1,…
## $ Indian.Marble <int> 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,…
## $ Floors <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1,…
## $ City <int> 3, 2, 2, 1, 2, 1, 3, 1, 1, 2, 1, 2, 1, 3, 3, 1, 3, 1, 3,…
## $ Electric <int> 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1,…
## $ Fiber <int> 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0,…
## $ Glass.Doors <int> 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,…
## $ Prices <int> 43800, 37550, 49500, 50075, 52400, 54300, 34400, 50425, …
Selanjutnya sebelum melakukan pembuatan model regresi, perlu dilakukan cek korelasi variabel prediktor terhadap Prices sebagai variabel target, dari cek korelasi diatas, di dapatkan insight fiber dan floors memiliki korelasi yang cukup kuat (mendekati 1) dengan variable prices.
library(GGally)
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
ggcorr(house_clean, label = T, label_size = 2.5, cex = 2.6)
Dari uji korelasi diatas, di dapatkan insight fiber dan floors memiliki korelasi yang cukup kuat (mendekati 1) dengan variable prices. Pada data tersebut dapat dilihat jika ketiga variabel Indian.Marble, Black.Marble dan White Marble saling berkorelasi sehingga terjadi multicollinearity, sehingga perlu di take out ketiga variabel. Multicollinearity tidak sesuai dengan asumsi dari regresi linear bahwa masing masing variabel prediktor tidak memiliki korelasi yang tinggi
library(dplyr)
house_clean <- house_clean%>%
select(-White.Marble,-Black.Marble,Indian.Marble)
Selanjutnya akan membuat model dengan price sebagai target variabel dengan Floors sebagai variabel prediktor
model_house_clean_floors <- lm(formula = Prices ~ Floors , data = house_clean)
summary(model_house_clean_floors)
##
## Call:
## lm(formula = Prices ~ Floors, data = house_clean)
##
## 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 ***
## Floors 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
Berdasarkan summary model diatas, maka variabel Floors dapat menjelaskan variance pada variabel prices sebesar 38 % dan angka ini belum maksimal sehingga perlu ditambah variabel lainnya untuk menaikan nilai Adjusted R-squared , namun variabel floor cukup signifikan dalam menjelaskan variance pada variabel price karena nilai p value < 0.05.
Pada tahap berikutnya akan dilakukan prediksi harga rumah dengan variabel floors
floors_predict <- as.data.frame(predict(object = model_house_clean_floors, newdata = house_clean))
colnames(floors_predict) <- "prediksi dengan variabel floors"
head(floors_predict)
## prediksi dengan variabel floors
## 1 34557.66
## 2 49561.05
## 3 34557.66
## 4 49561.05
## 5 49561.05
## 6 49561.05
Pada tabel diatas, dapat di interpretasikan di kolom pertama, rumah yang tidak bertingkat (floors = 0), diprediksikan dengan harga USD 34558, sementara rumah yang bertingkat (floors =1 ) memiliki prediksi harga USD 49561
Pada tahap berikutnya akan dibuat model regresi linear dengan menggunakan variabel prediktor
model_house_clean_all <- lm(formula = Prices ~ . , data = house_clean)
summary(model_house_clean_all)
##
## Call:
## lm(formula = Prices ~ ., data = house_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4671 -4377 -87 4373 4669
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.059e+04 2.707e+01 391.3 <2e-16 ***
## Area 2.512e+01 7.236e-02 347.1 <2e-16 ***
## Garage 1.497e+03 6.359e+00 235.4 <2e-16 ***
## FirePlace 7.528e+02 3.674e+00 204.9 <2e-16 ***
## Baths 1.258e+03 3.673e+00 342.4 <2e-16 ***
## Indian.Marble -9.502e+03 1.101e+01 -862.9 <2e-16 ***
## Floors 1.500e+04 1.039e+01 1443.8 <2e-16 ***
## City 3.499e+03 6.365e+00 549.7 <2e-16 ***
## Electric 1.255e+03 1.039e+01 120.8 <2e-16 ***
## Fiber 1.175e+04 1.039e+01 1130.6 <2e-16 ***
## Glass.Doors 4.448e+03 1.039e+01 428.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared: 0.908, Adjusted R-squared: 0.908
## F-statistic: 4.934e+05 on 10 and 499989 DF, p-value: < 2.2e-16
Berdasarkan summary model diatas, maka semua variabel prediktor dapat menjelaskan variansi dari variabel price sebesar 90,08 % dan angka ini cukup baik. Selain itu semua variabel prediktor signifikan secara statistik dalam menjelaskan variansi pada variabel target price.
Selanjutnya dilakukan prediksi harga price dengan menggunakan semua variabel prediktor
pred_model_house_interval <- predict(
object = model_house_clean_all,
newdata = house_clean,
interval = "prediction",
level = 0.95
)
head(pred_model_house_interval)
## fit lwr upr
## 1 48166.26 40966.42 55366.11
## 2 37670.29 30470.44 44870.14
## 3 45144.37 37944.53 52344.21
## 4 49959.03 42759.17 57158.89
## 5 47778.69 40578.84 54978.53
## 6 58923.15 51723.30 66122.99
Berdasarkan summary diatas dapat disimpulkan bahwa dengan confidence interval 95 %, untuk data di baris pertama, harga rumah di prediksi berada di range USD 40966 sampai USD 55366 dengan menggunakan semua variabel prediktor pada model model_house_clean_all
Berikutnya dilakukan Step Wise Regression untuk memilih variabel yang akan dilakukan sebagai prediksi harga rumah dan juga sebagai bahan rekomendasi dalam model improvment dalam melakukan regresi.
Pada tahap pertama akan dilakukan feature selection dengan metode backward untuk mendapat nilai AIC terbaik dengan cara mengurangi variabel prediktor
model_house_backward <- step(object = model_house_clean_all, direction = "backward", trace = 0)
summary(model_house_backward)
##
## Call:
## lm(formula = Prices ~ Area + Garage + FirePlace + Baths + Indian.Marble +
## Floors + City + Electric + Fiber + Glass.Doors, data = house_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4671 -4377 -87 4373 4669
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.059e+04 2.707e+01 391.3 <2e-16 ***
## Area 2.512e+01 7.236e-02 347.1 <2e-16 ***
## Garage 1.497e+03 6.359e+00 235.4 <2e-16 ***
## FirePlace 7.528e+02 3.674e+00 204.9 <2e-16 ***
## Baths 1.258e+03 3.673e+00 342.4 <2e-16 ***
## Indian.Marble -9.502e+03 1.101e+01 -862.9 <2e-16 ***
## Floors 1.500e+04 1.039e+01 1443.8 <2e-16 ***
## City 3.499e+03 6.365e+00 549.7 <2e-16 ***
## Electric 1.255e+03 1.039e+01 120.8 <2e-16 ***
## Fiber 1.175e+04 1.039e+01 1130.6 <2e-16 ***
## Glass.Doors 4.448e+03 1.039e+01 428.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared: 0.908, Adjusted R-squared: 0.908
## F-statistic: 4.934e+05 on 10 and 499989 DF, p-value: < 2.2e-16
Pada tahap pertama akan dilakukan feature selection dengan metode forward untuk mendapat nilai AIC terbaik dengan asumsi tidak ada variabel prediktor (regeresi dengan variabel target), kalu ditambahkan dengan variabel prediktor sampai mendapat AIC terbesar
#model tanpa prediktor
model_house_non <- lm(Prices ~ 1, house_clean)
# model forward
model_house_forward <- step(object = model_house_non, direction = "forward",scope = list(lower = model_house_non, upper = model_house_clean_all), trace = 0)
# Summary
summary(model_house_forward)
##
## Call:
## lm(formula = Prices ~ Floors + Fiber + Indian.Marble + City +
## Glass.Doors + Area + Baths + Garage + FirePlace + Electric,
## data = house_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4671 -4377 -87 4373 4669
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.059e+04 2.707e+01 391.3 <2e-16 ***
## Floors 1.500e+04 1.039e+01 1443.8 <2e-16 ***
## Fiber 1.175e+04 1.039e+01 1130.6 <2e-16 ***
## Indian.Marble -9.502e+03 1.101e+01 -862.9 <2e-16 ***
## City 3.499e+03 6.365e+00 549.7 <2e-16 ***
## Glass.Doors 4.448e+03 1.039e+01 428.1 <2e-16 ***
## Area 2.512e+01 7.236e-02 347.1 <2e-16 ***
## Baths 1.258e+03 3.673e+00 342.4 <2e-16 ***
## Garage 1.497e+03 6.359e+00 235.4 <2e-16 ***
## FirePlace 7.528e+02 3.674e+00 204.9 <2e-16 ***
## Electric 1.255e+03 1.039e+01 120.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3673 on 499989 degrees of freedom
## Multiple R-squared: 0.908, Adjusted R-squared: 0.908
## F-statistic: 4.934e+05 on 10 and 499989 DF, p-value: < 2.2e-16
Setelah melakukan dua metode diatas , selanjutnya dapat dibandingkan antara multiple R Squared dan RMSE untuk menentukan model yang terbaik
summary(model_house_backward)$adj.r.squared
## [1] 0.9079901
summary(model_house_forward)$adj.r.squared
## [1] 0.9079901
R squared antara dua model sama di 94,4% dimana kedua model memiliki variabel prediktor yang mampu menjelaskan 94.4 % variance dari variabel price sementara 0,05 % dijelaskan oleh variabel lain diluar model ini.
prediksi_house_backward <- predict(model_house_backward, newdata = house_clean)
prediksi_house_forward <- predict(model_house_forward, newdata = house_clean)
library(MLmetrics)
##
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
##
## Recall
RMSE(y_pred = prediksi_house_backward, y_true = house_clean$Prices)
## [1] 3673.375
RMSE(y_pred = prediksi_house_forward, y_true = house_clean$Prices)
## [1] 3673.375
Berdasarkan perhitungan diatas, dapat didapatkan insight kedua model memiliki RMSE dan R squared yang sama namun menghapus variabel swimming pool dan garden, jika dihubungkan dengan korelasi antar dua variabel prediktor tersebut ke variabel target maka kedua variabel tersebut tidak memiliki korelasi dengan price (corr = 0), sehingga model backward dan forward dapat dipilih antara keduanya
Selanjutnya adalah melakukan prediksi dengan model yang dipilih yaitu backward
house_clean$prediksi_backward <- prediksi_house_backward
head(house_clean)
## Area Garage FirePlace Baths Indian.Marble Floors City Electric Fiber
## 1 164 2 0 2 0 0 3 1 1
## 2 84 2 0 4 1 1 2 0 0
## 3 190 2 4 4 0 0 2 0 1
## 4 75 2 4 4 1 1 1 1 1
## 5 148 1 4 2 0 1 2 0 0
## 6 124 3 3 3 0 1 1 0 1
## Glass.Doors Prices prediksi_backward
## 1 1 43800 48166.26
## 2 1 37550 37670.29
## 3 0 49500 45144.37
## 4 1 50075 49959.03
## 5 1 52400 47778.69
## 6 1 54300 58923.15
##Model Evaluation
hist(model_house_backward$residuals)
shapiro.test(model_house_backward$residuals[0:"5000"])
##
## Shapiro-Wilk normality test
##
## data: model_house_backward$residuals[0:"5000"]
## W = 0.81338, p-value < 2.2e-16
Pada uji normalitas diatas dengan menggunakan Shapiro- Wilk, didapatkan p value yang lebih kecil dari 0,05 sehingga fail to reject to reject Ho sehingga error berdistribusi normal. berikut adalah hipotesis untuk uji normalitas
H0: residual berdistribusi normal
H1: residual tidak berdistribusi normal
1.Pada pembuatan model regresi untuk memprediksi harga rumah dengan atribut yanng ada,didapatkan multiple R squared sebesar 0,9048, dimana semua variabel prediktor dapat menjelaskan variance dari variabel prices sebesar 90,48 %
2.Semua variabel prediktor secara signifikan mempengaruhi variabel prices karena memiliki p value dibawah 0.05
3.Terdapat multicolinearity pada variabel White.Marble, Black Marble sehingga tidak sesuai asumsi dari linear regression sehingga perlu di take out dari model