Regresi Logistik Multinomial

Analisis Faktor yang Berhubungan dengan Tipe Stres Mahasiswa Berdasarkan Kondisi Akademik, Sosial, Psikologis, dan Lingkungan

Ester Nibenia Zendrato — 140610240043
Zahra Putri Argakoesoemah — 140610240047
Mata Kuliah: Analisis Data Kategori
Kelas: B

1. Latar Belakang

Di dalam kehidupan sehari-hari, setiap individu pasti pernah mengalami stres, baik di lingkungan tempat tinggal, tempat kerja, sekolah, maupun lingkungan sosial lainnya. Stres adalah respon tubuh yang diakibatkan karena adanya tuntutan dari luar diri individu yang melebihi kemampuan dalam memenuhi tuntutan untuk mengatasi dan menyelesaikan masalah tersebut. Stres bisa menimpa siapapun termasuk anak-anak, remaja, dewasa, atau yang sudah lanjut usia.

Mahasiswa merupakan kelompok yang rentan mengalami stres karena berbagai tuntutan akademik dan non-akademik. Tekanan nilai, beban tugas, kualitas hubungan sosial, tingkat kecemasan, persaingan antarteman, lingkungan rumah, serta gangguan tidur menjadi faktor-faktor yang sering menyebabkan stres. Identifikasi faktor-faktor tersebut penting untuk memahami sumber stres serta menentukan upaya pengelolaan yang tepat.

Tiga Tipe Stres

Distress Stres negatif: membuat gugup dan sulit untuk berkonsentrasi

Eustress Stres positif: meningkatkan semangat & konsentrasi belajar

Mixed Stress Stres campuran: kombinasi distress & eustress

“Stres yang tidak dikelola dengan baik dapat memengaruhi kesehatan dan prestasi akademik mahasiswa.”

Tujuan Penelitian

Mengidentifikasi faktor-faktor akademik, sosial, psikologis, dan lingkungan yang berhubungan dengan tipe stres mahasiswa menggunakan Regresi Logistik Multinomial.

2. Data & Variabel

Sumber Data

df <- read.csv("C:/Users/Zahra Putri/Downloads/Stress Indicators Dataset for Mental Health Classification.csv")

df$stress_label <- factor(df$stress_type, levels = c(0,1,2),
                          labels = c("Distress","Eustress","Mixed Stress"))

predictors  <- c("anxiety_tension","sleep_problems","academic_overload",
                 "low_academic_confidence","peer_competition",
                 "relationship_stress","home_environment")
pred_labels <- c("Tingkat Kecemasan","Gangguan Tidur","Beban Akademik",
                 "Rendah Diri Akademik","Persaingan Teman Sebaya",
                 "Stres Hubungan Interpersonal","Lingkungan Rumah")
Informasi Dataset
Keterangan
Sumber Stress Indicators Dataset for Mental Health Classification (Mendeley Data, 2025)
Link Dataset https://data.mendeley.com/datasets/2gsjv8m7ch/2
Karateristik Responden Mahasiswa Daffodil International University laki-laki dan perempuan dengan rentang usia 18–22 tahun.
Jumlah Observasi 2.000 baris
Skala Pengukuran Likert 1–5

Variabel Penelitian

Variabel Dependen (Y) —> Tipe Stres: 0 = Distress | 1 = Eustress (referensi) | 2 = Mixed Stress

Variabel Independen (X) —> 7 prediktor skala Likert 1–5:

X1 Tingkat Kecemasan
X2 Gangguan Tidur
X3 Beban Akademik
X4 Rendah Diri Akademik
X5 Persaingan Teman Sebaya
X6 Stres Hubungan Interpersonal
X7 Lingkungan Rumah

Distribusi Tipe Stres

warna <- c("Distress" = "#7f1d28", "Eustress" = "#a8293a", "Mixed Stress" = "#d96a78")

dist_df <- as.data.frame(table(df$stress_label)) %>%
  rename(Tipe = Var1, n = Freq) %>%
  mutate(pct   = n / sum(n) * 100,
         label = paste0(n, "\n(", round(pct,1), "%)"))

ggplot(dist_df, aes(x = Tipe, y = n, fill = Tipe)) +
  geom_col(width = 0.5, show.legend = FALSE) +
  geom_text(aes(label = label), vjust = -0.4, fontface = "bold", size = 4.2) +
  scale_fill_manual(values = warna) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.18))) +
  labs(title = "Distribusi Tipe Stres Mahasiswa", x = NULL, y = "Jumlah Observasi") +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(face = "bold", hjust = 0.5, color = "#3b0a10", size = 13))

Data tidak seimbang, terlihat bahwa Eustress mendominasi distribusi data (91,4%).

3. Metode Penelitian

Langkah-Langkah Analisis

1 Statistik Deskriptif
2 Uji Chi-Square
3 Uji VIF
4 Model Multinomial
5 Uji Wald + RRR
6 Goodness of Fit
7 Confusion Matrix

Model Regresi Logistik Multinomial

Dengan Eustress sebagai kategori referensi, model membentuk dua persamaan logit:

\[\log\frac{\hat{\pi}_D}{\hat{\pi}_E} = \beta_{00} + \beta_{01}X_1 + \beta_{02}X_2 + \cdots + \beta_{07}X_7\]

\[\log\frac{\hat{\pi}_M}{\hat{\pi}_E} = \beta_{20} + \beta_{21}X_1 + \beta_{22}X_2 + \cdots + \beta_{27}X_7\]

Interpretasi RRR (Relative Risk Ratio = \(e^\beta\)):

  • RRR > 1 artinya kenaikan X meningkatkan peluang kategori tersebut dibandingkan referensi
  • RRR < 1 artinya kenaikan X menurunkan peluang kategori tersebut dibandingkan referensi

4. Hasil dan Pembahasan

4.1 Statistik Deskriptif — Rata-Rata Skor

mean_df <- aggregate(df[, predictors], by = list(Tipe = df$stress_label), FUN = mean) %>%
  pivot_longer(-Tipe, names_to = "Prediktor", values_to = "Mean") %>%
  mutate(Prediktor = factor(Prediktor, levels = predictors, labels = pred_labels))

ggplot(mean_df, aes(x = Prediktor, y = Mean, fill = Tipe)) +
  geom_col(position = position_dodge(0.7), width = 0.65) +
  geom_hline(yintercept = c(1,2,3,4,5), linetype = "dotted", color = "grey75") +
  scale_fill_manual(values = warna) +
  scale_y_continuous(breaks = 1:5, limits = c(0, 5.3)) +
  labs(title = "Rata-Rata Skor Prediktor per Tipe Stres",
       x = NULL, y = "Rata-Rata Skor (1–5)", fill = "Tipe Stres") +
  theme_minimal(base_size = 11) +
  theme(axis.text.x  = element_text(angle = 30, hjust = 1, size = 9),
        legend.position = "top",
        plot.title = element_text(face = "bold", hjust = 0.5, color = "#3b0a10", size = 12))

Distress selalu memiliki skor tertinggi dan Mixed Stress selalu terendah. Hal tersebut mengindikasikan beban stressor yang sangat berbeda antarkelompok.

4.1 Tabel Rata-Rata Skor

mean_tbl <- aggregate(df[, predictors], by = list(TipeStres = df$stress_label),
                      FUN = function(x) round(mean(x), 3))
colnames(mean_tbl)[-1] <- pred_labels

kable(mean_tbl, caption = "Tabel 3.1 — Rata-Rata Skor Prediktor per Tipe Stres",
      align = "lrrrrrrr") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(1, background = "#f9e1e5") %>%
  row_spec(2, background = "#fdf2f3") %>%
  row_spec(3, background = "#f3cdd3")
Tabel 3.1 — Rata-Rata Skor Prediktor per Tipe Stres
TipeStres Tingkat Kecemasan Gangguan Tidur Beban Akademik Rendah Diri Akademik Persaingan Teman Sebaya Stres Hubungan Interpersonal Lingkungan Rumah
Distress 3.814 3.986 3.557 3.886 3.786 3.514 3.771
Eustress 2.533 2.783 2.494 2.563 2.467 2.498 2.404
Mixed Stress 1.637 1.647 1.824 1.755 1.696 1.784 1.755

Kelompok Distress konsisten memiliki rata-rata skor tertinggi pada seluruh variabel prediktor dibandingkan dua kelompok lainnya. Rata-rata tertinggi pada kelompok Distress adalah variabel Gangguan Tidur (3,99) dan Rendah Diri Akademik (3,89) yang menunjukkan bahwa mahasiswa dengan stres negatif mengalami gangguan tidur dan rendahnya kepercayaan diri akademik yang paling berat.

Kelompok Eustress berada pada posisi menengah dengan rata-rata antara 2,40 hingga 2,78, sementara kelompok Mixed Stress menunjukkan rata-rata skor terendah di semua variabel (1,64 hingga 1,82) yang mengindikasikan bahwa kelompok ini tidak didominasi oleh satu jenis stressor tertentu secara kuat.

4.1 Tabel Proporsi Skor Tinggi (>4)

prop_tbl <- data.frame(
  Prediktor = pred_labels,
  Distress     = c(62.9, 82.9, 60.0, 62.9, 60.0, 50.0, 62.9),
  Eustress     = c(21.7, 28.7, 21.5, 22.4, 19.1, 20.6, 19.6),
  `Mixed Stress` = c(3.9, 7.8, 5.9, 6.9, 4.9, 1.0, 3.9),
  check.names = FALSE
)

kable(prop_tbl, caption = "Tabel 3.2 — Proporsi Skor Tinggi (>4) per Tipe Stres (%)",
      align = "lrrr") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(0, bold = TRUE)
Tabel 3.2 — Proporsi Skor Tinggi (>4) per Tipe Stres (%)
Prediktor Distress Eustress Mixed Stress
Tingkat Kecemasan 62.9 21.7 3.9
Gangguan Tidur 82.9 28.7 7.8
Beban Akademik 60.0 21.5 5.9
Rendah Diri Akademik 62.9 22.4 6.9
Persaingan Teman Sebaya 60.0 19.1 4.9
Stres Hubungan Interpersonal 50.0 20.6 1.0
Lingkungan Rumah 62.9 19.6 3.9

Tabel 3.2 memperkuat temuan sebelumnya yaitu kelompok Distress mendominasi di semua variabel dengan proporsi tertinggi pada Gangguan Tidur sebesar 82,9%. Artinya, lebih dari empat dari lima mahasiswa pada kelompok ini melaporkan gangguan tidur yang sangat tinggi.

Sebaliknya, kelompok Mixed Stress memiliki proporsi skor tinggi yang sangat rendah di hampir semua variabel, dengan yang terendah pada Stres Hubungan Interpersonal yaitu hanya 1,0%. Pola ini menunjukkan bahwa intensitas stressor secara keseluruhan paling tinggi berada pada Distress dan paling rendah berada pada Mixed Stress.


4.2 Uji Chi-Square

{cat(sprintf("%-32s %10s %12s %6s\n", "Variabel", "Chi²", "p-value", "Sig"))

for (i in seq_along(predictors)) 
  {
  tbl  <- table(df$stress_label, df[[predictors[i]]])
  test <- chisq.test(tbl, simulate.p.value = TRUE, B = 2000)
  sig  <- ifelse(test$p.value < 0.05, "v", "")
  cat(sprintf("%-32s %10.3f %12.5f %6s\n",
              pred_labels[i], test$statistic, test$p.value, sig))
}}
#> Variabel                              Chi²      p-value    Sig
#> Tingkat Kecemasan                   198.808      0.00050      v
#> Gangguan Tidur                      230.118      0.00050      v
#> Beban Akademik                      134.620      0.00050      v
#> Rendah Diri Akademik                170.007      0.00050      v
#> Persaingan Teman Sebaya             157.385      0.00050      v
#> Stres Hubungan Interpersonal        119.444      0.00050      v
#> Lingkungan Rumah                    133.255      0.00050      v
Seluruh variabel signifikan (p < 0,05). Dengan demikian kita menolak H0, artinya terdapat hubungan asosiasi yang signifikan secara individual antar ketujuh indikator akademik tersebut dengan tipe stres yang dialami mahasiswa. Oleh karena itu, seluruh variabel prediktor valid dan dapat dilanjutkan ke tahap pemodelan selanjutnya.

4.3 Uji Multikolinearitas (VIF)

formula_vif <- as.formula(paste("stress_type ~", paste(predictors, collapse = " + ")))
vif_vals    <- vif(lm(formula_vif, data = df))
vif_df      <- data.frame(Variabel = pred_labels, VIF = round(vif_vals, 3))

kable(vif_df, caption = "Tabel 3.4 — Nilai VIF Variabel Prediktor", align = "lr") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE, font_size = 13) %>%
  column_spec(2, color = ifelse(vif_df$VIF < 5, "#7f1d28", "#3b0a10"), bold = TRUE)
Tabel 3.4 — Nilai VIF Variabel Prediktor
Variabel VIF
anxiety_tension Tingkat Kecemasan 1.062
sleep_problems Gangguan Tidur 1.063
academic_overload Beban Akademik 1.152
low_academic_confidence Rendah Diri Akademik 1.122
peer_competition Persaingan Teman Sebaya 1.218
relationship_stress Stres Hubungan Interpersonal 1.112
home_environment Lingkungan Rumah 1.142
Semua VIF < 5 yang artinya tidak ada multikolinearitas yang berarti antarvariabel prediktor.

4.4 Pemodelan: Estimasi Parameter

df$stress_r   <- relevel(factor(df$stress_type), ref = "1")
formula_model <- as.formula(paste("stress_r ~", paste(predictors, collapse = " + ")))
model         <- multinom(formula_model, data = df, maxit = 500, trace = FALSE)

coef_m <- summary(model)$coefficients
se_m   <- summary(model)$standard.errors

coef_display <- coef_m
rownames(coef_display) <- c("Distress vs Eustress", "Mixed Stress vs Eustress")

kable(round(coef_display, 4),
      caption = "Koefisien Model Regresi Logistik Multinomial",
      col.names = c("Intercept", pred_labels)) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 12) %>%
  scroll_box(width = "100%")
Koefisien Model Regresi Logistik Multinomial
Intercept Tingkat Kecemasan Gangguan Tidur Beban Akademik Rendah Diri Akademik Persaingan Teman Sebaya Stres Hubungan Interpersonal Lingkungan Rumah
Distress vs Eustress -18.7290 1.1268 0.7083 0.2707 0.6946 0.9593 0.3102 0.7624
Mixed Stress vs Eustress 6.5729 -0.9083 -1.1703 -0.4016 -0.4761 -0.5327 -0.5614 -0.5318

4.5 Persamaan Model

Distress vs Eustress:
\[\log\frac{\hat{\pi}_D}{\hat{\pi}_E} = -18{,}729 + 1{,}127X_1 + 0{,}708X_2 + 0{,}271X_3 + 0{,}695X_4 + 0{,}959X_5 + 0{,}310X_6 + 0{,}762X_7\]

Seluruh koefisien bersifat positif, artinya peningkatan pada setiap variabel stressor meningkatkan log-odds mahasiswa masuk kategori Distress dibanding Eustress. Variabel dengan kontribusi terbesar adalah Tingkat Kecemasan (1,127) dan Persaingan Teman Sebaya (0,959).

Mixed Stress vs Eustress:
\[\log\frac{\hat{\pi}_M}{\hat{\pi}_E} = 6{,}573 - 0{,}908X_1 - 1{,}170X_2 - 0{,}402X_3 - 0{,}476X_4 - 0{,}533X_5 - 0{,}561X_6 - 0{,}532X_7\]

Seluruh koefisien bersifat negatif, artinya peningkatan stressor akan menurunkan peluang mahasiswa masuk kategori Mixed Stress dibanding Eustress. Hal ini konsisten dengan hasil statistik deskriptif yaitu Mixed Stress memiliki rata-rata skor stressor paling rendah.

Distress vs Eustress

Semua koefisien positif (+) sehingga semakin tinggi stressor, maka semakin tinggi peluang Distress

Mixed Stress vs Eustress

Semua koefisien negatif (−) sehingga semakin tinggi stressor, maka semakin rendah peluang Mixed Stress


4.6 Uji Wald & RRR — Distress vs Eustress

CI  <- exp(confint(model))
grp <- "0"
b   <- coef_m[grp, ]; se <- se_m[grp, ]
w   <- b / se;         p  <- 2 * (1 - pnorm(abs(w)))
rrr <- exp(b)
lo  <- CI[, "2.5 %",  grp]; hi <- CI[, "97.5 %", grp]

tbl_dist <- data.frame(
  Variabel  = c("Intercept", pred_labels),
  Koefisien = round(b, 4), SE = round(se, 4),
  Z         = round(w, 4), p_value = round(p, 4),
  RRR       = round(rrr, 4),
  CI_95     = paste0("[", round(lo,3), " ; ", round(hi,3), "]")
)

kable(tbl_dist, caption = "Tabel 3.5 — Ringkasan Distress vs Eustress",
      col.names = c("Variabel","β","SE","Z","p-value","RRR","95% CI")) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(which(tbl_dist$p_value < 0.05), background = "#f9e1e5") %>%
  column_spec(6, bold = TRUE, color = "#7f1d28")
Tabel 3.5 — Ringkasan Distress vs Eustress
Variabel β SE Z p-value RRR 95% CI
(Intercept) Intercept -18.7290 1.5701 -11.9282 0.0000 0.0000 [0 ; 0]
anxiety_tension Tingkat Kecemasan 1.1268 0.1760 6.4021 0.0000 3.0859 [2.186 ; 4.357]
sleep_problems Gangguan Tidur 0.7083 0.1575 4.4969 0.0000 2.0306 [1.491 ; 2.765]
academic_overload Beban Akademik 0.2707 0.1290 2.0975 0.0359 1.3108 [1.018 ; 1.688]
low_academic_confidence Rendah Diri Akademik 0.6946 0.1331 5.2195 0.0000 2.0030 [1.543 ; 2.6]
peer_competition Persaingan Teman Sebaya 0.9593 0.1572 6.1023 0.0000 2.6099 [1.918 ; 3.552]
relationship_stress Stres Hubungan Interpersonal 0.3102 0.1313 2.3634 0.0181 1.3637 [1.054 ; 1.764]
home_environment Lingkungan Rumah 0.7624 0.1326 5.7508 0.0000 2.1435 [1.653 ; 2.78]
Seluruh variabel prediktor berpengaruh signifikan terhadap peluang mahasiswa mengalami Distress dibandingkan Eustress (p < 0,05). Variabel dengan pengaruh terkuat adalah Tingkat Kecemasan dengan Relative Risk Ratio (RRR) sebesar 3,086 yang artinya setiap kenaikan satu poin kecemasan meningkatkan peluang Distress sebesar 3,1 kali dibanding Eustress dengan asumsi variabel lain konstan. Variabel dengan pengaruh paling lemah adalah Beban Akademik (RRR=1,311) dan Stres Hubungan Interpersonal (RRR=1,364) meskipun keduanya tetap signifikan.

4.7 Uji Wald & RRR — Mixed Stress vs Eustress

grp <- "2"
b   <- coef_m[grp, ]; se <- se_m[grp, ]
w   <- b / se;         p  <- 2 * (1 - pnorm(abs(w)))
rrr <- exp(b)
lo  <- CI[, "2.5 %",  grp]; hi <- CI[, "97.5 %", grp]

tbl_mix <- data.frame(
  Variabel  = c("Intercept", pred_labels),
  Koefisien = round(b, 4), SE = round(se, 4),
  Z         = round(w, 4), p_value = round(p, 4),
  RRR       = round(rrr, 4),
  CI_95     = paste0("[", round(lo,3), " ; ", round(hi,3), "]")
)

kable(tbl_mix, caption = "Tabel 3.6 — Ringkasan Mixed Stress vs Eustress",
      col.names = c("Variabel","β","SE","Z","p-value","RRR","95% CI")) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(which(tbl_mix$p_value < 0.05), background = "#f9e1e5") %>%
  column_spec(6, bold = TRUE, color = "#7f1d28")
Tabel 3.6 — Ringkasan Mixed Stress vs Eustress
Variabel β SE Z p-value RRR 95% CI
(Intercept) Intercept 6.5729 0.6777 9.6990 0e+00 715.4501 [189.552 ; 2700.421]
anxiety_tension Tingkat Kecemasan -0.9083 0.1423 -6.3828 0e+00 0.4032 [0.305 ; 0.533]
sleep_problems Gangguan Tidur -1.1703 0.1464 -7.9914 0e+00 0.3103 [0.233 ; 0.413]
academic_overload Beban Akademik -0.4016 0.1173 -3.4241 6e-04 0.6692 [0.532 ; 0.842]
low_academic_confidence Rendah Diri Akademik -0.4761 0.1209 -3.9369 1e-04 0.6212 [0.49 ; 0.787]
peer_competition Persaingan Teman Sebaya -0.5327 0.1309 -4.0684 0e+00 0.5870 [0.454 ; 0.759]
relationship_stress Stres Hubungan Interpersonal -0.5614 0.1277 -4.3957 0e+00 0.5704 [0.444 ; 0.733]
home_environment Lingkungan Rumah -0.5318 0.1293 -4.1124 0e+00 0.5876 [0.456 ; 0.757]
Seluruh variabel prediktor juga signifikan pada perbandingan Mixed Stress terhadap Eustress (p < 0,05). Semua RRR bernilai kurang dari 1. Variabel Gangguan Tidur memiliki pengaruh terkuat (RRR=0,310) yang artinya setiap kenaikan satu poin gangguan tidur akan menurunkan peluang Mixed Stress sebesar 69% dibanding Eustress. Demikian juga, Tingkat Kecemasan (RRR=0,403) menurunkan peluang Mixed Stress sebesar 60%. Pola ini menunjukkan bahwa kelompok Mixed Stress memiliki beban stressor yang lebih ringan dibandingkan kelompok Eustress sehingga peningkatan stressor justru mendorong mahasiswa ke kategori Eustress bukan Mixed Stress.

4.8 Visualisasi RRR

rrr_d  <- exp(coef_m["0", -1])
rrr_m  <- exp(coef_m["2", -1])

rrr_df <- data.frame(
  Prediktor = pred_labels,
  `Distress vs Eustress`     = rrr_d,
  `Mixed Stress vs Eustress` = rrr_m,
  check.names = FALSE
) %>%
  pivot_longer(-Prediktor, names_to = "Perbandingan", values_to = "RRR") %>%
  mutate(Prediktor = factor(Prediktor, levels = pred_labels))

ggplot(rrr_df, aes(x = Prediktor, y = RRR, fill = Perbandingan)) +
  geom_col(position = position_dodge(0.7), width = 0.65) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "#3b0a10", linewidth = 0.8) +
  scale_fill_manual(values = c("#7f1d28", "#d96a78")) +
  scale_y_continuous(breaks = seq(0, 3.5, 0.5)) +
  labs(title = "Relative Risk Ratio (RRR) per Prediktor",
       subtitle = "Garis putus-putus: RRR = 1 (tidak ada efek)",
       x = NULL, y = "RRR", fill = NULL) +
  theme_minimal(base_size = 11) +
  theme(axis.text.x  = element_text(angle = 30, hjust = 1, size = 9),
        legend.position = "top",
        plot.title = element_text(face = "bold", hjust = 0.5, color = "#3b0a10", size = 12))

Pada perbandingan Distress vs Eustress, semua RRR > 1 yang berarti peningkatan setiap stressor meningkatkan peluang mahasiswa masuk kategori Distress dibanding Eustress. Prediktor terkuat adalah Tingkat Kecemasan (RRR = 3,09).

Sebaliknya, pada perbandingan Mixed Stress vs Eustress, seluruh RRR < 1 yang berarti peningkatan stressor justru menurunkan peluang mahasiswa masuk kategori Mixed Stress. Gangguan Tidur menjadi faktor pembeda terkuat (RRR = 0,31) diikuti Tingkat Kecemasan (RRR = 0,40). Pola ini menunjukkan bahwa semakin tinggi intensitas stressor, mahasiswa cenderung bergeser ke kategori selain Mixed Stress yang konsisten dengan hasil statistik deskriptif yaitu kelompok Mixed Stress memiliki rata-rata skor stressor paling rendah di antara ketiga kelompok.

4.9 Evaluasi Kebaikan Model

ll_full     <- logLik(model)
ll_null     <- logLik(multinom(stress_r ~ 1, data = df, trace = FALSE))
lr_chi2     <- -2 * (as.numeric(ll_null) - as.numeric(ll_full))
lr_df_val   <- attr(ll_full,"df") - attr(ll_null,"df")
lr_p        <- pchisq(lr_chi2, df = lr_df_val, lower.tail = FALSE)
mcfadden_r2 <- 1 - (as.numeric(ll_full) / as.numeric(ll_null))
n_obs       <- nrow(df)
nagelkerke  <- (1 - exp((2/n_obs)*(as.numeric(ll_null)-as.numeric(ll_full)))) /
               (1 - exp((2/n_obs)*as.numeric(ll_null)))

gof_tbl <- data.frame(
  Indikator  = c("Log-Likelihood (Null)","Log-Likelihood (Full)",
                 "LR Chi-Square","McFadden Pseudo R²",
                 "Nagelkerke Pseudo R²","AIC","BIC"),
  Nilai      = c(round(as.numeric(ll_null),3), round(as.numeric(ll_full),3),
                 round(lr_chi2,3), round(mcfadden_r2,4),
                 round(nagelkerke,4), round(AIC(model),3), round(BIC(model),3)),
  Keterangan = c("Model tanpa prediktor",
                 "Model dengan 7 prediktor",
                 paste0("df=",lr_df_val,", p<0,0019 (Signifikan)"),
                 ">= 0,40 (Kecocokan Sangat Baik)",
                 "52,36% variasi tipe stres dijelaskan model",
                 "Efisiensi model","Penalti kompleksitas")
)

kable(gof_tbl, caption = "Tabel 3.7 — Ringkasan Statistik Evaluasi Kebaikan Model",
      align = "lrl") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 13) %>%
  row_spec(4:5, background = "#f9e1e5", bold = TRUE)
Tabel 3.7 — Ringkasan Statistik Evaluasi Kebaikan Model
Indikator Nilai Keterangan
Log-Likelihood (Null) -702.5960 Model tanpa prediktor
Log-Likelihood (Full) -395.6820 Model dengan 7 prediktor
LR Chi-Square 613.8270 df=14, p<0,0019 (Signifikan)
McFadden Pseudo R² 0.4368 >= 0,40 (Kecocokan Sangat Baik)
Nagelkerke Pseudo R² 0.5236 52,36% variasi tipe stres dijelaskan model
AIC 823.3640 Efisiensi model
BIC 912.9790 Penalti kompleksitas

4.10 Confusion Matrix & Akurasi

pred_class  <- predict(model, newdata = df)
conf_matrix <- table(Aktual = df$stress_r, Prediksi = pred_class)

accuracy <- mean(pred_class == df$stress_r) * 100
cat(sprintf("\nAkurasi Keseluruhan: %.1f%%\n", accuracy))
#> 
#> Akurasi Keseluruhan: 92.3%
Didapatkan nilai akurasi sebesar 0,923 atau 92,3% yang artinya 92,3% observasi berhasil diklasifikasikan dengan benar. Meskipun nilai akurasi tergolong tinggi, hasil ini perlu diperhatikan karena data didominasi oleh kategori Eustress. Hal tersebut menyebabkan model cenderung lebih mudah mengenali kategori mayoritas (Eustress) dibandingkan kategori lainnya (Distress dan Mixed Stress).
cm_df <- as.data.frame(conf_matrix) %>%
  mutate(Aktual   = factor(Aktual,   levels = c("0","1","2"),
                           labels = c("Distress","Eustress","Mixed Stress")),
         Prediksi = factor(Prediksi, levels = c("0","1","2"),
                           labels = c("Distress","Eustress","Mixed Stress")))

ggplot(cm_df, aes(x = Prediksi, y = Aktual, fill = Freq)) +
  geom_tile(color = "white", linewidth = 0.9) +
  geom_text(aes(label = Freq), fontface = "bold", size = 5, color = "#3b0a10") +
  scale_fill_gradient(low = "#fdf2f3", high = "#7f1d28", name = "Frekuensi") +
  labs(title = "Confusion Matrix (Prediksi vs Aktual)",
       x = "Kelas Prediksi", y = "Kelas Aktual") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, color = "#3b0a10", size = 13))

Sebagian besar observasi berhasil diklasifikasikan dengan benar pada kategori Eustress, yaitu sebanyak 1.803 dari 1.828 observasi. Namun, masih terdapat beberapa kesalahan klasifikasi, terutama pada kategori Distress dan Mixed Stress yang cenderung diprediksi sebagai Eustress. Model mampu mengenali kategori Eustress dengan sangat baik, tetapi kemampuan model dalam mengidentifikasi kategori Distress dan Mixed Stress masih relatif rendah.

5. Kesimpulan

Variabel Signifikan
7 / 7
Semua prediktor p < 0,05
McFadden R²
0,437
Kecocokan Sangat Baik
Nagelkerke R²
0,524
52,4% variasi dijelaskan model
Perbandingan Prediktor Terkuat RRR Interpretasi
Distress vs Eustress Tingkat Kecemasan 3,09 Jika kecemasan meningkat maka risiko Distress 3× lebih tinggi vs Eustress
Distress vs Eustress Persaingan Teman Sebaya 2,61 Jika persaingan teman sebaya meningkat maka risiko Distress meningkat vs Eustress
Mixed Stress vs Eustress Gangguan Tidur 0,31 Jika gangguan tidur meningkat maka risiko Mixed Stress 69% lebih kecil vs Eustress
Model Regresi Logistik Multinomial terbukti mampu mengidentifikasi faktor-faktor yang secara signifikan berhubungan dengan tipe stres mahasiswa, dengan tingkat kecocokan yang sangat baik.

Daftar Pustaka

  1. Hasanah, M. Stres dan Solusinya dalam Perspektif Psikologi dan Islam. Jurnal Ummul Qura 2019, XIII, 104–114.
  2. Gaol, N.T.L. Teori Stres: Stimulus, Respons, dan Transaksional. Buletin Psikologi 2016, 24, 1–11. https://doi.org/10.22146/bpsi.11224.
  3. Lin, S.H.; Huang, Y.C. Life Stress and Academic Burnout. Active Learning in Higher Education 2014, 15, 77–90.
  4. Gadzella, B.M. et al. Evaluation of the Student Life-Stress Inventory-Revised. Journal of Instructional Psychology 2012, 39, 82–91.
  5. Hargrove, M.B.; Nelson, D.L.; Cooper, C.L. Generating Eustress by Challenging Employees. Organizational Dynamics 2013, 42, 61–69.
  6. Lai, A.Y.K. et al. Mental Health Impacts of COVID-19 on International University Students. Frontiers in Psychiatry 2020, 11, 584240.
  7. Seto, S.B. et al. Hubungan Motivasi terhadap Tingkat Stress Mahasiswa dalam Menulis Tugas Akhir. Jurnal Basicedu 2020, 4, 733–739.
  8. Mondol, M.M.R.; Kabir, M.A. Stress Indicators Dataset for Mental Health Classification. Mendeley Data 2025, V2. https://doi.org/10.17632/2gsjv8m7ch.2.
  9. Agresti, A. Categorical Data Analysis, 2nd ed.; Wiley: New York, 2002.
  10. Agresti, A. An Introduction to Categorical Data Analysis, 2nd ed.; Wiley: Hoboken, 2007.
  11. Rodriguez, G. Generalized Linear Models: Modeling Categorical Outcomes; Princeton University, 2007.
  12. O’Brien, R.M. A caution regarding rules of thumb for VIF. Qual. Quant. 2007, 41, 673–690.
  13. Venables, W.N.; Ripley, B.D. Modern Applied Statistics with S, 4th ed.; Springer: New York, 2002.
  14. Rodriguez, G. Multinomial Response Models; Princeton University, 2018.