Sebuah survey telah menerbitkan peringkat restoran untuk berbagai lokasi di sebuah kota. Survey tersebut menghasilkan sebuah data yang berisi rating rasa makanan, rating dekorasi, rating pelayanan, dan harga makanan rata-rata dari sampel dari 50 restoran di pinggiran kota dan 50 restoran di pusat kota.Total data yang dikumpulkan adalah 100 restoran.
Model regresi akan dikembangkan untuk memprediksi harga makanan rata-rata. Berdasarkan variabel yang mewakili rating rasa makanan, rating dekorasi, ratting pelayanan dan variabel dummy terkait lokasi (area pinggiran kota versus pusat kota).
# chunk options
knitr::opts_chunk$set(
message = FALSE,
warning = FALSE,
fig.align = "center",
comment = "#>"
)
# scientific notation
options(scipen = 9999)
# import libs
library(tidyverse)
library(lubridate)
library(GGally)
library(MLmetrics)
library(lmtest)
library(car)
library(plotly)
Mengimpor dataset yang akan digunakan dan memberi nama variabel
restaurant <- read.csv("Restaurants.csv")
names(restaurant) <- c("price", "decor", "service", "taste", "location")
restaurant
Deskripsi variabelnya adalah: - price: harga makanan rata-rata dalam satuan ribu rupiah. - decor: rating dekorasi restoran skala 1 sampai 5. - service: rating pelayanan restoran skala 1 sampai 5. - taset: rating rasa makanan skala 1 sampai 5. - location: lokasi restoran dengan nilai 0 untuk area pinggiran kota dan 1 untuk pusat kota.
glimpse(restaurant)
#> Rows: 100
#> Columns: 5
#> $ price <int> 81, 28, 24, 38, 45, 49, 36, 60, 50, 41, 84, 64, 78, 57, 80...
#> $ decor <dbl> 3.57, 2.50, 2.50, 3.75, 3.39, 3.57, 3.57, 3.39, 3.04, 4.11...
#> $ service <dbl> 4.26, 3.52, 2.96, 3.52, 3.89, 3.70, 4.26, 4.07, 3.70, 3.33...
#> $ taste <dbl> 4.07, 3.27, 3.21, 3.77, 3.83, 3.95, 4.14, 4.01, 3.70, 3.83...
#> $ location <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
Seluruh data bersifat numerik. Jadi tidak perlu ada transformasi data.
colSums(is.na(restaurant))
#> price decor service taste location
#> 0 0 0 0 0
Dataset yang akan diproses tidak ada missing data
summary(restaurant)
#> price decor service taste location
#> Min. :23.00 Min. :1.610 Min. :2.590 Min. :2.840 Min. :0.0
#> 1st Qu.:39.75 1st Qu.:3.167 1st Qu.:3.700 1st Qu.:3.700 1st Qu.:0.0
#> Median :48.00 Median :3.570 Median :3.890 Median :3.950 Median :0.5
#> Mean :49.78 Mean :3.491 Mean :3.895 Mean :3.922 Mean :0.5
#> 3rd Qu.:57.25 3rd Qu.:3.750 3rd Qu.:4.117 3rd Qu.:4.140 3rd Qu.:1.0
#> Max. :91.00 Max. :5.000 Max. :5.000 Max. :5.000 Max. :1.0
Berikut adalah visualisasi nilai korelasi antar variabel
ggcorr(restaurant, label = TRUE, label_size = 2.9, hjust = 1, layout.exp = 2)
Dari visualisasi korelasi antar variabel, dapat dilihat bahwa rating dekorasi restoran dan rating rasa makanan memiliki korelasi yang sangat tinggi yaitu 0,9. Artinya restoran yang memiliki dekorasi yang bagus hampir dapat dipastikan memiliki rasa yang enak. Selain itu ada korelasi yang tinggi antara rating pelayanan dan dengan rating rasa makanan. Bisa disimpulkan bahwa restoran yang memiliki pelayanan bagus, bisa dipastikan memiliki rasa yang enak. Insight lain yang bisa didapat adalah ada korelasi positif antara harga makanan rata-rata dengan rating dekorasi, rating pelayanan dan rating rasa makanan.
Pada bagian ini akan dibuat model regresi linear berganda untuk memprediksi harga makanan rata-rata dengan variabel prediktor rating dekorasi, rating pelayanan, rating rasa makanan, dan lokasi restoran. Pemilihan faktor/prediktor yang digunakan pada analisis regresi dapat dilakukan dengan: 1. Bisnis knowledge 2. Statistics tools
Tahapan Step-Wise Regression adalah:
Membuat baseline model dengan menggunakan semua variabel prediktor, kemudian pilih prediktor yang signifikan berpengaruh terhadap target
Memilih prediktor berdasarkan hasil pengolahan dan perhitungan step-wise regression. Step-wise regression menggunakan nilai AIC sebagai pembanding.
Stepwise membantu kita memilih predikotr yang ‘baik’ untuk model kita berdasarkan nilai AIC (Akaike’s Information Criterion). AIC adalah jumlah information loss. Model yang memiliki AIC paling rendah akan dipilih sebagai model prediksi.
# model tanpa prediktor
model_none <- lm(price ~ 1, data = restaurant)
# model dengan semua prediktor
model_all <- lm(price ~ ., data = restaurant)
Secara default fungsi step() akan melakukan step-wise regression dengan metode “backward” jika model awal yang di input adalah model linier regresi dengan semua prediktor
Backward elimination melakukan pengurangan prediktor (membuang prediktor dari yang paling tidak signifikan mempengaruhi target) dari model yang mencakup seluruh prediktor
backward <- step(object = model_all, direction = "backward")
#> Start: AIC=474.13
#> price ~ decor + service + taste + location
#>
#> Df Sum of Sq RSS AIC
#> - decor 1 49.5 10417 472.60
#> - taste 1 156.3 10524 473.62
#> <none> 10367 474.13
#> - service 1 320.0 10688 475.17
#> - location 1 4098.0 14465 505.43
#>
#> Step: AIC=472.6
#> price ~ service + taste + location
#>
#> Df Sum of Sq RSS AIC
#> <none> 10417 472.60
#> - service 1 302.1 10719 473.46
#> - taste 1 1531.9 11949 484.32
#> - location 1 4211.9 14629 504.56
Backward stepwise akan membuang variabel yang membuat nilai AIC menjadi paling kecil. Dari hasil tersebut, model regresi terbaik adalah model yang menggunakan variabel prediktor rating pelayanan, rating rasa makanan dan lokasi restoran
Forward selection melakukan penambahan prediktor (menambah prediktor dari yang paling signifikan mempengaruhi target) dari model tanpa prediktor
forward <- step(object = model_none, direction = "forward", scope = list(lower=model_none, upper=model_all))
#> Start: AIC=548.6
#> price ~ 1
#>
#> Df Sum of Sq RSS AIC
#> + taste 1 8606.0 15045 505.36
#> + service 1 8014.6 15637 509.22
#> + decor 1 6099.4 17552 520.77
#> + location 1 2642.0 21009 538.75
#> <none> 23651 548.60
#>
#> Step: AIC=505.36
#> price ~ taste
#>
#> Df Sum of Sq RSS AIC
#> + location 1 4326.2 10719 473.46
#> + service 1 416.4 14629 504.56
#> <none> 15045 505.36
#> + decor 1 9.0 15036 507.30
#>
#> Step: AIC=473.46
#> price ~ taste + location
#>
#> Df Sum of Sq RSS AIC
#> + service 1 302.080 10417 472.60
#> <none> 10719 473.46
#> + decor 1 31.519 10688 475.17
#>
#> Step: AIC=472.6
#> price ~ taste + location + service
#>
#> Df Sum of Sq RSS AIC
#> <none> 10417 472.60
#> + decor 1 49.452 10367 474.13
Forward stepwise akan membuang variabel yang membuat nilai AIC menjadi paling kecil. Dari hasil tersebut, model regresi terbaik adalah model yang menggunakan variabel prediktor rating pelayanan, rating rasa makanan dan lokasi restoran.
model_best <- lm(price ~ taste+location+service, data = restaurant)
summary(model_best)
#>
#> Call:
#> lm(formula = price ~ taste + location + service, data = restaurant)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -27.720 -7.004 -0.900 4.702 34.823
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -67.874 11.539 -5.882 0.0000000589 ***
#> taste 20.316 5.407 3.757 0.000295 ***
#> location 13.137 2.109 6.230 0.0000000123 ***
#> service 8.063 4.833 1.669 0.098474 .
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 10.42 on 96 degrees of freedom
#> Multiple R-squared: 0.5596, Adjusted R-squared: 0.5458
#> F-statistic: 40.65 on 3 and 96 DF, p-value: < 0.00000000000000022
Tiga prediktor yaitu: taste, location, service dapat menggambarkan 54.58% dari harga rata-rata makanan (price). Variabel taste dan location memiliki pengaruh yang signifikan terhadap harga rata-rata makanan. Sedangkan rating pelayanan (service) tidak berpengaruh signifikan sebagai prediktor harga rata-rata makanan (price)
Untuk memprediksi harga rata-rata makanan berdasarkan hasil regresi yang terbentuk, variabel rating rasa makanan dan lokasi restoran secara signifikan bisa bertindah sebagai prediktor harga rata-rata makanan. Sedangkan variabel rating pelayanan tidak signifikan sebagai prediktor harga rata-rata makanan.
Restoran yang berada di pusat kota akan memiliki harga yang lebih mahal sebesar Rp. 8.063.
Selain itu restoran yang memiliki rating lebih tinggi satu point diprediksi akan memiliki harga yang lebih mahal sebesar Rp. 20.316.
Dari hasil analisis regresi ini, rating rasa makan dan lokasi restoran berpengaruh signifikan terhadap harga rata-rata makanan di sebuah restoran.
Restoran bisa menaikkan harga makanan untuk meningkatkan margin bisnis jika sudah berhasil menaikkan rating rasa makanan. Walaupun rating pelayanan tidak berpengaruh secara signifikan, namun restoran harus tetap mempertahankan kualitas pelayanannya selain kualitas rasa makanan Berbicara masalah lokasi bisnis restoran, jika restoran menjual harga makanan yang lebih murah, maka direkomendasikan membuka restoran di pinggiran kota.
Pengujian normality error dilakukan dengan cara:
Dalam pengujian normality error, kita akan membuat visualisasi error.
hist(model_best$residuals)
Berdasarkan dari visualisasi histogram, residual (error) terdistribusi secara normal
Pengujian distribusi error bisa dilakukan dengan cara uni statistik menggunakan fungsi shapiro.test().
Shapiro-Wilk hypothesis:
shapiro.test(model_best$residuals)
#>
#> Shapiro-Wilk normality test
#>
#> data: model_best$residuals
#> W = 0.96674, p-value = 0.01251
Yang kita butuhkan dalah p-value > 0.05 Hasil meninjukkan bahwa P-value > 0.05. Maka H0 diterima dan error/residual berdistribusi normal.
Homoscedasticity adalah suatu keadaan dimana residual (error) variance adalah sama pada setiap level variabel independen. Pengujian homoscefascity dilakukan dengan cara:
plot(model_best$fitted.values, model_best$residuals)
abline(h=0, col = "red")
Pada visualisasi plot residual vs fitted values, telah terlihat bahwa residual menyebar secara merata dan tidak membentuk sebuah pola. Untuk lebih akurat, kita akan menggunakan uji Breusch-Pagan untuk menguji Homoscedasticity
Kita akan menggunakan menggunakan fungsi bptest() dari library lmtest
Breusch-Pagan hypothesis:
library(lmtest)
bptest(model_best)
#>
#> studentized Breusch-Pagan test
#>
#> data: model_best
#> BP = 2.0946, df = 3, p-value = 0.553
Homoscedasticity terjadi ketika p-value > 0.05. Hasil menunjukkan bahwa P-value > 0.05. Maka dari hasil tersebut terima H0. Maka residual bersifat homoscedasticity.
Mulitcolinearity adalah antar prediktor saling berkorelasi signifikan. Persamaan regresi tidak boleh ada multicolinearity.
Pengujian dilakukan dengan menghitung nilai vif menggunakan function vif() dari library car. Ketika nilai VIF lebih kecil dari 10, asumsi no-multicolinearity terpenuhi.
Rule of thumb: variabel yang mengalami multicolinearity jika nilai VIF > 10
library(car)
vif(model_best)
#> taste location service
#> 3.624903 1.024348 3.582693
Dari hasil pengujian Multicolinearity, tidak terjadi multicolinearity karena VIF < 10