Pendahuluan

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.

Data Student Lifestyle, Mental Health & Burnout Insight

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.

Load Package

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

Input Data

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

Eksplorasi Data

# 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()

Pre Processing Data

# 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

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.

Pemodelan Analisis Regresi Linear Berganda

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.

Visualisasi Model Regresi

# 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

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.

Pemodelan Decision Tree

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.

Visualisasi Decision Tree

# 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:

  1. Kelas high \(\text{Precision}_{High} = \frac{3425}{3425 + 888 + 2197} = 0.53\)

  2. Kelas low

\(\text{Precision}_{Low} = \frac{3144}{445 + 3144 + 1513} = 0.61\)

  1. Kelas medium

\(\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.

Analisis Clustering

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.

Pemodelan K-MEANS Clustering

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.