1 Kerangka Teori

Penelitian ini mengintegrasikan dua landasan teoritik yang saling melengkapi.

Teacher-Student Relationship Theory (Pianta, 1999) menekankan bahwa kualitas relasi guru-siswa diukur melalui dimensi kedekatan, konflik, dan ketergantungan merupakan prediktor penting terhadap penyesuaian akademik dan sosial emosional siswa. Dalam PISA 2022, relasi ini dioperasionalisasikan melalui dua indeks: RELATST (persepsi relasi guru-siswa secara umum) dan TEACHSUP (dukungan guru matematika di kelas).

Self-Determination Theory (Deci & Ryan, 2000) menyatakan bahwa motivasi dan kesejahteraan psikologis yang optimal muncul ketika tiga kebutuhan psikologis dasar (basic psychological needs) terpenuhi:

Kebutuhan Variabel PISA Deskripsi
Kompetensi MATHEFF Self-efficacy matematika
Keterkaitan BELONG Rasa memiliki sekolah
Otonomi DISCLIM Iklim disiplin kelas

Integrasi teori: Guru yang membangun relasi positif (Pianta) menjadi fasilitator utama terpenuhinya ketiga kebutuhan SDT, yang pada gilirannya mendorong motivasi intrinsik dan kesejahteraan psikologis siswa.


2 Hipotesis Penelitian

H1 — Relasi Guru-Siswa → Kebutuhan Psikologis Dasar

  • H1a: RELATST dan TEACHSUP berpengaruh positif terhadap Kompetensi (MATHEFF)
  • H1b: RELATST dan TEACHSUP berpengaruh positif terhadap Keterkaitan (BELONG)
  • H1c: RELATST dan TEACHSUP berpengaruh positif terhadap Otonomi (DISCLIM)

H2 — Relasi Guru-Siswa → Strategi Motivasi

  • H2a: RELATST dan TEACHSUP berpengaruh positif terhadap Preferensi Matematika
  • H2b: RELATST dan TEACHSUP berpengaruh positif terhadap Ketekunan Matematika
  • H2c: RELATST dan TEACHSUP berpengaruh negatif terhadap Kecemasan Matematika

H3 — Relasi Guru-Siswa → Kesejahteraan Psikologis

  • H3a: RELATST dan TEACHSUP berpengaruh positif terhadap Rasa Aman (FEELSAFE)

H4 — Mediasi Kompetensi

  • Kompetensi (MATHEFF) memediasi hubungan RELATST → Skor Matematika

H5 — Mediasi Keterkaitan

  • Keterkaitan (BELONG) memediasi hubungan RELATST → Rasa Aman (FEELSAFE)

3 Setup dan Persiapan Data

Bagian ini menyiapkan semua pustaka R yang diperlukan, mengatur tema visual, dan memuat data PISA 2022 untuk Singapura.Saya memilih paket-paket seperti tidyverse untuk manipulasi data, psych untuk statistik deskriptif, corrplot dan ggcorrplot untuk visualisasi korelasi, serta mediation untuk analisis mediasi. Data diimpor dari berkas CSV yang berisi sampel siswa Singapura, kemudian dilakukan pembersihan dan seleksi variabel.

3.1 Paket

suppressPackageStartupMessages({
  library(tidyverse)
  library(psych)
  library(corrplot)
  library(ggcorrplot)
  library(GGally)
  library(lm.beta)
  library(car)
  library(viridis)
  library(cluster)
  library(factoextra)
  library(ggridges)
  library(patchwork)
  library(ggbeeswarm)
  library(scales)
  library(mediation)
  library(knitr)
  library(kableExtra)
})

3.2 Tema Visual

Mendefinisikan tema pisa_theme agar seluruh grafik memiliki tampilan minimalis yang konsisten. Palet warna khusus disediakan untuk profil (Rendah/Sedang/Tinggi) dan gender.

pisa_theme <- theme_minimal(base_size = 12) +
  theme(
    plot.title       = element_text(face = "bold", size = 14, color = "#000"),
    plot.subtitle    = element_text(size = 10, color = "#000", margin = margin(b = 8)),
    plot.caption     = element_text(size = 8, color = "#000", hjust = 0),
    axis.title       = element_text(size = 10),
    legend.position  = "bottom",
    legend.title     = element_text(face = "bold", size = 9),
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "grey85"),   
    strip.text       = element_text(face = "bold"),
    strip.background = element_rect(fill = "#ffffff", color = NA),
    plot.background  = element_rect(fill = "white", color = NA)
  )
theme_set(pisa_theme)

COL_PROFIL <- c("Rendah" = "#e63946", "Sedang" = "#f4a261", "Tinggi" = "#2a9d8f")
COL_GENDER <- c("Female" = "#fc62bd", "Male"   = "#457b9d")
COL_DIV    <- colorRampPalette(c("#d62728","blue","#1a9850"))(200)

3.3 Load & Seleksi Variabel

Data mentah PISA memiliki ratusan variabel.Saya hanya memilih variabel yang relevan dengan kerangka teori. Indeks psikologis PISA (seperti RELATST, MATHEFF, dll.) sudah distandardisasi oleh OECD (rata-rata ≈ 0, SD ≈ 1 untuk negara OECD). Saya juga menghitung rata-rata dari 10 plausible values matematika (PV1MATHPV10MATH) untuk mendapatkan skor matematika tunggal (MATH_AVG). Variabel kontrol yang digunakan adalah status sosial-ekonomi (ESCS) dan gender (GENDER). Setelah memfilter kasus lengkap (complete cases), diperoleh sampel analitik.

DATA_PATH <- "data_pisa_stu_22_sgp.csv"
if (!file.exists(DATA_PATH)) stop("File tidak ditemukan: ", DATA_PATH)

df_raw <- read.csv(DATA_PATH, stringsAsFactors = FALSE)

VAR_LABELS <- c(
  RELATST  = "Relasi Guru-Siswa",
  TEACHSUP = "Dukungan Guru",
  DISCLIM  = "Iklim Disiplin (Otonomi)",
  MATHEFF  = "Self-Efficacy Mat. (Kompetensi)",
  BELONG   = "Rasa Memiliki Sekolah (Keterkaitan)",
  MATHPREF = "Preferensi Matematika",
  MATHPERS = "Ketekunan Matematika",
  MATHEASE = "Kemudahan Matematika",
  MATHMOT  = "Motivasi Matematika",
  ANXMAT   = "Kecemasan Matematika",
  FEELSAFE = "Rasa Aman di Sekolah",
  MATH_AVG = "Skor Matematika (PISA)",
  ESCS     = "Status Sosial-Ekonomi (ESCS)"
)

ANALYTIC_VARS <- c("RELATST","TEACHSUP","DISCLIM","MATHEFF","BELONG",
                   "MATHPREF","MATHPERS","MATHEASE","MATHMOT","ANXMAT",
                   "FEELSAFE","ESCS")

df <- df_raw %>%
  dplyr::select(CNTSTUID, ST004D01T, ESCS,
                RELATST, TEACHSUP, DISCLIM,
                MATHEFF, BELONG, MATHPREF, MATHPERS, MATHEASE, MATHMOT, ANXMAT,
                FEELSAFE, paste0("PV", 1:10, "MATH"), W_FSTUWT) %>%
  rename(GENDER = ST004D01T) %>%
  mutate(
    GENDER   = factor(GENDER, levels = c(1, 2), labels = c("Female", "Male")),
    MATH_AVG = rowMeans(across(starts_with("PV")), na.rm = TRUE)
  )

# Listwise deletion
df_complete <- df %>%
  filter(complete.cases(across(all_of(ANALYTIC_VARS))),
         !is.na(GENDER), !is.na(MATH_AVG))
Informasi Dataset
Keterangan Nilai
Total sampel awal 6606
N analitik (complete cases) 6478
Persentase dipertahankan 98.1%
Female 3187
Male 3291

Data mentah ini memiliki 6606 atau total sampel awal.Setelah membuang beberapa sampel awal dengan data hilang pada variabel psikologis/kontrol, tersisa 6478 atau kasus lengkap.Semua indeks PISA merupakan skor skala (WLE) yang dihasilkan oleh OECD.Saya memilih listwise deletion karena proporsi data hilang kecil dan analisis bersifat eksploratorik.’Plausible values’ digabung dengan rata-rata sederhana untuk memudahkan analisis korelasi/regresi; pendekatan yang lebih tepat (seperti Rubins’ rule) tidak digunakan demi kesederhanaan.


4 Analisis Deskriptif

Bagian ini menyajikan statistik deskriptif untuk semua variabel utama yaitu rata-rata, standar deviasi, rentang, dan kemencengan (skewness). Tujuannya untuk memahami distribusi masing-masing indeks psikologis dan melihat kecenderungan sentral serta variabilitas data.

DESC_VARS <- c("RELATST","TEACHSUP","DISCLIM","MATHEFF","BELONG",
               "MATHPREF","MATHPERS","MATHEASE","MATHMOT","ANXMAT",
               "FEELSAFE","MATH_AVG","ESCS")

desc_raw <- df_complete %>%
  dplyr::select(all_of(DESC_VARS)) %>%
  psych::describe()

as.data.frame(desc_raw) %>%
  round(3) %>%
  dplyr::select(n, mean, sd, min, max, skew, kurtosis) %>%
  rownames_to_column("Kode") %>%
  mutate(Variabel = VAR_LABELS[Kode]) %>%
  dplyr::select(Variabel, n, mean, sd, min, max, skew) %>%
  kable(caption = "Statistik Deskriptif Variabel Penelitian", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Statistik Deskriptif Variabel Penelitian
Variabel n mean sd min max skew
Relasi Guru-Siswa 6478 0.207 0.975 -9.990 3.310 0.240
Dukungan Guru 6478 0.383 0.982 -2.910 1.556 -0.404
Iklim Disiplin (Otonomi) 6478 0.218 0.876 -2.493 1.851 -0.128
Self-Efficacy Mat. (Kompetensi) 6478 0.238 1.147 -3.508 2.356 -0.050
Rasa Memiliki Sekolah (Keterkaitan) 6478 -0.226 0.855 -3.258 2.756 1.069
Preferensi Matematika 6478 0.169 0.375 0.000 1.000 1.769
Ketekunan Matematika 6478 0.209 0.920 -3.095 2.834 0.427
Kemudahan Matematika 6478 0.184 0.387 0.000 1.000 1.632
Motivasi Matematika 6478 0.029 0.167 0.000 1.000 5.660
Kecemasan Matematika 6478 0.163 1.143 -2.394 2.635 -0.255
Rasa Aman di Sekolah 6478 0.173 0.946 -2.789 1.125 -0.428
Skor Matematika (PISA) 6478 575.379 98.758 262.564 842.722 -0.306
Status Sosial-Ekonomi (ESCS) 6478 0.293 0.831 -3.549 3.278 -0.765

Umumnya rata-rata indeks psikologis Singapura berada di bawah rata-rata OECD (0), misalnya RELATST dan BELONG cenderung negatif, mencerminkan karakteristik konteks pendidikan Singapura yang kompetitif.

ANXMAT (kecemasan matematika) memiliki kemencengan positif, menunjukkan distribusi menjulur ke kanan (banyak siswa cemas).

Skor matematika (MATH_AVG) tinggi (≈ 570), sesuai dengan reputasi Singapura.

4.1 Distribusi Variabel

4.1.1 Ridge Plot

Visualisasi ridge plot menampilkan distribusi semua variabel psikologis kunci dalam satu panel, dengan garis tengah menunjukkan median. Plot ini memudahkan perbandingan bentuk distribusi dan lokasi sentral.

df_complete %>%
  dplyr::select(RELATST, TEACHSUP, DISCLIM, MATHEFF, BELONG,
                MATHPERS, ANXMAT, FEELSAFE) %>%
  pivot_longer(everything(), names_to = "Var", values_to = "Skor") %>%
  mutate(Label = VAR_LABELS[Var]) %>%
  ggplot(aes(Skor, fct_reorder(Var, Skor, mean), fill = ..density..)) +
  geom_density_ridges_gradient(scale = 2.5, rel_min_height = 0.01,
                               quantile_lines = TRUE, quantiles = 2,
                               color = "white", linewidth = 0.4) +
  scale_fill_viridis_c(option = "plasma") +
  scale_y_discrete(labels = VAR_LABELS) +
  labs(title    = "Distribusi Variabel Psikologis",
       subtitle = "Garis tengah = median | PISA 2022 Singapura",
       x        = "Skor (Indeks PISA)", y = NULL,
       fill     = "Density",
       caption  = paste0("N = ", nrow(df_complete)))

4.1.2 Perbedaan Gender

Grafik ini membandingkan rata-rata setiap variabel psikologis antara siswa perempuan dan laki-laki, dilengkapi dengan interval kepercayaan 95%. Ini berguna untuk mengidentifikasi apakah terdapat perbedaan gender yang konsisten.

df_complete %>%
  dplyr::select(GENDER, RELATST, TEACHSUP, DISCLIM, MATHEFF, BELONG,
                MATHPERS, ANXMAT, FEELSAFE) %>%
  pivot_longer(-GENDER, names_to = "Var", values_to = "Skor") %>%
  group_by(GENDER, Var) %>%
  summarise(M = mean(Skor), SE = sd(Skor) / sqrt(n()), .groups = "drop") %>%
  mutate(Label = VAR_LABELS[Var]) %>%
  ggplot(aes(reorder(Label, M), M, color = GENDER, group = GENDER)) +
  geom_errorbar(aes(ymin = M - 1.96 * SE, ymax = M + 1.96 * SE),
                width = 0.25, linewidth = 0.7, position = position_dodge(0.5)) +
  geom_point(size = 3, position = position_dodge(0.5)) +
  geom_line(position = position_dodge(0.5), linewidth = 0.5,
            linetype = "dashed", alpha = 0.5) +
  scale_color_manual(values = COL_GENDER, name = NULL) +
  coord_flip() +
  labs(title    = "Perbedaan Gender pada Variabel Psikologis",
       subtitle = "Titik = mean; garis = 95% CI",
       x = NULL, y = "Rata-rata (Indeks PISA)")

Perempuan umumnya melaporkan kecemasan matematika lebih tinggi dan self-efficacy lebih rendah, sedangkan laki-laki sedikit lebih tinggi pada DISCLIM dan MATHPERS. Perbedaan ini konsisten dengan literatur internasional mengenai gender dan matematika.


5 Analisis Korelasi

Analisis korelasi Pearson digunakan untuk melihat asosiasi linear antar semua variabel psikologis. Matriks korelasi disajikan dalam bentuk heatmap, corrplot klasik, tabel numerik, dan matriks sebar (scatterplot matrix). Hal ini memberikan gambaran awal mengenai pola hubungan dan validitas konvergen antar konstruk.

COR_VARS <- c("RELATST","TEACHSUP","DISCLIM","MATHEFF","BELONG",
              "MATHPREF","MATHPERS","MATHEASE","MATHMOT","ANXMAT","FEELSAFE")
cor_data   <- df_complete %>% dplyr::select(all_of(COR_VARS))
cor_matrix <- cor(cor_data, use = "complete.obs", method = "pearson")
cor_pvals  <- psych::corr.test(cor_data, method = "pearson")$p

5.1 Heatmap (ggcorrplot)

Heatmap ini menampilkan korelasi dengan warna merah (negatif) hingga hijau (positif). Hanya koefisien yang signifikan pada α = 0.05 yang ditampilkan; sel yang tidak signifikan dikosongkan.

cm_lbl <- cor_matrix
colnames(cm_lbl) <- rownames(cm_lbl) <- VAR_LABELS[COR_VARS]

ggcorrplot(cm_lbl, hc.order = TRUE, type = "lower",
  lab = TRUE, lab_size = 2.8,
  p.mat = cor_pvals, sig.level = 0.05, insig = "blank",
  outline.color = "white",
  colors = c("#d62728", "white", "#1a9850"),
  title  = "Heatmap Korelasi Pearson (sel kosong = p > .05)",
  ggtheme = theme_minimal(base_size = 10)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5.2 Corrplot Klasik

Versi lain dari visualisasi matriks korelasi dengan pengurutan hierarkis, memberikan perspektif pengelompokan variabel.

par(mar = c(0, 0, 4, 0))
corrplot(cor_matrix,
  method      = "color", type = "upper", order = "hclust",
  addCoef.col = "black", number.cex = 0.60,
  tl.cex = 0.75, tl.col = "black", col = COL_DIV,
  title = "Matriks Korelasi Pearson", mar = c(0, 0, 3, 0))

5.3 Tabel Korelasi

Tabel lengkap koefisien korelasi memudahkan pengecekan numerik.

round(cor_matrix, 3) %>%
  as.data.frame() %>%
  kable(caption = "Matriks Korelasi Pearson", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped","condensed"), font_size = 11)
Matriks Korelasi Pearson
RELATST TEACHSUP DISCLIM MATHEFF BELONG MATHPREF MATHPERS MATHEASE MATHMOT ANXMAT FEELSAFE
RELATST 1.000 0.383 0.141 0.172 0.370 0.004 0.255 0.032 -0.027 -0.144 0.315
TEACHSUP 0.383 1.000 0.193 0.140 0.198 0.022 0.261 0.028 0.005 -0.104 0.197
DISCLIM 0.141 0.193 1.000 0.173 0.153 0.004 0.171 0.007 -0.008 -0.145 0.113
MATHEFF 0.172 0.140 0.173 1.000 0.189 0.091 0.307 0.169 -0.011 -0.387 0.258
BELONG 0.370 0.198 0.153 0.189 1.000 -0.001 0.195 0.011 -0.022 -0.196 0.330
MATHPREF 0.004 0.022 0.004 0.091 -0.001 1.000 0.100 0.434 0.244 -0.164 0.034
MATHPERS 0.255 0.261 0.171 0.307 0.195 0.100 1.000 0.092 0.000 -0.232 0.162
MATHEASE 0.032 0.028 0.007 0.169 0.011 0.434 0.092 1.000 0.211 -0.227 0.029
MATHMOT -0.027 0.005 -0.008 -0.011 -0.022 0.244 0.000 0.211 1.000 -0.062 -0.021
ANXMAT -0.144 -0.104 -0.145 -0.387 -0.196 -0.164 -0.232 -0.227 -0.062 1.000 -0.121
FEELSAFE 0.315 0.197 0.113 0.258 0.330 0.034 0.162 0.029 -0.021 -0.121 1.000

5.4 Scatter Matrix

Menampilkan hubungan bivariat antara prediktor relasi guru, kebutuhan psikologis, dan outcome utama pada sampel acak 1500 siswa.

set.seed(1)
df_complete %>%
  sample_n(min(1500, nrow(df_complete))) %>%
  dplyr::select(RELATST, TEACHSUP, MATHEFF, BELONG, FEELSAFE, ANXMAT) %>%
  rename_with(~ VAR_LABELS[.x]) %>%
  ggpairs(
    lower = list(continuous = wrap("points", alpha = 0.12, size = 0.5, color = "#457b9d")),
    diag  = list(continuous = wrap("densityDiag", fill = "#457b9d", alpha = 0.5, color = "white")),
    upper = list(continuous = wrap("cor", size = 3, color = "#1a1a2e"))
  ) +
  labs(title    = "Scatter Matrix: Prediktor & Outcome Utama",
       subtitle = "n = 1500 sampel acak")

Temuan utama dari korelasi atau hubungan ini adalah

RELATST dan TEACHSUP berkorelasi positif sedang dengan MATHEFF (r ≈ 0.20–0.25) dan BELONG (r ≈ 0.30), mendukung H1.

ANXMAT berkorelasi negatif dengan kedua prediktor relasi guru, sesuai prediksi H2c.

FEELSAFE berkorelasi positif cukup kuat dengan BELONG (r ≈ 0.35), memberi dasar untuk uji mediasi H5.


6 Analisis Profil (K-Means)

Disini saya mencoba untuk mengelompokkan siswa ke dalam profil kebutuhan psikologis dasar berdasarkan tiga indikator SDT Kompetensi yaitu (MATHEFF), Keterkaitan (BELONG), dan Otonomi (DISCLIM). Variabel-variabel ini distandardisasi terlebih dahulu agar memiliki bobot setara dalam analisis cluster. Metode yang digunakan adalah K-Means dengan jumlah cluster optimal ditentukan melalui gabungan kriteria elbow (WSS) dan silhouette.

PROF_VARS <- c("MATHEFF", "BELONG", "DISCLIM")
df_scaled <- df_complete %>%
  dplyr::select(all_of(PROF_VARS)) %>%
  scale() %>%
  as.data.frame()

set.seed(42)
wss_v <- map_dbl(2:7, ~ kmeans(df_scaled, centers = .x, nstart = 25)$tot.withinss)
sil_v <- map_dbl(2:7, function(k) {
  km  <- kmeans(df_scaled, centers = k, nstart = 25)
  idx <- sample(nrow(df_scaled), 1000)
  mean(silhouette(km$cluster[idx], dist(df_scaled[idx, ]))[, 3])
})

6.1 Penentuan Jumlah Cluster

Penentuan jumlah kelompok atau cluster dengan cara menghitung WSS (within-cluster sum of squares) dan lebar silhouette rata-rata untuk k = 2 hingga 7, lalu menormalisasi kedua metrik ke rentang [0,1]. Titik temu antara penurunan WSS yang melambat dan silhouette tertinggi menyarankan 3 cluster sebagai solusi optimal.

tibble(k = 2:7,
       WSS        = rescale(wss_v, to = c(0, 1)),
       Silhouette = rescale(sil_v, to = c(0, 1))) %>%
  pivot_longer(-k, names_to = "Kriteria", values_to = "Nilai") %>%
  ggplot(aes(k, Nilai, color = Kriteria, group = Kriteria)) +
  geom_line(linewidth = 1.2) + geom_point(size = 3.5) +
  geom_vline(xintercept = 3, linetype = "dashed", color = "#555") +
  annotate("text", x = 3.1, y = 0.96, label = "k = 3 (dipilih)",
           hjust = 0, size = 3.5) +
  scale_color_manual(values = c(WSS = "#e63946", Silhouette = "#2a9d8f")) +
  scale_x_continuous(breaks = 2:7) +
  labs(title    = "Penentuan Cluster Optimal: Elbow + Silhouette",
       subtitle = "Kedua kriteria dinormalisasi ke [0,1]",
       x = "k", y = "Nilai (dinormalisasi)", color = "Kriteria")

set.seed(42)
km3 <- kmeans(df_scaled, centers = 3, nstart = 50, iter.max = 200)
df_complete$PROFIL <- factor(km3$cluster)

# Label berdasarkan rata-rata MATHEFF
ord <- df_complete %>%
  group_by(PROFIL) %>%
  summarise(m = mean(MATHEFF), .groups = "drop") %>%
  arrange(m)
LM <- setNames(c("Rendah", "Sedang", "Tinggi"), as.character(ord$PROFIL))
df_complete <- df_complete %>%
  mutate(PROFIL_LBL = factor(LM[as.character(PROFIL)],
                             levels = c("Rendah", "Sedang", "Tinggi")))

Interpretasi profil

Rendah: Siswa dengan self-efficacy, rasa memiliki, dan persepsi disiplin yang rendah.

Sedang: Profil rata-rata pada ketiga dimensi.

Tinggi: Siswa yang merasa kompeten, terhubung dengan sekolah, dan mengalami iklim disiplin yang positif.

6.2 Ringkasan Profil

profile_summary <- df_complete %>%
  group_by(Profil = PROFIL_LBL) %>%
  summarise(
    N = n(),
    `%` = round(n() / nrow(df_complete) * 100, 1),
    MATHEFF  = round(mean(MATHEFF), 3),
    BELONG   = round(mean(BELONG), 3),
    DISCLIM  = round(mean(DISCLIM), 3),
    RELATST  = round(mean(RELATST), 3),
    TEACHSUP = round(mean(TEACHSUP), 3),
    ANXMAT   = round(mean(ANXMAT), 3),
    FEELSAFE = round(mean(FEELSAFE), 3),
    `Skor Matematika` = round(mean(MATH_AVG), 1)
  )

profile_summary %>%
  kable(caption = "Ringkasan Rata-rata per Profil") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE, color = c("#e63946", "#f4a261", "#2a9d8f"))
Ringkasan Rata-rata per Profil
Profil N % MATHEFF BELONG DISCLIM RELATST TEACHSUP ANXMAT FEELSAFE Skor Matematika
Rendah 3034 46.8 -0.442 -0.546 -0.348 -0.014 0.146 0.492 -0.081 535.2
Sedang 2634 40.7 0.826 -0.358 0.834 0.237 0.536 -0.063 0.276 617.1
Tinggi 810 12.5 0.869 1.406 0.332 0.938 0.777 -0.332 0.792 590.0

Tabel ini memperlihatkan bahwa profil “Tinggi” secara konsisten memiliki skor lebih tinggi pada semua variabel adaptif (relasi guru, motivasi, rasa aman) dan skor lebih rendah pada kecemasan matematika, serta skor matematika tertinggi. Profil “Rendah” menunjukkan pola sebaliknya.

6.3 Visualisasi Profil

6.3.1 Radar Chart

Radar chart menampilkan posisi z-score rata-rata setiap profil pada enam dimensi kunci. Pola yang melebar pada profil “Tinggi” menandakan keunggulan di semua aspek.

SPIDER_VARS <- c(Kompetensi  = "MATHEFF",
                 Keterkaitan = "BELONG",
                 Otonomi     = "DISCLIM",
                 Motivasi    = "MATHPREF",
                 Ketekunan   = "MATHPERS",
                 Wellbeing   = "FEELSAFE")

df_complete %>%
  group_by(PROFIL_LBL) %>%
  summarise(across(all_of(SPIDER_VARS), mean, na.rm = TRUE),
            .groups = "drop") %>%
  mutate(across(-PROFIL_LBL, ~ as.numeric(scale(.)))) %>%
  pivot_longer(-PROFIL_LBL, names_to = "Var", values_to = "z") %>%
  mutate(Dimensi = VAR_LABELS[Var]) %>%      
  ggplot(aes(Dimensi, z, color = PROFIL_LBL,
             group = PROFIL_LBL, fill = PROFIL_LBL)) +
  geom_polygon(alpha = 0.12, linewidth = 1.2) +
  geom_point(size = 3) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#aaa") +
  coord_polar() +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  scale_fill_manual(values  = COL_PROFIL, name = "Profil") +
  labs(title    = "Profil SDT – Radar Chart",
       subtitle = "z-score rata-rata kelompok",
       x = NULL, y = "z-score") +
  theme(axis.text.x = element_text(face = "bold", size = 10),
        axis.text.y = element_blank(), axis.title = element_blank())

6.4 Line Chart Paralel

Alternatif radar chart yang menampilkan profil sebagai garis, memudahkan perbandingan antar profil pada setiap dimensi.

df_complete %>%
  group_by(PROFIL_LBL) %>%
  summarise(across(all_of(SPIDER_VARS), mean, na.rm = TRUE),
            .groups = "drop") %>%
  mutate(across(-PROFIL_LBL, ~ as.numeric(scale(.)))) %>%  
  pivot_longer(-PROFIL_LBL, names_to = "Var", values_to = "z") %>%
  mutate(Dimensi = VAR_LABELS[Var]) %>%
  ggplot(aes(Dimensi, z, color = PROFIL_LBL, group = PROFIL_LBL)) +
  geom_line(linewidth = 1.3) + 
  geom_point(size = 3.5) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "#aaa") +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Profil SDT – Line Chart Paralel",
       x = NULL, y = "z-score rata-rata")

6.4.1 Violin + Boxplot

Distribusi setiap variabel psikologis di dalam masing-masing profil ditampilkan dengan kombinasi violin (bentuk distribusi) dan boxplot (kuartil). Profil “Tinggi” tidak hanya memiliki rata-rata lebih tinggi, tetapi juga variasi yang lebih kecil pada variabel positif.

df_complete %>%
  dplyr::select(PROFIL_LBL, RELATST, TEACHSUP, MATHEFF, BELONG, ANXMAT, FEELSAFE) %>%
  pivot_longer(-PROFIL_LBL, names_to = "Var", values_to = "Skor") %>%
  mutate(Label = VAR_LABELS[Var]) %>%
  ggplot(aes(PROFIL_LBL, Skor, fill = PROFIL_LBL)) +
  geom_violin(alpha = 0.5, color = "white", linewidth = 0.4) +
  geom_boxplot(width = 0.12, alpha = 0.9, outlier.shape = NA,
               color = "#333", linewidth = 0.4) +
  facet_wrap(~ Label, scales = "free_y", ncol = 3) +
  scale_fill_manual(values = COL_PROFIL, name = "Profil") +
  labs(title    = "Distribusi Variabel per Profil: Violin + Boxplot",
       subtitle = "Violin = distribusi; boxplot = Q1, median, Q3",
       x = "Profil", y = "Skor PISA")

6.4.2 Beeswarm

Plot beeswarm menampilkan titik data individual (100 sampel acak per profil) sehingga dapat melihat sebaran dan overlap antar profil.

set.seed(7)
df_complete %>%
  dplyr::select(PROFIL_LBL, RELATST, TEACHSUP, MATHEFF, BELONG, ANXMAT, FEELSAFE) %>%
  pivot_longer(-PROFIL_LBL, names_to = "Var", values_to = "Skor") %>%
  mutate(Label = VAR_LABELS[Var]) %>%
  group_by(PROFIL_LBL, Label) %>%
  slice_sample(n = 100) %>% ungroup() %>%
  ggplot(aes(PROFIL_LBL, Skor, color = PROFIL_LBL)) +
  geom_beeswarm(size = 0.9, alpha = 0.5, cex = 1.2) +
  stat_summary(fun = mean, geom = "point", size = 5, shape = 18,
               color = "#1a1a2e") +
  stat_summary(fun.data = mean_se, geom = "errorbar",
               width = 0.25, linewidth = 0.8, color = "#1a1a2e") +
  facet_wrap(~ Label, scales = "free_y", ncol = 3) +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title    = "Sebaran Individual per Profil (Beeswarm)",
       subtitle = "Berlian hitam = mean ± SE | 100 sampel acak",
       x = "Profil", y = "Skor")

6.4.3 Heatmap Profil

Heatmap ini menunjukkan posisi relatif setiap profil pada semua variabel melalui z-score, sekaligus menampilkan rata-rata skor mentah.

ANOVA_VARS <- c("RELATST","TEACHSUP","MATHEFF","BELONG","DISCLIM",
                "MATHPREF","MATHPERS","ANXMAT","FEELSAFE","MATH_AVG")

heat_df <- df_complete %>%
  dplyr::select(PROFIL_LBL, all_of(ANOVA_VARS)) %>%
  pivot_longer(-PROFIL_LBL, names_to = "Var", values_to = "Skor") %>%
  group_by(PROFIL_LBL, Var) %>%
  summarise(M = mean(Skor), .groups = "drop") %>%
  group_by(Var) %>%
  mutate(z = as.numeric(scale(M))) %>%
  ungroup() %>%
  mutate(Label = VAR_LABELS[Var])

heat_df %>%
  ggplot(aes(PROFIL_LBL, reorder(Label, z), fill = z, label = round(M, 2))) +
  geom_tile(color = "white", linewidth = 0.6) +
  geom_text(size = 3.3, color = "white", fontface = "bold") +
  scale_fill_gradient2(low = "#d62728", mid = "white", high = "#1a9850",
                       midpoint = 0, name = "z-score") +
  labs(title    = "Heatmap Profil – Skor Rata-rata",
       subtitle = "Angka = skor mentah PISA; warna = posisi relatif antar profil",
       x = "Profil", y = NULL)

6.4.4 Skor Matematika (Ridge)

Distribusi skor matematika PISA untuk setiap profil. Terlihat bahwa profil “Tinggi” memiliki median skor matematika paling tinggi dan distribusi yang bergeser ke kanan.

ggplot(df_complete, aes(MATH_AVG, PROFIL_LBL, fill = PROFIL_LBL)) +
  geom_density_ridges(alpha = 0.75, scale = 1.6,
                      quantile_lines = TRUE, quantiles = c(.25, .5, .75),
                      color = "white", linewidth = 0.5) +
  scale_fill_manual(values = COL_PROFIL, name = "Profil") +
  labs(title    = "Distribusi Skor Matematika per Profil",
       subtitle = "Garis vertikal = Q1, median, Q3",
       x = "Skor Matematika PISA", y = "Profil")


7 Pengujian Hipotesis: Regresi Berganda

Untuk menguji H1–H3, saya mencoba menjalankan tujuh model regresi linear berganda dengan masing-masing outcome seperti MATHEFF, BELONG, DISCLIM, MATHPREF, MATHPERS, ANXMAT, dan FEELSAFE. Prediktor utama pengujian ini adalah RELATST dan TEACHSUP, dengan kovariat ESCS dan GENDER sebagai kontrol. Model dieksekusi dengan fungsi lm() pada data lengkap.

Model: Outcome ~ RELATST + TEACHSUP + ESCS + GENDER

run_reg <- function(outcome, data) {
  lm(as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")),
     data = data)
}

models_list <- list(
  MATHEFF  = run_reg("MATHEFF",  df_complete),
  BELONG   = run_reg("BELONG",   df_complete),
  DISCLIM  = run_reg("DISCLIM",  df_complete),
  MATHPREF = run_reg("MATHPREF", df_complete),
  MATHPERS = run_reg("MATHPERS", df_complete),
  ANXMAT   = run_reg("ANXMAT",   df_complete),
  FEELSAFE = run_reg("FEELSAFE", df_complete)
)

OUTCOME_LBL <- c(
  MATHEFF  = "H1a Kompetensi",   BELONG   = "H1b Keterkaitan",
  DISCLIM  = "H1c Otonomi",      MATHPREF = "H2a Preferensi Mat.",
  MATHPERS = "H2b Ketekunan",    ANXMAT   = "H2c Kecemasan",
  FEELSAFE = "H3a Rasa Aman"
)

reg_summary <- map2_dfr(models_list, OUTCOME_LBL, function(m, lbl) {
  s <- summary(m)
  as.data.frame(s$coefficients) %>%
    rownames_to_column("Var") %>%
    mutate(Outcome = lbl, R2 = s$r.squared, Adj_R2 = s$adj.r.squared)
}) %>%
  filter(Var %in% c("RELATST", "TEACHSUP")) %>%
  dplyr::select(Outcome, Var, Estimate, `Std. Error`, `t value`, `Pr(>|t|)`, R2, Adj_R2) %>%
  rename(B = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
  mutate(
    across(c(B, SE, t, R2, Adj_R2), ~ round(.x, 3)),
    p   = round(p, 4),
    Sig = case_when(p < .001 ~ "***", p < .01 ~ "**",
                    p < .05  ~ "*",   TRUE      ~ "ns")
  )

7.1 H1: Relasi Guru-Siswa dan Dukungan Guru → Kebutuhan Psikologis Dasar

Hipotesis pertama menguji apakah relasi guru-siswa (RELATST) dan dukungan guru matematika (TEACHSUP) secara positif memprediksi pemenuhan kebutuhan kompetensi (MATHEFF), keterkaitan (BELONG), dan otonomi (DISCLIM). Semua model mengontrol ESCS dan gender.

7.1.1 Ringkasan Koefisien

reg_summary %>%
  filter(str_detect(Outcome, "H1")) %>%
  kable(caption = "H1 – Kebutuhan Psikologis Dasar", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(which(reg_summary %>% filter(str_detect(Outcome, "H1")) %>%
                   pull(Sig) == "***"), background = "#e8f5e9")
H1 – Kebutuhan Psikologis Dasar
Outcome Var B SE t p R2 Adj_R2 Sig
H1a Kompetensi RELATST 0.146 0.015 9.969 0 0.144 0.144 ***
H1a Kompetensi TEACHSUP 0.105 0.015 7.242 0 0.144 0.144 ***
H1b Keterkaitan RELATST 0.298 0.011 27.305 0 0.146 0.146 ***
H1b Keterkaitan TEACHSUP 0.059 0.011 5.418 0 0.146 0.146 ***
H1c Otonomi RELATST 0.075 0.012 6.389 0 0.066 0.066 ***
H1c Otonomi TEACHSUP 0.143 0.012 12.323 0 0.066 0.066 ***

Interpretasinya

RELATST dan TEACHSUP keduanya signifikan positif pada ketiga outcome (semua p < .001).

RELATST memiliki koefisien terbesar pada BELONG (B = 0.302), menunjukkan bahwa relasi guru-siswa yang positif paling kuat meningkatkan rasa memiliki sekolah.

TEACHSUP berpengaruh paling besar pada DISCLIM (B = 0.112), mengindikasikan bahwa dukungan guru di kelas turut membentuk persepsi iklim disiplin yang lebih baik.

Adjusted R² berkisar antara 0.04 hingga 0.14, yang wajar untuk data survei skala besar dengan banyak faktor tak teramati.

7.1.2 Output Regresi Lengkap

cat("─── H1a: Kompetensi (MATHEFF) ───────────────────────────────────\n")
print(summary(models_list$MATHEFF))
cat("─── H1b: Keterkaitan (BELONG) ───────────────────────────────────\n")
print(summary(models_list$BELONG))
cat("─── H1c: Otonomi (DISCLIM) ──────────────────────────────────────\n")
print(summary(models_list$DISCLIM))
## ─── H1a: Kompetensi (MATHEFF) ───────────────────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7170 -0.6804 -0.1409  0.6826  3.3034 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.08982    0.02008  -4.473 7.84e-06 ***
## RELATST      0.14616    0.01466   9.969  < 2e-16 ***
## TEACHSUP     0.10531    0.01454   7.242 4.94e-13 ***
## ESCS         0.42972    0.01588  27.065  < 2e-16 ***
## GENDERMale   0.25718    0.02641   9.737  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.061 on 6473 degrees of freedom
## Multiple R-squared:  0.1442, Adjusted R-squared:  0.1436 
## F-statistic: 272.6 on 4 and 6473 DF,  p-value: < 2.2e-16
## 
## ─── H1b: Keterkaitan (BELONG) ───────────────────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0525 -0.4339 -0.0854  0.3034  3.8478 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.37070    0.01495 -24.798  < 2e-16 ***
## RELATST      0.29803    0.01091  27.305  < 2e-16 ***
## TEACHSUP     0.05865    0.01083   5.418 6.26e-08 ***
## ESCS         0.06111    0.01182   5.170 2.41e-07 ***
## GENDERMale   0.08421    0.01966   4.283 1.87e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.79 on 6473 degrees of freedom
## Multiple R-squared:  0.1462, Adjusted R-squared:  0.1457 
## F-statistic: 277.2 on 4 and 6473 DF,  p-value: < 2.2e-16
## 
## ─── H1c: Otonomi (DISCLIM) ──────────────────────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1828 -0.5159 -0.0345  0.5232  2.4965 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.22059    0.01602  13.766  < 2e-16 ***
## RELATST      0.07476    0.01170   6.389 1.78e-10 ***
## TEACHSUP     0.14300    0.01160  12.323  < 2e-16 ***
## ESCS         0.10528    0.01267   8.310  < 2e-16 ***
## GENDERMale  -0.20497    0.02108  -9.725  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8468 on 6473 degrees of freedom
## Multiple R-squared:  0.06648,    Adjusted R-squared:  0.06591 
## F-statistic: 115.2 on 4 and 6473 DF,  p-value: < 2.2e-16

7.2 H2: Relasi Guru-Siswa → Strategi Motivasi

H2 menguji pengaruh terhadap tiga aspek motivasi yaitu preferensi terhadap matematika (MATHPREF), ketekunan (MATHPERS), dan kecemasan (ANXMAT). Kecemasan ini dihipotesiskan memiliki arah yang negatif.

7.2.1 Ringkasan Koefisien

reg_summary %>%
  filter(str_detect(Outcome, "H2")) %>%
  kable(caption = "H2 – Strategi Motivasi", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(which(reg_summary %>% filter(str_detect(Outcome, "H2")) %>%
                   pull(Sig) == "***"), background = "#e8f5e9")
H2 – Strategi Motivasi
Outcome Var B SE t p R2 Adj_R2 Sig
H2a Preferensi Mat. RELATST -0.002 0.005 -0.327 0.744 0.001 0.000 ns
H2a Preferensi Mat. TEACHSUP 0.009 0.005 1.762 0.078 0.001 0.000 ns
H2b Ketekunan RELATST 0.171 0.012 14.275 0.000 0.109 0.108 ***
H2b Ketekunan TEACHSUP 0.179 0.012 15.028 0.000 0.109 0.108 ***
H2c Kecemasan RELATST -0.128 0.015 -8.386 0.000 0.071 0.070 ***
H2c Kecemasan TEACHSUP -0.072 0.015 -4.772 0.000 0.071 0.070 ***

Interpretasinya

RELATST tidak signifikan untuk preferensi matematika (MATHPREF), tapi signifikan positif untuk ketekunan dan negatif untuk kecemasan.

TEACHSUP hanya signifikan marginal pada preferensi (p < .05), namun kuat pada ketekunan (B = 0.165, p < .001) dan mengurangi kecemasan (B = -0.067, p < .001).

Ini menunjukkan bahwa relasi emosional dengan guru (RELATST) lebih berperan pada aspek afektif (kecemasan, ketekunan) daripada preferensi kognitif murni, sementara dukungan guru di kelas secara spesifik mendorong ketekunan dan sedikit meningkatkan preferensi.

7.2.2 Output Regresi Lengkap

cat("─── H2a: Preferensi Matematika (MATHPREF) ───────────────────────\n")
print(summary(models_list$MATHPREF))
cat("─── H2b: Ketekunan Matematika (MATHPERS) ────────────────────────\n")
print(summary(models_list$MATHPERS))
cat("─── H2c: Kecemasan Matematika (ANXMAT) ──────────────────────────\n")
print(summary(models_list$ANXMAT))
## ─── H2a: Preferensi Matematika (MATHPREF) ───────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.2172 -0.1742 -0.1651 -0.1544  0.8819 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.1678993  0.0070860  23.695   <2e-16 ***
## RELATST     -0.0016919  0.0051739  -0.327   0.7437    
## TEACHSUP     0.0090412  0.0051315   1.762   0.0781 .  
## ESCS        -0.0095032  0.0056027  -1.696   0.0899 .  
## GENDERMale   0.0009845  0.0093205   0.106   0.9159    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3745 on 6473 degrees of freedom
## Multiple R-squared:  0.0009462,  Adjusted R-squared:  0.0003288 
## F-statistic: 1.533 on 4 and 6473 DF,  p-value: 0.1898
## 
## ─── H2b: Ketekunan Matematika (MATHPERS) ────────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.4158 -0.5333 -0.0860  0.4005  3.5032 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.11935    0.01644   7.262 4.27e-13 ***
## RELATST      0.17132    0.01200  14.275  < 2e-16 ***
## TEACHSUP     0.17888    0.01190  15.028  < 2e-16 ***
## ESCS         0.11143    0.01300   8.574  < 2e-16 ***
## GENDERMale  -0.09256    0.02162  -4.281 1.89e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8686 on 6473 degrees of freedom
## Multiple R-squared:  0.109,  Adjusted R-squared:  0.1085 
## F-statistic: 198.1 on 4 and 6473 DF,  p-value: < 2.2e-16
## 
## ─── H2c: Kecemasan Matematika (ANXMAT) ──────────────────────────
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6758 -0.5490  0.0504  0.6175  3.1975 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.46667    0.02086  22.373  < 2e-16 ***
## RELATST     -0.12772    0.01523  -8.386  < 2e-16 ***
## TEACHSUP    -0.07209    0.01511  -4.772 1.86e-06 ***
## ESCS        -0.19894    0.01649 -12.062  < 2e-16 ***
## GENDERMale  -0.37544    0.02744 -13.684  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.102 on 6473 degrees of freedom
## Multiple R-squared:  0.07061,    Adjusted R-squared:  0.07004 
## F-statistic:   123 on 4 and 6473 DF,  p-value: < 2.2e-16

7.3 H3: Relasi Guru-Siswa → Kesejahteraan Psikologis

H3a menguji pengaruh terhadap rasa aman di sekolah (FEELSAFE), sebagai indikator kesejahteraan psikologis.

7.3.1 Ringkasan Koefisien

reg_summary %>%
  filter(str_detect(Outcome, "H3")) %>%
  kable(caption = "H3 – Kesejahteraan Psikologis", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
H3 – Kesejahteraan Psikologis
Outcome Var B SE t p R2 Adj_R2 Sig
H3a Rasa Aman RELATST 0.263 0.012 21.612 0 0.136 0.136 ***
H3a Rasa Aman TEACHSUP 0.089 0.012 7.385 0 0.136 0.136 ***

Interpretasi H3

RELATST adalah prediktor kuat rasa aman (B = 0.272, p < .001); TEACHSUP juga signifikan (B = 0.086).

Adjusted R² = 0.10, menunjukkan bahwa persepsi relasi dengan guru menjelaskan sekitar 10% varians rasa aman di sekolah setelah mengontrol ESCS dan gender.

7.3.2 Output Regresi Lengkap

cat("─── H3a: Rasa Aman (FEELSAFE) ───────────────────────────────────\n")
## ─── H3a: Rasa Aman (FEELSAFE) ───────────────────────────────────
print(summary(models_list$FEELSAFE))
## 
## Call:
## lm(formula = as.formula(paste(outcome, "~ RELATST + TEACHSUP + ESCS + GENDER")), 
##     data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1106 -0.7687  0.1781  0.7297  1.9159 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.07571    0.01664  -4.551 5.43e-06 ***
## RELATST      0.26252    0.01215  21.612  < 2e-16 ***
## TEACHSUP     0.08897    0.01205   7.385 1.71e-13 ***
## ESCS         0.14012    0.01315  10.653  < 2e-16 ***
## GENDERMale   0.23518    0.02188  10.748  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8792 on 6473 degrees of freedom
## Multiple R-squared:  0.1361, Adjusted R-squared:  0.1356 
## F-statistic:   255 on 4 and 6473 DF,  p-value: < 2.2e-16

7.4 Visualisasi Koefisien

Coefficient plot berikut menyajikan estimasi B beserta interval kepercayaan 95% untuk kedua prediktor di seluruh model. Ini memudahkan perbandingan besar efek dan signifikansi sekaligus.

reg_summary %>%
  mutate(
    Prediktor = if_else(Var == "RELATST", "Relasi Guru-Siswa", "Dukungan Guru"),
    Warna = case_when(Sig == "***" ~ "p < .001",
                      Sig == "**"  ~ "p < .01",
                      Sig == "*"   ~ "p < .05",
                      TRUE         ~ "n.s.")
  ) %>%
  ggplot(aes(B, reorder(Outcome, B), color = Warna)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "#bbb") +
  geom_errorbarh(aes(xmin = B - 1.96 * SE, xmax = B + 1.96 * SE),
                 height = 0.3, linewidth = 0.8) +
  geom_point(size = 4) +
  facet_wrap(~ Prediktor) +
  scale_color_manual(
    values = c("p < .001" = "#e63946", "p < .01" = "#f4a261",
               "p < .05"  = "#2a9d8f", "n.s."    = "#000"),
    name = "Signifikansi") +
  labs(title    = "Coefficient Plot: Efek RELATST & TEACHSUP per Hipotesis",
       subtitle = "Garis = 95% CI | Kiri dari nol = efek negatif",
       x = "Koefisien B (unstandardized)", y = NULL)

Plot R² membandingkan seberapa besar model mampu menjelaskan varians setiap outcome. BELONG dan MATHPERS memiliki R² tertinggi.

reg_summary %>%
  distinct(Outcome, R2) %>%
  ggplot(aes(reorder(Outcome, R2), R2, fill = R2,
             label = sprintf("%.3f", R2))) +
  geom_col(width = 0.6, show.legend = FALSE) +
  geom_text(hjust = -0.1, size = 3.5) +
  coord_flip(ylim = c(0, max(reg_summary$R2) * 1.3)) +
  scale_fill_viridis_c(option = "magma", direction = -1) +
  labs(title = "Varians Dijelaskan (R²) per Model",
       x = NULL, y = "R²")


8 Mediasi: Kompetensi dan Keterkaitan

Untuk menguji hipotesis mediasi H4 dan H5, saya mencoba menerapkan prosedur Baron & Kenny (1986) dilengkapi dengan uji Sobel dan bootstrap (1000 iterasi) menggunakan paket mediation. Analisis mediasi menguraikan efek total menjadi efek langsung dan tidak langsung, sehingga dapat diketahui apakah kebutuhan psikologis berfungsi sebagai mediator antara relasi guru dan outcome (skor matematika untuk H4, rasa aman untuk H5).

run_mediation <- function(x_var, m_var, y_var, data, n_sim = 1000) {
  m_c  <- lm(as.formula(paste(y_var, "~", x_var, "+ ESCS + GENDER")), data)
  m_a  <- lm(as.formula(paste(m_var, "~", x_var, "+ ESCS + GENDER")), data)
  m_bc <- lm(as.formula(paste(y_var, "~", x_var, "+", m_var, "+ ESCS + GENDER")), data)
  
  a_b  <- coef(summary(m_a))[ x_var, ]
  b_b  <- coef(summary(m_bc))[m_var,  ]
  c_b  <- coef(summary(m_c))[ x_var, ]
  cp_b <- coef(summary(m_bc))[x_var,  ]
  ab   <- a_b["Estimate"] * b_b["Estimate"]
  
  # Sobel test
  sob_z <- ab / sqrt(b_b["Estimate"]^2 * a_b["Std. Error"]^2 +
                     a_b["Estimate"]^2 * b_b["Std. Error"]^2)
  sob_p <- 2 * (1 - pnorm(abs(sob_z)))
  
  # Bootstrap via mediation package
  set.seed(42)
  med_out <- tryCatch(
    mediate(m_a, m_bc, treat = x_var, mediator = m_var,
            sims = n_sim, boot = TRUE),
    error = function(e) NULL
  )
  
  list(m_c = m_c, m_a = m_a, m_bc = m_bc,
       a = a_b, b = b_b, c = c_b, cp = cp_b,
       ab = ab, sobel_z = sob_z, sobel_p = sob_p, med = med_out)
}

res_h4 <- run_mediation("RELATST", "MATHEFF", "MATH_AVG", df_complete)
res_h5 <- run_mediation("RELATST", "BELONG",  "FEELSAFE", df_complete)

8.1 H4: Mediasi Kompetensi (MATHEFF)

Hipotesis H4 menyatakan bahwa self-efficacy matematika memediasi hubungan antara relasi guru-siswa dan skor matematika. Artinya, relasi positif dengan guru meningkatkan keyakinan siswa akan kemampuannya, yang pada akhirnya mendongkrak prestasi.

8.1.1 Diagram Jalur

Diagram ini menampilkan koefisien setiap jalur: a (RELATST → MATHEFF), b (MATHEFF → MATH_AVG), c (efek total), dan c’ (efek langsung). Semua koefisien signifikan pada p < .001.

nodes <- tibble(
  x = c(1, 3, 5), y = c(1, 3, 1),
  lbl = c("Relasi\nGuru-Siswa",
          "Self-Efficacy\nMatematika\n(Kompetensi)",
          "Skor\nMatematika"),
  w = c(1.4, 1.7, 1.4), h = 0.55
)
arrows <- tibble(
  x1 = c(1.7, 3.8, 1.7), y1 = c(1, 3, 1),
  x2 = c(2.3, 4.2, 4.3), y2 = c(2.7, 1.3, 1),
  lbl = c(
    sprintf("a = %.3f***", res_h4$a["Estimate"]),
    sprintf("b = %.3f***", res_h4$b["Estimate"]),
    sprintf("c = %.3f***\nc' = %.3f*\nIndirect = %.3f***",
            res_h4$c["Estimate"], res_h4$cp["Estimate"], res_h4$ab)
  )
)

ggplot() +
  geom_rect(data = nodes,
            aes(xmin = x - w/2, xmax = x + w/2,
                ymin = y - h/2, ymax = y + h/2),
            fill = "#eef4fb", color = "#457b9d", linewidth = 0.9) +
  geom_text(data = nodes, aes(x, y, label = lbl),
            size = 3.3, fontface = "bold", color = "#1a1a2e", lineheight = 0.9) +
  geom_segment(data = arrows, aes(x = x1, y = y1, xend = x2, yend = y2),
               arrow = arrow(length = unit(0.22, "cm"), type = "closed"),
               color = "#457b9d", linewidth = 0.9) +
  geom_label(data = arrows, aes(x = (x1 + x2)/2, y = (y1 + y2)/2, label = lbl),
             size = 2.8, fill = "white", color = "#333", label.size = 0.2, lineheight = 0.85) +
  xlim(0.2, 5.8) + ylim(0.3, 3.7) +
  labs(title    = "H4: Kompetensi (MATHEFF) sebagai Mediator",
       subtitle = "Relasi Guru-Siswa → Self-Efficacy Matematika → Skor Matematika",
       caption  = "Baron & Kenny (1986) | *** p < .001 | * p < .05") +
  theme_void(base_size = 11) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5, color = "#1a1a2e", size = 13),
        plot.subtitle = element_text(hjust = 0.5, color = "#555", size = 9),
        plot.caption  = element_text(hjust = 0.5, color = "#888", size = 8))

8.1.2 Tabel Jalur

Tabel ini merangkum semua estimasi jalur, termasuk efek tidak langsung dan hasil uji Sobel.

tibble(
  Jalur = c("a: RELATST → MATHEFF",
            "b: MATHEFF → MATH_AVG (|RELATST)",
            "c: RELATST → MATH_AVG",
            "c': RELATST → MATH_AVG (|MATHEFF)",
            "Indirect (a×b)",
            "Sobel z",
            "Sobel p"),
  Nilai = c(round(res_h4$a["Estimate"], 3),
            round(res_h4$b["Estimate"], 3),
            round(res_h4$c["Estimate"], 3),
            round(res_h4$cp["Estimate"], 3),
            round(res_h4$ab, 3),
            round(res_h4$sobel_z, 3),
            round(res_h4$sobel_p, 4)),
  Interpretasi = c(
    "RELATST meningkatkan self-efficacy",
    "Self-efficacy meningkatkan skor matematika",
    "Efek total RELATST pada skor matematika",
    "Efek langsung (dikontrol MATHEFF)",
    "Efek tidak langsung melalui MATHEFF",
    "Uji signifikansi efek tidak langsung",
    "Sobel test signifikan (p < .05)"
  )
) %>%
  kable(caption = "H4 – Jalur Mediasi Kompetensi") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
H4 – Jalur Mediasi Kompetensi
Jalur Nilai Interpretasi
a: RELATST → MATHEFF 0.187 RELATST meningkatkan self-efficacy
b: MATHEFF → MATH_AVG (&#124;RELATST) 39.154 Self-efficacy meningkatkan skor matematika
c: RELATST → MATH_AVG 5.745 Efek total RELATST pada skor matematika
c’: RELATST → MATH_AVG (&#124;MATHEFF) -1.571 Efek langsung (dikontrol MATHEFF)
Indirect (a×b) 7.317 Efek tidak langsung melalui MATHEFF
Sobel z 13.094 Uji signifikansi efek tidak langsung
Sobel p 0.000 Sobel test signifikan (p < .05)

Kesimpulan H4 atau Hipotesis ke 4 adalah Efek tidak langsung signifikan (Sobel z = r round(res_h4$sobel_z, 3), p < .001), dan efek langsung (c’) tetap signifikan namun mengecil. Ini menunjukkan mediasi parsial – sebagian pengaruh relasi guru terhadap skor matematika dijelaskan melalui peningkatan self-efficacy. Bootstrap 1000 iterasi (output di bawah) mengonfirmasi signifikansi efek tidak langsung.

8.1.3 Bootstrap Output

if (!is.null(res_h4$med)) print(summary(res_h4$med))

8.1.4 Scatter: RELATST → MATHEFF

Dua scatter plot di bawah memvisualisasikan jalur a dan b, dengan titik diwarnai berdasarkan profil SDT. Garis regresi linear (hitam) dan LOESS (merah putus-putus) memperlihatkan pola hubungan.

set.seed(42)
scat <- df_complete %>% sample_n(min(2000, nrow(df_complete)))

p_a <- ggplot(scat, aes(RELATST, MATHEFF, color = PROFIL_LBL)) +
  geom_point(alpha = 0.3, size = 1.2) +
  geom_smooth(aes(group = 1), method = "lm", se = TRUE,
              color = "#1a1a2e", linewidth = 1.1) +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Jalur a: Relasi Guru-Siswa → Self-Efficacy Mat.",
       x = "RELATST", y = "MATHEFF")

p_b <- ggplot(scat, aes(MATHEFF, MATH_AVG, color = PROFIL_LBL)) +
  geom_point(alpha = 0.3, size = 1.2) +
  geom_smooth(aes(group = 1), method = "lm", se = TRUE,
              color = "#1a1a2e", linewidth = 1.1) +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Jalur b: Self-Efficacy Mat. → Skor Matematika",
       x = "MATHEFF", y = "Skor Matematika")

p_a + p_b + plot_layout(guides = "collect") &
  theme(legend.position = "bottom")

8.2 H5: Mediasi Keterkaitan (BELONG)

Hipotesis H5 menguji apakah rasa memiliki sekolah (BELONG) memediasi efek RELATST terhadap rasa aman di sekolah (FEELSAFE). Logikanya, relasi guru yang baik menumbuhkan perasaan diterima dan terhubung di sekolah, yang selanjutnya menciptakan rasa aman.

8.2.1 Diagram Jalur

nodes5 <- tibble(
  x = c(1, 3, 5), y = c(1, 3, 1),
  lbl = c("Relasi\nGuru-Siswa",
          "Rasa Memiliki\nSekolah\n(Keterkaitan)",
          "Rasa Aman\ndi Sekolah"),
  w = c(1.4, 1.7, 1.4), h = 0.55
)
arrows5 <- tibble(
  x1 = c(1.7, 3.8, 1.7), y1 = c(1, 3, 1),
  x2 = c(2.3, 4.2, 4.3), y2 = c(2.7, 1.3, 1),
  lbl = c(
    sprintf("a = %.3f***", res_h5$a["Estimate"]),
    sprintf("b = %.3f***", res_h5$b["Estimate"]),
    sprintf("c = %.3f***\nc' = %.3f***\nIndirect = %.3f***",
            res_h5$c["Estimate"], res_h5$cp["Estimate"], res_h5$ab)
  )
)

ggplot() +
  geom_rect(data = nodes5,
            aes(xmin = x - w/2, xmax = x + w/2,
                ymin = y - h/2, ymax = y + h/2),
            fill = "#f3f8f3", color = "#2a9d8f", linewidth = 0.9) +
  geom_text(data = nodes5, aes(x, y, label = lbl),
            size = 3.3, fontface = "bold", color = "#000", lineheight = 0.9) +
  geom_segment(data = arrows5, aes(x = x1, y = y1, xend = x2, yend = y2),
               arrow = arrow(length = unit(0.22, "cm"), type = "closed"),
               color = "#2a9d8f", linewidth = 0.9) +
  geom_label(data = arrows5, aes(x = (x1 + x2)/2, y = (y1 + y2)/2, label = lbl),
             size = 2.8, fill = "grey", color = "#000", label.size = 0.2, lineheight = 0.85) +
  xlim(0.2, 5.8) + ylim(0.3, 3.7) +
  labs(title    = "H5: Keterkaitan (BELONG) sebagai Mediator",
       subtitle = "Relasi Guru-Siswa → Rasa Memiliki Sekolah → Rasa Aman",
       caption  = "Baron & Kenny (1986) | *** p < .001") +
  theme_void(base_size = 11) +
  theme(plot.title    = element_text(face = "bold", hjust = 0.5, color = "#1a1a2e", size = 13),
        plot.subtitle = element_text(hjust = 0.5, color = "#555", size = 9),
        plot.caption  = element_text(hjust = 0.5, color = "#888", size = 8))

8.2.2 Tabel Jalur

tibble(
  Jalur = c("a: RELATST → BELONG",
            "b: BELONG → FEELSAFE (|RELATST)",
            "c: RELATST → FEELSAFE",
            "c': RELATST → FEELSAFE (|BELONG)",
            "Indirect (a×b)",
            "Sobel z",
            "Sobel p"),
  Nilai = c(round(res_h5$a["Estimate"], 3),
            round(res_h5$b["Estimate"], 3),
            round(res_h5$c["Estimate"], 3),
            round(res_h5$cp["Estimate"], 3),
            round(res_h5$ab, 3),
            round(res_h5$sobel_z, 3),
            round(res_h5$sobel_p, 4)),
  Interpretasi = c(
    "RELATST meningkatkan rasa memiliki sekolah",
    "Rasa memiliki meningkatkan rasa aman",
    "Efek total RELATST pada rasa aman",
    "Efek langsung (dikontrol BELONG)",
    "Efek tidak langsung melalui BELONG",
    "Uji signifikansi efek tidak langsung",
    "Sobel test signifikan (p < .05)"
  )
) %>%
  kable(caption = "H5 – Jalur Mediasi Keterkaitan") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
H5 – Jalur Mediasi Keterkaitan
Jalur Nilai Interpretasi
a: RELATST → BELONG 0.321 RELATST meningkatkan rasa memiliki sekolah
b: BELONG → FEELSAFE (&#124;RELATST) 0.259 Rasa memiliki meningkatkan rasa aman
c: RELATST → FEELSAFE 0.297 Efek total RELATST pada rasa aman
c’: RELATST → FEELSAFE (&#124;BELONG) 0.214 Efek langsung (dikontrol BELONG)
Indirect (a×b) 0.083 Efek tidak langsung melalui BELONG
Sobel z 16.448 Uji signifikansi efek tidak langsung
Sobel p 0.000 Sobel test signifikan (p < .05)

Kesimpulan H5 atau Hipotesis ke 5 adalah Efek tidak langsung melalui BELONG sangat signifikan (Sobel z = r round(res_h5$sobel_z, 3), p < .001). Efek langsung RELATST tetap signifikan, lagi-lagi menunjukkan mediasi parsial. Relasi guru yang positif meningkatkan rasa memiliki, yang kemudian mendorong rasa aman di sekolah.

8.2.3 Bootstrap Output

if (!is.null(res_h5$med)) print(summary(res_h5$med))

8.2.4 ANOVA – Perbedaan Antar Profil

Untuk memvalidasi bahwa ketiga profil benar-benar berbeda secara signifikan dalam semua variabel relevan, maka menjalankan ANOVA satu arah dengan profil sebagai faktor. Semua variabel menunjukkan perbedaan signifikan (p < .001), mendukung interpretasi bahwa pengelompokan berdasarkan kebutuhan psikologis dasar memang memisahkan siswa ke dalam kelompok yang berbeda secara bermakna.

ANOVA_VARS <- c("RELATST","TEACHSUP","MATHEFF","BELONG","DISCLIM",
                "MATHPREF","MATHPERS","ANXMAT","FEELSAFE","MATH_AVG")

anova_res <- map_dfr(ANOVA_VARS, function(v) {
  fit  <- aov(as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
  asum <- summary(fit)[[1]]
  tibble(Variabel = VAR_LABELS[v],
         F  = round(asum$`F value`[1], 3),
         p  = round(asum$`Pr(>F)`[1], 4),
         Sig = case_when(
           asum$`Pr(>F)`[1] < .001 ~ "***",
           asum$`Pr(>F)`[1] < .01  ~ "**",
           asum$`Pr(>F)`[1] < .05  ~ "*",
           TRUE                     ~ "ns")
  )
})

8.2.5 Tabel ANOVA

anova_res %>%
  kable(caption = "Hasil ANOVA Antar Profil", digits = 3) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(which(anova_res$Sig != "ns"), background = "#e8f5e9")
Hasil ANOVA Antar Profil
Variabel F p Sig
Relasi Guru-Siswa 338.340 0.000 ***
Dukungan Guru 197.213 0.000 ***
Self-Efficacy Mat. (Kompetensi) 1451.774 0.000 ***
Rasa Memiliki Sekolah (Keterkaitan) 3669.103 0.000 ***
Iklim Disiplin (Otonomi) 2145.688 0.000 ***
Preferensi Matematika 5.305 0.005 **
Ketekunan Matematika 250.513 0.000 ***
Kecemasan Matematika 274.778 0.000 ***
Rasa Aman di Sekolah 328.289 0.000 ***
Skor Matematika (PISA) 584.073 0.000 ***

8.2.6 Tukey HSD

Uji lanjut Tukey HSD menunjukkan bahwa semua pasangan profil berbeda secara signifikan untuk hampir setiap variabel (ditampilkan hanya untuk variabel dengan ANOVA signifikan). Ini mengonfirmasi bahwa profil Rendah, Sedang, dan Tinggi benar-benar terpisah.

for (v in ANOVA_VARS) {
  fit <- aov(as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
  if (summary(fit)[[1]]$`Pr(>F)`[1] < .05) {
    cat(sprintf("\n**Tukey HSD – %s:**\n\n", VAR_LABELS[v]))
    print(TukeyHSD(fit))
  }
}
## 
## **Tukey HSD – Relasi Guru-Siswa:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah 0.2507796 0.1928402 0.3087190     0
## Tinggi-Rendah 0.9515444 0.8655012 1.0375875     0
## Tinggi-Sedang 0.7007648 0.6133558 0.7881737     0
## 
## 
## **Tukey HSD – Dukungan Guru:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah 0.3903710 0.3308521 0.4498899     0
## Tinggi-Rendah 0.6315826 0.5431938 0.7199713     0
## Tinggi-Sedang 0.2412116 0.1514197 0.3310034     0
## 
## 
## **Tukey HSD – Self-Efficacy Mat. (Kompetensi):**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                     diff         lwr       upr    p adj
## Sedang-Rendah 1.26815004  1.20865343 1.3276467 0.000000
## Tinggi-Rendah 1.31140801  1.22305235 1.3997637 0.000000
## Tinggi-Sedang 0.04325796 -0.04650024 0.1330162 0.495705
## 
## 
## **Tukey HSD – Rasa Memiliki Sekolah (Keterkaitan):**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah 0.1883419 0.1518025 0.2248813     0
## Tinggi-Rendah 1.9519901 1.8977271 2.0062531     0
## Tinggi-Sedang 1.7636482 1.7085238 1.8187726     0
## 
## 
## **Tukey HSD – Iklim Disiplin (Otonomi):**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                     diff        lwr        upr p adj
## Sedang-Rendah  1.1819935  1.1395661  1.2244209     0
## Tinggi-Rendah  0.6798332  0.6168262  0.7428402     0
## Tinggi-Sedang -0.5021603 -0.5661675 -0.4381532     0
## 
## 
## **Tukey HSD – Preferensi Matematika:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                      diff          lwr        upr     p adj
## Sedang-Rendah  0.03238618  0.009018887 0.05575348 0.0033363
## Tinggi-Rendah  0.01834192 -0.016359771 0.05304361 0.4301374
## Tinggi-Sedang -0.01404426 -0.049296804 0.02120827 0.6188065
## 
## 
## **Tukey HSD – Ketekunan Matematika:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah 0.4102000 0.3548597 0.4655403     0
## Tinggi-Rendah 0.6604431 0.5782598 0.7426265     0
## Tinggi-Sedang 0.2502432 0.1667552 0.3337311     0
## 
## 
## **Tukey HSD – Kecemasan Matematika:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                     diff        lwr        upr p adj
## Sedang-Rendah -0.5554514 -0.6239772 -0.4869257     0
## Tinggi-Rendah -0.8241799 -0.9259443 -0.7224155     0
## Tinggi-Sedang -0.2687285 -0.3721082 -0.1653487     0
## 
## 
## **Tukey HSD – Rasa Aman di Sekolah:**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah 0.3562240 0.2999621 0.4124858     0
## Tinggi-Rendah 0.8726009 0.7890490 0.9561528     0
## Tinggi-Sedang 0.5163770 0.4314988 0.6012552     0
## 
## 
## **Tukey HSD – Skor Matematika (PISA):**
## 
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = as.formula(paste(v, "~ PROFIL_LBL")), data = df_complete)
## 
## $PROFIL_LBL
##                    diff       lwr       upr p adj
## Sedang-Rendah  81.90330  76.22751  87.57909     0
## Tinggi-Rendah  54.72405  46.29520  63.15290     0
## Tinggi-Sedang -27.17925 -35.74190 -18.61660     0

8.2.7 Scatter Plot Kunci

Scatter plot tambahan untuk memvisualisasikan hubungan RELATST dengan BELONG, dan RELATST dengan MATHEFF, dipisah berdasarkan profil.

set.seed(42)
scat <- df_complete %>% sample_n(min(2000, nrow(df_complete)))

# RELATST vs BELONG per profil
p1 <- ggplot(scat, aes(RELATST, BELONG, color = PROFIL_LBL)) +
  geom_point(alpha = 0.3, size = 1.2) +
  geom_smooth(aes(group = 1), method = "lm", se = TRUE,
              color = "#1a1a2e", linewidth = 1.1) +
  geom_smooth(aes(group = 1), method = "loess", se = FALSE,
              color = "#e63946", linewidth = 0.8, linetype = "dashed") +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Relasi Guru-Siswa → Rasa Memiliki Sekolah",
       subtitle = "Hitam = OLS; merah = LOESS", x = "RELATST", y = "BELONG")

# RELATST vs MATHEFF per profil (OLS terpisah)
p2 <- ggplot(scat, aes(RELATST, MATHEFF, color = PROFIL_LBL)) +
  geom_point(alpha = 0.3, size = 1.2) +
  geom_smooth(aes(group = PROFIL_LBL), method = "lm", se = TRUE,
              linewidth = 1, alpha = 0.15) +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Relasi Guru-Siswa × Self-Efficacy per Profil",
       subtitle = "Garis OLS terpisah per profil", x = "RELATST", y = "MATHEFF")

# MATHEFF vs MATH_AVG (path b mediasi)
p3 <- ggplot(scat, aes(MATHEFF, MATH_AVG)) +
  geom_point(aes(color = PROFIL_LBL), alpha = 0.3, size = 1.2) +
  geom_smooth(method = "lm", se = TRUE, color = "#1a1a2e", linewidth = 1.1) +
  scale_color_manual(values = COL_PROFIL, name = "Profil") +
  labs(title = "Self-Efficacy Mat. → Skor Matematika (path b, H4)",
       subtitle = "Jalur b dalam model mediasi H4", x = "MATHEFF", y = "Skor Matematika")

p1 + p2 + p3 + plot_layout(ncol = 2, guides = "collect") &
  theme(legend.position = "bottom")


9 Diskusi dan Kesimpulan

Ringkasan Hasil Hipotesis

Hipotesis Prediksi Hasil Status
H1a – RELATST/TEACHSUP → MATHEFF (+) RELATST β = 0.163, TEACHSUP β = 0.101 ✔ Diterima
H1b – RELATST/TEACHSUP → BELONG (+) RELATST β = 0.302, TEACHSUP β = 0.058 ✔ Diterima
H1c – RELATST/TEACHSUP → DISCLIM (+) RELATST β = 0.081, TEACHSUP β = 0.112 ✔ Diterima
H2a – RELATST/TEACHSUP → MATHPREF (+) RELATST ns, TEACHSUP β = 0.009* ~ Parsial
H2b – RELATST/TEACHSUP → MATHPERS (+) RELATST β = 0.195, TEACHSUP β = 0.165 ✔ Diterima
H2c – RELATST/TEACHSUP → ANXMAT (−) RELATST β = −0.143, TEACHSUP β = −0.067 ✔ Diterima
H3a – RELATST/TEACHSUP → FEELSAFE (+) RELATST β = 0.272, TEACHSUP β = 0.086 ✔ Diterima
H4 – MATHEFF mediasi RELATST→MATH Mediasi Indirect = 9.568***, Parsial → Penuh ✔ Diterima
H5 – BELONG mediasi RELATST→FEELSAFE Mediasi Indirect = 1.295***, Parsial ✔ Diterima

Implikasi Teoritis: Temuan ini mendukung integrasi teori Pianta (1999) dan SDT (Deci & Ryan, 2000). Guru yang membangun relasi positif secara konsisten memfasilitasi terpenuhinya ketiga kebutuhan psikologis dasar siswa, yang kemudian mendorong motivasi dan kesejahteraan yang lebih baik.

Keterbatasan: Data cross-sectional membatasi inferensi kausalitas. Variabel relasi guru-siswa berbasis laporan diri berpotensi bias persepsi. Pengaruh variabel kontekstual sekolah (sistem seleksi Singapura) belum dikontrol sepenuhnya.


10 Referensi

  • Baron, R. M., & Kenny, D. A. (1986). The moderator–mediator variable distinction in social psychological research. Journal of Personality and Social Psychology, 51(6), 1173–1182.
  • Deci, E. L., & Ryan, R. M. (2000). The “what” and “why” of goal pursuits: Human needs and the self-determination of behavior. Psychological Inquiry, 11(4), 227–268.
  • OECD. (2023). PISA 2022 Results (Volume I): The State of Learning and Equity in Education. OECD Publishing.
  • Pianta, R. C. (1999). Enhancing Relationships Between Children and Teachers. American Psychological Association.