1 Pendahuluan

Tidur merupakan kebutuhan dasar manusia yang berperan penting dalam kualitas hidup, kesehatan fisik, dan kesehatan mental [1]. Penelitian sebelumnya menunjukkan bahwa kualitas tidur mahasiswa dipengaruhi oleh berbagai faktor, termasuk tingkat stres dan pola tidur [2,3].

Kualitas tidur bersifat ordinal sehingga analisis yang tepat perlu mempertimbangkan urutan kategorinya. Regresi logistik ordinal mensyaratkan asumsi proportional odds, yaitu pengaruh prediktor dianggap konstan di setiap batas kategori. Apabila asumsi ini tidak terpenuhi, Partial Proportional Odds Model (PPO) menjadi alternatif yang lebih fleksibel.

Penelitian ini bertujuan mengidentifikasi pengaruh frekuensi kesulitan tidur, durasi tidur, frekuensi terbangun malam hari, dan tingkat stres terhadap kualitas tidur mahasiswa menggunakan pendekatan PPO.


2 Data

Data yang digunakan dalam penelitian ini adalah data sekunder yang berasal dari dataset publik Student Insomnia and Educational Outcomes, dataset ini dipublikasikan oleh Akik Abdullah dan Md Shohanur Rahman pada repositori Mendeley Data. Dataset diperoleh melalui survei secara daring menggunakan Google Forms pada periode waktu Oktober hingga November 2024. Dataset terdiri dari 996 responden dengan variabel respon adalah kualitas tidur dan variabel prediktor adalah frekuensi kesulitan tidur, durasi tidur, frekuensi terbangun pada malam hari, dan stres level. Seluruh variabel yang ada dalam dataset bersifat kategorik atau ordinal dan tidak terdapat nilai yang hilang (missing value).

Tabel Variabel Penelitian
Variabel Skala Kategori / Level
Sleep Quality (Respon) Ordinal Very poor (1) < Poor (2) < Average (3) < Good (4) < Very good (5)
Difficulty Sleeping Ordinal Never (1), Rarely 1-2x/minggu (2), Sometimes 3-4x/minggu (3), Often 5-6x/minggu (4), Every night (5)
Hours of Sleep Ordinal < 4 jam (1), 4-5 jam (2), 6-7 jam (3), 7-8 jam (4), > 8 jam (5)
Wake up Night Ordinal Never (1), Rarely 1-2x/minggu (2), Sometimes 3-4x/minggu (3), Often 5-6x/minggu (4), Every night (5)
Stress Level Ordinal No stress (1), Low stress (2), High stress (3), Extremely high stress (4)

3 Analisis

3.1 Persiapan

library(tidyverse)
library(MASS)
library(brant)
library(car)
library(VGAM)
library(knitr)
library(kableExtra)
library(scales)
data_sleep <- read.csv("C:/Users/Asus/Documents/KULYEAH/SEM 4/ADK/PROJEK AKHIR/Rpubs/Book6.csv", sep = ",", header = TRUE) %>%
  mutate(
    Sleep_quality = ordered(
      Sleep.quality,
      levels = c("Very poor", "Poor", "Average", "Good", "Very good")
    ),
    Difficulty_Sleeping = case_when(
      Difficulty.Sleeping == "Never"                         ~ 1,
      Difficulty.Sleeping == "Rarely (1-2 times a week)"    ~ 2,
      Difficulty.Sleeping == "Sometimes (3-4 times a week)" ~ 3,
      Difficulty.Sleeping == "Often (5-6 times a week)"     ~ 4,
      Difficulty.Sleeping == "Every night"                   ~ 5
    ),
    Hours_of_Sleep = case_when(
      Hours.of.Sleep == "Less than 4 hours" ~ 1,
      Hours.of.Sleep == "4-5 hours"         ~ 2,
      Hours.of.Sleep == "6-7 hours"         ~ 3,
      Hours.of.Sleep == "7-8 hours"         ~ 4,
      Hours.of.Sleep == "More than 8 hours" ~ 5
    ),
    Wake_up_Night = case_when(
      Wake.up.Night == "Never"                         ~ 1,
      Wake.up.Night == "Rarely (1-2 times a week)"     ~ 2,
      Wake.up.Night == "Sometimes (3-4 times a week)"  ~ 3,
      Wake.up.Night == "Often (5-6 times a week)"      ~ 4,
      Wake.up.Night == "Every night"                    ~ 5
    ),
    Stress_level = case_when(
      Stress.level == "No stress"             ~ 1,
      Stress.level == "Low stress"            ~ 2,
      Stress.level == "High stress"           ~ 3,
      Stress.level == "Extremely high stress" ~ 4
    )
  )

3.2 Distribusi Variabel Respon

data_sleep %>%
  count(Sleep_quality) %>%
  mutate(Proporsi = round(n / sum(n), 3)) %>%
  rename(`Sleep Quality` = Sleep_quality, Frekuensi = n) %>%
  kable(caption = "Tabel 1. Distribusi Kualitas Tidur Responden") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Tabel 1. Distribusi Kualitas Tidur Responden
Sleep Quality Frekuensi Proporsi
Very poor 290 0.291
Poor 166 0.167
Average 75 0.075
Good 214 0.215
Very good 251 0.252
data_sleep %>%
  count(Sleep_quality) %>%
  mutate(proporsi = n / sum(n)) %>%
  ggplot(aes(x = Sleep_quality, y = proporsi, fill = Sleep_quality)) +
  geom_col(width = 0.65, alpha = 0.9) +
  geom_text(aes(label = percent(proporsi, accuracy = 0.1)),
            vjust = -0.4, fontface = "bold", color = "#1a4f5a") +
  scale_y_continuous(labels = percent_format(), limits = c(0, 0.35)) +
  scale_fill_manual(values = c(
    "Very poor" = "#2a7b8c",
    "Poor"      = "#3a9ab2",
    "Average"   = "#5bbcd6",
    "Good"      = "#7dcfe0",
    "Very good" = "#a8e0ec"
  )) +
  labs(
    title    = "Distribusi Kualitas Tidur Responden",
    subtitle = "Variabel respon ordinal: Very poor < Poor < Average < Good < Very good",
    x = NULL, y = "Proporsi"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none",
        plot.title    = element_text(color = "#1a4f5a", face = "bold"),
        plot.subtitle = element_text(color = "#2a7b8c", size = 11))

Dari 996 responden, kategori Very poor memiliki frekuensi terbesar (29,1%), diikuti Very good (25,2%), Good (21,5%), Poor (16,7%), dan Average (7,5%). Distribusi tidak seimbang, terutama pada kategori Average yang jauh lebih sedikit dibanding kategori lainnya. Meskipun demikian, seluruh kategori memiliki jumlah observasi yang memadai untuk estimasi parameter model sehingga pemodelan dapat dilanjutkan.

3.3 Uji Multikolinearitas

Hipotesis:

  • H₀: Tidak terdapat multikolinearitas antarvariabel prediktor (VIF < 10)
  • H₁: Terdapat multikolinearitas antarvariabel prediktor (VIF ≥ 10)

Keputusan: Tolak H₀ jika VIF ≥ 10.

model_lm_vif <- lm(
  as.numeric(Sleep_quality) ~ Difficulty_Sleeping + Hours_of_Sleep +
    Wake_up_Night + Stress_level,
  data = data_sleep
)

vif_result <- vif(model_lm_vif)

data.frame(
  Variabel = names(vif_result),
  VIF      = round(vif_result, 6)
) %>%
  kable(caption = "Tabel 2. Hasil Uji Multikolinearitas (VIF)") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Tabel 2. Hasil Uji Multikolinearitas (VIF)
Variabel VIF
Difficulty_Sleeping Difficulty_Sleeping 1.369753
Hours_of_Sleep Hours_of_Sleep 1.495637
Wake_up_Night Wake_up_Night 1.551912
Stress_level Stress_level 1.110339

Seluruh nilai VIF jauh di bawah ambang batas 10, sehingga tidak terdapat multikolinearitas antarvariaabel prediktor. Keempat variabel dapat digunakan secara bersamaan dalam pemodelan.

3.4 Estimasi Model Ordinal (Cumulative Logit Model)

library(lmtest)

model_po <- MASS::polr(
  Sleep_quality ~ Difficulty_Sleeping + Hours_of_Sleep +
    Wake_up_Night + Stress_level,
  data   = data_sleep,
  Hess   = TRUE,
  method = "logistic"
)

po_test <- coeftest(model_po)
po_tabel <- data.frame(
  Parameter  = rownames(po_test),
  Estimate   = round(po_test[, 1], 4),
  `Std.Error` = round(po_test[, 2], 4),
  `z.value`  = round(po_test[, 3], 4),
  `p.value`  = round(po_test[, 4], 4),
  check.names = FALSE
)
colnames(po_tabel) <- c("Parameter", "Estimate", "Std. Error", "z value", "p-value")

po_tabel %>%
  kable(caption = "Tabel 3. Hasil Estimasi Proportional Odds Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE
  )
Tabel 3. Hasil Estimasi Proportional Odds Model
Parameter Estimate Std. Error z value p-value
Difficulty_Sleeping Difficulty_Sleeping -0.1510 0.0819 -1.8441 0.0655
Hours_of_Sleep Hours_of_Sleep -0.0335 0.0871 -0.3841 0.7010
Wake_up_Night Wake_up_Night 0.3522 0.0812 4.3384 0.0000
Stress_level Stress_level 0.0470 0.0874 0.5378 0.5909

Berdasarkan hasil estimasi Proportional Odds Model, hanya variabel night waking frequency yang berpengaruh signifikan terhadap kualitas tidur dengan nilai p-value kurang dari 0,05. Variabel difficulty sleeping, hours of sleep, dan stress level tidak menunjukkan pengaruh signifikan pada taraf signifikansi 5%. Nilai estimasi night waking frequency sebesar 0,3522 menunjukkan bahwa semakin sering responden terbangun saat malam hari, odds responden berada pada kategori kualitas tidur yang lebih rendah cenderung meningkat.

3.5 Uji Proportional Odds (Uji Brant)

Hipotesis:

  • H₀: Asumsi proportional odds terpenuhi (koefisien konsisten di semua batas kategori)
  • H₁: Asumsi proportional odds tidak terpenuhi

Keputusan: Tolak H₀ jika p-value < 0,05.

brant_result <- brant(model_po)
## ---------------------------------------------------- 
## Test for     X2  df  probability 
## ---------------------------------------------------- 
## Omnibus          86.9    12  0
## Difficulty_Sleeping  11.49   3   0.01
## Hours_of_Sleep       6.76    3   0.08
## Wake_up_Night        14.17   3   0
## Stress_level     15.88   3   0
## ---------------------------------------------------- 
## 
## H0: Parallel Regression Assumption holds
data.frame(
  Variabel = c("Omnibus", "Difficulty Sleeping", "Hours of Sleep",
               "Night Waking Frequency", "Stress Level"),
  `Chi-square` = round(c(brant_result["Omnibus", "X2"],
                         brant_result["Difficulty_Sleeping", "X2"],
                         brant_result["Hours_of_Sleep", "X2"],
                         brant_result["Wake_up_Night", "X2"],
                         brant_result["Stress_level", "X2"]), 4),
  `Derajat Bebas` = c(brant_result["Omnibus", "df"],
                      brant_result["Difficulty_Sleeping", "df"],
                      brant_result["Hours_of_Sleep", "df"],
                      brant_result["Wake_up_Night", "df"],
                      brant_result["Stress_level", "df"]),
  `p-value` = round(c(brant_result["Omnibus", "probability"],
                      brant_result["Difficulty_Sleeping", "probability"],
                      brant_result["Hours_of_Sleep", "probability"],
                      brant_result["Wake_up_Night", "probability"],
                      brant_result["Stress_level", "probability"]), 4),
  check.names = FALSE
) %>%
  kable(caption = "Tabel 4. Hasil Uji Brant") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  ) %>%
  row_spec(1, bold = TRUE)
Tabel 4. Hasil Uji Brant
Variabel Chi-square Derajat Bebas p-value
Omnibus 86.8952 12 0.0000
Difficulty Sleeping 11.4917 3 0.0093
Hours of Sleep 6.7622 3 0.0799
Night Waking Frequency 14.1681 3 0.0027
Stress Level 15.8801 3 0.0012

Hasil uji Brant omnibus menunjukkan χ² = 86,90 dengan p-value < 0,05, sehingga asumsi proportional odds dinyatakan tidak terpenuhi. Per variabel, hanya hours of sleep yang memenuhi asumsi (p = 0,08 > 0,05). Variabel difficulty sleeping, night waking frequency, dan stress level melanggar asumsi pada taraf signifikansi 5%.

3.6 Estimasi Partial Proportional Odds Model

Hipotesis:

  • H₀: β = 0 (variabel prediktor tidak berpengaruh signifikan terhadap kualitas tidur)
  • H₁: β ≠ 0 (variabel prediktor berpengaruh signifikan terhadap kualitas tidur)

Kriteria penolakan: Tolak H₀ jika |z| > z_{α/2} atau p-value < 0,05.

model_ppo <- VGAM::vglm(
  Sleep_quality ~ Difficulty_Sleeping + Hours_of_Sleep +
    Wake_up_Night + Stress_level,
  family = cumulative(
    parallel = FALSE ~ Difficulty_Sleeping + Wake_up_Night + Stress_level,
    reverse  = FALSE
  ),
  data = data_sleep
)

ppo_coef <- coef(summary(model_ppo))

result_ppo <- as.data.frame(ppo_coef) %>%
  tibble::rownames_to_column("Parameter") %>%
  dplyr::rename(
    Estimate  = Estimate,
    SE        = `Std. Error`,
    `z value` = `z value`,
    `p-value` = `Pr(>|z|)`
  ) %>%
  mutate(
    OR      = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate), 4), NA),
    `CI 2.5%`  = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate - 1.96 * SE), 4), NA),
    `CI 97.5%` = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate + 1.96 * SE), 4), NA),
    across(c(Estimate, SE, `z value`, `p-value`), ~ round(.x, 4))
  )

result_ppo %>%
  kable(caption = "Tabel 5. Hasil Estimasi Partial Proportional Odds Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE
  )
Tabel 5. Hasil Estimasi Partial Proportional Odds Model
Parameter Estimate SE z value p-value OR CI 2.5% CI 97.5%
(Intercept):1 -2.6730 0.5392 -4.9570 0.0000 NA NA NA
(Intercept):2 -0.3143 0.4560 -0.6892 0.4907 NA NA NA
(Intercept):3 1.7263 0.4647 3.7150 0.0002 NA NA NA
(Intercept):4 5.2490 0.6699 7.8353 0.0000 NA NA NA
Difficulty_Sleeping:1 0.4642 0.1087 4.2717 0.0000 1.5908 1.2856 1.9684
Difficulty_Sleeping:2 0.2208 0.0925 2.3866 0.0170 1.2471 1.0403 1.4950
Difficulty_Sleeping:3 0.0767 0.0921 0.8326 0.4051 1.0797 0.9014 1.2933
Difficulty_Sleeping:4 0.0453 0.1108 0.4087 0.6828 1.0463 0.8421 1.3000
Hours_of_Sleep 0.0274 0.0900 0.3045 0.7608 1.0278 0.8616 1.2260
Wake_up_Night:1 -0.2304 0.0996 -2.3127 0.0207 0.7942 0.6534 0.9655
Wake_up_Night:2 -0.2900 0.0912 -3.1811 0.0015 0.7482 0.6258 0.8946
Wake_up_Night:3 -0.4256 0.0927 -4.5918 0.0000 0.6534 0.5448 0.7835
Wake_up_Night:4 -0.7724 0.1211 -6.3776 0.0000 0.4619 0.3643 0.5856
Stress_level:1 0.1832 0.1141 1.6046 0.1086 1.2010 0.9602 1.5021
Stress_level:2 0.0872 0.1012 0.8621 0.3886 1.0911 0.8949 1.3305
Stress_level:3 -0.0733 0.1014 -0.7228 0.4698 0.9293 0.7618 1.1337
Stress_level:4 -0.3278 0.1254 -2.6132 0.0090 0.7205 0.5634 0.9213

Difficulty Sleeping

  • Batas Very poor|Poor: signifikan (p < 0,05), estimasi positif → semakin sering responden mengalami kesulitan tidur, odds berada pada kategori kualitas tidur yang lebih rendah cenderung meningkat.
  • Batas Poor|Average: signifikan (p = 0,017), estimasi positif → arah efek sama dengan batas sebelumnya.
  • Batas Average|Good dan Good|Very good: tidak signifikan.

Night Waking Frequency

  • Seluruh batas kategori signifikan (p < 0,05), estimasi negatif → semakin sering responden terbangun di malam hari, odds berada pada kategori kualitas tidur yang lebih rendah cenderung menurun.

Stress Level

  • Batas Very poor|Poor, Poor|Average, Average|Good: tidak signifikan.
  • Batas Good|Very good: signifikan (p = 0,009), estimasi negatif → semakin tinggi tingkat stres, odds berada pada kategori kualitas tidur yang lebih rendah cenderung menurun.

Hours of Sleep

  • Tidak signifikan pada seluruh batas kategori (p = 0,761).

3.7 Perbandingan Model (AIC)

data.frame(
  Model = c("Proportional Odds Model", "Partial Proportional Odds Model"),
  AIC   = c(round(AIC(model_po), 3), round(AIC(model_ppo), 3))
) %>%
  kable(caption = "Tabel 6. Perbandingan AIC") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Tabel 6. Perbandingan AIC
Model AIC
Proportional Odds Model 3041.295
Partial Proportional Odds Model 2939.702

PPO Model memiliki AIC lebih kecil dibandingkan model awal, sehingga dipilih sebagai model terbaik.

3.8 Uji Rasio Likelihood (G²) — Model PPO

Hipotesis:

  • H₀: Semua koefisien prediktor = 0 (model tidak berguna)
  • H₁: Minimal terdapat satu koefisien prediktor ≠ 0

Keputusan: Tolak H₀ jika p-value < 0,05.

model_null_vglm <- VGAM::vglm(
  Sleep_quality ~ 1,
  family = cumulative(parallel = TRUE, reverse = FALSE),
  data   = data_sleep
)

ll_null_ppo  <- logLik(model_null_vglm)[1]
ll_penuh_ppo <- logLik(model_ppo)[1]
G2_ppo       <- -2 * (ll_null_ppo - ll_penuh_ppo)
df_ppo       <- df.residual(model_null_vglm) - df.residual(model_ppo)
p_ppo        <- pchisq(G2_ppo, df = df_ppo, lower.tail = FALSE)

data.frame(
  `Statistik G²`  = round(G2_ppo, 4),
  `Derajat Bebas` = round(df_ppo, 0),
  `p-value`       = round(p_ppo, 4),
  check.names = FALSE
) %>%
  kable(caption = "Tabel 7. Uji Rasio Likelihood — PPO Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Tabel 7. Uji Rasio Likelihood — PPO Model
Statistik G² Derajat Bebas p-value
142.8136 13 0

G² = 142,81 dengan p-value < 0,05, sehingga H₀ ditolak. Model PPO secara keseluruhan signifikan dan minimal terdapat satu variabel prediktor yang berpengaruh nyata terhadap kualitas tidur.

3.9 Interpretasi Odds Ratio

result_ppo %>%
  dplyr::select(Parameter, Estimate, OR, `CI 2.5%`, `CI 97.5%`, `p-value`) %>%
  kable(caption = "Tabel 8. Ringkasan Odds Ratio dan Interval Kepercayaan PPO Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE
  )
Tabel 8. Ringkasan Odds Ratio dan Interval Kepercayaan PPO Model
Parameter Estimate OR CI 2.5% CI 97.5% p-value
(Intercept):1 -2.6730 NA NA NA 0.0000
(Intercept):2 -0.3143 NA NA NA 0.4907
(Intercept):3 1.7263 NA NA NA 0.0002
(Intercept):4 5.2490 NA NA NA 0.0000
Difficulty_Sleeping:1 0.4642 1.5908 1.2856 1.9684 0.0000
Difficulty_Sleeping:2 0.2208 1.2471 1.0403 1.4950 0.0170
Difficulty_Sleeping:3 0.0767 1.0797 0.9014 1.2933 0.4051
Difficulty_Sleeping:4 0.0453 1.0463 0.8421 1.3000 0.6828
Hours_of_Sleep 0.0274 1.0278 0.8616 1.2260 0.7608
Wake_up_Night:1 -0.2304 0.7942 0.6534 0.9655 0.0207
Wake_up_Night:2 -0.2900 0.7482 0.6258 0.8946 0.0015
Wake_up_Night:3 -0.4256 0.6534 0.5448 0.7835 0.0000
Wake_up_Night:4 -0.7724 0.4619 0.3643 0.5856 0.0000
Stress_level:1 0.1832 1.2010 0.9602 1.5021 0.1086
Stress_level:2 0.0872 1.0911 0.8949 1.3305 0.3886
Stress_level:3 -0.0733 0.9293 0.7618 1.1337 0.4698
Stress_level:4 -0.3278 0.7205 0.5634 0.9213 0.0090

Difficulty Sleeping

Nilai OR sebesar 1,5908 pada batas Very poor|Poor dan 1,2471 pada batas Poor|Average menunjukkan bahwa setiap kenaikan satu kategori frekuensi kesulitan tidur meningkatkan odds responden berada pada kategori kualitas tidur yang lebih rendah masing-masing sebesar 59,08% dan 24,71%, dengan asumsi variabel lain konstan. Pada batas Average|Good dan Good|Very good, variabel ini tidak berpengaruh signifikan.

Night Waking Frequency

Nilai OR yang kurang dari 1 pada seluruh batas kategori (0,7942; 0,7482; 0,6534; 0,4619) menunjukkan bahwa setiap kenaikan satu kategori frekuensi terbangun di malam hari menurunkan odds responden berada pada kategori kualitas tidur yang lebih rendah. Namun, arah hasil ini perlu diinterpretasikan secara hati-hati karena tidak sepenuhnya sejalan dengan teori umum.

Stress Level

Nilai OR sebesar 0,7205 pada batas Good|Very good menunjukkan bahwa setiap kenaikan satu kategori tingkat stres menurunkan odds responden berada pada kategori kualitas tidur yang lebih rendah sebesar 27,95%, dengan asumsi variabel lain konstan. Namun, hasil ini perlu diinterpretasikan secara hati-hati. Pada batas kategori lainnya, variabel ini tidak berpengaruh signifikan.

Hours of Sleep

OR = 1,0278 (p = 0,761) → tidak signifikan pada seluruh batas kategori, tidak diinterpretasikan lebih lanjut.

3.10 Evaluasi Kinerja Model (Confusion Matrix)

pred_prob  <- predict(model_ppo, type = "response")
pred_class <- apply(pred_prob, 1, function(x) {
  levels(data_sleep$Sleep_quality)[which.max(x)]
})
pred_class <- ordered(pred_class,
                      levels = c("Very poor", "Poor", "Average", "Good", "Very good"))

conf <- table(Aktual = data_sleep$Sleep_quality, Prediksi = pred_class)

conf %>%
  kable(caption = "Tabel 9. Confusion Matrix Hasil Prediksi PPO Model") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Tabel 9. Confusion Matrix Hasil Prediksi PPO Model
Very poor Poor Average Good Very good
Very poor 142 4 0 52 92
Poor 68 15 0 26 57
Average 29 3 0 34 9
Good 99 8 1 40 66
Very good 80 2 0 25 144
accuracy <- sum(diag(conf)) / sum(conf)
cat(sprintf("Akurasi model: %.2f%%\n", accuracy * 100))
## Akurasi model: 34.24%

Akurasi prediksi model sebesar 34,24% tergolong rendah, kemungkinan disebabkan oleh ketidakseimbangan distribusi variabel respon, terutama kategori Average yang hanya mewakili 7,5% dari total observasi.


4 Kesimpulan

  • Penelitian ini menunjukkan bahwa kualitas tidur mahasiswa berhubungan dengan beberapa faktor pola tidur, terutama frekuensi terbangun di malam hari dan kesulitan tidur.
  • Uji Rasio Likelihood menunjukkan model PPO signifikan secara simultan dengan G² = 142,81 dan p-value < 0,05.
  • Night waking frequency menjadi variabel yang paling konsisten berhubungan dengan kualitas tidur, sedangkan difficulty sleeping berpengaruh pada dua batas kategori awal dan stress level hanya signifikan pada batas kategori tertinggi.
  • Hours of sleep tidak menunjukkan pengaruh signifikan terhadap kualitas tidur pada taraf 5%, sehingga dalam penelitian ini durasi tidur belum menjadi faktor yang cukup kuat setelah dikontrol oleh variabel lain.
  • Secara keseluruhan, PPO layak digunakan karena lebih sesuai dengan karakteristik data ordinal dan mampu mengakomodasi pelanggaran asumsi proportional odds.
  • Untuk penelitian selanjutnya, disarankan menambahkan variabel lain yang berkaitan dengan kualitas tidur mahasiswa, seperti penggunaan gadget sebelum tidur, konsumsi kafein, aktivitas fisik, beban akademik, kondisi kesehatan mental, dan lingkungan tidur, agar model dapat memberikan gambaran yang lebih komprehensif.

5 Referensi

[1] Lisiswanti, R., Rodiani, Saputra, O., Sari M., & Zafirah, N. (2019). Hubungan Antara Kualitas Tidur Terhadap Hasil Belajar Mahasiswa Program Studi Pendidikan Dokter Fakultas Kedokteran Universitas Lampung. J Agromedicine, 6(1).

[2] Tristianingsih, J., & Handayani, S. (2021). Determinan Kualitas Tidur Mahasiswa Kampus A di Universitas Muhammadiyah Prof DR Hamka. Perilaku dan Promosi Kesehatan: Indonesian Journal of Health Promotion and Behavior, 3(2). https://doi.org/10.47034/ppk.v3i2.5275

[3] The relationship between sleep quality, stress, and academic performance. Journal of Family and Community Medicine, 27(1). https://journals.lww.com/jfcm/fulltext/2020/27010/the_relationship_between_sleep_quality,_stress,.4.aspx

[4] Kasingku, J. D., & Lotulung, M. S. D. (2024). Memahami Hubungan Kualitas Tidur terhadap Keberhasilan Belajar Siswa. Jurnal Pendidikan dan Pembelajaran Indonesia (JPPI), 4(3), 1038–1050. https://doi.org/10.53299/jppi.v4i3.703