Project-Based Learning ini merupakan tugas yang disusun untuk memenuhi komponen penilaian kuis dan Ujian Tengah Semester (UTS) pada semester genap dalam mata kuliah Visualisasi Data Lanjut. Proyek ini berfokus pada pengembangan visualisasi data yang mencakup tiga metode utama dalam analisis, yaitu Regresi Linear Berganda, Klasifikasi, dan Clustering. Dataset yang digunakan dalam proyek ini bersumber dari kaggle.
Dataset ini mengumpulkan berbagai parameter yang berkaitan dengan aspek akademik, psikologis, dan gaya hidup untuk menganalisis kesehatan mental dan tingkat burnout pada mahasiswa. Dataset ini dirancang untuk merepresentasikan berbagai tantangan yang dihadapi mahasiswa dalam lingkungan pembelajaran modern, di mana ekspektasi pribadi, paparan internet, dan tekanan akademik memberikan dampak negatif yang signifikan terhadap kesejahteraan. Dataset ini memberikan pemahaman yang komprehensif mengenai hubungan antara pencapaian akademik dan kondisi kesehatan mental, serta faktor-faktor seperti stres, kecemasan, depresi, pola tidur, tekanan finansial, dan dukungan sosial. Dengan skala yang besar, yaitu mencapai satu juta data, dataset ini sangat sesuai untuk analisis yang realistis, pemodelan, serta penelitian di bidang pendidikan, psikologi, dan data sains.
Dataset ini terdiri dari dua puluh kolom yang mencakup data demografis (usia, jenis kelamin, dan tahun akademik), perilaku akademik (jam belajar, performa, tekanan ujian), indikator kesehatan mental (tingkat stres, skor kecemasan, skor depresi, skor burnout, indeks kesehatan mental), serta faktor gaya hidup (jam tidur, aktivitas fisik, waktu layar, penggunaan internet, dan dukungan sosial). Selain itu, dataset ini juga mencakup faktor eksternal seperti ekspektasi keluarga dan tekanan finansial. Dataset ini sangat bermanfaat untuk penelitian prediktif karena menyediakan variabel output seperti risiko putus studi (dropout risk) dan tingkat risiko (risk level – rendah/tinggi). Karena setiap baris merepresentasikan satu mahasiswa, dataset ini memungkinkan analisis yang mendalam terhadap pola, korelasi, serta faktor risiko potensial yang dapat memengaruhi kesejahteraan mahasiswa.
library(ggplot2)
library(tidyr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.2
## corrplot 0.95 loaded
library(smotefamily)
## Warning: package 'smotefamily' was built under R version 4.5.2
Data_Student <- read.csv("C:/Users/Lenovo IP Slim 3/Downloads/student_mental_health_burnout_1M.csv", header = TRUE)
# lihat data
head(Data_Student)
## age gender academic_year study_hours_per_day exam_pressure
## 1 23 Male 2 5.596071 6.487218
## 2 20 Male 3 5.597171 5.631481
## 3 29 Male 2 2.580491 6.015297
## 4 27 Male 4 4.607208 6.684005
## 5 24 Male 4 2.186569 4.010945
## 6 29 Female 3 7.697210 8.460408
## academic_performance stress_level anxiety_score depression_score sleep_hours
## 1 68.41111 4.1169497 2.275713 1.9867302 6.880545
## 2 67.68216 0.3494894 0.000000 0.0000000 7.463339
## 3 58.37236 3.4761768 2.425201 0.8519955 8.946670
## 4 68.92565 6.7788425 4.512425 4.2856453 4.571380
## 5 69.14192 1.8545952 1.102558 0.0000000 5.989324
## 6 68.33225 5.4647865 1.720314 2.3133384 6.574379
## physical_activity social_support screen_time internet_usage financial_stress
## 1 2.728861 6.470080 4.993801 4.983157 3.446626
## 2 3.690866 0.000000 3.862980 5.136124 2.814039
## 3 3.296720 6.901725 5.428880 3.058333 4.918515
## 4 2.065480 2.349857 6.304842 6.931147 6.915885
## 5 4.026504 4.512921 4.903146 5.134903 4.382820
## 6 0.000000 3.928159 3.869208 3.918780 2.872448
## family_expectation burnout_score mental_health_index risk_level dropout_risk
## 1 3.586147 2.037344 7.074487 Low 1.7466011
## 2 5.478666 0.000000 9.860204 Low 0.0000000
## 3 6.068155 0.000000 7.626370 Low 0.6969413
## 4 6.557540 7.227651 4.649042 High 5.3805916
## 5 5.934779 0.000000 8.927394 Low 0.0000000
## 6 10.000000 1.472916 6.603990 Low 2.7310635
# Cek Missing Value
sum(is.na(Data_Student))
## [1] 0
# Lihat struktur data
str(Data_Student)
## 'data.frame': 1000000 obs. of 20 variables:
## $ age : int 23 20 29 27 24 29 21 23 26 19 ...
## $ gender : chr "Male" "Male" "Male" "Male" ...
## $ academic_year : int 2 3 2 4 4 3 3 2 4 3 ...
## $ study_hours_per_day : num 5.6 5.6 2.58 4.61 2.19 ...
## $ exam_pressure : num 6.49 5.63 6.02 6.68 4.01 ...
## $ academic_performance: num 68.4 67.7 58.4 68.9 69.1 ...
## $ stress_level : num 4.117 0.349 3.476 6.779 1.855 ...
## $ anxiety_score : num 2.28 0 2.43 4.51 1.1 ...
## $ depression_score : num 1.987 0 0.852 4.286 0 ...
## $ sleep_hours : num 6.88 7.46 8.95 4.57 5.99 ...
## $ physical_activity : num 2.73 3.69 3.3 2.07 4.03 ...
## $ social_support : num 6.47 0 6.9 2.35 4.51 ...
## $ screen_time : num 4.99 3.86 5.43 6.3 4.9 ...
## $ internet_usage : num 4.98 5.14 3.06 6.93 5.13 ...
## $ financial_stress : num 3.45 2.81 4.92 6.92 4.38 ...
## $ family_expectation : num 3.59 5.48 6.07 6.56 5.93 ...
## $ burnout_score : num 2.04 0 0 7.23 0 ...
## $ mental_health_index : num 7.07 9.86 7.63 4.65 8.93 ...
## $ risk_level : chr "Low" "Low" "Low" "High" ...
## $ dropout_risk : num 1.747 0 0.697 5.381 0 ...
# Ringkasan Data
summary(Data_Student)
## age gender academic_year study_hours_per_day
## Min. :17 Length:1000000 Min. :1.000 Min. : 0.000
## 1st Qu.:20 Class :character 1st Qu.:2.000 1st Qu.: 3.651
## Median :23 Mode :character Median :3.000 Median : 4.998
## Mean :23 Mean :2.501 Mean : 5.002
## 3rd Qu.:26 3rd Qu.:4.000 3rd Qu.: 6.346
## Max. :29 Max. :4.000 Max. :14.000
## exam_pressure academic_performance stress_level anxiety_score
## Min. : 1.000 Min. :42.37 Min. : 0.000 Min. : 0.000
## 1st Qu.: 4.945 1st Qu.:67.18 1st Qu.: 3.103 1st Qu.: 1.924
## Median : 5.999 Median :71.00 Median : 4.244 Median : 2.970
## Mean : 5.999 Mean :71.00 Mean : 4.246 Mean : 2.986
## 3rd Qu.: 7.052 3rd Qu.:74.82 3rd Qu.: 5.385 3rd Qu.: 4.015
## Max. :10.000 Max. :97.25 Max. :10.000 Max. :10.000
## depression_score sleep_hours physical_activity social_support
## Min. :0.000000 Min. : 3.000 Min. :0.000 Min. : 0.000
## 1st Qu.:0.005198 1st Qu.: 5.491 1st Qu.:1.991 1st Qu.: 3.650
## Median :1.047839 Median : 6.502 Median :3.001 Median : 4.999
## Mean :1.274728 Mean : 6.502 Mean :3.011 Mean : 5.000
## 3rd Qu.:2.086397 3rd Qu.: 7.515 3rd Qu.:4.011 3rd Qu.: 6.350
## Max. :8.530800 Max. :10.000 Max. :7.000 Max. :10.000
## screen_time internet_usage financial_stress family_expectation
## Min. : 1.000 Min. : 1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 3.651 1st Qu.: 3.491 1st Qu.: 3.657 1st Qu.: 4.647
## Median : 5.004 Median : 5.002 Median : 5.001 Median : 6.000
## Mean : 5.019 Mean : 5.038 Mean : 5.003 Mean : 5.983
## 3rd Qu.: 6.351 3rd Qu.: 6.507 3rd Qu.: 6.355 3rd Qu.: 7.352
## Max. :12.000 Max. :14.000 Max. :10.000 Max. :10.000
## burnout_score mental_health_index risk_level dropout_risk
## Min. : 0.0000 Min. : 1.310 Length:1000000 Min. :0.000
## 1st Qu.: 0.1248 1st Qu.: 6.142 Class :character 1st Qu.:0.000
## Median : 1.4965 Median : 7.074 Mode :character Median :1.010
## Mean : 1.7841 Mean : 7.023 Mean :1.325
## 3rd Qu.: 2.8895 3rd Qu.: 7.962 3rd Qu.:2.174
## Max. :10.0000 Max. :10.000 Max. :9.326
Berdasarkan hasil statistik deskriptif, variabel age menunjukkan bahwa usia mahasiswa berada pada rentang 17 hingga 29 tahun dengan rata-rata sekitar 23 tahun, yang mengindikasikan dominasi mahasiswa usia produktif. Variabel academic_year memiliki nilai rata-rata 2,5 yang menunjukkan distribusi mahasiswa relatif merata dari tahun pertama hingga keempat. Rata-rata study_hours_per_day sebesar 5 jam per hari dengan rentang yang cukup luas hingga 14 jam, sementara exam_pressure memiliki rata-rata sekitar 6 yang menunjukkan tingkat tekanan akademik yang sedang. Variabel academic_performance memiliki rata-rata sekitar 71 dengan rentang nilai yang cukup besar, menandakan variasi performa akademik yang cukup tinggi.
Dari aspek kesehatan mental, stress_level, anxiety_score, dan depression_score memiliki rata-rata masing-masing sekitar 4,2; 2,9; dan 1,27, yang menunjukkan bahwa sebagian besar mahasiswa berada pada tingkat rendah hingga sedang. Variabel burnout_score memiliki rata-rata relatif rendah (1,78), sedangkan mental_health_index memiliki rata-rata cukup tinggi (7,02), yang mengindikasikan kondisi kesehatan mental yang cenderung baik secara umum. Selain itu, variabel gaya hidup seperti sleep_hours (rata-rata 6,5 jam), physical_activity (3 kali), dan screen_time (sekitar 5 jam) menunjukkan pola aktivitas yang cukup moderat.
Variabel internet_usage, financial_stress, dan family_expectation memiliki rata-rata sekitar 5, yang menunjukkan tingkat sedang, sedangkan social_support juga berada pada rata-rata 5 yang mengindikasikan dukungan sosial yang cukup. Untuk variabel hasil, dropout_risk memiliki rata-rata rendah (1,32), sementara risk_level didominasi oleh kategori rendah. Secara keseluruhan, statistik deskriptif menunjukkan bahwa mayoritas mahasiswa berada pada kondisi yang relatif stabil dengan tingkat stres dan risiko yang tidak terlalu tinggi, meskipun tetap terdapat variasi yang cukup besar pada beberapa variabel.
# Visualisasi Data Awal
## Histogram
Data_Student %>%
select(where(is.numeric)) %>%
pivot_longer(cols = everything(),
names_to = "variabel",
values_to = "nilai") %>%
ggplot(aes(x = nilai)) +
geom_histogram(fill = "lightblue2", color = "black", bins = 30) +
facet_wrap(~variabel, scales = "free_x") +
labs(x = "Nilai", y = "Frekuensi",
title = "Distribusi Variabel Numerik") +
theme_bw()
Berdasarkan visualisasi distribusi variabel numerik, sebagian besar variabel menunjukkan pola distribusi yang mendekati normal, yang mengindikasikan penyebaran data yang relatif seimbang. Namun, beberapa variabel seperti burnout_score, depression_score, dan dropout_risk menunjukkan distribusi yang cenderung miring ke kanan, yang mengindikasikan bahwa sebagian besar mahasiswa berada pada tingkat rendah hingga sedang, dengan hanya sebagian kecil yang mengalami kondisi ekstrem. Selain itu, terdapat variabel diskrit seperti academic_year yang bersifat kategorik ordinal. Secara keseluruhan, variasi data yang cukup luas pada beberapa variabel menunjukkan potensi hubungan yang dapat dianalisis lebih lanjut dalam pemodelan statistik.
# Visualisasi Data Awal
## Boxplot
Data_Student %>%
select(where(is.numeric)) %>%
pivot_longer(cols = everything(),
names_to = "variabel",
values_to = "nilai") %>%
ggplot(aes(x = variabel, y = nilai)) +
geom_boxplot(fill = "lightgreen") +
coord_flip() +
labs(title = "Boxplot Variabel Numerik",
x = "Variabel",
y = "Nilai") +
theme_bw()
Berdasarkan hasil visualisasi boxplot, variabel academic_performance menunjukkan variasi yang luas dengan beberapa outlier yang mencerminkan perbedaan performa antar mahasiswa, sementara academic_year bersifat diskrit dengan sebaran terbatas pada tingkat tahun akademik, dan age memiliki variasi yang cukup dengan distribusi yang relatif normal. Variabel kesehatan mental seperti anxiety_score, burnout_score, dan depression_score umumnya didominasi oleh nilai rendah hingga sedang, namun tetap terdapat beberapa nilai ekstrem, khususnya pada burnout_score dan depression_score yang cenderung miring ke kanan. Variabel dropout_risk juga menunjukkan pola serupa dengan mayoritas nilai rendah dan beberapa outlier tinggi. Sementara itu, exam_pressure, family_expectation, dan financial_stress memiliki distribusi yang relatif seimbang dengan variasi sedang. Pada aspek gaya hidup, internet_usage dan screen_time menunjukkan variasi yang cukup tinggi dengan adanya nilai ekstrem, sedangkan physical_activity memiliki variasi yang relatif rendah. Variabel mental_health_index, sleep_hours, dan stress_level menunjukkan distribusi yang cukup normal dengan nilai yang terkonsentrasi pada rentang tengah. Selain itu, social_support memiliki sebaran yang cukup merata, dan study_hours_per_day menunjukkan variasi yang terbatas dengan nilai yang cenderung terkonsentrasi pada rentang tertentu. Secara keseluruhan, sebagian besar variabel menunjukkan distribusi yang relatif stabil, namun keberadaan outlier pada beberapa variabel mengindikasikan adanya kondisi ekstrem yang perlu diperhatikan dalam analisis lanjutan.
# Visualisasi Data Awal
## Heatmap
num_data <- Data_Student[sapply(Data_Student, is.numeric)]
cor_matrix <- cor(num_data)
corrplot(cor_matrix, method = "color", type = "upper", tl.cex = 0.7)
Berdasarkan heatmap korelasi, variabel kesehatan mental seperti stress_level, anxiety_score, dan depression_score menunjukkan korelasi positif yang kuat terhadap burnout_score, yang mengindikasikan bahwa peningkatan kondisi psikologis negatif berkaitan dengan meningkatnya tingkat burnout. Sebaliknya, mental_health_index memiliki korelasi negatif yang kuat terhadap burnout_score, yang menunjukkan bahwa kondisi kesehatan mental yang baik dapat menurunkan tingkat burnout. Selain itu, dropout_risk juga berkorelasi positif dengan variabel kesehatan mental, yang menandakan bahwa kondisi mental yang buruk dapat meningkatkan risiko putus studi. Faktor gaya hidup seperti sleep_hours menunjukkan hubungan negatif terhadap stres, sementara variabel lain seperti screen_time dan internet_usage memiliki korelasi yang relatif lemah. Secara keseluruhan, faktor psikologis memiliki pengaruh yang lebih dominan dibandingkan faktor akademik dan gaya hidup.
# Visualisasi Data Awal
## Bar Chart
Data_Student %>%
select(risk_level, gender, academic_year) %>%
mutate(academic_year = as.factor(academic_year)) %>%
pivot_longer(cols = everything(),
names_to = "variabel",
values_to = "kategori") %>%
ggplot(aes(x = kategori, fill = kategori)) +
geom_bar() +
facet_wrap(~variabel, scales = "free") +
labs(title = "Distribusi Variabel Kategorik",
x = "Kategori",
y = "Jumlah") +
theme_bw() +
theme(legend.position = "none")
Berdasarkan visualisasi variabel kategorik, distribusi academic_year menunjukkan keseimbangan pada setiap tingkat tahun akademik, sehingga data dapat dianggap representatif. Variabel gender juga relatif seimbang antara laki-laki dan perempuan, meskipun kategori “Other” memiliki proporsi yang jauh lebih kecil. Sementara itu, variabel risk_level menunjukkan ketidakseimbangan distribusi, di mana kategori risiko rendah mendominasi dibandingkan kategori sedang dan tinggi. Kondisi ini mengindikasikan bahwa sebagian besar mahasiswa berada pada tingkat risiko rendah, namun juga perlu diperhatikan dalam analisis klasifikasi karena potensi bias akibat ketidakseimbangan data.
# Visualisasi Data Awal
## Pie Chart
Data_Student %>%
count(risk_level) %>%
ggplot(aes(x = "", y = n, fill = risk_level)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y") +
labs(title = "Proporsi Risk Level",
fill = "Risk Level") +
theme_void()
# Encoding Variabel Kategorik
Data_Student$gender <- as.factor(Data_Student$gender)
Data_Student$risk_level <- as.factor(Data_Student$risk_level)
# Standarisasi Data
Scaled_Student <- scale(Data_Student[, sapply(Data_Student, is.numeric)])
table(Data_Student$risk_level)
##
## High Low Medium
## 15080 766645 218275
Distribusi variabel risk_level menunjukkan ketidakseimbangan yang signifikan, di mana kategori risiko rendah mendominasi dengan proporsi sekitar 76%, diikuti oleh risiko sedang sebesar 21%, dan risiko tinggi hanya sekitar 1,5%. Kondisi ini mengindikasikan bahwa sebagian besar mahasiswa berada pada tingkat risiko rendah, sementara kasus dengan risiko tinggi relatif jarang. Dapat disimpulkan bahwa terjadi ketidakseimbangan kelas.
# Equal Sampling
set.seed(123)
n_target <- min(table(Data_Student$risk_level))
data_balanced <- Data_Student %>%
group_by(risk_level) %>%
slice_sample(n = n_target) %>%
ungroup()
table(data_balanced$risk_level)
##
## High Low Medium
## 15080 15080 15080
Hasil equal sampling menunjukkan bahwa jumlah data pada setiap kategori risk_level telah berhasil diseimbangkan dengan jumlah yang sama. Hal ini menghilangkan dominasi kelas mayoritas dan memungkinkan model klasifikasi untuk belajar secara lebih adil terhadap setiap kelas.
Analisis Regresi Linear Berganda merupakan analisis untuk mengetahui pengaruh variabel bebas (independen) yang jumlahnya lebih dari satu terhadap satu variabel terikat (dependen). Model analisis regresi linier berganda digunakan untuk menjelaskan hubungan dan seberapa besar pengaruh variabel-variabel bebas (independen) terhadap variabel terikat (dependen) (Ghazali,2018).
Analisis regresi dilakukan menggunakan metode Regresi Linier Berganda dimana bentuk umum dari persamaan metode ini adalah sebagai berikut:
\[Y = \alpha + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \cdots + \beta_n X_n\] Dalam analisis regresi, variabel dependen (Y) harus berupa data numerik yang ingin diprediksi atau dijelaskan. Pada dataset ini, variabel yang dipilih sebagai Y adalah burnout_score. burnout_score dipilih karena merupakan variabel numerik yang merepresentasikan tingkat kelelahan mental mahasiswa dan memiliki hubungan dengan beberapa variabel prediktor dalam dataset.
model_reg <- lm(burnout_score ~ age + gender + academic_year +
study_hours_per_day + exam_pressure +
academic_performance + stress_level +
anxiety_score + depression_score +
sleep_hours + physical_activity +
social_support + screen_time +
internet_usage + financial_stress +
family_expectation,
data = data_balanced)
summary(model_reg)
##
## Call:
## lm(formula = burnout_score ~ age + gender + academic_year + study_hours_per_day +
## exam_pressure + academic_performance + stress_level + anxiety_score +
## depression_score + sleep_hours + physical_activity + social_support +
## screen_time + internet_usage + financial_stress + family_expectation,
## data = data_balanced)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.1757 -0.6977 -0.0003 0.6981 3.9153
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.5989984 0.0856380 6.995 2.7e-12 ***
## age 0.0012450 0.0012875 0.967 0.33356
## genderMale -0.0156471 0.0098185 -1.594 0.11103
## genderOther -0.0733842 0.0252557 -2.906 0.00367 **
## academic_year -0.0001264 0.0042940 -0.029 0.97652
## study_hours_per_day 0.0068134 0.0042186 1.615 0.10630
## exam_pressure 0.1945758 0.0056388 34.507 < 2e-16 ***
## academic_performance -0.0008269 0.0009693 -0.853 0.39358
## stress_level 0.4793196 0.0064453 74.367 < 2e-16 ***
## anxiety_score 0.3091454 0.0048218 64.114 < 2e-16 ***
## depression_score 0.2396786 0.0051279 46.740 < 2e-16 ***
## sleep_hours -0.2970548 0.0036084 -82.323 < 2e-16 ***
## physical_activity -0.0046467 0.0034751 -1.337 0.18118
## social_support -0.1906886 0.0027920 -68.298 < 2e-16 ***
## screen_time -0.0017080 0.0054004 -0.316 0.75180
## internet_usage 0.0036154 0.0049030 0.737 0.46090
## financial_stress 0.0019540 0.0031098 0.628 0.52978
## family_expectation 0.0027424 0.0028812 0.952 0.34118
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.023 on 45222 degrees of freedom
## Multiple R-squared: 0.8263, Adjusted R-squared: 0.8263
## F-statistic: 1.266e+04 on 17 and 45222 DF, p-value: < 2.2e-16
Nilai R-squared sebesar 0,8263 menunjukkan bahwa sekitar 82,63% variasi burnout_score dapat dijelaskan oleh variabel independen dalam model regresi. Hal ini mengindikasikan bahwa model memiliki kemampuan yang sangat baik dalam menjelaskan hubungan antara variabel prediktor dengan tingkat burnout mahasiswa, sementara sisanya sebesar 17,37% dipengaruhi oleh faktor lain di luar model.
Koefisien regresi menunjukkan bahwa setiap peningkatan satu satuan pada variabel independen akan mempengaruhi burnout_score sesuai dengan nilai koefisiennya, dengan asumsi variabel lain konstan. Variabel stress_level memiliki pengaruh terbesar dengan koefisien sebesar 0,479, yang berarti setiap kenaikan satu unit stres akan meningkatkan burnout_score sebesar 0,479, diikuti oleh anxiety_score 0,309, depression_score 0,24, dan exam_pressure 0,195 yang juga berpengaruh positif signifikan. Sebaliknya, variabel sleep_hours memiliki koefisien negatif sebesar -0,297 yang menunjukkan bahwa setiap tambahan satu jam tidur akan menurunkan burnout_score sebesar 0,297, serta social_support -0,191 yang juga berperan dalam menurunkan tingkat burnout. Selain itu, kategori gender Other memiliki nilai burnout_score lebih rendah sebesar 0,073 dibandingkan kategori referensi. Sementara itu, variabel lain tidak menunjukkan pengaruh yang signifikan terhadap burnout_score dalam model ini.
Berdasarkan analisis residual, nilai median residual yang mendekati nol -0,04989 menunjukkan bahwa model tidak memiliki bias yang signifikan. Sebaran residual yang relatif simetris antara nilai minimum -2,073 dan maksimum 3,079 mengindikasikan bahwa kesalahan prediksi tersebar secara cukup merata sehingga tidak terdapat indikasi pelanggaran asumsi utama regresi seperti homoskedastisitas dan linearitas.
# Scatter Plot
ggplot(data_balanced, aes(x = stress_level, y = burnout_score)) +
geom_point(alpha = 0.4) +
geom_smooth(method = "lm") +
labs(title = "Hubungan Stress Level dengan Burnout Score",
x = "Stress Level",
y = "Burnout Score") +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'
Scatter plot menunjukkan hubungan positif antara stress_level dan burnout_score, di mana peningkatan stres diikuti dengan peningkatan burnout. Variabel ini dipilih karena memiliki pengaruh paling besar dan signifikan dalam model, sehingga paling representatif untuk divisualisasikan.
# Plot Residual vs Fitted
plot(model_reg, which = 1)
Plot residual menunjukkan bahwa sebagian besar titik tersebar di sekitar garis horizontal nol, yang mengindikasikan bahwa model secara umum sudah cukup baik dalam menangkap pola hubungan antara variabel independen dan dependen. Namun, terlihat adanya pola lengkung (kurva) pada garis smoothing serta bentuk sebaran yang menyerupai kipas/segitiga, yang mengindikasikan adanya potensi pelanggaran asumsi linearitas dan homoskedastisitas.
# Heatmap
library(corrplot)
num_data <- data_balanced[sapply(data_balanced, is.numeric)]
cor_matrix <- cor(num_data)
corrplot(cor_matrix, method = "color", type = "upper")
# Korelasi
cor_matrix
## age academic_year study_hours_per_day
## age 1.0000000000 0.0062487674 0.0003144518
## academic_year 0.0062487674 1.0000000000 -0.0026702926
## study_hours_per_day 0.0003144518 -0.0026702926 1.0000000000
## exam_pressure -0.0014066348 -0.0054219507 0.7825461832
## academic_performance -0.0020239145 -0.0049393885 0.3931646691
## stress_level -0.0021573283 -0.0059785604 0.4323933223
## anxiety_score 0.0007619344 -0.0030027674 0.3611351344
## depression_score -0.0037531423 -0.0063799207 0.3262613188
## sleep_hours -0.0034914384 -0.0023751157 -0.0933826771
## physical_activity -0.0090614659 0.0016765771 -0.0283307424
## social_support 0.0025345302 0.0061531145 -0.0583669803
## screen_time -0.0028438164 0.0035882725 0.0053271339
## internet_usage -0.0021803981 0.0051486713 0.0022772803
## financial_stress 0.0010400024 -0.0053844639 0.0755277821
## family_expectation -0.0047623515 0.0007607741 0.0501544203
## burnout_score 0.0007542382 -0.0052534532 0.4313201085
## mental_health_index 0.0018870366 0.0057177195 -0.4209389802
## dropout_risk -0.0015989928 -0.0076814503 0.3074279813
## exam_pressure academic_performance stress_level
## age -0.0014066348 -0.002023915 -0.0021573283
## academic_year -0.0054219507 -0.004939388 -0.0059785604
## study_hours_per_day 0.7825461832 0.393164669 0.4323933223
## exam_pressure 1.0000000000 0.140541025 0.5539093744
## academic_performance 0.1405410247 1.000000000 0.0817245920
## stress_level 0.5539093744 0.081724592 1.0000000000
## anxiety_score 0.4636127747 0.068641225 0.8242305981
## depression_score 0.4150378312 0.058177249 0.7305615516
## sleep_hours -0.1158507747 -0.017632948 -0.3784298161
## physical_activity -0.0365428883 -0.007786684 -0.2008539132
## social_support -0.0741237646 -0.005998146 -0.1120828349
## screen_time 0.0006166012 0.005827738 0.0018759854
## internet_usage -0.0025860941 0.003930667 -0.0004981308
## financial_stress 0.0988733218 0.012149512 0.5174370189
## family_expectation 0.0667300167 0.009308715 0.3852063405
## burnout_score 0.5489933269 0.078752730 0.8483443492
## mental_health_index -0.5387143985 -0.078678349 -0.9630632824
## dropout_risk 0.3925924234 0.056201795 0.7042889970
## anxiety_score depression_score sleep_hours
## age 0.0007619344 -0.003753142 -0.003491438
## academic_year -0.0030027674 -0.006379921 -0.002375116
## study_hours_per_day 0.3611351344 0.326261319 -0.093382677
## exam_pressure 0.4636127747 0.415037831 -0.115850775
## academic_performance 0.0686412253 0.058177249 -0.017632948
## stress_level 0.8242305981 0.730561552 -0.378429816
## anxiety_score 1.0000000000 0.604936026 -0.318020047
## depression_score 0.6049360263 1.000000000 -0.287701731
## sleep_hours -0.3180200474 -0.287701731 1.000000000
## physical_activity -0.1652750087 -0.144978979 0.035006466
## social_support -0.0978008368 -0.414982330 0.061967449
## screen_time -0.0002753312 0.003169223 -0.003108478
## internet_usage -0.0026252285 0.001998107 -0.003123650
## financial_stress 0.4181124469 0.372588690 -0.073581283
## family_expectation 0.3148553177 0.272854985 -0.058744247
## burnout_score 0.7737032105 0.747142776 -0.471376030
## mental_health_index -0.8978576571 -0.838862348 0.369656817
## dropout_risk 0.6164198680 0.758028023 -0.325231828
## physical_activity social_support screen_time
## age -0.009061466 0.002534530 -0.0028438164
## academic_year 0.001676577 0.006153114 0.0035882725
## study_hours_per_day -0.028330742 -0.058366980 0.0053271339
## exam_pressure -0.036542888 -0.074123765 0.0006166012
## academic_performance -0.007786684 -0.005998146 0.0058277376
## stress_level -0.200853913 -0.112082835 0.0018759854
## anxiety_score -0.165275009 -0.097800837 -0.0002753312
## depression_score -0.144978979 -0.414982330 0.0031692234
## sleep_hours 0.035006466 0.061967449 -0.0031084780
## physical_activity 1.000000000 0.017208551 0.0017866579
## social_support 0.017208551 1.000000000 -0.0047329519
## screen_time 0.001786658 -0.004732952 1.0000000000
## internet_usage 0.001095563 -0.003980422 0.8902520915
## financial_stress -0.023360281 -0.054375413 -0.0088280289
## family_expectation -0.023489944 -0.033908019 -0.0002691502
## burnout_score -0.154174287 -0.305478422 0.0039735186
## mental_health_index 0.192840042 0.205691876 -0.0017384343
## dropout_risk -0.118668740 -0.443235302 0.0008190960
## internet_usage financial_stress family_expectation
## age -0.0021803981 0.001040002 -0.0047623515
## academic_year 0.0051486713 -0.005384464 0.0007607741
## study_hours_per_day 0.0022772803 0.075527782 0.0501544203
## exam_pressure -0.0025860941 0.098873322 0.0667300167
## academic_performance 0.0039306675 0.012149512 0.0093087152
## stress_level -0.0004981308 0.517437019 0.3852063405
## anxiety_score -0.0026252285 0.418112447 0.3148553177
## depression_score 0.0019981070 0.372588690 0.2728549847
## sleep_hours -0.0031236499 -0.073581283 -0.0587442473
## physical_activity 0.0010955630 -0.023360281 -0.0234899437
## social_support -0.0039804215 -0.054375413 -0.0339080192
## screen_time 0.8902520915 -0.008828029 -0.0002691502
## internet_usage 1.0000000000 -0.007724391 -0.0020739173
## financial_stress -0.0077243913 1.000000000 0.0473291586
## family_expectation -0.0020739173 0.047329159 1.0000000000
## burnout_score 0.0022790354 0.388954597 0.2894997487
## mental_health_index 0.0005122300 -0.494062028 -0.3676590105
## dropout_risk 0.0018875584 0.481581008 0.2156608782
## burnout_score mental_health_index dropout_risk
## age 0.0007542382 0.001887037 -0.001598993
## academic_year -0.0052534532 0.005717720 -0.007681450
## study_hours_per_day 0.4313201085 -0.420938980 0.307427981
## exam_pressure 0.5489933269 -0.538714398 0.392592423
## academic_performance 0.0787527298 -0.078678349 0.056201795
## stress_level 0.8483443492 -0.963063282 0.704288997
## anxiety_score 0.7737032105 -0.897857657 0.616419868
## depression_score 0.7471427756 -0.838862348 0.758028023
## sleep_hours -0.4713760299 0.369656817 -0.325231828
## physical_activity -0.1541742866 0.192840042 -0.118668740
## social_support -0.3054784224 0.205691876 -0.443235302
## screen_time 0.0039735186 -0.001738434 0.000819096
## internet_usage 0.0022790354 0.000512230 0.001887558
## financial_stress 0.3889545970 -0.494062028 0.481581008
## family_expectation 0.2894997487 -0.367659010 0.215660878
## burnout_score 1.0000000000 -0.877705489 0.799968132
## mental_health_index -0.8777054892 1.000000000 -0.760025181
## dropout_risk 0.7999681322 -0.760025181 1.000000000
Berdasarkan matriks korelasi, terlihat bahwa burnout_score memiliki hubungan yang kuat dengan beberapa variabel psikologis. Variabel stress_level memiliki korelasi positif paling tinggi dengan burnout_score sebesar 0,848, diikuti oleh anxiety_score 0,774 dan depression_score 0,747, yang menunjukkan bahwa semakin tinggi tingkat stres, kecemasan, dan depresi, maka semakin tinggi pula tingkat burnout. Selain itu, exam_pressure 0,549 dan study_hours_per_day 0,431 juga memiliki hubungan positif sedang dengan burnout. Sebaliknya, sleep_hours memiliki korelasi negatif yang cukup kuat sebesar -0,471, yang menunjukkan bahwa semakin lama waktu tidur, maka tingkat burnout cenderung menurun. Variabel social_support juga memiliki hubungan negatif -0,305 terhadap burnout. Sementara itu, variabel seperti usia, tahun akademik, penggunaan internet, dan screen time memiliki korelasi yang sangat lemah atau mendekati nol, sehingga tidak memiliki hubungan yang berarti dengan burnout_score.
Analisis klasifikasi adalah metode data mining dan statistika untuk mengelompokkan data ke dalam kategori atau kelas yang telah ditentukan (berlabel) berdasarkan pola dari data historis. Teknik ini bertujuan memprediksi kelas data baru menggunakan algoritma seperti pohon keputusan, jaringan saraf, atau regresi logistik.
Variabel target (Y) yang digunakan dalam analisis klasifikasi adalah risk_level, karena merupakan variabel kategorik yang merepresentasikan tingkat risiko kesehatan mental mahasiswa (low, medium, high), sehingga sesuai untuk digunakan sebagai target dalam model klasifikasi.
library(rpart)
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.2
set.seed(123)
# split data
train_index <- sample(1:nrow(data_balanced), 0.7*nrow(data_balanced))
train <- data_balanced[train_index, ]
test <- data_balanced[-train_index, ]
# model TANPA leakage
model_cls <- rpart(risk_level ~ age + gender + academic_year +
study_hours_per_day + sleep_hours +
physical_activity + social_support +
screen_time + internet_usage +
financial_stress + family_expectation,
data = train,
method = "class")
# visualisasi tree
rpart.plot(model_cls)
Beberapa variabel tidak digunakan karena memiliki korelasi yang sangat tinggi dengan variabel target sehingga berpotensi menyebabkan data leakage dan menghasilkan model yang tidak realistis.
# Confusion Matrix
pred <- predict(model_cls, test, type = "class")
# Tabel
cm <- table(Prediksi = pred, Aktual = test$risk_level)
# Data Frame
cm_df <- as.data.frame(cm)
# Plot
ggplot(cm_df, aes(x = Aktual, y = Prediksi, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq)) +
labs(title = "Confusion Matrix",
x = "Actual",
y = "Predicted") +
theme_minimal()
Berdasarkan visualisasi confusion matrix, terlihat bahwa model mampu mengklasifikasikan sebagian data dengan benar, yang ditunjukkan oleh nilai pada diagonal utama. Prediksi yang benar paling banyak terjadi pada kelas Low (3144), diikuti oleh kelas High (3425), dan Medium (823). Namun, masih terdapat cukup banyak kesalahan klasifikasi, terutama antara kelas High dan Medium, serta antara Low dan Medium.
Kesalahan terbesar terlihat pada data aktual Medium yang sering diprediksi sebagai Low (1513) dan High (2197), yang menunjukkan bahwa model mengalami kesulitan dalam membedakan karakteristik kelas Medium. Selain itu, terdapat juga kesalahan pada kelas Low yang diprediksi sebagai High (888), meskipun jumlahnya lebih kecil dibandingkan kesalahan lainnya.
Akurasi digunakan untuk mengukur proporsi prediksi yang benar terhadap seluruh data.
\(\text{Akurasi} = \frac{\text{Jumlah Prediksi Benar}}{\text{Total Data}}\)
Berdasarkan confusion matrix, jumlah prediksi benar diperoleh dari elemen diagonal utama, yaitu: \(3425 + 3144 + 823 = 7392\)
Sedangkan total data adalah: \(13573\)
Sehingga akurasi model adalah: \(\text{Akurasi} = \frac{7392}{13573} = 0.544\)
Nilai akurasi sebesar 54,4% menunjukkan bahwa model mampu mengklasifikasikan data dengan benar sekitar setengah dari keseluruhan data, sehingga performa model dapat dikategorikan cukup, namun masih perlu ditingkatkan.
Precision digunakan untuk mengukur ketepatan model dalam memprediksi suatu kelas tertentu.
\(\text{Precision} = \frac{\text{True Positive}}{\text{Total Prediksi Positif}}\)
Perhitungan precision untuk masing-masing kelas adalah sebagai berikut:
Kelas high \(\text{Precision}_{High} = \frac{3425}{3425 + 888 + 2197} = 0.53\)
Kelas low
\(\text{Precision}_{Low} = \frac{3144}{445 + 3144 + 1513} = 0.61\)
\(\text{Precision}_{Medium} = \frac{823}{697 + 441 + 823} = 0.42\)
Hasil precision menunjukkan bahwa model paling baik dalam memprediksi kelas Low dengan nilai 61%, diikuti oleh kelas High sebesar 53%, dan kelas Medium sebesar 42%. Hal ini menunjukkan bahwa model masih kurang akurat dalam memprediksi kelas Medium dibandingkan kelas lainnya.
# ROC
library(pROC)
## Warning: package 'pROC' was built under R version 4.5.2
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
# ubah jadi binary (High vs lainnya)
test$binary <- ifelse(test$risk_level == "High", 1, 0)
# ambil probabilitas kelas High
prob_high <- predict(model_cls, test, type = "prob")[, "High"]
# buat ROC
roc_obj <- roc(test$binary, prob_high)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# plot ROC
plot(roc_obj, col = "blue", main = "ROC Curve (High vs Others)")
Berdasarkan ROC curve (High vs Others), terlihat bahwa garis ROC berada di atas garis diagonal (garis acak), yang menunjukkan bahwa model memiliki kemampuan dalam membedakan antara kelas High dan kelas lainnya. Kurva yang cenderung mendekati sudut kiri atas menunjukkan bahwa model memiliki performa yang cukup baik dalam mengklasifikasikan data.
# Nilai AUC
auc(roc_obj)
## Area under the curve: 0.7554
AUC sebesar 0,7554, yang menunjukkan bahwa model memiliki kemampuan yang baik dalam membedakan antara kelas High dan kelas lainnya.
Kinerja model dievaluasi berdasarkan nilai akurasi, precision, serta hasil ROC dan AUC, yang menunjukkan bahwa model memiliki performa yang cukup baik namun belum optimal. Sementara itu, potensi bias dianalisis dari pola kesalahan pada confusion matrix, di mana model cenderung lebih baik dalam memprediksi kelas tertentu dibandingkan kelas lainnya, khususnya pada kelas Low dibandingkan Medium.
Clustering adalah proses mengelompokkan atau penggolongan objek berdasarkan informasi yang diperoleh dari data yang menjelaskan hubungan antar objek dengan prinsip untuk memaksimalkan kesamaan antar anggota satu kelas dan meminimumkan kesamaan antar kelas/cluster. Clustering membagi data ke dalam grup-grup yang mempunyai obyek yang karakteristiknya sama.
K-Means adalah suatu metode penganalisaan data atau metode data mining yang melakukan proses pemodelan tanpa supervisi (unsupervised) dan merupakan salah satu metode yang melakukan pengelompokan data dengan sistem partisi. Metode ini berusaha untuk meminimalkan variasi antar data yang ada di dalam suatu cluster dan memaksimalkan variasi dengan data yang ada di cluster lainnya.
data_cluster <- data_balanced %>%
select(where(is.numeric))
# Standarisasi
data_scaled <- scale(data_cluster)
# Metode Elbow
wss <- sapply(1:10, function(k){
kmeans(data_scaled, centers = k, nstart = 10)$tot.withinss
})
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: Quick-TRANSfer stage steps exceeded maximum (= 2262000)
## Warning: did not converge in 10 iterations
plot(1:10, wss, type="b", pch=19,
xlab="Jumlah Cluster",
ylab="Within Sum of Squares",
main="Elbow Method")
Berdasarkan grafik Elbow Method, terlihat bahwa penurunan nilai Within
Sum of Squares (WSS) sangat tajam dari jumlah klaster 1 ke 2, dan masih
cukup signifikan hingga klaster 3. Setelah itu, penurunan mulai melandai
dan tidak terlalu signifikan.
# K-MEANS
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
data_clustered <- as.data.frame(data_scaled)
data_clustered$cluster <- as.factor(kmeans_result$cluster)
# Plot Cluster
library(ggplot2)
ggplot(data_clustered, aes(x = stress_level, y = anxiety_score, color = cluster)) +
geom_point(alpha = 0.6, size = 2) +
theme_minimal() +
labs(
title = "Scatter Plot Klaster",
x = "Stress Level",
y = "Anxiety Score",
color = "Cluster"
)
Berdasarkan scatter plot, terlihat bahwa data terbagi menjadi tiga
klaster yang cukup jelas sepanjang sumbu stress level dan anxiety score.
Klaster 1 (merah) cenderung berada pada nilai stress level dan anxiety
score yang tinggi, yang menunjukkan kelompok individu dengan kondisi
mental yang lebih rentan. Klaster 2 (hijau) berada pada nilai sedang,
yang menggambarkan kelompok dengan tingkat stres dan kecemasan moderat.
Sementara itu, klaster 3 (biru) berada pada nilai yang lebih rendah,
yang menunjukkan kelompok dengan kondisi mental yang relatif lebih
stabil.
Selain itu, terlihat pola hubungan positif antara stress level dan anxiety score, di mana peningkatan tingkat stres diikuti oleh peningkatan kecemasan. Variabel stress level dan anxiety score dipilih dalam visualisasi karena keduanya merupakan indikator utama yang memiliki pengaruh signifikan terhadap kondisi mental mahasiswa serta menunjukkan korelasi yang cukup kuat.
# Visualisasi Centroid
# ambil centroid
centroids <- as.data.frame(kmeans_result$centers)
centroids$cluster <- as.factor(1:nrow(centroids))
# ubah ke long format
centroids_long <- centroids %>%
pivot_longer(-cluster, names_to = "variable", values_to = "value")
# plot centroid
ggplot(centroids_long, aes(x = variable, y = value, fill = cluster)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Visualisasi Centroid",
x = "Variabel",
y = "Nilai (Standarisasi)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Berdasarkan visualisasi centroid, terlihat perbedaan karakteristik yang
cukup jelas pada masing-masing klaster.
Klaster merah memiliki nilai tinggi pada anxiety score, burnout score, depression score, dan stress level, serta nilai yang relatif rendah pada sleep hours dan social support. Hal ini menunjukkan bahwa klaster ini merupakan kelompok dengan kondisi mental yang kurang baik atau memiliki risiko burnout yang tinggi.
Klaster hijau memiliki nilai yang cenderung berada di sekitar rata-rata (mendekati nol) pada hampir seluruh variabel. Hal ini menunjukkan bahwa klaster ini merupakan kelompok dengan kondisi mental yang moderat atau stabil.
Klaster biru memiliki nilai rendah pada stress level, anxiety score, dan depression score, serta nilai tinggi pada sleep hours dan social support. Hal ini menunjukkan bahwa klaster ini merupakan kelompok dengan kondisi mental yang baik dan tingkat stres yang rendah.
Hasil clustering menunjukkan bahwa faktor psikologis seperti stres, kecemasan, dan depresi menjadi pembeda utama antar kelompok. Selain itu, variabel seperti waktu tidur dan dukungan sosial berperan sebagai faktor pelindung yang berkaitan dengan kondisi mental yang lebih baik. Hal ini menunjukkan bahwa peningkatan kualitas tidur dan dukungan sosial dapat menjadi strategi penting dalam mengurangi risiko burnout.