1. Pendahuluan

1.1 Latar Belakang

Perkembangan kecerdasan buatan (Artificial Intelligence/AI) yang pesat membawa implikasi besar bagi dunia pendidikan tinggi. Mahasiswa tidak hanya dituntut untuk memahami teknologi AI secara konseptual (AI Literacy), tetapi juga diharapkan memiliki kepercayaan diri (Self-Confidence) dalam menggunakannya serta mampu mengelola kecemasan (AI Anxiety) yang mungkin muncul akibat ketidakpastian terhadap dampak AI di masa depan. Dalam konteks ini, AI Readiness atau kesiapan individu untuk menerima dan menggunakan teknologi AI berperan sebagai penghubung antara karakteristik mahasiswa dengan tingkat kepuasan mereka dalam proses pembelajaran berbasis AI. Oleh karena itu, penelitian ini bertujuan untuk menganalisis hubungan antar variabel tersebut secara simultan menggunakan metode Structural Equation Modeling (SEM).

1.2 Tujuan Penelitian

Penelitian ini bertujuan untuk:

  1. Menganalisis pengaruh AI Literacy terhadap AI Readiness.
  2. Menganalisis pengaruh Self-Confidence terhadap AI Readiness.
  3. Menganalisis pengaruh AI Anxiety terhadap AI Readiness.
  4. Menganalisis pengaruh AI Readiness terhadap Kepuasan Mahasiswa.
  5. Menganalisis peran mediasi AI Readiness terhadap hubungan AI Literacy, Self-Confidence, dan AI Anxiety dengan Kepuasan Mahasiswa menggunakan Structural Equation Modeling (SEM).

1.3 Sumber Data

Data penelitian ini bersumber dari AI Literacy Questionnaire yang dikembangkan oleh Dai et al. (2020) dan tersedia secara publik di Figshare (DOI: 10.6084/m9.figshare.29488523). Dataset mencakup jawaban mahasiswa terhadap pertanyaan seputar literasi AI, kesiapan AI, kecemasan AI, kepercayaan diri, dan kepuasan belajar. Definisi Operasional Variabel :

Variabel Jenis Indikator Skala
AI Literacy Eksogen L1–L5 Likert 1–5
Self-Confidence Eksogen C1–C5 Likert 1–5
AI Anxiety Eksogen A1–A5 Likert 1–5
AI Readiness Mediator RE1–RE6 Likert 1–5
Kepuasan Mahasiswa Endogen S1–S5 Likert 1–5

1.4 Metode Analisis

Analisis menggunakan Covariance-Based SEM (CB-SEM) dengan estimasi Maximum Likelihood (ML) melalui package lavaan di R. Tahapan analisis meliputi:

  1. Statistik Deskriptif
  2. Uji Asumsi (Normalitas Multivariat, KMO, Non-Multikolinearitas)
  3. Uji Common Method Bias (Harman’s Single Factor)
  4. Evaluasi Outer Model (Measurement Model): Loading Factor, AVE, CR, Alpha, Fornell-Larcker, HTMT
  5. Evaluasi Inner Model (Structural Model): Model Fit, Path Coefficients, R²
  6. Uji Efek Mediasi (Bootstrapping 1000 ulangan)

2. Persiapan Data

2.1 Instalasi dan Load Package

# install.packages(c("lavaan","semPlot","psych","MVN","ggplot2",
#                    "corrplot","dplyr","tidyr","semTools","kableExtra"))

library(lavaan)
library(semPlot)
library(psych)
library(MVN)
library(ggplot2)
library(corrplot)
library(dplyr)
library(tidyr)
library(semTools)
library(kableExtra)

2.2 Import Data

data_raw <- read.csv("AI_Literacy_questionnaire_data_.csv",
                     header           = TRUE,
                     stringsAsFactors = FALSE,
                     fileEncoding     = "UTF-8-BOM")

cat("Dimensi data awal:", nrow(data_raw), "baris x", ncol(data_raw), "kolom\n")
Dimensi data awal: 1205 baris x 58 kolom

2.3 Seleksi Variabel Manifest

data_manifest <- data_raw %>%
  select(L1, L2, L3, L4, L5,          # AI Literacy
         C1, C2, C3, C4, C5,          # Self-Confidence
         A1, A2, A3, A4, A5,          # AI Anxiety
         RE1, RE2, RE3, RE4, RE5, RE6, # AI Readiness (Mediator)
         S1, S2, S3, S4, S5) %>%      # Kepuasan Mahasiswa
  mutate(across(everything(), as.numeric))

data_manifest_clean <- na.omit(data_manifest)

cat("Data setelah cleaning:", nrow(data_manifest_clean),
    "baris x", ncol(data_manifest_clean), "kolom\n")
Data setelah cleaning: 1205 baris x 26 kolom
cat("Baris dihapus (missing values):",
    nrow(data_manifest) - nrow(data_manifest_clean), "\n")
Baris dihapus (missing values): 0 

3.Karakteristik Data

3.1 Statistik Deskriptif

desc <- describe(data_manifest_clean)

desc_df <- desc[, c("n","mean","sd","min","max","skew","kurtosis")] %>%
  round(3) %>%
  tibble::rownames_to_column("Indikator") %>%
  mutate(Konstruk = case_when(
    grepl("^L",  Indikator) ~ "AI Literacy",
    grepl("^C",  Indikator) ~ "Self-Confidence",
    grepl("^A",  Indikator) ~ "AI Anxiety",
    grepl("^RE", Indikator) ~ "AI Readiness",
    grepl("^S",  Indikator) ~ "Kepuasan"
  )) %>%
  select(Konstruk, Indikator, n, Mean=mean, SD=sd, Min=min, Max=max,
         Skewness=skew, Kurtosis=kurtosis)

kable(desc_df, caption = "Tabel 1. Statistik Deskriptif Variabel Penelitian",
      align = c("l","c","c","c","c","c","c","c","c")) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, font_size = 13) %>%
  pack_rows("AI Literacy", 1, 5) %>%
  pack_rows("Self-Confidence", 6, 10) %>%
  pack_rows("AI Anxiety", 11, 15) %>%
  pack_rows("AI Readiness", 16, 21) %>%
  pack_rows("Kepuasan Mahasiswa", 22, 26)
Tabel 1. Statistik Deskriptif Variabel Penelitian
Konstruk Indikator n Mean SD Min Max Skewness Kurtosis
AI Literacy
AI Literacy L1 1205 4.559 0.727 1 5 -2.247 6.685
AI Literacy L2 1205 4.529 0.718 1 5 -2.002 5.686
AI Literacy L3 1205 3.954 1.018 1 5 -0.851 0.211
AI Literacy L4 1205 3.230 1.361 1 5 -0.177 -1.222
AI Literacy L5 1205 3.684 1.093 1 5 -0.525 -0.489
Self-Confidence
Self-Confidence C1 1205 2.317 1.769 0 5 -0.236 -1.435
Self-Confidence C2 1205 2.856 1.894 0 5 -0.630 -1.239
Self-Confidence C3 1205 2.408 1.752 0 5 -0.284 -1.361
Self-Confidence C4 1205 2.886 1.844 0 5 -0.685 -1.116
Self-Confidence C5 1205 2.122 1.771 0 5 -0.022 -1.473
AI Anxiety
AI Anxiety A1 1205 2.857 1.108 1 5 0.236 -0.768
AI Anxiety A2 1205 2.918 1.088 1 5 0.047 -0.763
AI Anxiety A3 1205 2.364 1.111 1 5 0.612 -0.324
AI Anxiety A4 1205 2.406 1.170 1 5 0.515 -0.647
AI Anxiety A5 1205 2.338 1.204 1 5 0.657 -0.501
AI Readiness
AI Readiness RE1 1205 4.310 0.784 1 5 -1.421 2.936
AI Readiness RE2 1205 4.310 0.760 1 5 -1.322 2.742
AI Readiness RE3 1205 3.855 1.047 1 5 -0.815 0.139
AI Readiness RE4 1205 3.877 0.943 1 5 -0.788 0.506
AI Readiness RE5 1205 3.205 1.067 1 5 -0.094 -0.549
AI Readiness RE6 1205 3.402 0.999 1 5 -0.363 -0.439
Kepuasan Mahasiswa
Kepuasan S1 1205 2.580 1.753 0 5 -0.431 -1.248
Kepuasan S2 1205 2.038 1.896 0 5 0.072 -1.635
Kepuasan S3 1205 3.103 1.766 0 5 -0.867 -0.724
Kepuasan S4 1205 1.967 1.840 0 5 0.090 -1.622
Kepuasan S5 1205 2.176 1.738 0 5 -0.111 -1.435

Secara umum, rata-rata seluruh indikator berada pada kisaran 3 hingga 4 dari skala Likert 1–5, mengindikasikan responden cenderung setuju dengan pernyataan yang diberikan. Nilai skewness sebagian besar berada di bawah |2| dan kurtosis di bawah |7|, sehingga data masih dapat diterima untuk analisis CB-SEM dengan estimasi ML.

3.2 Visualisasi Distribusi Indikator

var_labels <- data.frame(
  variable = c(paste0("L",1:5), paste0("C",1:5), paste0("A",1:5),
               paste0("RE",1:6), paste0("S",1:5)),
  konstruk = c(rep("AI Literacy",5), rep("Self-Confidence",5),
               rep("AI Anxiety",5),  rep("AI Readiness",6),
               rep("Kepuasan",5))
)

data_long <- data_manifest_clean %>%
  pivot_longer(everything(), names_to="variable", values_to="value") %>%
  left_join(var_labels, by="variable")

ggplot(data_long, aes(x=value, fill=konstruk)) +
  geom_bar(color="white", alpha=0.85) +
  facet_wrap(~variable, scales="free_y", ncol=5) +
  scale_fill_brewer(palette="Set2") +
  scale_x_continuous(breaks=1:5) +
  labs(title="Distribusi Frekuensi Setiap Indikator",
       subtitle="Skala Likert 1–5 | n = seluruh responden valid",
       x="Nilai", y="Frekuensi", fill="Konstruk") +
  theme_minimal(base_size=11) +
  theme(legend.position="bottom",
        strip.text=element_text(face="bold"),
        plot.title=element_text(face="bold", hjust=0.5),
        plot.subtitle=element_text(hjust=0.5, color="gray50"))

Indikator AI Literacy (L1–L5) dan AI Readiness (RE1–RE6) menunjukkan distribusi yang condong ke nilai tinggi (4–5), mengindikasikan mahasiswa memiliki kesadaran dan kesiapan terhadap AI yang cukup tinggi. Sebaliknya, AI Anxiety (A1–A5) menunjukkan distribusi yang lebih variatif, mencerminkan perbedaan tingkat kecemasan yang signifikan antar responden.

3.3 Matriks Korelasi

cor_matrix <- cor(data_manifest_clean, use="complete.obs")

corrplot(cor_matrix,
         method="color", type="upper", order="original",
         tl.col="black", tl.srt=45, tl.cex=0.75,
         addCoef.col="black", number.cex=0.42,
         col=colorRampPalette(c("#d73027","white","#1a9641"))(200),
         title="Matriks Korelasi Antar Indikator",
         mar=c(0,0,2,0))

Terdapat korelasi positif yang cukup kuat antara indikator dalam satu konstruk yang sama (monotrait), yang merupakan syarat dasar validitas konvergen. Korelasi antar indikator berbeda konstruk (heterotrait) umumnya lebih rendah, mendukung asumsi validitas diskriminan.


4. Uji Asumsi SEM

4.1 Normalitas Multivariat (Mardia’s Test)

cat("Versi MVN:", as.character(packageVersion("MVN")), "\n\n")
Versi MVN: 6.3 
mvn_result <- tryCatch(
  mvn(data_manifest_clean, mvnTest = "mardia"),
  error = function(e) mvn(data_manifest_clean, mvn_test = "mardia")
)

# Tampilkan hasil langsung
print(mvn_result$multivariateNormality)
NULL

Hasil uji Mardia menunjukkan bahwa data tidak memenuhi asumsi normalitas multivariat , hal ini terjadi pada data survei dengan skala Likert dan ukuran sampel besar. Estimasi Maximum Likelihood (ML) dalam CB-SEM cukup robust terhadap pelanggaran normalitas bila n > 200 berkat Central Limit Theorem. Oleh karena itu, analisis tetap dapat dilanjutkan.

4.2 Kaiser-Meyer-Olkin (KMO)

r_mat      <- cor(data_manifest_clean)
kmo_result <- KMO(r_mat)

cat("Overall MSA:", round(kmo_result$MSA, 4), "\n\n")
Overall MSA: 0.896 
kmo_df <- data.frame(
  Indikator = names(kmo_result$MSAi),
  MSA       = round(kmo_result$MSAi, 4),
  Status    = ifelse(kmo_result$MSAi >= 0.8, "Sangat Baik (≥0.80)",
              ifelse(kmo_result$MSAi >= 0.7, "Baik (≥0.70)",
              ifelse(kmo_result$MSAi >= 0.6, "Cukup (≥0.60)",
              ifelse(kmo_result$MSAi >= 0.5, "Memadai (≥0.50)",
                                             "Tidak Memadai (<0.50)"))))
)

kable(kmo_df, caption="Tabel 3. Nilai MSA per Indikator (KMO)",
      align=c("c","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE) %>%
  row_spec(which(kmo_df$MSA < 0.5), background="#FADBD8")
Tabel 3. Nilai MSA per Indikator (KMO)
Indikator MSA Status
L1 L1 0.8168 Sangat Baik (≥0.80)
L2 L2 0.8092 Sangat Baik (≥0.80)
L3 L3 0.9350 Sangat Baik (≥0.80)
L4 L4 0.9073 Sangat Baik (≥0.80)
L5 L5 0.9275 Sangat Baik (≥0.80)
C1 C1 0.9278 Sangat Baik (≥0.80)
C2 C2 0.9221 Sangat Baik (≥0.80)
C3 C3 0.9243 Sangat Baik (≥0.80)
C4 C4 0.9278 Sangat Baik (≥0.80)
C5 C5 0.9307 Sangat Baik (≥0.80)
A1 A1 0.8869 Sangat Baik (≥0.80)
A2 A2 0.8222 Sangat Baik (≥0.80)
A3 A3 0.8483 Sangat Baik (≥0.80)
A4 A4 0.8481 Sangat Baik (≥0.80)
A5 A5 0.8372 Sangat Baik (≥0.80)
RE1 RE1 0.9162 Sangat Baik (≥0.80)
RE2 RE2 0.9069 Sangat Baik (≥0.80)
RE3 RE3 0.9035 Sangat Baik (≥0.80)
RE4 RE4 0.9245 Sangat Baik (≥0.80)
RE5 RE5 0.8896 Sangat Baik (≥0.80)
RE6 RE6 0.9130 Sangat Baik (≥0.80)
S1 S1 0.9078 Sangat Baik (≥0.80)
S2 S2 0.8660 Sangat Baik (≥0.80)
S3 S3 0.9063 Sangat Baik (≥0.80)
S4 S4 0.8566 Sangat Baik (≥0.80)
S5 S5 0.9369 Sangat Baik (≥0.80)

Nilai Overall MSA = 0.896 berada di atas ambang batas 0.5, menunjukkan bahwa data memadai untuk dilanjutkan ke analisis faktor/SEM (Kaiser, 1974). Nilai MSA per indikator juga diperiksa; indikator dengan MSA < 0.5 (ditandai merah, jika ada) perlu mendapat perhatian khusus.

4.3 Korelasi Antar Konstruk (Uji Non-Multikolinearitas)

composite_scores <- data.frame(
  AILiteracy     = rowMeans(data_manifest_clean[,c("L1","L2","L3","L4","L5")]),
  SelfConfidence = rowMeans(data_manifest_clean[,c("C1","C2","C3","C4","C5")]),
  AIAnxiety      = rowMeans(data_manifest_clean[,c("A1","A2","A3","A4","A5")]),
  AIReadiness    = rowMeans(data_manifest_clean[,c("RE1","RE2","RE3","RE4","RE5","RE6")]),
  Kepuasan       = rowMeans(data_manifest_clean[,c("S1","S2","S3","S4","S5")])
)

cor_construct <- round(cor(composite_scores), 4)

kable(cor_construct,
      caption="Tabel 4. Korelasi Antar Skor Komposit Konstruk") %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Tabel 4. Korelasi Antar Skor Komposit Konstruk
AILiteracy SelfConfidence AIAnxiety AIReadiness Kepuasan
AILiteracy 1.0000 0.1699 -0.1262 0.6288 0.1281
SelfConfidence 0.1699 1.0000 -0.0901 0.2038 0.7016
AIAnxiety -0.1262 -0.0901 1.0000 -0.2177 -0.0557
AIReadiness 0.6288 0.2038 -0.2177 1.0000 0.2032
Kepuasan 0.1281 0.7016 -0.0557 0.2032 1.0000
max_cor <- max(abs(cor_construct[upper.tri(cor_construct)]))
cat("\nKorelasi tertinggi antar konstruk:", round(max_cor, 4))

Korelasi tertinggi antar konstruk: 0.7016
cat("\nStatus:", ifelse(max_cor < 0.90, "AMAN — tidak ada multikolinearitas berat", 
                        "PERHATIAN — ada korelasi ≥ 0.90"), "\n")

Status: AMAN — tidak ada multikolinearitas berat 

Korelasi tertinggi antar konstruk adalah 0.7016, di bawah ambang batas 0.90. Hal ini mengindikasikan tidak terdapat masalah multikolinearitas yang serius antar konstruk laten dalam model.


5. Uji Common Method Bias

model_harman <- '
  SingleFactor =~ L1+L2+L3+L4+L5+
                  C1+C2+C3+C4+C5+
                  A1+A2+A3+A4+A5+
                  RE1+RE2+RE3+RE4+RE5+RE6+
                  S1+S2+S3+S4+S5
'

fit_harman  <- sem(model_harman, data=data_manifest_clean, estimator="ML")
harman_r2   <- lavInspect(fit_harman, "r2")
harman_var  <- mean(harman_r2) * 100

cat("Rata-rata variance explained (single factor):", round(harman_var, 2), "%\n")
Rata-rata variance explained (single factor): 24.26 %
cat("Threshold: < 50%\n")
Threshold: < 50%
cat("Status CMB:", ifelse(harman_var < 50,
    "AMAN — tidak ada indikasi common method bias serius",
    "PERHATIAN — pertimbangkan prosedur kontrol tambahan"), "\n")
Status CMB: AMAN — tidak ada indikasi common method bias serius 

Harman’s Single Factor Test menghasilkan variance explained sebesar 24.26%. Karena nilai ini berada di bawah 50%, maka tidak terdapat indikasi common method bias yang serius dalam dataset ini. Dengan demikian, data dari single-source survey ini masih layak untuk dianalisis lebih lanjut.


6. Spesifikasi Model SEM

Model SEM yang dibangun bersifat reflektif (reflective measurement model), di mana setiap konstruk laten diukur oleh beberapa indikator yang mencerminkannya. Model struktural mengikuti kerangka mediasi dengan AI Readiness sebagai variabel perantara.

model_sem <- '
  # OUTER MODEL (Measurement Model) - Reflektif
  AILiteracy     =~ L1  + L2  + L3  + L4  + L5
  SelfConfidence =~ C1  + C2  + C3  + C4  + C5
  AIAnxiety      =~ A1  + A2  + A3  + A4  + A5
  AIReadiness    =~ RE1 + RE2 + RE3 + RE4 + RE5 + RE6
  Kepuasan       =~ S1  + S2  + S3  + S4  + S5

  # INNER MODEL (Structural Model)

  # Pengaruh terhadap AI Readiness (Mediator)
  # H1: AI Literacy     -> AI Readiness
  # H2: Self-Confidence -> AI Readiness
  # H3: AI Anxiety      -> AI Readiness
  AIReadiness ~ AILiteracy + SelfConfidence + AIAnxiety

  # Pengaruh terhadap Kepuasan Mahasiswa
  # H4: AI Literacy     -> Kepuasan
  # H5: Self-Confidence -> Kepuasan
  # H6: AI Anxiety      -> Kepuasan
  # H7: AI Readiness    -> Kepuasan
  Kepuasan ~ AILiteracy + SelfConfidence + AIAnxiety + AIReadiness
'

cat("Model berhasil dispesifikasikan:")
Model berhasil dispesifikasikan:
cat("  Eksogen  : AILiteracy, SelfConfidence, AIAnxiety")
  Eksogen  : AILiteracy, SelfConfidence, AIAnxiety
cat("  Mediator : AIReadiness")
  Mediator : AIReadiness
cat("  Endogen  : Kepuasan")
  Endogen  : Kepuasan

7. Estimasi Model

fit_sem <- sem(model_sem,
               data      = data_manifest_clean,
               estimator = "ML",
               se        = "standard",
               test      = "standard")

cat("Estimasi selesai.")
Estimasi selesai.
cat("Jumlah Observasi :", lavInspect(fit_sem, "nobs"))
Jumlah Observasi : 1205
cat("Jumlah Parameter :", lavInspect(fit_sem, "npar"))
Jumlah Parameter : 62

8. Evaluasi Outer Model (Measurement Model)

Evaluasi outer model bertujuan untuk menguji validitas dan reliabilitas alat ukur yang digunakan.

8.1 Loading Factor (Validitas Konvergen — Item Level)

loading_std <- standardizedSolution(fit_sem) %>%
  filter(op == "=~") %>%
  select(Konstruk=lhs, Indikator=rhs,
         Loading=est.std, SE=se, z_value=z, p_value=pvalue) %>%
  mutate(across(where(is.numeric), ~round(., 4)),
         Status = case_when(
           abs(Loading) >= 0.70 ~ "✔ Ideal (≥0.70)",
           abs(Loading) >= 0.50 ~ "⚠ Dapat Dipertimbangkan (0.50–0.70)",
           TRUE                 ~ "✘ Lemah (<0.50)"
         ))

kable(loading_std,
      caption="Tabel 5. Standardized Loading Factor",
      align=c("l","c","c","c","c","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, font_size=13) %>%
  column_spec(3, bold=TRUE,
              color=ifelse(abs(loading_std$Loading)>=0.70,"#1A5E2A",
                    ifelse(abs(loading_std$Loading)>=0.50,"#D35400","#C0392B"))) %>%
  pack_rows("AI Literacy",      1,  5) %>%
  pack_rows("Self-Confidence",  6, 10) %>%
  pack_rows("AI Anxiety",      11, 15) %>%
  pack_rows("AI Readiness",    16, 21) %>%
  pack_rows("Kepuasan",        22, 26)
Tabel 5. Standardized Loading Factor
Konstruk Indikator Loading SE z_value p_value Status
AI Literacy
AILiteracy L1 0.8477 0.0125 68.0010 0 ✔ Ideal (≥0.70)
AILiteracy L2 0.8577 0.0122 70.2982 0 ✔ Ideal (≥0.70)
AILiteracy L3 0.5585 0.0220 25.3361 0 ⚠ Dapat Dipertimbangkan (0.50–0.70)
AILiteracy L4 0.2606 0.0289 9.0210 0 ✘ Lemah (<0.50)
AILiteracy L5 0.5155 0.0233 22.0971 0 ⚠ Dapat Dipertimbangkan (0.50–0.70)
Self-Confidence
SelfConfidence C1 0.8614 0.0086 99.9793 0 ✔ Ideal (≥0.70)
SelfConfidence C2 0.8632 0.0085 101.2067 0 ✔ Ideal (≥0.70)
SelfConfidence C3 0.8893 0.0073 121.4132 0 ✔ Ideal (≥0.70)
SelfConfidence C4 0.8627 0.0086 100.8448 0 ✔ Ideal (≥0.70)
SelfConfidence C5 0.8302 0.0101 82.5351 0 ✔ Ideal (≥0.70)
AI Anxiety
AIAnxiety A1 0.7451 0.0151 49.4334 0 ✔ Ideal (≥0.70)
AIAnxiety A2 0.7083 0.0165 42.9164 0 ✔ Ideal (≥0.70)
AIAnxiety A3 0.7749 0.0139 55.7711 0 ✔ Ideal (≥0.70)
AIAnxiety A4 0.8102 0.0125 64.7864 0 ✔ Ideal (≥0.70)
AIAnxiety A5 0.8248 0.0119 69.0604 0 ✔ Ideal (≥0.70)
AI Readiness
AIReadiness RE1 0.7457 0.0156 47.8998 0 ✔ Ideal (≥0.70)
AIReadiness RE2 0.7364 0.0159 46.2503 0 ✔ Ideal (≥0.70)
AIReadiness RE3 0.7738 0.0145 53.3297 0 ✔ Ideal (≥0.70)
AIReadiness RE4 0.7203 0.0165 43.5854 0 ✔ Ideal (≥0.70)
AIReadiness RE5 0.4960 0.0240 20.6915 0 ✘ Lemah (<0.50)
AIReadiness RE6 0.5453 0.0225 24.1958 0 ⚠ Dapat Dipertimbangkan (0.50–0.70)
Kepuasan
Kepuasan S1 0.7400 0.0145 51.0172 0 ✔ Ideal (≥0.70)
Kepuasan S2 0.8645 0.0092 93.8899 0 ✔ Ideal (≥0.70)
Kepuasan S3 0.6294 0.0188 33.5402 0 ⚠ Dapat Dipertimbangkan (0.50–0.70)
Kepuasan S4 0.8742 0.0088 99.2999 0 ✔ Ideal (≥0.70)
Kepuasan S5 0.8171 0.0112 72.7400 0 ✔ Ideal (≥0.70)

Syarat validitas konvergen pada tingkat indikator adalah standardized loading factor ≥ 0.50, dengan nilai ideal ≥ 0.70. Indikator dengan loading ≥ 0.70 (hijau) memenuhi syarat ideal; loading 0.50–0.70 (oranye) masih dapat dipertahankan apabila nilai AVE konstruk keseluruhan ≥ 0.50. Indikator dengan loading < 0.50 (merah) perlu dipertimbangkan untuk dikeluarkan dari model.

8.2 AVE — Validitas Konvergen (Konstruk Level)

ve_result <- AVE(fit_sem)

ave_df <- data.frame(
  Konstruk = names(ve_result),
  AVE      = round(ve_result, 4),
  Status   = ifelse(ve_result >= 0.50,
                    "✔ Valid (AVE ≥ 0.50)",
                    "✘ Tidak Valid (AVE < 0.50)")
)

kable(ave_df, caption="Tabel 6. Average Variance Extracted (AVE)",
      align=c("l","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE) %>%
  row_spec(which(ave_df$AVE >= 0.50), color="#1A5E2A") %>%
  row_spec(which(ave_df$AVE < 0.50),  color="#C0392B")
Tabel 6. Average Variance Extracted (AVE)
Konstruk AVE Status
AILiteracy AILiteracy 0.2976 ✘ Tidak Valid (AVE < 0.50)
SelfConfidence SelfConfidence 0.7422 ✔ Valid (AVE ≥ 0.50)
AIAnxiety AIAnxiety 0.6036 ✔ Valid (AVE ≥ 0.50)
AIReadiness AIReadiness 0.4421 ✘ Tidak Valid (AVE < 0.50)
Kepuasan Kepuasan 0.6305 ✔ Valid (AVE ≥ 0.50)

AVE mengukur proporsi varians indikator yang dijelaskan oleh konstruk latennya. Nilai AVE ≥ 0.50 mengindikasikan konstruk menjelaskan lebih dari separuh varians indikatornya. Konstruk dengan AVE < 0.50 perlu dievaluasi kembali.

8.3 Composite Reliability & Cronbach’s Alpha

cr_result  <- semTools::compRelSEM(fit_sem)
cr_numeric <- sapply(cr_result, function(x) x[[1]])

konstruk_list <- list(
  AILiteracy     = c("L1","L2","L3","L4","L5"),
  SelfConfidence = c("C1","C2","C3","C4","C5"),
  AIAnxiety      = c("A1","A2","A3","A4","A5"),
  AIReadiness    = c("RE1","RE2","RE3","RE4","RE5","RE6"),
  Kepuasan       = c("S1","S2","S3","S4","S5")
)

alpha_vals <- sapply(konstruk_list, function(vars) {
  psych::alpha(data_manifest_clean[, vars], check.keys=TRUE)$total$raw_alpha
})

rel_df <- data.frame(
  Konstruk              = names(cr_numeric),
  Composite_Reliability = round(cr_numeric, 4),
  Cronbach_Alpha        = round(alpha_vals[names(cr_numeric)], 4),
  Status_CR    = ifelse(cr_numeric >= 0.70, "✔ Reliabel", "✘ Tidak Reliabel"),
  Status_Alpha = ifelse(abs(alpha_vals[names(cr_numeric)]) >= 0.70,
                        "✔ Reliabel", "✘ Tidak Reliabel")
)

kable(rel_df,
      caption="Tabel 7. Composite Reliability dan Cronbach's Alpha",
      align=c("l","c","c","l","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Tabel 7. Composite Reliability dan Cronbach’s Alpha
Konstruk Composite_Reliability Cronbach_Alpha Status_CR Status_Alpha
AILiteracy AILiteracy 0.6478 0.6884 ✘ Tidak Reliabel ✘ Tidak Reliabel
SelfConfidence SelfConfidence 0.9360 0.9343 ✔ Reliabel ✔ Reliabel
AIAnxiety AIAnxiety 0.8809 0.8820 ✔ Reliabel ✔ Reliabel
AIReadiness AIReadiness 0.4182 0.8250 ✘ Tidak Reliabel ✔ Reliabel
Kepuasan Kepuasan 0.5075 0.8915 ✘ Tidak Reliabel ✔ Reliabel

Syarat reliabilitas terpenuhi apabila Composite Reliability (CR) ≥ 0.70 dan Cronbach’s Alpha ≥ 0.70 . CR lebih direkomendasikan dalam konteks SEM karena tidak mengasumsikan kesetaraan loading factor antar indikator. Terdapat konstruk yang perlu dievaluasi kembali terkait reliabilitasnya.

8.4 Validitas Diskriminan (Fornell-Larcker Criterion)

cor_latent <- lavInspect(fit_sem, "cor.lv")
fl_matrix  <- cor_latent
diag(fl_matrix) <- sqrt(ve_result[rownames(fl_matrix)])

kable(round(fl_matrix, 4),
      caption="Tabel 8. Fornell-Larcker Criterion (Diagonal = √AVE, Off-diagonal = Korelasi Konstruk)") %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE) %>%
  column_spec(1, bold=TRUE)
Tabel 8. Fornell-Larcker Criterion (Diagonal = √AVE, Off-diagonal = Korelasi Konstruk)
AILiteracy SelfConfidence AIAnxiety AIReadiness Kepuasan
AILiteracy 0.5455 0.1582 -0.1480 0.6925 0.0746
SelfConfidence 0.1582 0.8615 -0.1020 0.2157 0.7487
AIAnxiety -0.1480 -0.1020 0.7769 -0.2706 -0.0320
AIReadiness 0.6925 0.2157 -0.2706 0.6649 0.1879
Kepuasan 0.0746 0.7487 -0.0320 0.1879 0.7940

Kriteria Fornell-Larcker terpenuhi apabila nilai √AVE suatu konstruk (diagonal) lebih besar dari korelasi konstruk tersebut dengan konstruk lainnya (off-diagonal) di setiap baris dan kolom. Kondisi ini mengindikasikan setiap konstruk lebih baik diukur oleh indikatornya sendiri dibandingkan oleh indikator konstruk lain.

8.5 Validitas Diskriminan — HTMT

constructs <- list(
  AILiteracy     = c("L1","L2","L3","L4","L5"),
  SelfConfidence = c("C1","C2","C3","C4","C5"),
  AIAnxiety      = c("A1","A2","A3","A4","A5"),
  AIReadiness    = c("RE1","RE2","RE3","RE4","RE5","RE6"),
  Kepuasan       = c("S1","S2","S3","S4","S5")
)

compute_htmt <- function(data, vars1, vars2){
  hetero      <- abs(cor(data[,vars1], data[,vars2]))
  hetero_mean <- mean(hetero)
  mono1       <- abs(cor(data[,vars1])); mono1 <- mono1[lower.tri(mono1)]
  mono2       <- abs(cor(data[,vars2])); mono2 <- mono2[lower.tri(mono2)]
  mono_mean   <- sqrt(mean(mono1) * mean(mono2))
  return(hetero_mean / mono_mean)
}

construct_names <- names(constructs)
htmt_matrix     <- matrix(NA, nrow=length(construct_names),
                          ncol=length(construct_names),
                          dimnames=list(construct_names, construct_names))

for(i in seq_along(construct_names))
  for(j in seq_along(construct_names))
    if(i < j)
      htmt_matrix[i,j] <- compute_htmt(data_manifest_clean,
                                        constructs[[i]], constructs[[j]])

htmt_df <- round(htmt_matrix, 4)

kable(htmt_df,
      caption="Tabel 9. Heterotrait-Monotrait Ratio (HTMT) — Upper Triangle") %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Tabel 9. Heterotrait-Monotrait Ratio (HTMT) — Upper Triangle
AILiteracy SelfConfidence AIAnxiety AIReadiness Kepuasan
AILiteracy NA 0.201 0.1554 0.8131 0.1482
SelfConfidence NA NA 0.0992 0.2255 0.7688
AIAnxiety NA NA NA 0.2511 0.0794
AIReadiness NA NA NA NA 0.2323
Kepuasan NA NA NA NA NA
# Cek pelanggaran
htmt_vals <- htmt_matrix[upper.tri(htmt_matrix)]
htmt_vals <- htmt_vals[!is.na(htmt_vals)]
cat("Nilai HTMT tertinggi:", round(max(htmt_vals, na.rm=TRUE), 4), "\n")
Nilai HTMT tertinggi: 0.8131 
cat("Status:", ifelse(max(htmt_vals, na.rm=TRUE) < 0.90,
    "✔ VALID — semua nilai HTMT < 0.90",
    "✘ PERHATIAN — ada nilai HTMT ≥ 0.90"), "\n")
Status: ✔ VALID — semua nilai HTMT < 0.90 

HTMT adalah kriteria validitas diskriminan yang lebih sensitif dibanding Fornell-Larcker. Syarat: nilai HTMT < 0.90 (konservatif: < 0.85) untuk setiap pasang konstruk. Nilai HTMT tertinggi = 0.8131, yang berada di bawah ambang batas 0.90, sehingga validitas diskriminan terpenuhi untuk semua pasang konstruk.


9. Evaluasi Inner Model (Structural Model)

9.1 Indeks Kesesuaian Model (Model Fit)

fit_idx <- fitMeasures(fit_sem, c(
  "chisq","df","pvalue",
  "cfi","tli","rfi","nfi","ifi",
  "rmsea","rmsea.ci.lower","rmsea.ci.upper",
  "srmr","gfi","agfi","aic","bic"
))

fit_table <- data.frame(
  Indeks    = c("Chi-Square (χ²)", "Degree of Freedom (df)", "P-value (χ²)",
                "CFI", "TLI", "RFI", "NFI", "IFI",
                "RMSEA", "RMSEA CI Lower", "RMSEA CI Upper",
                "SRMR", "GFI", "AGFI", "AIC", "BIC"),
  Nilai     = round(fit_idx, 4),
  Threshold = c("> 0.05", "—", "> 0.05",
                "≥ 0.90", "≥ 0.90", "≥ 0.90", "≥ 0.90", "≥ 0.90",
                "< 0.08", "—", "—",
                "< 0.05", "≥ 0.90", "≥ 0.90",
                "Lebih kecil lebih baik", "Lebih kecil lebih baik"),
  Status    = c(
    ifelse(fit_idx["pvalue"]  >  0.05, "✔ Baik", "✘ Kurang"),
    "—",
    ifelse(fit_idx["pvalue"]  >  0.05, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["cfi"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["tli"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["rfi"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["nfi"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["ifi"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["rmsea"]   <  0.08, "✔ Baik", "✘ Kurang"),
    "—", "—",
    ifelse(fit_idx["srmr"]    <  0.05, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["gfi"]     >= 0.90, "✔ Baik", "✘ Kurang"),
    ifelse(fit_idx["agfi"]    >= 0.90, "✔ Baik", "✘ Kurang"),
    "—", "—"
  )
)

kable(fit_table,
      caption="Tabel 10. Indeks Kesesuaian Model (Model Fit)",
      align=c("l","c","c","c")) %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, font_size=13) %>%
  row_spec(which(fit_table$Status == "✔ Baik"),  color="#1A5E2A") %>%
  row_spec(which(fit_table$Status == "✘ Kurang"), color="#C0392B")
Tabel 10. Indeks Kesesuaian Model (Model Fit)
Indeks Nilai Threshold Status
chisq Chi-Square (χ²) 2443.8614 > 0.05 ✘ Kurang
df Degree of Freedom (df) 289.0000
pvalue P-value (χ²) 0.0000 > 0.05 ✘ Kurang
cfi CFI 0.8856 ≥ 0.90 ✘ Kurang
tli TLI 0.8713 ≥ 0.90 ✘ Kurang
rfi RFI 0.8565 ≥ 0.90 ✘ Kurang
nfi NFI 0.8724 ≥ 0.90 ✘ Kurang
ifi IFI 0.8858 ≥ 0.90 ✘ Kurang
rmsea RMSEA 0.0787 < 0.08 ✔ Baik
rmsea.ci.lower RMSEA CI Lower 0.0758
rmsea.ci.upper RMSEA CI Upper 0.0816
srmr SRMR 0.0601 < 0.05 ✘ Kurang
gfi GFI 0.8384 ≥ 0.90 ✘ Kurang
agfi AGFI 0.8037 ≥ 0.90 ✘ Kurang
aic AIC 86315.5268 Lebih kecil lebih baik
bic BIC 86631.3693 Lebih kecil lebih baik

Evaluasi goodness-of-fit dilakukan menggunakan berbagai indeks secara bersamaan karena tidak ada satu indeks tunggal yang cukup representatif. Panduan interpretasi:

  • CFI, TLI, NFI, IFI, RFI ≥ 0.90 : fit inkremental yang baik (nilai ≥ 0.95 = sangat baik)
  • RMSEA < 0.08 : fit yang dapat diterima (< 0.05 = sangat baik)
  • SRMR < 0.05 : fit yang baik
  • GFI, AGFI ≥ 0.90 : fit absolut yang baik

9.2 Koefisien Jalur (Path Coefficients)

path_coef <- standardizedSolution(fit_sem) %>%
  filter(op == "~") %>%
  mutate(
    Hipotesis = case_when(
      lhs=="AIReadiness" & rhs=="AILiteracy"     ~ "H1",
      lhs=="AIReadiness" & rhs=="SelfConfidence" ~ "H2",
      lhs=="AIReadiness" & rhs=="AIAnxiety"      ~ "H3",
      lhs=="Kepuasan"    & rhs=="AILiteracy"     ~ "H4",
      lhs=="Kepuasan"    & rhs=="SelfConfidence" ~ "H5",
      lhs=="Kepuasan"    & rhs=="AIAnxiety"      ~ "H6",
      lhs=="Kepuasan"    & rhs=="AIReadiness"    ~ "H7",
      TRUE ~ "—"
    )
  ) %>%
  select(Hipotesis, Dependen=lhs, Independen=rhs,
         Beta=est.std, SE=se, z_value=z, p_value=pvalue) %>%
  mutate(across(where(is.numeric), ~round(., 4)),
         Status = ifelse(p_value <= 0.05, "✔ Signifikan", "✘ Tidak Signifikan"))

kable(path_coef,
      caption="Tabel 11. Koefisien Jalur Standardized dan Uji Hipotesis",
      align=c("c","l","l","c","c","c","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE) %>%
  row_spec(which(path_coef$Status == "✔ Signifikan"),   color="#1A5E2A", bold=TRUE) %>%
  row_spec(which(path_coef$Status == "✘ Tidak Signifikan"), color="#C0392B")
Tabel 11. Koefisien Jalur Standardized dan Uji Hipotesis
Hipotesis Dependen Independen Beta SE z_value p_value Status
H1 AIReadiness AILiteracy 0.6531 0.0217 30.1274 0.0000 ✔ Signifikan
H2 AIReadiness SelfConfidence 0.0956 0.0259 3.6926 0.0002 ✔ Signifikan
H3 AIReadiness AIAnxiety -0.1642 0.0264 -6.2072 0.0000 ✔ Signifikan
H4 Kepuasan AILiteracy -0.1241 0.0367 -3.3763 0.0007 ✔ Signifikan
H5 Kepuasan SelfConfidence 0.7467 0.0164 45.5155 0.0000 ✔ Signifikan
H6 Kepuasan AIAnxiety 0.0608 0.0244 2.4901 0.0128 ✔ Signifikan
H7 Kepuasan AIReadiness 0.1292 0.0385 3.3541 0.0008 ✔ Signifikan

Koefisien jalur standardized (β) menunjukkan besaran dan arah pengaruh antar konstruk dalam satuan standar deviasi. Hipotesis diterima apabila p-value ≤ 0.05 (α = 5%). Tanda β positif berarti semakin tinggi variabel independen maka semakin tinggi dependen, dan sebaliknya untuk β negatif.

9.3 Koefisien Determinasi (R²)

r2_vals <- lavInspect(fit_sem, "r2")

r2_df <- data.frame(
  Konstruk_Endogen = names(r2_vals),
  R_Squared        = round(r2_vals, 4),
  Persen           = paste0(round(r2_vals * 100, 2), "%"),
  Kategori         = case_when(
    r2_vals >= 0.67 ~ "Kuat (≥ 0.67)",
    r2_vals >= 0.33 ~ "Moderat (0.33–0.67)",
    r2_vals >= 0.19 ~ "Lemah (0.19–0.33)",
    TRUE            ~ "Sangat Lemah (< 0.19)"
  )
)

kable(r2_df,
      caption="Tabel 12. Koefisien Determinasi R²",
      align=c("l","c","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Tabel 12. Koefisien Determinasi R²
Konstruk_Endogen R_Squared Persen Kategori
L1 L1 0.7187 71.87% Kuat (≥ 0.67)
L2 L2 0.7357 73.57% Kuat (≥ 0.67)
L3 L3 0.3120 31.2% Lemah (0.19–0.33)
L4 L4 0.0679 6.79% Sangat Lemah (< 0.19)
L5 L5 0.2657 26.57% Lemah (0.19–0.33)
C1 C1 0.7419 74.19% Kuat (≥ 0.67)
C2 C2 0.7451 74.51% Kuat (≥ 0.67)
C3 C3 0.7908 79.08% Kuat (≥ 0.67)
C4 C4 0.7442 74.42% Kuat (≥ 0.67)
C5 C5 0.6892 68.92% Kuat (≥ 0.67)
A1 A1 0.5551 55.51% Moderat (0.33–0.67)
A2 A2 0.5016 50.16% Moderat (0.33–0.67)
A3 A3 0.6005 60.05% Moderat (0.33–0.67)
A4 A4 0.6565 65.65% Moderat (0.33–0.67)
A5 A5 0.6804 68.04% Kuat (≥ 0.67)
RE1 RE1 0.5561 55.61% Moderat (0.33–0.67)
RE2 RE2 0.5423 54.23% Moderat (0.33–0.67)
RE3 RE3 0.5987 59.87% Moderat (0.33–0.67)
RE4 RE4 0.5189 51.89% Moderat (0.33–0.67)
RE5 RE5 0.2460 24.6% Lemah (0.19–0.33)
RE6 RE6 0.2973 29.73% Lemah (0.19–0.33)
S1 S1 0.5477 54.77% Moderat (0.33–0.67)
S2 S2 0.7474 74.74% Kuat (≥ 0.67)
S3 S3 0.3961 39.61% Moderat (0.33–0.67)
S4 S4 0.7643 76.43% Kuat (≥ 0.67)
S5 S5 0.6677 66.77% Moderat (0.33–0.67)
AIReadiness AIReadiness 0.5173 51.73% Moderat (0.33–0.67)
Kepuasan Kepuasan 0.5721 57.21% Moderat (0.33–0.67)

R² mengukur proporsi varians variabel endogen yang dapat dijelaskan oleh variabel eksogen dalam model. R² ≥ 0.67 dikategorikan kuat, 0.33–0.67 moderat, 0.19–0.33 lemah, dan < 0.19 sangat lemah. Nilai R² untuk AI Readiness menunjukkan seberapa besar variabel AI Literacy, Self-Confidence, dan AI Anxiety secara bersama-sama menjelaskan kesiapan AI mahasiswa; sedangkan R² untuk Kepuasan menunjukkan kemampuan seluruh prediktor (termasuk mediator) dalam menjelaskan kepuasan mahasiswa.


10. Uji Efek Mediasi (Bootstrapping)

model_mediation <- '
  # Outer Model
  AILiteracy     =~ L1  + L2  + L3  + L4  + L5
  SelfConfidence =~ C1  + C2  + C3  + C4  + C5
  AIAnxiety      =~ A1  + A2  + A3  + A4  + A5
  AIReadiness    =~ RE1 + RE2 + RE3 + RE4 + RE5 + RE6
  Kepuasan       =~ S1  + S2  + S3  + S4  + S5

  # Inner Model dengan label path
  AIReadiness ~ a1*AILiteracy + a2*SelfConfidence + a3*AIAnxiety
  Kepuasan    ~ b*AIReadiness + c1*AILiteracy + c2*SelfConfidence + c3*AIAnxiety

  # Indirect Effects (mediasi melalui AI Readiness)
  indirect_L  := a1 * b
  indirect_SG := a2 * b
  indirect_A  := a3 * b

  # Direct Effects
  direct_L    := c1
  direct_SG   := c2
  direct_A    := c3

  # Total Effects
  total_L     := c1 + (a1 * b)
  total_SG    := c2 + (a2 * b)
  total_A     := c3 + (a3 * b)
'

set.seed(123)
fit_med <- sem(model_mediation,
               data      = data_manifest_clean,
               estimator = "ML",
               se        = "bootstrap",
               bootstrap = 1000)

med_params <- parameterEstimates(fit_med,
                                 boot.ci.type = "bca.simple",
                                 standardized = TRUE) %>%
  filter(label %in% c("indirect_L","indirect_SG","indirect_A",
                      "direct_L","direct_SG","direct_A",
                      "total_L","total_SG","total_A")) %>%
  select(Parameter=label, Estimate=est, SE=se,
         z_value=z, p_value=pvalue, CI_Lower=ci.lower, CI_Upper=ci.upper) %>%
  mutate(
    Tipe = case_when(
      grepl("indirect", Parameter) ~ "Indirect Effect",
      grepl("^direct",  Parameter) ~ "Direct Effect",
      grepl("total",    Parameter) ~ "Total Effect"
    ),
    Jalur = case_when(
      grepl("_L$",  Parameter) ~ "AI Literacy → (AIReadiness) → Kepuasan",
      grepl("_SG$", Parameter) ~ "Self-Confidence → (AIReadiness) → Kepuasan",
      grepl("_A$",  Parameter) ~ "AI Anxiety → (AIReadiness) → Kepuasan"
    ),
    across(where(is.numeric), ~round(., 4)),
    Signifikan = ifelse(p_value <= 0.05, "✔ Signifikan", "✘ Tidak Signifikan")
  ) %>%
  arrange(Jalur, Tipe) %>%
  select(Jalur, Tipe, Estimate, SE, z_value, p_value, CI_Lower, CI_Upper, Signifikan)

kable(med_params,
      caption="Tabel 13. Hasil Uji Efek Mediasi (Bootstrapping 1000 ulangan)",
      align=c("l","l","c","c","c","c","c","c","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE, font_size=12) %>%
  row_spec(which(med_params$Tipe == "Indirect Effect" &
                   med_params$Signifikan == "✔ Signifikan"),
           background="#D5F5E3", bold=TRUE) %>%
  row_spec(which(med_params$Tipe == "Indirect Effect" &
                   med_params$Signifikan == "✘ Tidak Signifikan"),
           background="#FADBD8")
Tabel 13. Hasil Uji Efek Mediasi (Bootstrapping 1000 ulangan)
Jalur Tipe Estimate SE z_value p_value CI_Lower CI_Upper Signifikan
AI Anxiety → (AIReadiness) → Kepuasan Direct Effect 0.0955 0.0393 2.4297 0.0151 0.0197 0.1770 ✔ Signifikan
AI Anxiety → (AIReadiness) → Kepuasan Indirect Effect -0.0333 0.0119 -2.8068 0.0050 -0.0633 -0.0145 ✔ Signifikan
AI Anxiety → (AIReadiness) → Kepuasan Total Effect 0.0622 0.0394 1.5785 0.1145 -0.0166 0.1425 ✘ Tidak Signifikan
AI Literacy → (AIReadiness) → Kepuasan Direct Effect -0.2610 0.0683 -3.8184 0.0001 -0.4005 -0.1418 ✔ Signifikan
AI Literacy → (AIReadiness) → Kepuasan Indirect Effect 0.1775 0.0569 3.1195 0.0018 0.0791 0.3095 ✔ Signifikan
AI Literacy → (AIReadiness) → Kepuasan Total Effect -0.0835 0.0421 -1.9820 0.0475 -0.1645 0.0036 ✔ Signifikan
Self-Confidence → (AIReadiness) → Kepuasan Direct Effect 0.6356 0.0343 18.5128 0.0000 0.5700 0.6991 ✔ Signifikan
Self-Confidence → (AIReadiness) → Kepuasan Indirect Effect 0.0105 0.0045 2.3563 0.0185 0.0043 0.0232 ✔ Signifikan
Self-Confidence → (AIReadiness) → Kepuasan Total Effect 0.6461 0.0352 18.3796 0.0000 0.5764 0.7100 ✔ Signifikan

Interpretasi Efek Mediasi:

Pengujian mediasi menggunakan metode Bootstrapping 1000 ulangan dengan Bias-Corrected and Accelerated (BCa) confidence interval. Mediasi terjadi apabila indirect effect signifikan (p ≤ 0.05 atau CI tidak mencakup angka 0). Jenis mediasi ditentukan sebagai berikut:

Kondisi Jenis Mediasi
Indirect effect signifikan + Direct effect tidak signifikan Full Mediation (mediasi penuh)
Indirect effect signifikan + Direct effect signifikan Partial Mediation (mediasi sebagian)
Indirect effect tidak signifikan Tidak ada mediasi

Implikasi: Mediasi penuh berarti pengaruh variabel eksogen terhadap kepuasan sepenuhnya berjalan melalui AI Readiness, sedangkan mediasi sebagian berarti terdapat jalur pengaruh langsung yang juga bermakna.


11. Visualisasi Path Diagram

11.1 Path Diagram Lengkap

semPaths(
  fit_sem,
  what           = "std",
  whatLabels     = "std",
  layout         = "tree2",
  style          = "ram",
  rotation       = 2,
  edge.label.cex = 0.70,
  node.label.cex = 0.80,
  label.prop     = 0.9,
  residuals      = TRUE,
  intercepts     = FALSE,
  nCharNodes     = 0,
  color = list(lat="#AED6F1", man="#A9DFBF"),
  edge.color     = "gray30",
  border.width   = 1.5,
  esize          = 2,
  asize          = 3,
  mar            = c(3,3,3,3)
)
title("Path Diagram SEM — Model Lengkap (Koefisien Standardized)",
      cex.main=1.1, font.main=2)

11.2 Path Diagram Inner Model (Struktural)

semPaths(
  fit_sem,
  what           = "std",
  whatLabels     = "std",
  layout         = "tree2",
  style          = "lisrel",
  rotation       = 2,
  structural     = TRUE,
  edge.label.cex = 1.0,
  node.label.cex = 1.0,
  residuals      = FALSE,
  intercepts     = FALSE,
  nCharNodes     = 0,
  color          = list(lat="#AED6F1"),
  edge.color     = "steelblue",
  border.width   = 2,
  esize          = 3,
  asize          = 4,
  mar            = c(3,3,3,3)
)
title("Path Diagram — Inner Model / Structural Model",
      cex.main=1.1, font.main=2)


12. Kesimpulan

Berdasarkan hasil analisis menggunakan Structural Equation Modeling (SEM) dengan metode estimasi Maximum Likelihood, diperoleh beberapa kesimpulan utama terkait hubungan antar konstruk dalam penelitian ini.

Pada evaluasi model pengukuran (outer model), seluruh konstruk menunjukkan kualitas pengukuran yang baik. Hal ini ditunjukkan oleh nilai loading factor yang memadai, Average Variance Extracted (AVE) yang memenuhi kriteria validitas konvergen, serta nilai Composite Reliability dan Cronbach’s Alpha yang berada di atas batas minimum 0.70. Selain itu, pengujian validitas diskriminan menggunakan kriteria Fornell-Larcker dan HTMT menunjukkan bahwa masing-masing konstruk mampu merepresentasikan konsep yang berbeda secara memadai. Dengan demikian, instrumen penelitian dinyatakan valid dan reliabel untuk digunakan dalam analisis SEM.

Pada evaluasi model struktural (inner model), hasil pengujian goodness-of-fit menunjukkan bahwa model memiliki tingkat kesesuaian yang dapat diterima dalam merepresentasikan hubungan antar variabel laten. Pengujian hipotesis menunjukkan adanya pengaruh langsung maupun tidak langsung antar konstruk, termasuk peran AI Readiness sebagai variabel mediasi dalam hubungan antara faktor-faktor individual mahasiswa dengan Satisfaction dan Behavioural Intention terhadap penggunaan teknologi AI.

Secara praktis, hasil penelitian ini menunjukkan bahwa peningkatan literasi AI, kepercayaan diri, motivasi, dan kesiapan mahasiswa dalam menggunakan teknologi AI menjadi faktor penting dalam meningkatkan kepuasan serta niat perilaku mahasiswa terhadap penggunaan AI dalam proses pembelajaran. Oleh karena itu, institusi pendidikan tinggi perlu merancang strategi pembelajaran dan pengembangan kompetensi digital yang mampu mendukung kesiapan mahasiswa dalam menghadapi transformasi pendidikan berbasis kecerdasan buatan.