1. Pengenalan

Kita menggunakan dataset Graduate Admissions dari Kaggle. Dataset ini dibuat dengan tujuan membantu siswa dalam memilih universitas dengan profil mereka. Hasil yang diprediksi memberi insight tentang peluang mereka untuk masuk universitas berdasarkan profil mereka.

Apa yang akan kita lakukan ?

Kita akan mengolah data dengan regresi linear menggunakan dataset graduate admissions. Langkah - langkah yang akan kita lakukan sebagai berikut:

  • Kita akan menetapkan Chance.of.Admit sebagai variabel target dan variabel lainnya sebagai prediktor
  • Kita cek korelasi variabel Chance.of.Admit dengan variabel prediktor lainnya
  • Membuat model regresi linear untuk menjelaskan variabel Chance.of.Admit berdasarkan prediktor
  • Menguji validitas model
  • Membuat Kesimpulan dari model

2. Persiapan Data

Import Library

library(performance) #membandingkan kinerja antar model
library(lmtest) #cek homoscedasticity
library(car) #cek Multicollinearity
library(MLmetrics) #MSE
library(GGally) #ggcorr
library(dplyr) #mengolah data sebelum di proses
library(DT) #datatables

Import Data

gradAdmission <- read.csv("Admission_Predict_Ver1.1.csv")
glimpse(gradAdmission)
## Rows: 500
## Columns: 9
## $ Serial.No.        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15...
## $ GRE.Score         <int> 337, 324, 316, 322, 314, 330, 321, 308, 302, 323,...
## $ TOEFL.Score       <int> 118, 107, 104, 110, 103, 115, 109, 101, 102, 108,...
## $ University.Rating <int> 4, 4, 3, 3, 2, 5, 3, 2, 1, 3, 3, 4, 4, 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,...
## $ LOR               <dbl> 4.5, 4.5, 3.5, 2.5, 3.0, 3.0, 4.0, 4.0, 1.5, 3.0,...
## $ CGPA              <dbl> 9.65, 8.87, 8.00, 8.67, 8.21, 9.34, 8.20, 7.90, 8...
## $ Research          <int> 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0...
## $ Chance.of.Admit   <dbl> 0.92, 0.76, 0.72, 0.80, 0.65, 0.90, 0.75, 0.68, 0...

Dataset graduate admissions memiliki variabel-variabel sebagai berikut:

  • GRE.Score adalah Skor GRE
  • TOEFL.Score adalah Skor Toefl
  • University.Rating adalah Peringkat Universitas
  • SOP adalah Pernyataan Tujuan
  • LOR adalah Surat Rekomendasi
  • CGPA adalah IPK Sarjana
  • Research adalah Pengalaman Riset
  • Chance.of.Admit adalah Peluang Diterima

Dataset memiliki 500 baris dan 9 kolom. Variabel target kita adalah Chance.of.Admit.
Serial.No. adalah nomor pengenal peserta sehingga kita bisa mengabaikannya.Kita akan menggunakan variabel lain sebagai prediktor.

Langkah pertama kita perlu memisahkan data yang tidak akan kita gunakan dari dataset kita

gradAdmission <- gradAdmission %>% 
  select(-Serial.No.)

Langkah selanjutnya kita harus mengecek apakah di dataset kita terdapat missing values

colSums(is.na(gradAdmission))
##         GRE.Score       TOEFL.Score University.Rating               SOP 
##                 0                 0                 0                 0 
##               LOR              CGPA          Research   Chance.of.Admit 
##                 0                 0                 0                 0

Tidak terdapat missing values di dataset Graduate Admissions

3. Ekplorasi data

Lihat Kolerasi Antar Variabel

ggcorr(data = gradAdmission, label = T, hjust = 0.9, cex=3)

Grafik tersebut menunjukkan bahwa semua variabel memiliki korelasi yang kuat dengan variabel Chance.of.Admit.

4. Modelling

Pisahkan data

Sebelumnya kita perlu membagi data menjadi dataset train dan dataset uji. Kita akan menggunakan dataset train untuk melatih model regresi linier. Dataset pengujian akan digunakan sebagai pembanding dan melihat apakah model menjadi overfit atau tidak dalam memprediksi data baru yang belum terlihat selama fase pelatihan.

Kita akan 80% dari data sebagai data pelatihan dan 20% sebagai data pengujian.

RNGkind(sample.kind = "Rounding")
set.seed(200)
intrain <- sample(nrow(gradAdmission), nrow(gradAdmission)*0.8)

gradAdmission_train <- gradAdmission[intrain,]
gradAdmission_test <- gradAdmission[-intrain,]

Modelling

Kita akan memulai membuat model pertama dengan menggunakan seluruh variabel menjadi prediktor.

model_all <- lm(data = gradAdmission_train,formula = Chance.of.Admit~.)
summary(model_all)
## 
## Call:
## lm(formula = Chance.of.Admit ~ ., data = gradAdmission_train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.26765 -0.02392  0.01151  0.03327  0.14979 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -1.2733204  0.1221932 -10.421  < 2e-16 ***
## GRE.Score          0.0017502  0.0006009   2.913 0.003789 ** 
## TOEFL.Score        0.0028152  0.0010102   2.787 0.005584 ** 
## University.Rating  0.0054974  0.0043271   1.270 0.204674    
## SOP                0.0045725  0.0053186   0.860 0.390474    
## LOR                0.0174360  0.0047358   3.682 0.000264 ***
## CGPA               0.1205607  0.0110485  10.912  < 2e-16 ***
## Research           0.0205563  0.0075931   2.707 0.007082 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.06134 on 392 degrees of freedom
## Multiple R-squared:  0.8194, Adjusted R-squared:  0.8162 
## F-statistic: 254.2 on 7 and 392 DF,  p-value: < 2.2e-16

Selanjutnya kita akan membuat model kedua dengan tanpa prediktor.

model_none <- lm(Chance.of.Admit ~ 1, data = gradAdmission_train)
summary(model_none)
## 
## Call:
## lm(formula = Chance.of.Admit ~ 1, data = gradAdmission_train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.3865 -0.0865  0.0035  0.1135  0.2435 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.726500   0.007154   101.6   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1431 on 399 degrees of freedom

Dari hasil pemodelan antara model 1 dan model 2, kita bisa lihat model 1 memiliki adjusted r-squared sebesar 81,94% . Bearti variabel prediktor menjelaskan variansi dari variabel target cukup baik.

Tentu ada kemungkinan untuk meningkatkan adjusted r-squared dengan cara kita harus mengecek prediktor apa saja yang bagus digunakan dalam pemodelan. Untuk mengeceknya kita akan menggunakan backward dan forward

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=-2225.19
## Chance.of.Admit ~ GRE.Score + TOEFL.Score + University.Rating + 
##     SOP + LOR + CGPA + Research
## 
##                     Df Sum of Sq    RSS     AIC
## - SOP                1   0.00278 1.4775 -2226.4
## - University.Rating  1   0.00607 1.4808 -2225.6
## <none>                           1.4748 -2225.2
## - Research           1   0.02757 1.5023 -2219.8
## - TOEFL.Score        1   0.02922 1.5040 -2219.3
## - GRE.Score          1   0.03192 1.5067 -2218.6
## - LOR                1   0.05100 1.5257 -2213.6
## - CGPA               1   0.44796 1.9227 -2121.1
## 
## Step:  AIC=-2226.44
## Chance.of.Admit ~ GRE.Score + TOEFL.Score + University.Rating + 
##     LOR + CGPA + Research
## 
##                     Df Sum of Sq    RSS     AIC
## <none>                           1.4775 -2226.4
## - University.Rating  1   0.01184 1.4894 -2225.2
## - Research           1   0.02766 1.5052 -2221.0
## - GRE.Score          1   0.03101 1.5085 -2220.1
## - TOEFL.Score        1   0.03185 1.5094 -2219.9
## - LOR                1   0.06135 1.5389 -2212.2
## - CGPA               1   0.48214 1.9597 -2115.5

Pada backward prediktor yang digunakan adalah GRE.Score,TOEFL.Score,University.Rating,LOR,CGPA,Research

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),trace = F)

Setelah itu kita bandingkan kinerja antara backward dan forward

compare_performance(backward,forward)
## # Comparison of Model Performance Indices
## 
## Model    | Type |      AIC |      BIC |   R2 | R2 (adj.) | RMSE | Sigma |   BF | p
## ----------------------------------------------------------------------------------
## backward |   lm | -1089.29 | -1057.35 | 0.82 |      0.82 | 0.06 |  0.06 | 1.00 |  
## forward  |   lm | -1089.29 | -1057.35 | 0.82 |      0.82 | 0.06 |  0.06 | 1.00 |

Berdasarkan adj.rsquared dan RMSE, baik model stepwise backward maupun stepwise forward, kedua model memiliki performace sama baiknya. Jadi kita gunakan satu di antara mereka.

5. Cek Asumsi

Analisis regresi adalah suatu teknik statistikal yang dipergunakan untuk menganalisis pengaruh di antara suatu variabel dependen dan variabel independen. Dalam menggunakan analisis regresi terdapat hal-hal yang harus dipenuhi, yaitu asumsi-asumsinya. Adapun pada sesi ini, kita akan melakukan uji asumsi berupa:

Linearitas

Dilakukan sebelum membuat model untuk memastikan bahwa variabel prediktor dengan target memiliki hubungan yang linear. Dapat dicek dengan menghitung nilai korelasi menggunakan function ggcorr() dari library GGally

ggcorr(data = gradAdmission, label = T, hjust = 0.9, cex=3)

Grafik tersebut menunjukkan bahwa semua variabel memiliki korelasi yang kuat dengan variabel Chance.of.Admit.

Normalitas Residual

Residual adalah beda antara y aktual dengan y prediksi. Uji asumsi normalitas regresi linear dapat diuji dengan berbagai metode uji normalitas.

Dilakukan dengan cara:

  1. Membuat visualisasi dari error yang dihasilkan (histogram)
hist(backward$residuals,breaks = 20)

Grafik tersebut menunjukkan distribusi normal. Artinya error banyak berkumpul disekitar angka 0.

  1. Melakukan uji statistik menggunakan fungsi shapiro.test()

Shapiro-Wilk hypothesis:

  • H0: error/residual berdistribusi normal
  • H1: error/residual tidak berdistribusi normal
shapiro.test(backward$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  backward$residuals
## W = 0.91232, p-value = 1.787e-14

Hasil dari shapiro.test() p-value > alpha (alpha = 0.05) yang bearti gagal tolak h0 (terima h0)
Maka error/residual berdistribusi normal

Homoskedastisitas

Harapannya dari model yang terbentuk memperoleh error/residual yang variansinya tidak membentuk sebuah pola (harus menyebar random). Artinya ketika error tidak membentuk pola, model kita sudah berhasil menangkap pola pada data.

Dilakukan dengan cara:

  1. Membuat visualisasi antara hasil prediksi dengan error (scatter plot)
plot(backward$fitted.values, backward$residuals)
abline(h=0, col = "red")

  1. Melakukan uji Breusch-Pagan menggunakan fungsi bptest() dari library lmtest

Breusch-Pagan hypothesis :

  • H0: Homoscedasticity
  • H1: Heteroscedasticity
bptest(backward)
## 
##  studentized Breusch-Pagan test
## 
## data:  backward
## BP = 21.087, df = 6, p-value = 0.00177

Hasil dari bptest() pvalue > alpha yang bearti gagal tolak H0 (terima h0) Maka residual bersifat Homoscedasticity

Multikolinearitas

Harapannya pada model linear regression, tidak terjadi multikolinearitas. Multikolinearitas terjadi ketika antar variabel prediktor yang digunakan pada model memiliki hubungan yang kuat. Ditakutkan ketikan antar prediktor memiliki hubungan kuat, informasi yang dijelaskan redundan.

Dilakukan dengan menghitung nilai vif menggunakan function vif() dari library car. Ketika nilai VIF lebih kecil dari 10, asumsi no-multicolinearity terpenuhi

vif(backward)
##         GRE.Score       TOEFL.Score University.Rating               LOR 
##          4.730943          4.006843          2.176064          1.869430 
##              CGPA          Research 
##          4.581451          1.493267

6. Uji Coba ke Data Pengujian

lm_pred <- predict(object = backward, newdata = gradAdmission_test %>% 
                     select(-Chance.of.Admit))

Kita cek RSME dari dataset train

RMSE(backward$fitted.values,gradAdmission_train$Chance.of.Admit)
## [1] 0.06077687

Kita cek RSME dari dataset test

RMSE(lm_pred,gradAdmission_test$Chance.of.Admit)
## [1] 0.05451787

7. Kesimpulan

Dari proses olah data berikut ini prediktor yang mempengaruhi Chance.of.Admit:

  • GRE Score
  • Toefl Score
  • University Rating
  • Letter of Recommendation
  • CGPA
  • Research

Proses pemodelan memperoleh hasil:

  • RSME dari dataset train : 6,07%
  • RSME dari dataset test : 5,45%

Hasil pada RMSE menunjukkan pada model bersifat overfit.