1 Pendahuluan

Analisis ini menggunakan CB-SEM untuk menguji faktor yang memengaruhi adopsi AI di kalangan mahasiswa perguruan tinggi Indonesia (Mendeley Data, 602 responden).

Konstruk dan Hipotesis:

Kode Nama Konstruk Indikator
PE Performance Expectation PE1-PE20 (4 sub-konstruk)
CU Challenge Using AI CU1-CU4
ATU Attitude Toward Using AI ATU1-ATU5
AUP Perception of AI Use AUP1-AUP5
MIUA Motivation/Intention to Use AI MIUA1-MIUA5
  • H1: PE -> ATU (positif)
  • H2: CU -> ATU (negatif)
  • H3: ATU -> AUP (positif)
  • H4: ATU -> MIUA (positif)
  • H5: AUP -> MIUA (positif)

2 Load Library

library(readxl)
library(lavaan)
library(semPlot)
library(semTools)
library(tidyverse)
library(psych)
library(corrplot)
library(knitr)
library(kableExtra)
library(qgraph)

3 Load Data

df_raw <- read_excel("Dataset of AI Adoption Usage among Students in Indonesia Higher Education.xlsx")
cat("Dimensi data:", nrow(df_raw), "baris x", ncol(df_raw), "kolom\n")
## Dimensi data: 602 baris x 46 kolom
pe_cols   <- paste0("PE",   1:20)
cu_cols   <- paste0("CU",   1:4)
atu_cols  <- paste0("ATU",  1:5)
aup_cols  <- paste0("AUP",  1:5)
miua_cols <- paste0("MIUA", 1:5)

all_cols <- c(pe_cols, cu_cols, atu_cols, aup_cols, miua_cols)

4 Preprocessing

df <- df_raw %>%
  select(all_of(all_cols)) %>%
  mutate(across(everything(), as.numeric)) %>%
  mutate(across(everything(), ~ifelse(is.na(.), median(., na.rm = TRUE), .)))

cat("Responden final:", nrow(df), "\n")
## Responden final: 602
desc_stats <- describe(df) %>%
  select(n, mean, sd, median, min, max, skew, kurtosis) %>%
  round(3)

kable(desc_stats, caption = "Statistik Deskriptif") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, font_size = 11) %>%
  pack_rows("Performance Expectation (PE)", 1, 20) %>%
  pack_rows("Challenge Using AI (CU)", 21, 24) %>%
  pack_rows("Attitude Toward Using AI (ATU)", 25, 29) %>%
  pack_rows("Perception of AI Use (AUP)", 30, 34) %>%
  pack_rows("Motivation/Intention (MIUA)", 35, 39)
Statistik Deskriptif
n mean sd median min max skew kurtosis
Performance Expectation (PE)
PE1 602 3.166 0.734 3 1 4 -0.926 1.269
PE2 602 3.047 0.703 3 1 4 -0.668 0.899
PE3 602 3.120 0.710 3 1 4 -0.815 1.211
PE4 602 3.017 0.769 3 1 4 -0.641 0.332
PE5 602 3.058 0.703 3 1 4 -0.683 0.934
PE6 602 3.106 0.749 3 1 4 -0.720 0.560
PE7 602 3.012 0.775 3 1 4 -0.577 0.133
PE8 602 3.088 0.695 3 1 4 -0.564 0.571
PE9 602 2.963 0.762 3 1 4 -0.546 0.198
PE10 602 2.852 0.818 3 1 4 -0.452 -0.198
PE11 602 3.060 0.706 3 1 4 -0.509 0.346
PE12 602 2.947 0.776 3 1 4 -0.547 0.132
PE13 602 2.993 0.812 3 1 4 -0.622 0.056
PE14 602 3.150 0.728 3 1 4 -0.779 0.838
PE15 602 3.045 0.723 3 1 4 -0.675 0.746
PE16 602 3.033 0.710 3 1 4 -0.576 0.564
PE17 602 2.995 0.758 3 1 4 -0.542 0.177
PE18 602 3.051 0.679 3 1 4 -0.540 0.708
PE19 602 3.110 0.681 3 1 4 -0.739 1.288
PE20 602 3.151 0.677 3 1 4 -0.675 1.016
Challenge Using AI (CU)
CU1 602 2.394 0.805 2 1 4 0.261 -0.388
CU2 602 2.277 0.837 2 1 4 0.448 -0.281
CU3 602 2.801 0.867 3 1 4 -0.415 -0.436
CU4 602 2.262 0.909 2 1 4 0.363 -0.631
Attitude Toward Using AI (ATU)
ATU1 602 3.012 0.705 3 1 4 -0.556 0.574
ATU2 602 2.671 0.843 3 1 4 -0.304 -0.458
ATU3 602 2.904 0.755 3 1 5 -0.396 0.078
ATU4 602 2.965 0.685 3 1 4 -0.513 0.638
ATU5 602 2.887 0.774 3 1 5 -0.426 0.154
Perception of AI Use (AUP)
AUP1 602 1.977 0.953 2 1 4 0.668 -0.532
AUP2 602 2.932 0.787 3 1 4 -0.432 -0.167
AUP3 602 3.154 0.823 3 1 4 -0.757 0.016
AUP4 602 2.673 0.728 3 1 4 -0.393 0.004
AUP5 602 2.673 0.808 3 1 4 -0.304 -0.338
Motivation/Intention (MIUA)
MIUA1 602 2.736 0.777 3 1 4 -0.334 -0.184
MIUA2 602 2.837 0.734 3 1 4 -0.492 0.267
MIUA3 602 2.777 0.768 3 1 4 -0.458 0.033
MIUA4 602 2.430 0.843 2 1 4 0.219 -0.548
MIUA5 602 3.013 0.723 3 1 4 -0.601 0.562

5 Uji Asumsi

5.1 Normalitas Multivariat (Mardia)

mardia_result <- psych::mardia(df, plot = FALSE)

cat("Mardia Skewness      :", round(mardia_result$b1p,    3), "\n")
## Mardia Skewness      : 337.477
cat("Mardia Skewness p-val:", round(mardia_result$p.skew, 4), "\n")
## Mardia Skewness p-val: 0
cat("Mardia Kurtosis      :", round(mardia_result$b2p,    3), "\n")
## Mardia Kurtosis      : 2395.753
cat("Mardia Kurtosis p-val:", round(mardia_result$p.kurt, 4), "\n")
## Mardia Kurtosis p-val: 0
if (mardia_result$p.skew > 0.05 && mardia_result$p.kurt > 0.05) {
  cat("Normal multivariat -> estimator ML cocok\n")
} else {
  cat("Tidak normal multivariat -> gunakan estimator MLR\n")
}
## Tidak normal multivariat -> gunakan estimator MLR

5.2 KMO & Bartlett

kmo_result      <- KMO(df)
bartlett_result <- cortest.bartlett(df)

cat("Overall KMO  :", round(kmo_result$MSA, 3), "\n")
## Overall KMO  : 0.957
cat("Bartlett p   :", round(bartlett_result$p.value, 5), "\n")
## Bartlett p   : 0

5.3 Multikolinieritas (VIF)

lm_miua <- lm(rowMeans(df[, miua_cols]) ~
                rowMeans(df[, pe_cols]) +
                rowMeans(df[, cu_cols]) +
                rowMeans(df[, atu_cols]) +
                rowMeans(df[, aup_cols]),
              data = df)

vif_vals <- car::vif(lm_miua)
vif_df <- data.frame(
  Prediktor = c("PE", "CU", "ATU", "AUP"),
  VIF       = round(vif_vals, 3),
  Status    = ifelse(vif_vals < 3.3, "Aman", ifelse(vif_vals < 5, "Perhatian", "Bermasalah"))
)

kable(vif_df, caption = "Variance Inflation Factor (VIF)", row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Variance Inflation Factor (VIF)
Prediktor VIF Status
PE 1.518 Aman
CU 1.254 Aman
ATU 1.769 Aman
AUP 1.794 Aman

5.4 Matriks Korelasi

corrplot(cor(df, use = "complete.obs"),
         method = "color", type = "upper", tl.cex = 0.6, tl.col = "black",
         col = colorRampPalette(c("#D73027", "white", "#1A9850"))(200),
         title = "Matriks Korelasi Indikator", mar = c(0, 0, 2, 0))


6 Spesifikasi Model SEM

model_sem <- '
  # Outer Model (Measurement Model)
  PE_EXP  =~ PE1  + PE2  + PE3  + PE4  + PE5
  PE_EASE =~ PE6  + PE7  + PE8  + PE9  + PE10
  PE_UTIL =~ PE11 + PE12 + PE13 + PE14 + PE15
  PE_OUT  =~ PE16 + PE17 + PE18 + PE19 + PE20
  CU      =~ CU1  + CU2  + CU3  + CU4
  ATU     =~ ATU1 + ATU2 + ATU3 + ATU4 + ATU5
  AUP     =~ AUP1 + AUP2 + AUP3 + AUP4 + AUP5
  MIUA    =~ MIUA1 + MIUA2 + MIUA3 + MIUA4 + MIUA5

  # Inner Model (Structural Model)
  ATU  ~ PE_EXP + PE_EASE + PE_UTIL + PE_OUT + CU
  AUP  ~ ATU
  MIUA ~ ATU + AUP
'
cat("Model berhasil dispesifikasi\n")
## Model berhasil dispesifikasi
cat("- 8 konstruk laten\n")
## - 8 konstruk laten
cat("- 39 indikator\n")
## - 39 indikator
cat("- 5 jalur struktural\n")
## - 5 jalur struktural

7 Estimasi Model

fit_sem <- sem(model_sem, data = df, estimator = "MLR",
               std.lv = FALSE, missing = "listwise")
cat("Model berhasil diestimasi\n")
## Model berhasil diestimasi

8 Evaluasi Outer Model

8.1 Loading Factor

std_loadings <- standardizedSolution(fit_sem) %>%
  filter(op == "=~") %>%
  select(Konstruk = lhs, Indikator = rhs,
         Loading = est.std, SE = se, z = z, pvalue = pvalue) %>%
  mutate(across(c(Loading, SE, z), ~round(., 3)),
         pvalue = round(pvalue, 4),
         Status = case_when(
           Loading >= 0.70 ~ "Ideal (>=0.70)",
           Loading >= 0.50 ~ "Acceptable (0.50-0.70)",
           TRUE            ~ "Drop (<0.50)"
         ))

kable(std_loadings, caption = "Standardized Factor Loadings", row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, font_size = 11) %>%
  column_spec(4, color = ifelse(std_loadings$Loading >= 0.70, "green",
                         ifelse(std_loadings$Loading >= 0.50, "orange", "red")))
Standardized Factor Loadings
Konstruk Indikator Loading SE z pvalue Status
PE_EXP PE1 0.749 0.033 22.513 0 Ideal (>=0.70)
PE_EXP PE2 0.786 0.024 33.209 0 Ideal (>=0.70)
PE_EXP PE3 0.768 0.026 29.809 0 Ideal (>=0.70)
PE_EXP PE4 0.759 0.026 28.868 0 Ideal (>=0.70)
PE_EXP PE5 0.768 0.026 29.193 0 Ideal (>=0.70)
PE_EASE PE6 0.745 0.028 26.385 0 Ideal (>=0.70)
PE_EASE PE7 0.760 0.026 29.715 0 Ideal (>=0.70)
PE_EASE PE8 0.801 0.024 34.068 0 Ideal (>=0.70)
PE_EASE PE9 0.734 0.024 30.043 0 Ideal (>=0.70)
PE_EASE PE10 0.716 0.027 26.199 0 Ideal (>=0.70)
PE_UTIL PE11 0.772 0.026 30.142 0 Ideal (>=0.70)
PE_UTIL PE12 0.718 0.029 24.435 0 Ideal (>=0.70)
PE_UTIL PE13 0.707 0.031 22.682 0 Ideal (>=0.70)
PE_UTIL PE14 0.680 0.033 20.418 0 Acceptable (0.50-0.70)
PE_UTIL PE15 0.778 0.025 31.645 0 Ideal (>=0.70)
PE_OUT PE16 0.781 0.026 29.982 0 Ideal (>=0.70)
PE_OUT PE17 0.738 0.027 27.184 0 Ideal (>=0.70)
PE_OUT PE18 0.797 0.024 32.832 0 Ideal (>=0.70)
PE_OUT PE19 0.718 0.032 22.545 0 Ideal (>=0.70)
PE_OUT PE20 0.781 0.027 29.303 0 Ideal (>=0.70)
CU CU1 0.762 0.031 24.327 0 Ideal (>=0.70)
CU CU2 0.803 0.035 22.849 0 Ideal (>=0.70)
CU CU3 0.456 0.042 10.967 0 Drop (<0.50)
CU CU4 0.516 0.047 10.885 0 Acceptable (0.50-0.70)
ATU ATU1 0.625 0.036 17.193 0 Acceptable (0.50-0.70)
ATU ATU2 0.715 0.029 24.756 0 Ideal (>=0.70)
ATU ATU3 0.786 0.024 32.406 0 Ideal (>=0.70)
ATU ATU4 0.693 0.045 15.568 0 Acceptable (0.50-0.70)
ATU ATU5 0.684 0.036 18.988 0 Acceptable (0.50-0.70)
AUP AUP1 0.454 0.041 11.035 0 Drop (<0.50)
AUP AUP2 0.506 0.048 10.534 0 Acceptable (0.50-0.70)
AUP AUP3 0.272 0.054 5.040 0 Drop (<0.50)
AUP AUP4 0.675 0.034 19.906 0 Acceptable (0.50-0.70)
AUP AUP5 0.778 0.027 29.197 0 Ideal (>=0.70)
MIUA MIUA1 0.768 0.026 29.867 0 Ideal (>=0.70)
MIUA MIUA2 0.768 0.026 29.199 0 Ideal (>=0.70)
MIUA MIUA3 0.796 0.022 35.696 0 Ideal (>=0.70)
MIUA MIUA4 0.662 0.031 21.506 0 Acceptable (0.50-0.70)
MIUA MIUA5 0.695 0.030 23.395 0 Acceptable (0.50-0.70)

8.2 AVE & Composite Reliability (CR)

calc_ave_cr <- function(construct, loadings_df) {
  l  <- loadings_df %>% filter(Konstruk == construct) %>% pull(Loading)
  l2 <- l^2
  data.frame(
    Konstruk = construct,
    AVE      = round(mean(l2), 3),
    CR       = round(sum(l)^2 / (sum(l)^2 + sum(1 - l2)), 3)
  )
}

constructs        <- unique(std_loadings$Konstruk)
convergent_validity <- do.call(rbind, lapply(constructs, calc_ave_cr, std_loadings)) %>%
  mutate(AVE_OK = ifelse(AVE >= 0.5, "Baik", "Kurang"),
         CR_OK  = ifelse(CR  >= 0.7, "Baik", "Kurang"))

kable(convergent_validity, caption = "Convergent Validity: AVE & CR",
      row.names = FALSE,
      col.names = c("Konstruk", "AVE", "CR", "AVE >= 0.5?", "CR >= 0.7?")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Convergent Validity: AVE & CR
Konstruk AVE CR AVE >= 0.5? CR >= 0.7?
PE_EXP 0.587 0.877 Baik Baik
PE_EASE 0.565 0.866 Baik Baik
PE_UTIL 0.536 0.852 Baik Baik
PE_OUT 0.583 0.875 Baik Baik
CU 0.425 0.737 Kurang Baik
ATU 0.494 0.829 Kurang Baik
AUP 0.319 0.679 Kurang Kurang
MIUA 0.547 0.857 Baik Baik

8.3 Validitas Diskriminan (Fornell-Larcker)

lv_cor   <- lavInspect(fit_sem, "cor.lv")
sqrt_ave <- setNames(sqrt(convergent_validity$AVE), convergent_validity$Konstruk)

fl_matrix <- lv_cor
for (c in rownames(lv_cor)) {
  if (c %in% names(sqrt_ave)) fl_matrix[c, c] <- sqrt_ave[c]
}

kable(round(as.data.frame(fl_matrix), 3),
      caption = "Fornell-Larcker (diagonal = sqrt(AVE), off-diagonal = korelasi)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, font_size = 10) %>%
  footnote(general = "Discriminant validity terpenuhi jika sqrt(AVE) diagonal > korelasi dengan konstruk lain")
Fornell-Larcker (diagonal = sqrt(AVE), off-diagonal = korelasi)
PE_EXP PE_EASE PE_UTIL PE_OUT CU ATU AUP MIUA
PE_EXP 0.766 0.902 0.873 0.895 0.157 0.607 0.492 0.491
PE_EASE 0.902 0.752 0.953 0.888 0.209 0.587 0.475 0.475
PE_UTIL 0.873 0.953 0.732 0.942 0.230 0.641 0.519 0.519
PE_OUT 0.895 0.888 0.942 0.764 0.197 0.680 0.551 0.550
CU 0.157 0.209 0.230 0.197 0.652 0.308 0.249 0.249
ATU 0.607 0.587 0.641 0.680 0.308 0.703 0.810 0.809
AUP 0.492 0.475 0.519 0.551 0.249 0.810 0.565 0.843
MIUA 0.491 0.475 0.519 0.550 0.249 0.809 0.843 0.740
Note:
Discriminant validity terpenuhi jika sqrt(AVE) diagonal > korelasi dengan konstruk lain

8.4 Reliabilitas (Cronbach Alpha)

construct_items <- list(
  PE_EXP  = paste0("PE",   1:5),
  PE_EASE = paste0("PE",   6:10),
  PE_UTIL = paste0("PE",  11:15),
  PE_OUT  = paste0("PE",  16:20),
  CU      = paste0("CU",   1:4),
  ATU     = paste0("ATU",  1:5),
  AUP     = paste0("AUP",  1:5),
  MIUA    = paste0("MIUA", 1:5)
)

alpha_df <- do.call(rbind, lapply(names(construct_items), function(name) {
  items <- intersect(construct_items[[name]], names(df))
  if (length(items) < 2) return(NULL)
  a <- psych::alpha(df[, items], warnings = FALSE)$total$raw_alpha
  data.frame(Konstruk = name, Alpha = round(a, 3),
             Status = ifelse(a >= 0.7, "Reliabel", "Tidak Reliabel"))
}))

kable(alpha_df, caption = "Cronbach's Alpha", row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Cronbach’s Alpha
Konstruk Alpha Status
PE_EXP 0.876 Reliabel
PE_EASE 0.867 Reliabel
PE_UTIL 0.852 Reliabel
PE_OUT 0.873 Reliabel
CU 0.711 Reliabel
ATU 0.831 Reliabel
AUP 0.670 Tidak Reliabel
MIUA 0.853 Reliabel

9 Evaluasi Inner Model

9.1 Model Fit Indices

fi <- fitMeasures(fit_sem, c("chisq", "df", "pvalue", "cfi", "tli",
                              "rmsea", "rmsea.ci.lower", "rmsea.ci.upper",
                              "srmr", "gfi", "agfi", "nfi"))

fit_table <- data.frame(
  Indeks    = c("Chi-Square", "df", "p-value", "CFI", "TLI",
                "RMSEA", "RMSEA CI Lower", "RMSEA CI Upper",
                "SRMR", "GFI", "AGFI", "NFI"),
  Nilai     = round(fi, 4),
  Threshold = c("-", "-", "> 0.05", ">= 0.90", ">= 0.90",
                "< 0.08", "-", "-", "< 0.08", ">= 0.90", ">= 0.90", ">= 0.90"),
  Status    = c("-", "-",
    ifelse(fi["pvalue"] > 0.05, "Baik", "Kurang"),
    ifelse(fi["cfi"]   >= 0.90, "Baik", "Kurang"),
    ifelse(fi["tli"]   >= 0.90, "Baik", "Kurang"),
    ifelse(fi["rmsea"] <  0.08, "Baik", "Kurang"),
    "-", "-",
    ifelse(fi["srmr"]  <  0.08, "Baik", "Kurang"),
    ifelse(fi["gfi"]   >= 0.90, "Baik", "Kurang"),
    ifelse(fi["agfi"]  >= 0.90, "Baik", "Kurang"),
    ifelse(fi["nfi"]   >= 0.90, "Baik", "Kurang"))
)

kable(fit_table, caption = "Model Fit Indices", row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Model Fit Indices
Indeks Nilai Threshold Status
Chi-Square 2272.3512
df 684.0000
p-value 0.0000 > 0.05 Kurang
CFI 0.8802 >= 0.90 Kurang
TLI 0.8702 >= 0.90 Kurang
RMSEA 0.0621 < 0.08 Baik
RMSEA CI Lower 0.0593
RMSEA CI Upper 0.0649
SRMR 0.0667 < 0.08 Baik
GFI 0.8204 >= 0.90 Kurang
AGFI 0.7951 >= 0.90 Kurang
NFI 0.8377 >= 0.90 Kurang

9.2 Koefisien Jalur & Uji Hipotesis

path_results <- standardizedSolution(fit_sem) %>%
  filter(op == "~") %>%
  select(Dependen = lhs, Independen = rhs,
         Beta = est.std, SE = se, z = z, pvalue = pvalue) %>%
  mutate(across(c(Beta, SE, z), ~round(., 3)),
         pvalue    = round(pvalue, 4),
         Sig       = case_when(pvalue < 0.001 ~ "***",
                               pvalue < 0.01  ~ "**",
                               pvalue < 0.05  ~ "*",
                               TRUE           ~ "ns"),
         Keputusan = ifelse(pvalue < 0.05, "Diterima", "Ditolak"))

kable(path_results, caption = "Koefisien Jalur Struktural (Standardized)",
      row.names = FALSE,
      col.names = c("Dependen", "Independen", "Beta", "SE", "z", "p-value", "Sig", "Keputusan")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  footnote(general = "*** p<0.001, ** p<0.01, * p<0.05, ns = tidak signifikan")
Koefisien Jalur Struktural (Standardized)
Dependen Independen Beta SE z p-value Sig Keputusan
ATU PE_EXP 0.134 0.233 0.574 0.5659 ns Ditolak
ATU PE_EASE -0.289 0.404 -0.715 0.4749 ns Ditolak
ATU PE_UTIL 0.197 0.502 0.392 0.6951 ns Ditolak
ATU PE_OUT 0.596 0.339 1.757 0.0789 ns Ditolak
ATU CU 0.184 0.053 3.462 0.0005 *** Diterima
AUP ATU 0.810 0.037 21.740 0.0000 *** Diterima
MIUA ATU 0.366 0.102 3.588 0.0003 *** Diterima
MIUA AUP 0.547 0.103 5.331 0.0000 *** Diterima
Note:
*** p<0.001, ** p<0.01, * p<0.05, ns = tidak signifikan

9.3 R-Squared

r2_vals <- lavInspect(fit_sem, "r2")
r2_df <- data.frame(
  Konstruk  = names(r2_vals),
  R_squared = round(r2_vals, 3),
  Kategori  = case_when(r2_vals >= 0.67 ~ "Kuat",
                        r2_vals >= 0.33 ~ "Moderat",
                        r2_vals >= 0.19 ~ "Lemah",
                        TRUE            ~ "Sangat Lemah")
) %>% filter(R_squared > 0)

kable(r2_df, caption = "R-Squared per Konstruk Endogen",
      row.names = FALSE, col.names = c("Konstruk", "R2", "Kategori")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
R-Squared per Konstruk Endogen
Konstruk R2 Kategori
PE1 0.561 Moderat
PE2 0.618 Moderat
PE3 0.590 Moderat
PE4 0.576 Moderat
PE5 0.590 Moderat
PE6 0.555 Moderat
PE7 0.577 Moderat
PE8 0.642 Moderat
PE9 0.539 Moderat
PE10 0.513 Moderat
PE11 0.597 Moderat
PE12 0.515 Moderat
PE13 0.500 Moderat
PE14 0.462 Moderat
PE15 0.605 Moderat
PE16 0.610 Moderat
PE17 0.545 Moderat
PE18 0.635 Moderat
PE19 0.515 Moderat
PE20 0.611 Moderat
CU1 0.581 Moderat
CU2 0.644 Moderat
CU3 0.207 Lemah
CU4 0.266 Lemah
ATU1 0.391 Moderat
ATU2 0.511 Moderat
ATU3 0.618 Moderat
ATU4 0.481 Moderat
ATU5 0.468 Moderat
AUP1 0.206 Lemah
AUP2 0.256 Lemah
AUP3 0.074 Sangat Lemah
AUP4 0.456 Moderat
AUP5 0.605 Moderat
MIUA1 0.590 Moderat
MIUA2 0.590 Moderat
MIUA3 0.633 Moderat
MIUA4 0.438 Moderat
MIUA5 0.483 Moderat
ATU 0.500 Moderat
AUP 0.656 Moderat
MIUA 0.757 Kuat

10 Visualisasi Path Diagram

10.1 Full Model

semPaths(fit_sem, what = "std", whatLabels = "std", style = "ram",
         layout = "tree2", rotation = 2, curve = 0.5,
         color = list(lat = "#2196F3", man = "#E3F2FD"),
         edge.label.cex = 0.65, sizeMan = 4, sizeLat = 8,
         residuals = TRUE, intercepts = FALSE, nCharNodes = 6,
         mar = c(4, 4, 4, 4))
title("Path Diagram: SEM AI Adoption (Standardized)", cex.main = 1.2)
Path Diagram SEM (Full)

Path Diagram SEM (Full)

10.2 Structural Model (Konstruk Saja)

params     <- parameterEstimates(fit_sem, standardized = TRUE)
str_params <- params[params$op == "~", ]
lv_names   <- intersect(c("PE_EXP","PE_EASE","PE_UTIL","PE_OUT","CU","ATU","AUP","MIUA"),
                        rownames(lavInspect(fit_sem, "cor.lv")))

adj_matrix <- matrix(0, length(lv_names), length(lv_names),
                     dimnames = list(lv_names, lv_names))
for (i in seq_len(nrow(str_params))) {
  f <- str_params$rhs[i]; t <- str_params$lhs[i]
  if (f %in% lv_names && t %in% lv_names)
    adj_matrix[f, t] <- round(str_params$std.all[i], 3)
}

qgraph(t(adj_matrix), layout = "spring", edge.labels = TRUE,
       label.cex = 1.2, node.width = 1.5, node.height = 1.5,
       color = "#C8E6C9", border.color = "#388E3C",
       edge.label.cex = 0.9, mar = c(3, 3, 3, 3),
       title = "Structural Model (Konstruk Laten)")
Structural Model (Konstruk Laten Saja)

Structural Model (Konstruk Laten Saja)


11 Ringkasan Hipotesis

hipotesis_df <- data.frame(
  Hipotesis = c("H1a","H1b","H1c","H1d","H2","H3","H4","H5"),
  Jalur     = c("PE_EXP -> ATU","PE_EASE -> ATU","PE_UTIL -> ATU","PE_OUT -> ATU",
                "CU -> ATU","ATU -> AUP","ATU -> MIUA","AUP -> MIUA"),
  Arah_Exp  = c("+","+","+","+","-","+","+","+"),
  Beta      = NA_real_, pvalue = NA_real_, Keputusan = NA_character_
)

for (i in seq_len(nrow(hipotesis_df))) {
  j   <- strsplit(hipotesis_df$Jalur[i], " -> ")[[1]]
  row <- path_results %>% filter(Independen == j[1], Dependen == j[2])
  if (nrow(row) > 0) {
    hipotesis_df$Beta[i]      <- row$Beta[1]
    hipotesis_df$pvalue[i]    <- row$pvalue[1]
    hipotesis_df$Keputusan[i] <- row$Keputusan[1]
  }
}

kable(hipotesis_df, caption = "Ringkasan Pengujian Hipotesis",
      row.names = FALSE,
      col.names = c("Hipotesis","Jalur","Arah","Beta","p-value","Keputusan")) %>%
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Ringkasan Pengujian Hipotesis
Hipotesis Jalur Arah Beta p-value Keputusan
H1a PE_EXP -> ATU
0.134 0.5659 Ditolak
H1b PE_EASE -> ATU
-0.289 0.4749 Ditolak
H1c PE_UTIL -> ATU
0.197 0.6951 Ditolak
H1d PE_OUT -> ATU
0.596 0.0789 Ditolak
H2 CU -> ATU
0.184 0.0005 Diterima
H3 ATU -> AUP
0.810 0.0000 Diterima
H4 ATU -> MIUA
0.366 0.0003 Diterima
H5 AUP -> MIUA
0.547 0.0000 Diterima

Analisis SEM menggunakan framework TAM/UTAUT. Dataset: AI Adoption in Indonesian Higher Education (Mendeley Data, 2025). Diolah dengan R lavaan.