1 Data Information

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 )

2 Library and Setup

library(dplyr)
library(leaps)
library(ggpubr)
admission <- read.csv("Admission_Predict.csv") %>%  
  dplyr::select(-Serial.No.)
admission
glimpse(admission)
#> Rows: 400
#> Columns: 8
#> $ GRE.Score         <int> 337, 324, 316, 322, 314, 330, 321, 308, 302, 323, 3…
#> $ TOEFL.Score       <int> 118, 107, 104, 110, 103, 115, 109, 101, 102, 108, 1…
#> $ 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, 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.0…
#> $ 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.5…
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

Business Problem

Ingin memprediksi Chance.of.Admit berdasarkan CGPA (Undergraduate GPA). Tentukan:

  • Variabel target: Chance.of.Admission
  • Variabel prediktor: CGPA (Undergraduate GPA)

Cek persebaran data

  • Cek persebaran variabel Chance.of.Admit:

    • histogram atau boxplot
boxplot(admission$Chance.of.Admit)

  • Cek persebaran variabel CGPA
hist(admission$CGPA)

Cek korelasi antar variabel target dan prediktor

- menggunakan nilai korelasi
cor(x = admission$Chance.of.Admit, y = admission$CGPA)
#> [1] 0.8732891
  • menggunakan visualisasi
plot(x = admission$Chance.of.Admit, y = admission$CGPA)

Ketika kita mendapatkan ada dua variabel yang saling berhubungan erat. Maka dapat dikatakan kedua variabel tersebut memiliki indikasi pasangan prediktor - target yang baik.

Nilai korelasi yang besar adalah indikasi yang baik untuk hubungan prediktor dan target.

3 Simple Linear Regression

Selanjutnya jika kita ingin menjawab dari business problem yang kita miliki, yaitu kita ingin melakukan prediksi Chance.of.Admit berdasarkan nilai CGPA, maka formula yang kita buat adalah sebagai berikut.

model_chance <- lm(formula = Chance.of.Admit~CGPA, data = admission)
summary(model_chance)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA, data = admission)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.274575 -0.030084  0.009443  0.041954  0.180734 
#> 
#> Coefficients:
#>             Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) -1.07151    0.05034  -21.29 <0.0000000000000002 ***
#> CGPA         0.20885    0.00584   35.76 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06957 on 398 degrees of freedom
#> Multiple R-squared:  0.7626, Adjusted R-squared:  0.762 
#> F-statistic:  1279 on 1 and 398 DF,  p-value: < 0.00000000000000022

Model yang diperoleh:

y = b0 +b1X Chance.of.Admit = -1.07151 + 0.20885CGPA

karena nilai slope positif, artinya hubungan antara chance.of.admit dengan CGPA berhubungan lurus, ketika chance.of.admit naik, maka CGPA naik, begitu sebaliknya.

Variabel prediktor berpengaruh signifikan terhadap variabel target, hal ini dapat dilihat dari nilai p-value < 0.05 sehingga CGPA berpengaruh signifikan terhadap Chance.of.Admit.

3.1 Interpretasi Model

Interpretasi model regresi

  • Intercept: Titik awal garis regresi terbentuk, menunjukkan nilai target variabel ketika nilai prediktor = 0

  • Slope: kenaikan setiap 1 satuan, kenaikan 1 prediktor meningkatkan target variabel sebesar slope

  • Koefisien bernilai positif = korelasi positif

Interpretasi summary() model

summary(model_chance)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA, data = admission)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.274575 -0.030084  0.009443  0.041954  0.180734 
#> 
#> Coefficients:
#>             Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) -1.07151    0.05034  -21.29 <0.0000000000000002 ***
#> CGPA         0.20885    0.00584   35.76 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06957 on 398 degrees of freedom
#> Multiple R-squared:  0.7626, Adjusted R-squared:  0.762 
#> F-statistic:  1279 on 1 and 398 DF,  p-value: < 0.00000000000000022

Dari model_chance kita peroleh R-Squared sebesar 76.26%, artinya model regresi kita hanya mampu menjelaskan variansi dari Profit sebesar 76.3% berdasarkan CGPA (Undergraduate GPA).

Goodness of fit dari model ini dapat dilihat dari nilai R-squared sebesar 0.7626/ 76.26%

# Visualizing fitting line
plot(x = admission$CGPA, y = admission$Chance.of.Admit)
abline(model_chance, col = "red")


Melakukan Pengecekkan Leverage:

  • hist()

  • boxplot()

  • Melakukan pengecekan outlier pada variabel CGPA

boxplot(admission$CGPA)

* Subset data admission tanpa melibatkan nilai outlier pada variabel Sales

chance_no <- admission[admission$CGPA > 7.0, ]
  • Membuat model tanpa outlier
model_chance_no <- lm(Chance.of.Admit~CGPA, chance_no)
summary(model_chance_no)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA, data = chance_no)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.274546 -0.030154  0.008999  0.042068  0.180851 
#> 
#> Coefficients:
#>              Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) -1.072810   0.051013  -21.03 <0.0000000000000002 ***
#> CGPA         0.208995   0.005916   35.33 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06965 on 397 degrees of freedom
#> Multiple R-squared:  0.7587, Adjusted R-squared:  0.7581 
#> F-statistic:  1248 on 1 and 397 DF,  p-value: < 0.00000000000000022

Formulasi model no outlier :

Profit = -1.072810 + 0.2089954*CGPA

Kita akan coba bandingkan model regresi yang menggunakan nilai outlier pada variabel CGPA dan tanpa nilai outlier

plot(admission$CGPA, admission$Chance.of.Admit)
abline(model_chance$coefficients[1], model_chance$coefficients[2], col = "red")
abline(model_chance_no$coefficients[1], model_chance_no$coefficients[2], col = "blue")

Kesimpulan:

Outlier yang dimiliki pada data Sales merupakan outlier yang high leverage low influence karena jika dilihat dari kemiringan garis regresi yang terbentuk pada model yang menggunakan outlier dan model tanpa outlier, kemiringan garisnya sama/pada satu garis.

summary(model_chance)$r.squared
#> [1] 0.7626339
summary(model_chance_no)$r.squared
#> [1] 0.7586926

4 Multiple Linear Regression

Multiple linear regression merupakan metode linear regresi dengan menggunakan lebih dari 1 variabel prediktor.

5 Cek korelasi Model dengan menggunakan semua prediktor

library(GGally)
ggcorr(admission, label = T, hjust = 0.9)

# Model dengan menggunakan semua prediktor

model_chance_admit_all <- lm(formula = Chance.of.Admit~., data = admission)
summary(model_chance_admit_all)
#> 
#> 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

Dari output yang didapatkan terdapat variabel yang sangat signifikan yaitu:

  • CGPA
  • LOR
  • TOEFL.Score

Dari output yang didapatkan terdapat variabel yang sangat tidak signifikan yaitu:

  • SOP
  • University.Rating

5.1 R-Squared vs Adjusted R-Squared

Ketika kita menggunakan lebih dari satu prediktor, R-Square akan selalu bertambah seiring dengan bertambahnya variabel prediktor baru meskipun belum tentu memiliki pengaruh terhadap model. Untuk mengatasi hal ini, dibuat metrik baru bernama Adjusted R-Square yang menghitung nilai R-Square tetapi juga mempertimbangkan jumlah variabel yang digunakan sehingga nilai R-Square yang ditampilkan lebih tepat.

R-squared digunakan untu simple linear regression, sedangkan Adjusted R-squared digunakan untuk multiple regression. Karena Adjusted R-squared memperhitungkan banyak observasi dan variabel prediktor yang digunakan.

Mari kita buat beberapa model dan kita bandingkan nilai r-squared nya:

model_admit1 <- lm(Chance.of.Admit ~ CGPA, admission)
model_admit2 <- lm(Chance.of.Admit ~ CGPA+LOR, admission)
model_admit3 <- lm(Chance.of.Admit ~ CGPA+LOR+TOEFL.Score, admission)
summary(model_admit1)$r.squared 
#> [1] 0.7626339
summary(model_admit2)$r.squared 
#> [1] 0.7756277
summary(model_admit3)$r.squared 
#> [1] 0.7896201
summary(model_admit1)$adj.r.squared
#> [1] 0.7620375
summary(model_admit2)$adj.r.squared
#> [1] 0.7744974
summary(model_admit3)$adj.r.squared
#> [1] 0.7880263

Summary ->


6 Feature Selection (Step-wise Regression)

Feature selection merupakan tahapan dalam memilih variabel yang akan digunakan

Mengevaluasi model stepwise menggunakan nilai AIC (Akaike Information Criterion/ Information Loss). AIC menunjukkan banyak informasi yang hilang pada model.

6.1 Backward

model_backward <- step(object = model_chance_admit_all, direction = "backward", trace = F)

Bentuk Model:

summary(model_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

Summary: Setelah dilakukan Feature Selection menggunakan Backward Elimination, didapatkan model dengan nilai AIC terkecil yaitu:

-> lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + CGPA + Research, data = admission)

Dengan nilai R-Squared sebesar: 0.8027/ 80.27%

6.2 Forward

Memuat mmodel tanpa prediktor:

model_chance_admit_none <- lm(Chance.of.Admit~1, admission)
model_forward <- step(object = model_chance_admit_none, direction = "forward",
                      scope = list(lower = model_chance_admit_none, upper = model_chance_admit_all), trace = F)
summary(model_forward)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA + GRE.Score + LOR + Research + 
#>     TOEFL.Score, 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 ***
#> CGPA         0.1210042  0.0117349  10.312 < 0.0000000000000002 ***
#> GRE.Score    0.0017820  0.0005955   2.992              0.00294 ** 
#> LOR          0.0227762  0.0048039   4.741           0.00000297 ***
#> Research     0.0245769  0.0079203   3.103              0.00205 ** 
#> TOEFL.Score  0.0030320  0.0010651   2.847              0.00465 ** 
#> ---
#> 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

6.3 Both

model_both <- step(object = model_chance_admit_all, direction = "both", 
                   scope = list(lower = model_chance_admit_none, upper = model_chance_admit_all), trace = F)
summary(model_both)
#> 
#> 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

Perbandingan nilai adjusted r-squared pada ketiga model yang sudah dibuat

print(paste("model backward:", summary(model_backward)$adj.r.squared))
#> [1] "model backward: 0.800218756144748"
print(paste("model forward:", summary(model_forward)$adj.r.squared))
#> [1] "model forward: 0.800218756144748"
print(paste("model both:", summary(model_both)$adj.r.squared))
#> [1] "model both: 0.800218756144748"

Dapat disimpulkan setelah dilakukan perbandingan nilai adjusted r-squared pada ketiga model yang telah dilakukan Feature Selection, dihasilkan nilai adjusted r-squared yang sama yaitu sebesar 0.8027/80.27%.

7 Confidence Interval

Mencari hasil prediksi dengan confidence interval 95%

set.seed(100)
random_admission <- sample(nrow(admission),10)
admission_test <- admission[random_admission,]
admission_predict <-  predict(object = model_backward, newdata = admission_test, interval = "prediction",
                              level = 0.95)
admission_predict
#>           fit       lwr       upr
#> 202 0.7129861 0.5869537 0.8390184
#> 358 0.6122619 0.4854007 0.7391231
#> 112 0.7700433 0.6443491 0.8957375
#> 206 0.5214041 0.3952517 0.6475564
#> 4   0.7394830 0.6134049 0.8655611
#> 311 0.7489737 0.6229587 0.8749887
#> 326 0.8558390 0.7299232 0.9817548
#> 98  0.8550961 0.7283098 0.9818825
#> 391 0.6243625 0.4983321 0.7503929
#> 7   0.7119613 0.5854532 0.8384694

Visualisasi Confidence Interval untuk Data Copiers

library(ggplot2)
ggplot(admission, aes(x = CGPA, y= Chance.of.Admit))+
  geom_point() +
  geom_smooth(method = "lm", level = 0.95)

7.1 Normality (Residual Normal)

Harapan dalam membuat madel linear regression, error yang dihasilkan berdistribusi normal. Artinya error banyak berkumpul disekitar angka 0. untuk menguji asumsi ini dpat dilakukan:

  1. Visualisasi Histogram Residual, dengan menggunakan fungsi hist()
hist(model_backward$residuals)

  1. Uji statistik menggunakan shapiro.test(). harapannya p-value > alpha agar keputusan yang diambil adalah gagal tolak H0)

Shapiro-Wilk hypotesis test:

\[ H_0: error/residual\ berdistribusi\ normal\\ H_1: error/residual\ tidak\ berdistribusi\ normal \]

shapiro.test(model_backward$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_backward$residuals
#> W = 0.92193, p-value = 0.0000000000001443

Kesimpulan: Asumsi normality of residuals pada model_backward tidak terpenuhi

Jika asumsi normalitas tidak terpenuhi, maka hasil uji signifikansi serta nilai standard error dari intercept dan slope setiap prediktor yang dihasilkan bersifat bias atau tidak mencerminkan nilai sebenarnya. Jika residual memiliki distribusi yang tidak normal, bisa lakukan transformasi data pada target variabel atau menambahkan sample data.

7.2 Melakukan Scalling menggunakan (Sqrt)

admission$Chance.of.Admit <- sqrt(admission$Chance.of.Admit)
head(admission)
model_hampir_final <- lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + 
    CGPA + Research, data = admission)
summary(model_hampir_final)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + 
#>     CGPA + Research, data = admission)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.171814 -0.014398  0.005996  0.024588  0.100183 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -0.3593729  0.0756934  -4.748           0.00000288 ***
#> GRE.Score    0.0010467  0.0003843   2.723              0.00675 ** 
#> TOEFL.Score  0.0017364  0.0006874   2.526              0.01193 *  
#> LOR          0.0140040  0.0031002   4.517           0.00000830 ***
#> CGPA         0.0734977  0.0075731   9.705 < 0.0000000000000002 ***
#> Research     0.0138537  0.0051113   2.710              0.00701 ** 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.04114 on 394 degrees of freedom
#> Multiple R-squared:  0.7777, Adjusted R-squared:  0.7749 
#> F-statistic: 275.7 on 5 and 394 DF,  p-value: < 0.00000000000000022
shapiro.test(model_hampir_final$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_hampir_final$residuals
#> W = 0.9105, p-value = 0.00000000000001225

8 Homoscedasticity

  1. Visualisasi dengan scatterplot antara nilai prediksi(fitted values) dengan nilai error
plot(model_hampir_final$fitted.values, model_hampir_final$residuals)
abline(h = 0, col = "red")

library(lmtest)
bptest(model_hampir_final)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_hampir_final
#> BP = 29.923, df = 5, p-value = 0.00001527

#Multiculinearity

library(car)
vif(model_hampir_final)
#>   GRE.Score TOEFL.Score         LOR        CGPA    Research 
#>    4.585053    4.104255    1.829491    4.808767    1.530007
# install.packages("performance")
library(performance)
# asumsi multikolinearity
check_collinearity(model_hampir_final)
# asumsi normality
check_normality(model_hampir_final)
#> Warning: Non-normality of residuals detected (p < .001).
# asumsi homoscedastocity
check_heteroscedasticity(model_hampir_final)
#> Warning: Heteroscedasticity (non-constant error variance) detected (p = 0.000).

9 ERROR

sum(abs(model_hampir_final$fitted.values - admission$Chance.of.Admit))/nrow(admission)
#> [1] 0.02888553
library(MLmetrics)
MAPE(y_pred = model_hampir_final$fitted.values, y_true = admission$Chance.of.Admit)
#> [1] 0.03665155