1 Opening

Salam sehat bagi para pembaca. Dalam report ini, kita akan memprediksi penerimaan mahasiswa baru. dimana data yang diperoleh berasal dari kaggle.

Dengan menggunakan metode Linear Regression, kita akan melihat faktor-faktor apa saja yang penting dalam penerimaan pendaftaran mahasiswa baru

2 Load Dataset

admis <- read.csv("data input/Admission_Predict.csv")

3 Data explanation

library(tidyverse)

glimpse(admis)
#> 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~
  1. Skor GRE ( dari 340)
  2. Skor TOEFL ( dari 120 )
  3. Peringkat Universitas ( dari 5 )
  4. Pernyataan Tujuan dan Kekuatan Surat Rekomendasi ( dari 5 )
  5. IPK Sarjana ( dari 10 )
  6. Pengalaman Penelitian ( 0 atau 1 )
  7. Peluang Diterima (mulai dari 0 hingga 1)

4 Data Cleansing

Diatas kita ada melihat stuktur data dan tidak semua tipe data sudah sesuai.

  1. University Rating diubah menjadi kategori
  2. SOP diubah menjadi kategori
  3. LOR diubah menjadi kategori
  4. Research diubah menjadi kategori
  5. Serial No. akan dihapus karena hanya menunjukan urutan id
admis <- admis %>%
  select(-Serial.No.) %>%
   mutate_at(.vars = c("University.Rating", "SOP", "LOR", "Research"), .funs = as.factor)

glimpse(admis)
#> Rows: 400
#> Columns: 8
#> $ 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 <fct> 4, 4, 3, 3, 2, 5, 3, 2, 1, 3, 3, 4, 4, 3, 3, 3, 3, 3~
#> $ SOP               <fct> 4.5, 4, 3, 3.5, 2, 4.5, 3, 3, 2, 3.5, 3.5, 4, 4, 4, ~
#> $ LOR               <fct> 4.5, 4.5, 3.5, 2.5, 3, 3, 4, 4, 1.5, 3, 4, 4.5, 4.5,~
#> $ CGPA              <dbl> 9.65, 8.87, 8.00, 8.67, 8.21, 9.34, 8.20, 7.90, 8.00~
#> $ Research          <fct> 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~

Selanjutnya kita ingin melihat apakah ada missing value (NA) dalam dataset yang akan digunakan.

anyNA(admis)
#> [1] FALSE
colSums(is.na(admis))
#>         GRE.Score       TOEFL.Score University.Rating               SOP 
#>                 0                 0                 0                 0 
#>               LOR              CGPA          Research   Chance.of.Admit 
#>                 0                 0                 0                 0

Data tidak mengandung missing value (NA) sehingga data bisa langsung digunakan untuk membuat model.

5 Data Correlation

Dalam Linear Regression, kita harus menentukan Target dan Prediktor yang akan dipakai. dimana Target adalah Chances of Admit. kita belum mengetahui prediktor apa yang paling sesuai untuk mendapatkan hasil terbaik. jadi disini kita akan terlebih dahulu melihat korelasi antar semua varibel yang ada dalam data

library(GGally)

ggcorr(admis, label = TRUE, label_size = 2.9, hjust = 1, layout.exp = 2)

dari tabel diatas, kita mendapatkan kalau CGPA memiliki nilai pengaruh positif paling tinggi dengan nilai sebesar 0.9 dan memiliki korelasi yang sangat positif dengan data numeric lainnya.

summary(admis)
#>    GRE.Score      TOEFL.Score    University.Rating      SOP          LOR    
#>  Min.   :290.0   Min.   : 92.0   1: 26             3.5    :70   3      :85  
#>  1st Qu.:308.0   1st Qu.:103.0   2:107             4      :70   4      :77  
#>  Median :317.0   Median :107.0   3:133             3      :64   3.5    :73  
#>  Mean   :316.8   Mean   :107.4   4: 74             4.5    :53   4.5    :45  
#>  3rd Qu.:325.0   3rd Qu.:112.0   5: 60             2.5    :47   2.5    :39  
#>  Max.   :340.0   Max.   :120.0                     5      :37   2      :38  
#>                                                    (Other):59   (Other):43  
#>       CGPA       Research Chance.of.Admit 
#>  Min.   :6.800   0:181    Min.   :0.3400  
#>  1st Qu.:8.170   1:219    1st Qu.:0.6400  
#>  Median :8.610            Median :0.7300  
#>  Mean   :8.599            Mean   :0.7244  
#>  3rd Qu.:9.062            3rd Qu.:0.8300  
#>  Max.   :9.920            Max.   :0.9700  
#> 
boxplot(admis)

Dari summary dan plot menunjukan kalau data tidak mengandung outlier (data yang berbeda jauh). sehingga kita tidak perlu melakukan subset data outlier.

6 Data Preparation

sebelum membuat model, kita akan membagi data menjadi 2 bagian : data train untuk melatih model dan data test untuk menguji apakah model kita bisa melakukan prediksi dengan baik. kita akan membagi jumlah data menjadi 70:30

RNGkind(sample.kind= "Rounding")
set.seed(417) 
idx <- sample(nrow(admis), nrow(admis)*0.7)
admis_train <- admis[idx,]
admis_test <- admis[-idx,]

7 Model Linear Regression

pertama kita akan membuat model linear regression target = chances of admit dan prediktor = CGPA karena CGPA memiliki nilai korelasi paling tinggi. model yang dibuat menggunakan data train.

model1 <- lm(Chance.of.Admit ~ CGPA, admis_train)

summary(model1)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA, data = admis_train)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -0.27490 -0.03008  0.01117  0.04376  0.18113 
#> 
#> Coefficients:
#>              Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) -1.081448   0.061831  -17.49 <0.0000000000000002 ***
#> CGPA         0.210040   0.007177   29.26 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.07224 on 278 degrees of freedom
#> Multiple R-squared:  0.7549, Adjusted R-squared:  0.7541 
#> F-statistic: 856.4 on 1 and 278 DF,  p-value: < 0.00000000000000022

dengan summary diatas, kita mendapatkan Adjusted R-squared bernilai 0.7549. tapi kita hanya menggunakan 1 prediktor saja. kita akan menguji prediktor lain.

model2 <- lm(Chance.of.Admit ~., admis_train) # model dengan seluruh prediktor
model3 <- lm(Chance.of.Admit ~1, admis_train) # model tanpa prediktor

summary(model2)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ ., data = admis_train)
#> 
#> Residuals:
#>       Min        1Q    Median        3Q       Max 
#> -0.241861 -0.021739  0.008546  0.036480  0.143385 
#> 
#> Coefficients:
#>                      Estimate Std. Error t value           Pr(>|t|)    
#> (Intercept)        -1.3340458  0.1753833  -7.606 0.0000000000005373 ***
#> GRE.Score           0.0018453  0.0007838   2.354           0.019312 *  
#> TOEFL.Score         0.0034439  0.0013101   2.629           0.009091 ** 
#> University.Rating2 -0.0401863  0.0234256  -1.715           0.087465 .  
#> University.Rating3 -0.0306617  0.0247789  -1.237           0.217067    
#> University.Rating4 -0.0300888  0.0278732  -1.079           0.281386    
#> University.Rating5 -0.0125682  0.0293847  -0.428           0.669220    
#> SOP1.5             -0.0106606  0.0454629  -0.234           0.814792    
#> SOP2                0.0002387  0.0454317   0.005           0.995811    
#> SOP2.5              0.0406525  0.0464336   0.875           0.382123    
#> SOP3                0.0337096  0.0462139   0.729           0.466408    
#> SOP3.5             -0.0004118  0.0468741  -0.009           0.992997    
#> SOP4                0.0076293  0.0471860   0.162           0.871681    
#> SOP4.5              0.0176808  0.0483229   0.366           0.714750    
#> SOP5                0.0119528  0.0494514   0.242           0.809200    
#> LOR2                0.0645862  0.0315349   2.048           0.041572 *  
#> LOR2.5              0.0867666  0.0320974   2.703           0.007327 ** 
#> LOR3                0.0786591  0.0310427   2.534           0.011877 *  
#> LOR3.5              0.1008464  0.0319011   3.161           0.001760 ** 
#> LOR4                0.1147890  0.0322274   3.562           0.000439 ***
#> LOR4.5              0.1209407  0.0340125   3.556           0.000449 ***
#> LOR5                0.1346831  0.0354160   3.803           0.000179 ***
#> CGPA                0.1174813  0.0145684   8.064 0.0000000000000285 ***
#> Research1           0.0175125  0.0102232   1.713           0.087921 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06551 on 256 degrees of freedom
#> Multiple R-squared:  0.8144, Adjusted R-squared:  0.7977 
#> F-statistic: 48.83 on 23 and 256 DF,  p-value: < 0.00000000000000022

Dengan memakai semua prediktor tanpa filtering, kita mendapatkan hasil Multiple R-squared sebesar 0.7977. kita akan mencoba melakukan filtering apakah bisa mendapatkan hasil yang optimal.

model_backwards <- step(model2, direction = "backward")
#> Start:  AIC=-1503.36
#> Chance.of.Admit ~ GRE.Score + TOEFL.Score + University.Rating + 
#>     SOP + LOR + CGPA + Research
#> 
#>                     Df Sum of Sq    RSS     AIC
#> - University.Rating  4  0.023439 1.1222 -1505.5
#> - SOP                8  0.056923 1.1557 -1505.2
#> <none>                           1.0988 -1503.4
#> - Research           1  0.012595 1.1114 -1502.2
#> - GRE.Score          1  0.023791 1.1226 -1499.4
#> - TOEFL.Score        1  0.029658 1.1285 -1497.9
#> - LOR                7  0.087932 1.1867 -1495.8
#> - CGPA               1  0.279124 1.3779 -1442.0
#> 
#> Step:  AIC=-1505.45
#> Chance.of.Admit ~ GRE.Score + TOEFL.Score + SOP + LOR + CGPA + 
#>     Research
#> 
#>               Df Sum of Sq    RSS     AIC
#> - SOP          8  0.046369 1.1686 -1510.1
#> <none>                     1.1222 -1505.5
#> - Research     1  0.013808 1.1361 -1504.0
#> - GRE.Score    1  0.028756 1.1510 -1500.4
#> - TOEFL.Score  1  0.029001 1.1513 -1500.3
#> - LOR          7  0.083953 1.2062 -1499.2
#> - CGPA         1  0.291037 1.4133 -1442.9
#> 
#> Step:  AIC=-1510.11
#> Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + CGPA + Research
#> 
#>               Df Sum of Sq    RSS     AIC
#> <none>                     1.1686 -1510.1
#> - Research     1  0.012052 1.1807 -1509.2
#> - TOEFL.Score  1  0.026351 1.1950 -1505.9
#> - GRE.Score    1  0.035378 1.2040 -1503.8
#> - LOR          7  0.096322 1.2649 -1501.9
#> - CGPA         1  0.307999 1.4766 -1446.6

dari summary model_backwards, kita memilih model dengan AIC paling kecil.

summary(model_backwards)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + 
#>     CGPA + Research, data = admis_train)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -0.26218 -0.02388  0.01114  0.03581  0.15854 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -1.3940302  0.1547624  -9.008 < 0.0000000000000002 ***
#> GRE.Score    0.0021600  0.0007583   2.848             0.004735 ** 
#> TOEFL.Score  0.0031393  0.0012770   2.458             0.014593 *  
#> LOR2         0.0472605  0.0299801   1.576             0.116115    
#> LOR2.5       0.0596601  0.0298158   2.001             0.046406 *  
#> LOR3         0.0585383  0.0286819   2.041             0.042236 *  
#> LOR3.5       0.0801689  0.0290416   2.760             0.006170 ** 
#> LOR4         0.0917593  0.0293332   3.128             0.001953 ** 
#> LOR4.5       0.1016158  0.0314542   3.231             0.001390 ** 
#> LOR5         0.1169775  0.0321802   3.635             0.000333 ***
#> CGPA         0.1175516  0.0139869   8.404  0.00000000000000256 ***
#> Research1    0.0168579  0.0101402   1.662             0.097584 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06603 on 268 degrees of freedom
#> Multiple R-squared:  0.8026, Adjusted R-squared:  0.7945 
#> F-statistic: 99.05 on 11 and 268 DF,  p-value: < 0.00000000000000022

dengan summary model_backwards yang sudah melakukan filtering, kita mendapatkan hasil Multiple R-squared 0.7945 dimana model sudah mendapatkan hasil yang cukup baik. tapi kita tetap harus melakukan trial dan error untuk melihat model manakah yang paling baik. selain backwards, ada metode forwards dan both

model_forward <- step(model3, 
                      scope = list(upper = model2, lower = model3),
                      direction = "forward")
#> Start:  AIC=-1077.82
#> Chance.of.Admit ~ 1
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + CGPA               1    4.4689 1.4507 -1469.6
#> + GRE.Score          1    3.8926 2.0270 -1375.9
#> + TOEFL.Score        1    3.6523 2.2673 -1344.5
#> + University.Rating  4    3.0088 2.9108 -1268.6
#> + LOR                7    2.7299 3.1897 -1237.0
#> + SOP                8    2.6037 3.3159 -1224.1
#> + Research           1    1.8080 4.1117 -1177.9
#> <none>                           5.9196 -1077.8
#> 
#> Step:  AIC=-1469.57
#> Chance.of.Admit ~ CGPA
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + GRE.Score          1  0.139803 1.3109 -1495.9
#> + TOEFL.Score        1  0.110214 1.3405 -1489.7
#> + Research           1  0.063820 1.3869 -1480.2
#> + LOR                7  0.114194 1.3365 -1478.5
#> + University.Rating  4  0.062632 1.3881 -1473.9
#> <none>                           1.4507 -1469.6
#> + SOP                8  0.078268 1.3724 -1469.1
#> 
#> Step:  AIC=-1495.94
#> Chance.of.Admit ~ CGPA + GRE.Score
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + LOR                7  0.104261 1.2066 -1505.2
#> + TOEFL.Score        1  0.029538 1.2814 -1500.3
#> + Research           1  0.016241 1.2947 -1497.4
#> <none>                           1.3109 -1495.9
#> + University.Rating  4  0.034732 1.2762 -1495.5
#> + SOP                8  0.066126 1.2448 -1494.4
#> 
#> Step:  AIC=-1505.15
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + TOEFL.Score        1  0.025970 1.1807 -1509.2
#> + Research           1  0.011671 1.1950 -1505.9
#> <none>                           1.2066 -1505.2
#> + University.Rating  4  0.015090 1.1916 -1500.7
#> + SOP                8  0.042708 1.1639 -1499.2
#> 
#> Step:  AIC=-1509.24
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + Research           1  0.012052 1.1686 -1510.1
#> <none>                           1.1807 -1509.2
#> + University.Rating  4  0.014029 1.1666 -1504.6
#> + SOP                8  0.044613 1.1361 -1504.0
#> 
#> Step:  AIC=-1510.11
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + Research
#> 
#>                     Df Sum of Sq    RSS     AIC
#> <none>                           1.1686 -1510.1
#> + SOP                8  0.046369 1.1222 -1505.5
#> + University.Rating  4  0.012885 1.1557 -1505.2
summary(model_forward)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + 
#>     Research, data = admis_train)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -0.26218 -0.02388  0.01114  0.03581  0.15854 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -1.3940302  0.1547624  -9.008 < 0.0000000000000002 ***
#> CGPA         0.1175516  0.0139869   8.404  0.00000000000000256 ***
#> GRE.Score    0.0021600  0.0007583   2.848             0.004735 ** 
#> LOR2         0.0472605  0.0299801   1.576             0.116115    
#> LOR2.5       0.0596601  0.0298158   2.001             0.046406 *  
#> LOR3         0.0585383  0.0286819   2.041             0.042236 *  
#> LOR3.5       0.0801689  0.0290416   2.760             0.006170 ** 
#> LOR4         0.0917593  0.0293332   3.128             0.001953 ** 
#> LOR4.5       0.1016158  0.0314542   3.231             0.001390 ** 
#> LOR5         0.1169775  0.0321802   3.635             0.000333 ***
#> TOEFL.Score  0.0031393  0.0012770   2.458             0.014593 *  
#> Research1    0.0168579  0.0101402   1.662             0.097584 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06603 on 268 degrees of freedom
#> Multiple R-squared:  0.8026, Adjusted R-squared:  0.7945 
#> F-statistic: 99.05 on 11 and 268 DF,  p-value: < 0.00000000000000022

dengan metode model_forwards, kita mendapatkan hasil adjusted R-squared sebesar 0.7945.

model_both <- step(model3, 
                      scope = list(upper = model2, lower = model3),
                      direction = "both")
#> Start:  AIC=-1077.82
#> Chance.of.Admit ~ 1
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + CGPA               1    4.4689 1.4507 -1469.6
#> + GRE.Score          1    3.8926 2.0270 -1375.9
#> + TOEFL.Score        1    3.6523 2.2673 -1344.5
#> + University.Rating  4    3.0088 2.9108 -1268.6
#> + LOR                7    2.7299 3.1897 -1237.0
#> + SOP                8    2.6037 3.3159 -1224.1
#> + Research           1    1.8080 4.1117 -1177.9
#> <none>                           5.9196 -1077.8
#> 
#> Step:  AIC=-1469.57
#> Chance.of.Admit ~ CGPA
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + GRE.Score          1    0.1398 1.3109 -1495.9
#> + TOEFL.Score        1    0.1102 1.3405 -1489.7
#> + Research           1    0.0638 1.3869 -1480.2
#> + LOR                7    0.1142 1.3365 -1478.5
#> + University.Rating  4    0.0626 1.3881 -1473.9
#> <none>                           1.4507 -1469.6
#> + SOP                8    0.0783 1.3724 -1469.1
#> - CGPA               1    4.4689 5.9196 -1077.8
#> 
#> Step:  AIC=-1495.94
#> Chance.of.Admit ~ CGPA + GRE.Score
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + LOR                7   0.10426 1.2066 -1505.2
#> + TOEFL.Score        1   0.02954 1.2814 -1500.3
#> + Research           1   0.01624 1.2947 -1497.4
#> <none>                           1.3109 -1495.9
#> + University.Rating  4   0.03473 1.2762 -1495.5
#> + SOP                8   0.06613 1.2448 -1494.4
#> - GRE.Score          1   0.13980 1.4507 -1469.6
#> - CGPA               1   0.71614 2.0270 -1375.9
#> 
#> Step:  AIC=-1505.15
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + TOEFL.Score        1   0.02597 1.1807 -1509.2
#> + Research           1   0.01167 1.1950 -1505.9
#> <none>                           1.2066 -1505.2
#> + University.Rating  4   0.01509 1.1916 -1500.7
#> + SOP                8   0.04271 1.1639 -1499.2
#> - LOR                7   0.10426 1.3109 -1495.9
#> - GRE.Score          1   0.12987 1.3365 -1478.5
#> - CGPA               1   0.41708 1.6237 -1424.0
#> 
#> Step:  AIC=-1509.24
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score
#> 
#>                     Df Sum of Sq    RSS     AIC
#> + Research           1  0.012052 1.1686 -1510.1
#> <none>                           1.1807 -1509.2
#> - TOEFL.Score        1  0.025970 1.2066 -1505.2
#> + University.Rating  4  0.014029 1.1666 -1504.6
#> + SOP                8  0.044613 1.1361 -1504.0
#> - LOR                7  0.100693 1.2814 -1500.3
#> - GRE.Score          1  0.055880 1.2366 -1498.3
#> - CGPA               1  0.309991 1.4907 -1446.0
#> 
#> Step:  AIC=-1510.11
#> Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + Research
#> 
#>                     Df Sum of Sq    RSS     AIC
#> <none>                           1.1686 -1510.1
#> - Research           1  0.012052 1.1807 -1509.2
#> - TOEFL.Score        1  0.026351 1.1950 -1505.9
#> + SOP                8  0.046369 1.1222 -1505.5
#> + University.Rating  4  0.012885 1.1557 -1505.2
#> - GRE.Score          1  0.035378 1.2040 -1503.8
#> - LOR                7  0.096322 1.2649 -1501.9
#> - CGPA               1  0.307999 1.4766 -1446.6
summary(model_both)
#> 
#> Call:
#> lm(formula = Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + 
#>     Research, data = admis_train)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -0.26218 -0.02388  0.01114  0.03581  0.15854 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -1.3940302  0.1547624  -9.008 < 0.0000000000000002 ***
#> CGPA         0.1175516  0.0139869   8.404  0.00000000000000256 ***
#> GRE.Score    0.0021600  0.0007583   2.848             0.004735 ** 
#> LOR2         0.0472605  0.0299801   1.576             0.116115    
#> LOR2.5       0.0596601  0.0298158   2.001             0.046406 *  
#> LOR3         0.0585383  0.0286819   2.041             0.042236 *  
#> LOR3.5       0.0801689  0.0290416   2.760             0.006170 ** 
#> LOR4         0.0917593  0.0293332   3.128             0.001953 ** 
#> LOR4.5       0.1016158  0.0314542   3.231             0.001390 ** 
#> LOR5         0.1169775  0.0321802   3.635             0.000333 ***
#> TOEFL.Score  0.0031393  0.0012770   2.458             0.014593 *  
#> Research1    0.0168579  0.0101402   1.662             0.097584 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.06603 on 268 degrees of freedom
#> Multiple R-squared:  0.8026, Adjusted R-squared:  0.7945 
#> F-statistic: 99.05 on 11 and 268 DF,  p-value: < 0.00000000000000022

dengan metode model_both, kita mendapatkan hasil adjusted R-squared sebesar 0.7945.

8 Evaluasi Model

kita sudah melakukan 3 model. disini kita akan menyimpulkan model manakah yang lebih baik dengan melihat R square dan RMSE (nilai error)

summary(model_backwards)$adj.r.squared
#> [1] 0.7944835
summary(model_forward)$adj.r.squared
#> [1] 0.7944835
summary(model_both)$adj.r.squared
#> [1] 0.7944835

kita mendapatkan nilai adj r squared semua model adalah sama.

model_backwards$call
#> lm(formula = Chance.of.Admit ~ GRE.Score + TOEFL.Score + LOR + 
#>     CGPA + Research, data = admis_train)
model_forward$call
#> lm(formula = Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + 
#>     Research, data = admis_train)
model_both$call
#> lm(formula = Chance.of.Admit ~ CGPA + GRE.Score + LOR + TOEFL.Score + 
#>     Research, data = admis_train)

berikut adalah prediktor yang dipakai oleh masing-masing model.

library(MLmetrics)
RMSE(model_backwards$fitted.values,admis_train$Chance.of.Admit)
#> [1] 0.06460361
RMSE(model_forward$fitted.values,admis_train$Chance.of.Admit)
#> [1] 0.06460361
RMSE(model_both$fitted.values,admis_train$Chance.of.Admit)
#> [1] 0.06460361

sama seperti hasil adj r squared. kita mendapatkan nilai RMSE yang sama sehingga kita bebas memilih model yang akan digunakan.

9 Prediction

kita sudah membuat 3 model. kita akan menguji data test dengan semua model yang kita buat dan melihat mana yang terbaik

lm_predict1 <- predict(object = model_both, newdata = head(admis_test, 10))
lm_predict1
#>         3         4        12        13        15        19        23        25 
#> 0.6524563 0.7425027 0.8371898 0.8542442 0.6322582 0.7311647 0.9291836 0.9543384 
#>        30        32 
#> 0.4917475 0.7199330
predict(model_both, newdata = head(admis_test, 10), 
        level = 0.95, interval = "prediction")
#>          fit       lwr       upr
#> 3  0.6524563 0.5199958 0.7849169
#> 4  0.7425027 0.6095459 0.8754595
#> 12 0.8371898 0.7048335 0.9695460
#> 13 0.8542442 0.7219695 0.9865189
#> 15 0.6322582 0.4989131 0.7656033
#> 19 0.7311647 0.5993983 0.8629311
#> 23 0.9291836 0.7962740 1.0620931
#> 25 0.9543384 0.8212471 1.0874296
#> 30 0.4917475 0.3576625 0.6258326
#> 32 0.7199330 0.5863557 0.8535103

Insight: hasil prediksi untuk observasi pertama di kisaran 0.519 - 0.784 , dengan tingkat kepercayaan 95%

RMSE(y_pred = lm_predict1,
     y_true = admis_test[1:10, "Chance.of.Admit"])
#> [1] 0.05216433

nilai error yang dihasilkan oleh prediction adalah 0.0521

10 Limitasi dan Asumsi

10.1 Normality of Residuals

Harapannya ketika membuat model linear regression, error/residual yang dihasilkan berdistribusi normal. Artinya error banyak berkumpul disekitar angka 0. Untuk menguji asumsi ini dapat dilakukan:

hist(model_both$residuals)

uji statistik dengan saphiro test

shapiro.test(model_both$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_both$residuals
#> W = 0.9114, p-value = 0.000000000008459

kita mendapatkan p value < 0.05 (nilai error tidak berdistribusi normal)

kesimpulannya adalah model tidak lolos uji asumsi

10.2 Homoscedasticity

plot(model2$fitted.values, model_both$residuals)
abline(h = 0, col = "red")

library(lmtest)
bptest(model_both)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_both
#> BP = 19.088, df = 11, p-value = 0.05954

kita mendapatkan nilai p value > 0.05 sehingga asumsi terpenuhi. kesimpulannya dimana model menghasilkan nilai error yang memiliki tidak memiliki pola(konstan)

10.3 Multicollinearity

library(car)

vif(model_both)
#>                 GVIF Df GVIF^(1/(2*Df))
#> CGPA        4.544704  1        2.131831
#> GRE.Score   4.884780  1        2.210154
#> LOR         1.906321  7        1.047162
#> TOEFL.Score 3.923766  1        1.980850
#> Research    1.645248  1        1.282672

Kesimpulan: tidak ada VIF yang < 10 sehingga tidak ada antar variable saling berkorelasi amat kuat; asumsi terpenuhi.

11 Conclusion.

Dari research yang kita lakukan, kita akan memakai model_both yang memakai semua prediktor sudah melalui tahap filtering both . dimana semua model mendapatkan nilai adj r squared sama besar. akan tetapi saat melakukan asumsi hanya pada saphiro test tidak lolos asumsi, sedangkan saat asumsi Homoscedasticity mendapatkan nilai p value > 0.05 sehingga lolos asumsi. nilai Vif value juga dibawah 10 artinya tidak ada antar variable saling berkorelasi amat kuat; asumsi terpenuhi.

walaupun model tidak lulus asumsi untuk saphiro, bukan berarti model tidak boleh dipakai, hanya saja bisa ditingkatkan atau kita bisa memakai metode lain untuk melakukan prediksi.

dari model yang sudah kita buat, kita mendapatkan kalau peluang mahasiswa diterima memiliki korelasi positif dengan GRE.Score, TOEFL.Score, University.Rating, SOP, LOR, CGPA, dan Research. sehingga mahasiswa harus memberikan nilai score yang bagus agar kemungkinan diterima semakin tinggi.