1 Introduction

Student Performance adalah ukuran performa seorang siswa dalam belajar. Kali ini kita akan mencoba membuat model Linear Regression menggunakan dataset Student Performance. Kita ingin mengetahui hubungan antar variabel, terutama antara Student Performance dengan variabel lainnya.

2 Data Preparation

Kita akan memuat terlebih dahulu semua Library yang nantinya akan digunakan dalam melakukan analisis-analisis.

library(dplyr)
library(GGally)
library(MLmetrics)
library(lmtest)
library(car)
library(rsample)

Kemudian memuat dataset Student Performance.

performance <- read.csv("data_input/Student_Performance.csv", stringsAsFactors = T)

rmarkdown::paged_table(performance)
str(performance)
#> 'data.frame':    10000 obs. of  6 variables:
#>  $ Hours.Studied                   : int  7 4 8 5 7 3 7 8 5 4 ...
#>  $ Previous.Scores                 : int  99 82 51 52 75 78 73 45 77 89 ...
#>  $ Extracurricular.Activities      : Factor w/ 2 levels "No","Yes": 2 1 2 2 1 1 2 2 1 1 ...
#>  $ Sleep.Hours                     : int  9 4 7 5 8 9 5 4 8 4 ...
#>  $ Sample.Question.Papers.Practiced: int  1 2 2 2 5 6 6 6 2 0 ...
#>  $ Performance.Index               : num  91 65 45 36 66 61 63 42 61 69 ...

Dari hasil pembacaan dataset di atas, terdapat 10.000 data observasi dengan 6 kolom. Di sini kolom Performance.Index menjadi targetnya dan 5 kolom sisanya akan menjadi prediktor. Adapun untuk penjelasan masing-masing kolom adalah sebagai berikut.

  • Hours.Studied : Total jam yang dihabiskan siswa untuk belajar.
  • Previous.Scores : Nilai yang didapatkan oleh siswa di tes sebelumnya.
  • Extracurricular.Activities : Apakah siswa mengikuti kegiatan ekstrakulikuler.
  • Sleep.Hours : Rata-rata jam tidur siswa per hari.
  • Sample.Question.Papers.Practiced : Jumlah contoh soal yang dikerjakan siswa.
  • Performance.Index : Ukuran kinerja keseluruhan setiap siswa.

Kemudian kita akan melakukan pengecekan apakah dataset tersebut terdapat Missing Value.

performance %>% is.na() %>% colSums()
#>                    Hours.Studied                  Previous.Scores 
#>                                0                                0 
#>       Extracurricular.Activities                      Sleep.Hours 
#>                                0                                0 
#> Sample.Question.Papers.Practiced                Performance.Index 
#>                                0                                0

3 Exploratory Data Analysis

Analisis data eksploratif adalah tahap untuk eksplorasi variabel data, melihat apakah ada pola yang dapat menunjukkan adanya korelasi apa pun antara variabel dengan target.

ggcorr(data = performance, label = T)

Pada grafik korelasi, terlihat bahwa hanya terdapat 2 variabel yang memiliki pengaruh positif terhadap Performance.Index yaitu Previous.Scores memiliki korelasi positif yang paling tinggi dan Hours.Studied, dan 2 variabel tersebut memiliki korelasi yang positif yang mana semakin tinggi nilai 2 variabel tersebut maka semakin tinggi juga Index Performance yang dimiliki siswa.

boxplot(performance)

Dan dari visualisasi bloxpot di atas membuktikan bahwa tidak ada data outlier di masing-masing kolom sehingga data bisa diproses ke tahap selanjutnya.

4 Modeling

Sebelum membuat model linear regression, di sini kita perlu memecah data menjadi 2 bagian yaitu train dataset untuk melakukan pelatihan model yang akan dibuat dan test dataset untuk menguji model yang telah dibuat.

RNGkind(sample.kind = "Rounding")
set.seed(123)
splitter <- initial_split(data = performance, prop = 0.8)
train <- training(splitter)
test <- testing(splitter)

Di sini kita akan membuat model dengan 1 variabel yang memiliki korelasi paling tinggi terlebih dahulu berdasarkan hasil visualisasi dari ggcorr sebelumnya dan nanti akan dibandingkan dengan model yang akan dibuat dengan menggunakan metode Step-wise Regression (Step-wise regression membantu kita memilih prediktor yang baik, dengan cara mencari kombinasi prediktor yang menghasilkan model terbaik berdasarkan nilai AIC).

4.1 Model 1 Variabel

model_lm <- lm(formula = Performance.Index ~ Previous.Scores, data = train)
summary(model_lm)
#> 
#> Call:
#> lm(formula = Performance.Index ~ Previous.Scores, data = train)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -17.7693  -6.5481  -0.0251   6.3690  18.0095 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)     -15.184654   0.359172  -42.28 <0.0000000000000002 ***
#> Previous.Scores   1.013825   0.005006  202.52 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 7.746 on 7998 degrees of freedom
#> Multiple R-squared:  0.8368, Adjusted R-squared:  0.8368 
#> F-statistic: 4.101e+04 on 1 and 7998 DF,  p-value: < 0.00000000000000022

Model tersebut memiliki Adjusted R-Squared sebesar 0.8368 yang mana predictor yaitu Previous.Scores dapat menjelaskan variansi data sebesar 83%, sedangkan sisanya dijelaskan oleh factor yang lain.

4.2 Model Step-wise Regression

Selanjutnya akan digunakan metode Step-wise Regression untuk melihat prediktor apa saja yang berpengaruh terhadap target.

model_lm_all <- lm(formula = Performance.Index ~ ., data = train)
model_backward <- step(object = model_lm_all,
                       direction = "backward")
#> Start:  AIC=11418.51
#> Performance.Index ~ Hours.Studied + Previous.Scores + Extracurricular.Activities + 
#>     Sleep.Hours + Sample.Question.Papers.Practiced
#> 
#>                                    Df Sum of Sq     RSS   AIC
#> <none>                                            33290 11419
#> - Extracurricular.Activities        1       830   34120 11614
#> - Sample.Question.Papers.Practiced  1      2491   35781 11994
#> - Sleep.Hours                       1      5384   38674 12616
#> - Hours.Studied                     1    435310  468600 32572
#> - Previous.Scores                   1   2478411 2511701 46004

Dari hasil Step-wise Regression di atas dapat kita tarik kesimpulan bahwa ketika menggunakan seluruh variabel menjadi prediktor nilai AIC (AIC menyatakan informasi yang hilang (information lost): Semakin kecil AIC, semkain sedikit informasi yang hilang (bagus)) adalah yang paling kecil yaitu sebesar 11418.51.

summary(model_lm_all)
#> 
#> Call:
#> lm(formula = Performance.Index ~ ., data = train)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -8.6382 -1.3801 -0.0249  1.3614  8.8011 
#> 
#> Coefficients:
#>                                    Estimate Std. Error t value
#> (Intercept)                      -34.033669   0.142103 -239.50
#> Hours.Studied                      2.846696   0.008805  323.31
#> Previous.Scores                    1.017684   0.001319  771.46
#> Extracurricular.ActivitiesYes      0.644471   0.045648   14.12
#> Sleep.Hours                        0.484090   0.013463   35.96
#> Sample.Question.Papers.Practiced   0.194300   0.007944   24.46
#>                                             Pr(>|t|)    
#> (Intercept)                      <0.0000000000000002 ***
#> Hours.Studied                    <0.0000000000000002 ***
#> Previous.Scores                  <0.0000000000000002 ***
#> Extracurricular.ActivitiesYes    <0.0000000000000002 ***
#> Sleep.Hours                      <0.0000000000000002 ***
#> Sample.Question.Papers.Practiced <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 2.041 on 7994 degrees of freedom
#> Multiple R-squared:  0.9887, Adjusted R-squared:  0.9887 
#> F-statistic: 1.396e+05 on 5 and 7994 DF,  p-value: < 0.00000000000000022

Model tersebut memiliki Multiple R-Squared sebesar 0.9887 yang mana predictor yaitu seluruh variabel dapat menjelaskan variansi data sebesar 98%, sedangkan sisanya dijelaskan oleh factor yang lain.

4.3 Comparison Model

Dari summary model yang telah dilakukan di atas, dapat diketahui Adjusted/Multiple R-squared dari masing-masing model yaitu:

  • Model model_lm : 0.8368
  • Model model_lm_all : 0.9887

Maka dapat disimpulkan bahwa model yang terbaik adalah pada saat semua variabel yang ada menjadi prediktor dengan R-Squared sebesar 0.9887 yaitu model_lm_all. Untuk perbedaan hasil pada saat visualisasi korelasi antara variabel dengan menggunakan fungsi ggcorr di atas dengan hasil Step-wise Regression mungkin ggcorr tidak mempertimbangkan efek interaksi atau non-linearitas antara variabel. Ini berarti bahwa hubungan yang lebih kompleks mungkin tidak terdeteksi dalam visualisasi korelasi.

5 Asumsi Linear Regression

5.1 Linearity

Linearity artinya target variabel dengan prediktornya memiliki hubungan yang linear atau hubungannya bersifat garis lurus. Untuk menentukan asumsi linearitas dari sebuah multiple linear regression dapat dilakukan dengan membuat plot residual vs fitted values.

plot(model_lm_all, which = 1)
abline(h = 10, col = "blue")
abline(h = -10, col = "blue")

Kesimpulan : Residual banyak berkumpul di sekitar nilai 0 sehingga asumsi Linearity [TERPENUHI].

5.2 Normality of Residuals

Model linear regression diharapkan menghasilkan error yang berdistribusi normal. Dengan begitu, error lebih banyak berkumpul di sekitar angka nol.

hist(model_lm_all$residuals)

ks.test(model_lm_all$residuals,
        "pnorm",
        mean = mean(model_lm_all$residuals),
        sd = sd(model_lm_all$residuals))
#> 
#>  Asymptotic one-sample Kolmogorov-Smirnov test
#> 
#> data:  model_lm_all$residuals
#> D = 0.0056788, p-value = 0.9586
#> alternative hypothesis: two-sided

Kesimpulan : Dari hasil visualisasi residual pada model linear regression di atas terlihat bahwa residual terdistribusi normal (plot membentuk lonceng dengan residual berkumpul di 0) serta p-value > alpha sehingga gagal tolak H0 (terima H1) yaitu error terdistribusi normal. Maka uji asumsi Normality of Residuals [TERPENUHI].

5.3 Homoscedasticity of Residuals

Diharapkan error yang dihasilkan oleh model menyebar secara acak atau dengan variasi konstan. Apabila divisualisasikan maka error tidak berpola. Kondisi ini disebut juga sebagai homoscedasticity.

bptest(model_lm_all)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_lm_all
#> BP = 1.3971, df = 5, p-value = 0.9246

Kesimpulan : p-value > alpha sehingga gagal tolak H0 (terima H1) yaitu error menyebar konstan atau homoscedasticity. Maka uji asumsi Homoscedasticity of Residuals [TERPENUHI].

5.4 Multicollinearity

Multicollinearity adalah kondisi adanya korelasi antar prediktor yang kuat. Hal ini tidak diinginkan karena menandakan prediktor redundan pada model, yang seharusnya dapat dipilih salah satu saja dari variable yang hubungannya amat kuat tersebut. Harapannya tidak terjadi multicollinearity.

Uji VIF (Variance Inflation Factor) memiliki interpretasi sebagai berikut :

  • nilai VIF > 10: terjadi multicollinearity pada model
  • nilai VIF < 10: tidak terjadi multicollinearity pada model
vif(model_lm_all)
#>                    Hours.Studied                  Previous.Scores 
#>                         1.000705                         1.000424 
#>       Extracurricular.Activities                      Sleep.Hours 
#>                         1.000756                         1.000453 
#> Sample.Question.Papers.Practiced 
#>                         1.000990

Kesimpulan : seluruh prediktor memiliki nilai VIF < 10 sehingga tidak terjadi multicollinearity pada model. Maka uji asumsi Multicollinearity [TERPENUHI].

5.5 Kesimpulan Asumsi

Kesimpulan Dari 4 uji asumsi yang dilakukan, dapat ditarik kesimpulan :

  1. Linearity -> [TERPENUHI]
  2. Normality of Residuals -> [TERPENUHI]
  3. Homoscedasticity of Residuals -> [TERPENUHI]
  4. No Multicollinearity -> [TERPENUHI]

Maka, model yang kita buat dianggap sebagai Best Linear Unbiased Estimator (BLUE) model, yaitu model yang dapat memprediksi data baru secara konsisten

6 Prediction

Selanjutnya Kita akan mencoba melakukan prediksi terhadap data test yang telah dibuat kemudian menyimpannya ke dalam kolom baru sehingga nanti bisa kita bandingkan dengan data aslinya.

test$pred_lm <- predict(object = model_lm_all, newdata = test)
head(test, 10)

7 Model Evaluation

Untuk mengetahui apakah model machine learning yang sudah dibuat cukup baik dengan melihat apakah hasil prediksi tersebut sudah menghasilkan error yang paling kecil, maka bisa menggunakan RMSE (Root Mean Square Error) yaitu ukuran yang digunakan untuk mengevaluasi seberapa baik model regresi dalam memprediksi nilai yang sebenarnya. Ini dihitung dengan mengambil akar kuadrat dari rata-rata kuadrat selisih antara nilai yang diprediksi dan nilai aktual.

RMSE(y_pred = test$pred_lm, y_true = test$Performance.Index)
#> [1] 2.028622

RMSE sebesar 2.028622 menunjukkan bahwa, secara rata-rata, prediksi model_lm_all menyimpang dari nilai aktual sebesar sekitar 2.03. Ini berarti bahwa ketika model memprediksi nilai Performance.Index, kesalahan prediksi rata-rata adalah sekitar 2.03. Dikarenakan rentang nilai dari Performance.Index adalah 0 - 100, maka model_lm_all memprediksi dengan baik karena hasil prediksi hanya memiliki penyimpangan nilai rata-rata sebesar 2.03.

8 Kesimpulan

Model Linear Regression model_lm_all yang telah dibuat memiliki R-Squared sebesar 0.9887 serta terpenuhi semua 4 uji asumsi dari Linear Regression. Serta memiliki nilai RMSE sebesar 2.03. Model tersebut bisa digunakan untuk memprediksi Student Performance yang lain sesuai dengan variabel yang ada pada Model Linear Regression ini.