Halo, dalam LBB kali ini saya ingin melakukan prediksi menggunakan regression model. Dataset pada project kali ini saya dapatkan dari https://www.kaggle.com/mohansacharya/graduate-admissions. Let’s get started!
Pada project LBB kali ini kita akan menggunakan library berikut:
#library yang digunakan
library(dplyr)
library(GGally)
library(caret)
library(car)
library(MLmetrics)
library(lmtest)
options(scipen = 9999)
Setelah itu mari kita read data yang akan digunakan.
admission <- read.csv("Admission_Predict.csv")
head(admission)
#cek tipe data
glimpse(admission)
## Rows: 400
## Columns: 9
## $ Serial.No. <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1~
## $ GRE.Score <int> 337, 324, 316, 322, 314, 330, 321, 308, 302, 323, 32~
## $ TOEFL.Score <int> 118, 107, 104, 110, 103, 115, 109, 101, 102, 108, 10~
## $ University.Rating <int> 4, 4, 3, 3, 2, 5, 3, 2, 1, 3, 3, 4, 4, 3, 3, 3, 3, 3~
## $ SOP <dbl> 4.5, 4.0, 3.0, 3.5, 2.0, 4.5, 3.0, 3.0, 2.0, 3.5, 3.~
## $ LOR <dbl> 4.5, 4.5, 3.5, 2.5, 3.0, 3.0, 4.0, 4.0, 1.5, 3.0, 4.~
## $ CGPA <dbl> 9.65, 8.87, 8.00, 8.67, 8.21, 9.34, 8.20, 7.90, 8.00~
## $ Research <int> 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1~
## $ Chance.of.Admit <dbl> 0.92, 0.76, 0.72, 0.80, 0.65, 0.90, 0.75, 0.68, 0.50~
The dataset contains several parameters which are considered important during the application for Masters Programs. The parameters included are :
GRE Scores
( out of 340 )TOEFL Scores
( out of 120 )University Rating
( out of 5 )Statement of Purpose and Letter of Recommendation Strength
( out of 5 )Undergraduate GPA
( out of 10 )Research Experience
( either 0 or 1 )Chance of Admit
( ranging from 0 to 1 )
Karena kolom Serial.No.
tidak memberi informasi apapun, mari kita hapus.
# membuang serial number
admission <- admission %>%
select(-Serial.No.)
head(admission)
Setelah itu mari kita cek apakah ada missing values dari data kita atau tidak.
#cek missing value
colSums(is.na(admission))
## GRE.Score TOEFL.Score University.Rating SOP
## 0 0 0 0
## LOR CGPA Research Chance.of.Admit
## 0 0 0 0
table(is.na(admission))
##
## FALSE
## 3200
Ternyata data admission tidak memiliki missing values, mari lanjut ke proses berikutnya.
## Cek Korelasi antar Kolom
# cek korelasi data
ggcorr(admission, label = T)
Dari hasil ggcorr
terlihat bahwa seluruh kolom memiliki hubungan yang kuat dengan variabel target kita Chance.of.Admit
.
summary(admission)
## GRE.Score TOEFL.Score University.Rating SOP
## Min. :290.0 Min. : 92.0 Min. :1.000 Min. :1.0
## 1st Qu.:308.0 1st Qu.:103.0 1st Qu.:2.000 1st Qu.:2.5
## Median :317.0 Median :107.0 Median :3.000 Median :3.5
## Mean :316.8 Mean :107.4 Mean :3.087 Mean :3.4
## 3rd Qu.:325.0 3rd Qu.:112.0 3rd Qu.:4.000 3rd Qu.:4.0
## Max. :340.0 Max. :120.0 Max. :5.000 Max. :5.0
## LOR CGPA Research Chance.of.Admit
## Min. :1.000 Min. :6.800 Min. :0.0000 Min. :0.3400
## 1st Qu.:3.000 1st Qu.:8.170 1st Qu.:0.0000 1st Qu.:0.6400
## Median :3.500 Median :8.610 Median :1.0000 Median :0.7300
## Mean :3.453 Mean :8.599 Mean :0.5475 Mean :0.7244
## 3rd Qu.:4.000 3rd Qu.:9.062 3rd Qu.:1.0000 3rd Qu.:0.8300
## Max. :5.000 Max. :9.920 Max. :1.0000 Max. :0.9700
Pada bagian ini saya akan membuat 2 model. Model pertama model_1
hanya menggunakan GRE.Score dan CGPA sebagai prediktor dan model kedua model_final
akan menggunakan seluruh kolom dari data sebagai prediktor.
#membuat model dengan dua prediktor
model_1 <- lm(Chance.of.Admit ~ GRE.Score + CGPA, data = admission)
summary(model_1)
##
## Call:
## lm(formula = Chance.of.Admit ~ GRE.Score + CGPA, data = admission)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.293413 -0.026336 0.007763 0.041295 0.150368
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.6175126 0.1061195 -15.242 < 0.0000000000000002 ***
## GRE.Score 0.0030507 0.0005276 5.782 0.000000015 ***
## CGPA 0.1599486 0.0101522 15.755 < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06689 on 397 degrees of freedom
## Multiple R-squared: 0.7811, Adjusted R-squared: 0.78
## F-statistic: 708.2 on 2 and 397 DF, p-value: < 0.00000000000000022
# membuat model dengan seluruh prediktor
model_final <- lm(Chance.of.Admit ~ ., data = admission)
summary(model_final)
##
## Call:
## lm(formula = Chance.of.Admit ~ ., data = admission)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.26259 -0.02103 0.01005 0.03628 0.15928
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.2594325 0.1247307 -10.097 < 0.0000000000000002 ***
## GRE.Score 0.0017374 0.0005979 2.906 0.00387 **
## TOEFL.Score 0.0029196 0.0010895 2.680 0.00768 **
## University.Rating 0.0057167 0.0047704 1.198 0.23150
## SOP -0.0033052 0.0055616 -0.594 0.55267
## LOR 0.0223531 0.0055415 4.034 0.000066 ***
## CGPA 0.1189395 0.0122194 9.734 < 0.0000000000000002 ***
## Research 0.0245251 0.0079598 3.081 0.00221 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06378 on 392 degrees of freedom
## Multiple R-squared: 0.8035, Adjusted R-squared: 0.8
## F-statistic: 228.9 on 7 and 392 DF, p-value: < 0.00000000000000022
Ternyata dari hasil summary kedua model di atas, yang paling baik adalah model_final
dimana mendapat nilai Adjusted R-squared sebesar 0.8 yang artinya model_final
memiliki kemampuan menangkap 80% dari data yang diperlukan saat akan melakukan prediksi. Sementara itu, model_1
hanya mampu menangkap 78% informasi dari data, dilihat dari Adjusted R-square yang sebesar 0.78.
Setelah mengetahui bahwa model_final memiliki performa lebih baik, mari kita masukkan model final menjadi model_step
dan lihat apakah setelah dilakukan proses step()
menjadi lebih baik atau tidak.
model_step <- step(model_final)
## Start: AIC=-2193.9
## Chance.of.Admit ~ GRE.Score + TOEFL.Score + University.Rating +
## SOP + LOR + CGPA + Research
##
## Df Sum of Sq RSS AIC
## - SOP 1 0.00144 1.5962 -2195.5
## - University.Rating 1 0.00584 1.6006 -2194.4
## <none> 1.5948 -2193.9
## - TOEFL.Score 1 0.02921 1.6240 -2188.6
## - GRE.Score 1 0.03435 1.6291 -2187.4
## - Research 1 0.03862 1.6334 -2186.3
## - LOR 1 0.06620 1.6609 -2179.6
## - CGPA 1 0.38544 1.9802 -2109.3
##
## Step: AIC=-2195.54
## Chance.of.Admit ~ GRE.Score + TOEFL.Score + University.Rating +
## LOR + CGPA + Research
##
## Df Sum of Sq RSS AIC
## - University.Rating 1 0.00464 1.6008 -2196.4
## <none> 1.5962 -2195.5
## - TOEFL.Score 1 0.02806 1.6242 -2190.6
## - GRE.Score 1 0.03565 1.6318 -2188.7
## - Research 1 0.03769 1.6339 -2188.2
## - LOR 1 0.06983 1.6660 -2180.4
## - CGPA 1 0.38660 1.9828 -2110.8
##
## Step: AIC=-2196.38
## Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + CGPA + Research
##
## Df Sum of Sq RSS AIC
## <none> 1.6008 -2196.4
## - TOEFL.Score 1 0.03292 1.6338 -2190.2
## - GRE.Score 1 0.03638 1.6372 -2189.4
## - Research 1 0.03912 1.6400 -2188.7
## - LOR 1 0.09133 1.6922 -2176.2
## - CGPA 1 0.43201 2.0328 -2102.8
summary(model_step, direction = "backward")
##
## Call:
## lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR +
## CGPA + Research, data = admission)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.263542 -0.023297 0.009879 0.038078 0.159897
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.2984636 0.1172905 -11.070 < 0.0000000000000002 ***
## GRE.Score 0.0017820 0.0005955 2.992 0.00294 **
## TOEFL.Score 0.0030320 0.0010651 2.847 0.00465 **
## LOR 0.0227762 0.0048039 4.741 0.00000297 ***
## CGPA 0.1210042 0.0117349 10.312 < 0.0000000000000002 ***
## Research 0.0245769 0.0079203 3.103 0.00205 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06374 on 394 degrees of freedom
## Multiple R-squared: 0.8027, Adjusted R-squared: 0.8002
## F-statistic: 320.6 on 5 and 394 DF, p-value: < 0.00000000000000022
Ternyata hasil model_step
tidak berbeda jauh dari model_final
, namun model_step
sedikit lebih baik dalam menangkap informasi dari data yaitu sebesar 80.02%. Maka untuk melakukan prediksi kita akan menggunakan model_step
.
# Evaluasi Model
Performa model dapat dihitung dengan menggunakan RMSE (root mean squared error). RMSE adalah bentuk akar kuadrat dari MSE. Karena sudah diakarkan, maka interpretasinya kurang lebih sama dengan MAE. RMSE dapat digunakan jika kita lebih concern dengan error yang sangat besar.
\[
RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2}
\]
Sebelum melakukan RMSE, kita lakukan prediksi model_step terhadap data awalnya menggunakan fungsi predict. Lalu hasil prediksi di assign ke variabel baru agar bisa dilakukan perbandingan terhadap data aktual.
pred <- predict(model_step, newdata = admission)
model_new <- admission %>%
mutate(prediction = pred,
prediction = pred)
RMSE(model_new$prediction, model_new$Chance.of.Admit)
## [1] 0.06326207
Dari hasil RMSE didapat bahwa kemungkinan error yang terjadi dari perdiksi adalah sebesar 0.0633 secara rata-rata.
MAPE(model_new$prediction, model_new$Chance.of.Admit)
## [1] 0.07317295
Dilihat dari hasil MAPE di atas, kemungkinan model regresi mengalami error atau melenceng dalam melakukan prediksi adalah sebesar 7.32%.
Linearity artinya target variabel dengan prediktornya memiliki hubungan yang linear atau hubungannya bersifat garis lurus. Selain itu, efek atau nilai koefisien antar variabel bersifat additive (y = a + b x1 + b x2 + …). Jika linearity ini tidak terpenuhi, maka otomatis semua nilai koefisien yang kita dapatkan tidak valid karena model berasumsi bahwa pola yang akan kita buat adalah linear. Selain itu, prediksi yang dihasilkan juga kurang akurat.
Hubungan linear antara target dan prediktor juga dapat dilihat melalui korelasi antar variabelnya. Jika korelasinya rendah, maka hubungannya tidak linear.
data.frame(prediksi = model_step$fitted.values,
error = model_step$residuals) %>%
ggplot(aes(x = prediksi, y = error)) +
geom_hline(yintercept = 0, lty = "dashed") +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Berdasar dari plot di atas, terlihat bahwa sebaran error sudah berada di sekitar 0 dan garis tren nyaris membentuk garis lurus yang artinya model kita sudah linear.
Residual atau error dari data perlu berdistribusi normal. Ketika kita membuat sebuah model regresi linear, persamaan yang akan kita dapat adalah sebagai berikut:
\[ y = \alpha + \beta\times x + \epsilon \\ \epsilon \sim Normal(0, \sigma) \]
Tanda \(\epsilon\) atau epsilon di belakang menunjukkan adanya error atau residual yang tidak ditangkap model. Model berasumsi bahwa error ini memiliki distribusi normal yang berpusat di angka 0. Untuk memeriksa distribusi dari nilai residual apakah berdistribusi normal (membentuk kurva lonceng) atau tidak, kita bisa menggunakan histogram.
Untuk melakukan uji asumsi normality di R-Studio dapat menggunakan code di bawah ini:
plot(density(model_step$residuals))
Dari plot di atas terlihat bahwa sebaran error terdistribusi normal atau sebaran residu berada di sekitar 0.
Model regression yang kita gunakan model_step
mampu menangkap 80.02% dari keseluruhan informasi dilihat dari hasil Adjusted R-square yang sebesar 0.8002. Karena dari hasil uji normality dan linearity saja sebaran error terkumpul di sekitar 0 maka bisa disimpulkan bahwa model step sudah memenuhi asumsi dalam prediksi untuk case admission ini. Dilihat dari RMSE dan MAPE sendiri, model regresi kita punya peluang melenceng dalam melakukan prediksi sebesar 7.32% atau sebesar 0.0633 secara rata-rata.
Kesimpulan yang dapat diambil dari case ini adalah model kita sudah memiliki kriteria yang cukup dan baik untuk digunakan dalam melakukan prediksi.