Github: https://github.com/gabrielerichsonmrp/gehm_regression
Tujuan dari project ini adalah untuk memprediksi penjualan rumah di King County, Washington, AS menggunakan metode Linear Regression. Dataset terdiri dari data historis rumah yang dijual antara Mei 2014 hingga Mei 2015.
Data yang digunakan dapat didownload dari KC_Housesales_Data
#> Observations: 21,597
#> Variables: 21
#> $ id <dbl> 7129300520, 6414100192, 5631500400, 2487200875, 19544...
#> $ date <fct> 10/13/2014, 12/9/2014, 2/25/2015, 12/9/2014, 2/18/201...
#> $ price <dbl> 221900, 538000, 180000, 604000, 510000, 1230000, 2575...
#> $ bedrooms <int> 3, 3, 2, 4, 3, 4, 3, 3, 3, 3, 3, 2, 3, 3, 5, 4, 3, 4,...
#> $ bathrooms <dbl> 1.00, 2.25, 1.00, 3.00, 2.00, 4.50, 2.25, 1.50, 1.00,...
#> $ sqft_living <int> 1180, 2570, 770, 1960, 1680, 5420, 1715, 1060, 1780, ...
#> $ sqft_lot <int> 5650, 7242, 10000, 5000, 8080, 101930, 6819, 9711, 74...
#> $ floors <dbl> 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0...
#> $ waterfront <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
#> $ view <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,...
#> $ condition <int> 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4,...
#> $ grade <int> 7, 7, 6, 7, 8, 11, 7, 7, 7, 7, 8, 7, 7, 7, 7, 9, 7, 7...
#> $ sqft_above <int> 1180, 2170, 770, 1050, 1680, 3890, 1715, 1060, 1050, ...
#> $ sqft_basement <int> 0, 400, 0, 910, 0, 1530, 0, 0, 730, 0, 1700, 300, 0, ...
#> $ yr_built <int> 1955, 1951, 1933, 1965, 1987, 2001, 1995, 1963, 1960,...
#> $ yr_renovated <int> 0, 1991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
#> $ zipcode <int> 98178, 98125, 98028, 98136, 98074, 98053, 98003, 9819...
#> $ lat <dbl> 47.5112, 47.7210, 47.7379, 47.5208, 47.6168, 47.6561,...
#> $ long <dbl> -122.257, -122.319, -122.233, -122.393, -122.045, -12...
#> $ sqft_living15 <int> 1340, 1690, 2720, 1360, 1800, 4760, 2238, 1650, 1780,...
#> $ sqft_lot15 <int> 5650, 7639, 8062, 5000, 7503, 101930, 6819, 9711, 811...
Berdasarkan data diatas, dataset yang digunakan memiliki 500.000 observasi dan 15 variabel. Selain itu, Struktur data yang kita miliki sudah sesuai dengan kebutuhan.
Dari struktur data diatas terdapat data id dan date. Variabel id tidak memberi informasi yang cukup penting sehingga dapat diremove. kemudian untuk modelling kali ini kita tidak mempertimbangkan tahun penjualan karena data diambil dari Mei 2014 hingga Mei 2015 sehingga perubahan yang terjadi tidak signifikan.
Tidak ada missing value pada dataset ini.
#> price bedrooms bathrooms sqft_living sqft_lot
#> 0 0 0 0 0
#> floors waterfront view condition grade
#> 0 0 0 0 0
#> sqft_above sqft_basement yr_built yr_renovated zipcode
#> 0 0 0 0 0
#> lat long sqft_living15 sqft_lot15
#> 0 0 0 0
Pada data yang hanya bernilai 1 dan 0 menandakan 1 = “Iya” dan 0 = “Tidak”
| Area | Area rumah |
|---|---|
| Garage | Jumlah Garasi |
| FirePlace | Jumlah Perapin |
| Baths | Jumlah Kamar Mandi |
| White.Marble | Apakah menggunkan keramik “White Marble” |
| Black.Marble | Apakah menggunakan keramik “Black Marble” |
| Floors | Apakah lantai sudah diflooring |
| City | Lokasi Kota dari rumah |
| Solar | Apakah terdapat tenaga surya |
| Electric | Apakah terdapat listrik |
| Fiber | Apakah menggunakan Fiber |
| Glass.Doors | Apakah menggunakan pintu kaca |
| Swiming.Pool | Apakah terdapat kolam renang |
| Garden | Apakah terdapat taman |
| Prices | Harga rumah. variabel yang akan diprediksi dalam analisis ini. |
#> price bedrooms bathrooms sqft_living
#> Min. : 78000 Min. : 1.000 Min. :0.500 Min. : 370
#> 1st Qu.: 322000 1st Qu.: 3.000 1st Qu.:1.750 1st Qu.: 1430
#> Median : 450000 Median : 3.000 Median :2.250 Median : 1910
#> Mean : 540297 Mean : 3.373 Mean :2.116 Mean : 2080
#> 3rd Qu.: 645000 3rd Qu.: 4.000 3rd Qu.:2.500 3rd Qu.: 2550
#> Max. :7700000 Max. :33.000 Max. :8.000 Max. :13540
#> sqft_lot floors waterfront view
#> Min. : 520 Min. :1.000 Min. :0.000000 Min. :0.0000
#> 1st Qu.: 5040 1st Qu.:1.000 1st Qu.:0.000000 1st Qu.:0.0000
#> Median : 7618 Median :1.500 Median :0.000000 Median :0.0000
#> Mean : 15099 Mean :1.494 Mean :0.007547 Mean :0.2343
#> 3rd Qu.: 10685 3rd Qu.:2.000 3rd Qu.:0.000000 3rd Qu.:0.0000
#> Max. :1651359 Max. :3.500 Max. :1.000000 Max. :4.0000
#> condition grade sqft_above sqft_basement yr_built
#> Min. :1.00 Min. : 3.000 Min. : 370 Min. : 0.0 Min. :1900
#> 1st Qu.:3.00 1st Qu.: 7.000 1st Qu.:1190 1st Qu.: 0.0 1st Qu.:1951
#> Median :3.00 Median : 7.000 Median :1560 Median : 0.0 Median :1975
#> Mean :3.41 Mean : 7.658 Mean :1789 Mean : 291.7 Mean :1971
#> 3rd Qu.:4.00 3rd Qu.: 8.000 3rd Qu.:2210 3rd Qu.: 560.0 3rd Qu.:1997
#> Max. :5.00 Max. :13.000 Max. :9410 Max. :4820.0 Max. :2015
#> yr_renovated zipcode lat long
#> Min. : 0.00 Min. :98001 Min. :47.16 Min. :-122.5
#> 1st Qu.: 0.00 1st Qu.:98033 1st Qu.:47.47 1st Qu.:-122.3
#> Median : 0.00 Median :98065 Median :47.57 Median :-122.2
#> Mean : 84.46 Mean :98078 Mean :47.56 Mean :-122.2
#> 3rd Qu.: 0.00 3rd Qu.:98118 3rd Qu.:47.68 3rd Qu.:-122.1
#> Max. :2015.00 Max. :98199 Max. :47.78 Max. :-121.3
#> sqft_living15 sqft_lot15
#> Min. : 399 Min. : 651
#> 1st Qu.:1490 1st Qu.: 5100
#> Median :1840 Median : 7620
#> Mean :1987 Mean : 12758
#> 3rd Qu.:2360 3rd Qu.: 10083
#> Max. :6210 Max. :871200
ggcorr(house,label = T, size=3, label_size = 3, hjust=0.95)+
labs(
title="Correlation Matrix of Input Data"
)+
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=8,face="bold"),
axis.text.y=element_blank()
)Berdasarkan matriks korelasi dari data input diatas, setiap variabel mempunyai pengaruh terhadap Price kecuali condition dan longitude. Kemudian variabel yang memiliki korelasi paling tinggi dengan Price adalah sqft_living dan grade.
# length(boxplot(house$price)$out)
#house <- house %>% filter(!Prices %in% bx.plot.outlier)
ggplot(house, aes(x=price)) +
geom_histogram(aes(y=..density..), colour="black", fill="white")+
geom_density(alpha=.2, fill="#FF6666")+
labs(
title="Price Distribution exclude Outlier"
)+
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=9,face="bold"),
axis.text.y=element_text(margin = margin(l=5)),
axis.text.x.bottom = element_text(margin = margin(b=5))
)+
mycolor_fill()Jika dilihat terdapat cukup banyak data yang memiliki harga yang jauh lebih tinggi dari data lainnya sehingga menyebabkan distribusi penyebaran harga rumah tidak normal. Sehinga saya memutuskan untuk membuang data dengan harga yang lebih dari USD 200 juta karena jika dilihat dari chart distribusi diatas untuk data yang memiliki harga diatas USD 200 juta sangat sedikit. berikut hasilnya:
house_clean <- house %>%
filter(price < 2000000)
ggplot(house_clean, aes(x=price)) +
geom_histogram(aes(y=..density..), colour="black", fill="white",binwidth = 50000)+
geom_density(alpha=.2, fill="#FF6666")+
scale_x_continuous(name = "Price",
labels = dollar)+
labs(
title="Price Distribution < USD 200 Millions"
)+
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=9,face="bold"),
axis.text.y=element_text(margin = margin(l=5)),
axis.text.x.bottom = element_text(margin = margin(b=5))
)+
mycolor_fill()Saya membagi data train:test dengan proporso 80:20
# Train vs Test
set.seed(999)
idx_house <- sample(x=nrow(house_clean),size=nrow(house)*0.7)
house_train <- house_clean[idx_house,]
house_test <- house_clean[-idx_house,]Modelling menggunakan metode regresi Linear ini dilakukan untuk memprediksi harga dari suatu rumah (Prices).
Berdasarkan matriks korelasi sebelumnya, variabel sqft_living dan grade memiliki korelasi paling kuat dengan variabel Price. Mari kita coba:
Linear Regression with single predictor: sqft_living
#>
#> Call:
#> lm(formula = price ~ sqft_living, data = house_train)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -939043 -137911 -22388 100402 1328765
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 56708.704 4401.073 12.88 <0.0000000000000002 ***
#> sqft_living 224.911 1.976 113.83 <0.0000000000000002 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 209500 on 15115 degrees of freedom
#> Multiple R-squared: 0.4616, Adjusted R-squared: 0.4615
#> F-statistic: 1.296e+04 on 1 and 15115 DF, p-value: < 0.00000000000000022
Jika dilihat berdasarkan P-Value variabel sqft_living sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%
Linear Regression with single predictor: grade
#>
#> Call:
#> lm(formula = price ~ grade, data = house_train)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -546749 -136708 -29188 94792 1408292
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -798454 11613 -68.76 <0.0000000000000002 ***
#> grade 172520 1505 114.65 <0.0000000000000002 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 208800 on 15115 degrees of freedom
#> Multiple R-squared: 0.4651, Adjusted R-squared: 0.4651
#> F-statistic: 1.315e+04 on 1 and 15115 DF, p-value: < 0.00000000000000022
Jika dilihat berdasarkan P-Value variabel grade sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%.
Kesimpulan: Model Linear Regression menggunakan single predictor tidak cocok diterapkan untuk menentukan harga rumah pada dataset ini.
#>
#> Call:
#> lm(formula = price ~ ., data = house_train)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -814783 -86349 -10888 67453 1014703
#>
#> Coefficients: (1 not defined because of singularities)
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -2203718.12279 2653008.90515 -0.831 0.4062
#> bedrooms -15545.64862 1729.12554 -8.990 < 0.0000000000000002 ***
#> bathrooms 28440.64411 2987.08035 9.521 < 0.0000000000000002 ***
#> sqft_living 97.67100 4.11018 23.763 < 0.0000000000000002 ***
#> sqft_lot 0.25148 0.04900 5.132 0.0000002895341 ***
#> floors 30737.22022 3286.84541 9.352 < 0.0000000000000002 ***
#> waterfront 276282.06569 18291.16379 15.105 < 0.0000000000000002 ***
#> view 45197.38008 1967.14560 22.976 < 0.0000000000000002 ***
#> condition 30402.18238 2160.70713 14.070 < 0.0000000000000002 ***
#> grade 92262.74833 1995.77858 46.229 < 0.0000000000000002 ***
#> sqft_above 7.75236 4.03269 1.922 0.0546 .
#> sqft_basement NA NA NA NA
#> yr_built -2151.58881 66.59657 -32.308 < 0.0000000000000002 ***
#> yr_renovated 22.29191 3.37609 6.603 0.0000000000417 ***
#> zipcode -399.19511 29.94200 -13.332 < 0.0000000000000002 ***
#> lat 587905.36296 9765.15490 60.204 < 0.0000000000000002 ***
#> long -138904.55063 11928.56379 -11.645 < 0.0000000000000002 ***
#> sqft_living15 45.97308 3.21390 14.304 < 0.0000000000000002 ***
#> sqft_lot15 -0.28530 0.06913 -4.127 0.0000369031984 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 152800 on 15099 degrees of freedom
#> Multiple R-squared: 0.7137, Adjusted R-squared: 0.7134
#> F-statistic: 2214 on 17 and 15099 DF, p-value: < 0.00000000000000022
Hasil summary dari model lm_house_all memberikan banyak informasi. nilai Estimate menginterpretasikan nilai setiap koefisien, misalnya apabila rumah memiliki waterfront maka akan berkontribusi pada kenaikan harga rumah sebesar USD 276282.06. Tapi kalau dilihat yang aneh pada variabel bedrooms, jika jumlah kamar bertambah 1 maka harga rumah berkuran sebesar USD -15545.64, apakah didaerah sana orang gak suka kamar banyak? :)
Mari melihat nilai dari Pr(>|t|), nilai ini menunjukan seberapa besar suatu variabel berpengaruh untuk memprediksi Prices. jika nilainya Pr(>|t|) dibawah 0.05 maka dapat diasumsikan bahwa variabel memiliki pengaruh signifikan dan sebaliknya. Berdasarkan summary model diatas, variabel sqft_above dan sqft_basement memilki nilai P Value > 0.05 bahkan NA Value, sehingga variabel ini dapat di exclude dari prediktor. Namun saya masih kurang mengerti untuk mendektsi singularitas pada variabel sqft_basement, next saya update terkait ini.
Selain itu, jika dilihat nilai Adjusted R-squared:0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, tapi coba kita selesaikan.
#> Start: AIC=360919.5
#> price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors +
#> waterfront + view + condition + grade + sqft_above + sqft_basement +
#> yr_built + yr_renovated + zipcode + lat + long + sqft_living15 +
#> sqft_lot15
#>
#>
#> Step: AIC=360919.5
#> price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors +
#> waterfront + view + condition + grade + sqft_above + yr_built +
#> yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15
#>
#> Df Sum of Sq RSS AIC
#> <none> 352569764618921 360920
#> - sqft_above 1 86292753269 352656057372190 360921
#> - sqft_lot15 1 397765471958 352967530090879 360935
#> - sqft_lot 1 615102445269 353184867064190 360944
#> - yr_renovated 1 1018037330628 353587801949549 360961
#> - bedrooms 1 1887389454602 354457154073523 360998
#> - floors 1 2042055310253 354611819929173 361005
#> - bathrooms 1 2116810239119 354686574858039 361008
#> - long 1 3166310589734 355736075208655 361053
#> - zipcode 1 4150550166874 356720314785795 361094
#> - condition 1 4622900972379 357192665591300 361114
#> - sqft_living15 1 4777917079792 357347681698713 361121
#> - waterfront 1 5327452570036 357897217188957 361144
#> - view 1 12326801207736 364896565826656 361437
#> - sqft_living 1 13185823472395 365755588091316 361473
#> - yr_built 1 24373155402529 376942920021450 361928
#> - grade 1 49902803183870 402472567802791 362919
#> - lat 1 84635672813050 437205437431971 364170
#>
#> Call:
#> lm(formula = price ~ bedrooms + bathrooms + sqft_living + sqft_lot +
#> floors + waterfront + view + condition + grade + sqft_above +
#> yr_built + yr_renovated + zipcode + lat + long + sqft_living15 +
#> sqft_lot15, data = house_train)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -814783 -86349 -10888 67453 1014703
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -2203718.12279 2653008.90515 -0.831 0.4062
#> bedrooms -15545.64862 1729.12554 -8.990 < 0.0000000000000002 ***
#> bathrooms 28440.64411 2987.08035 9.521 < 0.0000000000000002 ***
#> sqft_living 97.67100 4.11018 23.763 < 0.0000000000000002 ***
#> sqft_lot 0.25148 0.04900 5.132 0.0000002895341 ***
#> floors 30737.22022 3286.84541 9.352 < 0.0000000000000002 ***
#> waterfront 276282.06569 18291.16379 15.105 < 0.0000000000000002 ***
#> view 45197.38008 1967.14560 22.976 < 0.0000000000000002 ***
#> condition 30402.18238 2160.70713 14.070 < 0.0000000000000002 ***
#> grade 92262.74833 1995.77858 46.229 < 0.0000000000000002 ***
#> sqft_above 7.75236 4.03269 1.922 0.0546 .
#> yr_built -2151.58881 66.59657 -32.308 < 0.0000000000000002 ***
#> yr_renovated 22.29191 3.37609 6.603 0.0000000000417 ***
#> zipcode -399.19511 29.94200 -13.332 < 0.0000000000000002 ***
#> lat 587905.36296 9765.15490 60.204 < 0.0000000000000002 ***
#> long -138904.55063 11928.56379 -11.645 < 0.0000000000000002 ***
#> sqft_living15 45.97308 3.21390 14.304 < 0.0000000000000002 ***
#> sqft_lot15 -0.28530 0.06913 -4.127 0.0000369031984 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 152800 on 15099 degrees of freedom
#> Multiple R-squared: 0.7137, Adjusted R-squared: 0.7134
#> F-statistic: 2214 on 17 and 15099 DF, p-value: < 0.00000000000000022
Metode Stepwise akan menyeleksi variabel-variabel yang memilki pengaruh signifikan terhadap prediktor. Lihat bagian Step: AIC=360919.5, semakin kecil nilai AIC, maka semakin disarankan variabel prediktor yang dipilih dan nilai AIC paling kecil berada dibagian paling bawah tampilan. Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:
Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:
Formula:
lm(price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + waterfront + view + condition + grade + sqft_above + yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15, data=house_train)
Cara evaluasi model di kasus regresi dapat menggunakan beberapa matriks penilaian, antara lain:
R-squared & Adjusted R-squared
* Model yang dibuat menggunakan multiple predictor sehingga nilai yang baik diinterpretasikan adalah nilai Adjusted R-squared. model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, akan dicoba lagi menggunakan metode lain dikesempatan berikutnya.
Error
* Mean Absolute Error (MAE): Paling mudah untuk di interpretasikan karena dibandingkan dengan satuan data aktual.
* Mean Absolute Percentage Error (MAPE): Punya interval untuk seberapa baik model kita. (0 sd 100%). NamuN MAPE terdapat batasan, apabila pada data aktual memiliki nilai 0, MAPE akan inf.
* Root Mean Square Error (RMSE): Baik digunakan untuk data2 yang nilai fluktuatif.
Berikut pengujian error model ini:
MAE <- MAE(
y_pred = predict(lm_house_all,house_test),
y_true = house_test$price
)
MAPE <- MAPE(
y_pred = predict(lm_house_all,house_test),
y_true = house_test$price
)
RMSE <- RMSE(
y_pred = predict(lm_house_all,house_test),
y_true = house_test$price
)
data.frame("MAE"=MAE,"MAPE"=MAPE, "RMSE"=RMSE)Hasil pengujian error menggunakan 3 metode diatas menunjukan nilainya kurang cukup baik, dimana semakin kecil nilai error maka semakin baik model yang dibuat. Jika berdasarkan nilai MAE, maka model ini memiliki error kurang lebih sekitar USD 106.946.
1. Linearity
linearity <- data.frame(residual = lm_house_model$residuals, fitted = house_train$price)
linearity %>%
ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = lm) +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=9,face="bold"),
axis.text.y=element_text(margin = margin(l=5)),
axis.text.x.bottom = element_text(margin = margin(b=5))
)+
mycolor_color()Berdasarkan pengujian linearity terlihat bahwa model yang dibuat belum berhasil menangkap variansi data dengan baik, terlihat error atau jarak data dari mean cukup jauh.
2. Normality Residual
#>
#> Shapiro-Wilk normality test
#>
#> data: lm_house_model$residuals[0:5000]
#> W = 0.91304, p-value < 0.00000000000000022
#>
#> Anderson-Darling normality test
#>
#> data: lm_house_model$residuals
#> A = 217.41, p-value < 0.00000000000000022
Hipotesis:
- H0: Residual berdistribusi normal
- H1: Residual tidak berdistribusi normal
Kesimpulan Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model tidak berdistribusi normal.
3. No-Heteroscedasticity
#>
#> studentized Breusch-Pagan test
#>
#> data: lm_house_model
#> BP = 1920.3, df = 17, p-value < 0.00000000000000022
linearity <- data.frame(residual = lm_house_model$residuals, fitted = house_train$price)
linearity %>%
ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = "h") +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=9,face="bold"),
axis.text.y=element_text(margin = margin(l=5)),
axis.text.x.bottom = element_text(margin = margin(b=5))
)+
mycolor_color()Hipotesis:
- H0: Data residual Homogen (tidak membentuk sebuah pola)
- H1: Data residual heteros (membentuk sebuah pola)
Kesimpulan
Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model bersifat heteros, dapat dilihat membentuk sebuah pola.
4. No-Multicollinearity
Tidak terdapat Multicollinearity dari variabel yang digunakan pada model.
#> bedrooms bathrooms sqft_living sqft_lot floors
#> 1.644960 3.212349 8.130736 2.264065 2.039732
#> waterfront view condition grade sqft_above
#> 1.154350 1.354526 1.255650 3.283318 6.648321
#> yr_built yr_renovated zipcode lat long
#> 2.461627 1.148428 1.662262 1.188152 1.846180
#> sqft_living15 sqft_lot15
#> 2.977752 2.268754
Berikut data hasil prediksi Price terhadap data test.
price : Harga asli
predict.fit : hasil prediksi fit value
predict.lower : hasil prediksi prekiraan harga terendah
predict.upper : hasil prediksi perkiraan harga tertinggi
predict_price <- predict(
lm_house_model,
house_test,
interval = "confidence",
level = 0.95
)
house_predict <- cbind(house_test,predict_price)
house_predict %>%
select(
price, predict.fit=fit, predict.lower=lwr, predict.upper=upr, bedrooms, bathrooms, sqft_living, sqft_lot, floors, waterfront, view, condition, grade, sqft_above, yr_built, yr_renovated, zipcode, lat, long, sqft_living15, sqft_lot15)Model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Kemudian Hasil pengujian error menggunakan metode MAE menunjukan error kurang lebih sekitar USD 106.946. Pada pengujian asumsi, model ini hanya berhasil melewati pengujian Multicollinearity sedangkan pada gagal dalam pengujian Linearity, Normality dan Heteroscedasticity. Kesimpulannya, model ini masih kurang baik jika hendak digunakan untuk memprediksi harga rumah terkait dataset ini. Saya akan coba melakukan tunning atau menggunakan metode lainnya di kesempatan selanjutnya.