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!

Set Up


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)

EDA dan Data Wrangling

#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.

Melihat gambaran data

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

Membuat Model


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.

Performa Model

pred <- predict(model_step, newdata = admission)
model_new <- admission %>% 
  mutate(prediction = pred,
         prediction = pred)

RMSE

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

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%.

Uji Asumsi

Linearity

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.

Normality


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.

Kesimpulan

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.