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.
Kita akan memuat terlebih dahulu semua Library yang nantinya akan digunakan dalam melakukan analisis-analisis.
Kemudian memuat dataset Student Performance.
performance <- read.csv("data_input/Student_Performance.csv", stringsAsFactors = T)
rmarkdown::paged_table(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.
Kemudian kita akan melakukan pengecekan apakah dataset tersebut terdapat Missing Value.
#> Hours.Studied Previous.Scores
#> 0 0
#> Extracurricular.Activities Sleep.Hours
#> 0 0
#> Sample.Question.Papers.Practiced Performance.Index
#> 0 0
Analisis data eksploratif adalah tahap untuk eksplorasi variabel data, melihat apakah ada pola yang dapat menunjukkan adanya korelasi apa pun antara variabel dengan target.
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.
Dan dari visualisasi bloxpot di atas membuktikan bahwa tidak ada data outlier di masing-masing kolom sehingga data bisa diproses ke tahap selanjutnya.
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).
#>
#> 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.
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.
#>
#> 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.
Dari summary model yang telah dilakukan di atas, dapat diketahui Adjusted/Multiple R-squared dari masing-masing model yaitu:
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.
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.
Kesimpulan : Residual banyak berkumpul di sekitar nilai 0 sehingga asumsi Linearity [TERPENUHI].
Model linear regression diharapkan menghasilkan error yang berdistribusi normal. Dengan begitu, error lebih banyak berkumpul di sekitar angka nol.
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].
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.
#>
#> 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].
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 :
#> 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].
Kesimpulan Dari 4 uji asumsi yang dilakukan, dapat ditarik kesimpulan :
TERPENUHI
]TERPENUHI
]TERPENUHI
]TERPENUHI
]Maka, model yang kita buat dianggap sebagai Best Linear Unbiased Estimator (BLUE) model, yaitu model yang dapat memprediksi data baru secara konsisten
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.
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.
#> [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.
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.