library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(stringr)
library(plspm)
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:plspm':
## 
##     alpha

Baca dataset

data_raw <- read.csv(
  "Student_Satisfaction_Survey.csv",
  fileEncoding = "Windows-1252",
  stringsAsFactors = FALSE,
  check.names = FALSE
)

Rapikan nama kolom

names(data_raw) <- trimws(names(data_raw))
names(data_raw) <- make.names(names(data_raw))

Cek struktur data

str(data_raw)
## 'data.frame':    580 obs. of  12 variables:
##  $ SN                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Total.Feedback.Given: int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Total.Configured    : int  12 12 12 12 12 12 12 12 12 12 ...
##  $ Questions           : chr  "How much of the syllabus was covered in the class?" "How well did the teachers prepare for the classes?" "How well were the teachers able to communicate?" "The teacher’s approach to teaching can best be described as" ...
##  $ Weightage.1         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Weightage.2         : int  0 0 0 0 0 0 0 1 0 0 ...
##  $ Weightage.3         : int  1 0 0 1 0 0 1 0 0 1 ...
##  $ Weightage.4         : int  0 0 0 0 1 1 0 0 1 0 ...
##  $ Weightage.5         : int  0 1 1 0 0 0 0 0 0 0 ...
##  $ Average..Percentage : chr  "3.00 / 60.00" "5.00 / 100.00" "5.00 / 100.00" "3.00 / 60.00" ...
##  $ Course.Name         : chr  "FY B.VOC FOOD TECHNOLOGY" "FY B.VOC FOOD TECHNOLOGY" "FY B.VOC FOOD TECHNOLOGY" "FY B.VOC FOOD TECHNOLOGY" ...
##  $ Basic.Course        : chr  "B.VOC FOOD TECHNOLOGY" "B.VOC FOOD TECHNOLOGY" "B.VOC FOOD TECHNOLOGY" "B.VOC FOOD TECHNOLOGY" ...
head(data_raw)
##   SN Total.Feedback.Given Total.Configured
## 1  1                    1               12
## 2  2                    1               12
## 3  3                    1               12
## 4  4                    1               12
## 5  5                    1               12
## 6  6                    1               12
##                                                      Questions Weightage.1
## 1           How much of the syllabus was covered in the class?           0
## 2           How well did the teachers prepare for the classes?           0
## 3              How well were the teachers able to communicate?           0
## 4  The teacher’s approach to teaching can best be described as           0
## 5 Fairness of the internal evaluation process by the teachers.           0
## 6      Was your performance in assignments discussed with you?           0
##   Weightage.2 Weightage.3 Weightage.4 Weightage.5 Average..Percentage
## 1           0           1           0           0        3.00 / 60.00
## 2           0           0           0           1       5.00 / 100.00
## 3           0           0           0           1       5.00 / 100.00
## 4           0           1           0           0        3.00 / 60.00
## 5           0           0           1           0        4.00 / 80.00
## 6           0           0           1           0        4.00 / 80.00
##                Course.Name          Basic.Course
## 1 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY
## 2 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY
## 3 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY
## 4 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY
## 5 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY
## 6 FY B.VOC FOOD TECHNOLOGY B.VOC FOOD TECHNOLOGY

Ambil nilai rata-rata dari kolom Average/Percentage Contoh isi kolom: “4.56 / 91.11”

data_raw <- data_raw %>%
  mutate(
    AvgScore = as.numeric(sub("\\s*/.*$", "", Average..Percentage)),
    PercentScore = as.numeric(trimws(sub("^.*?/\\s*", "", Average..Percentage))),
    QuestionCode = paste0("Q", SN)
  )

Ubah data dari format panjang menjadi format lebar Setiap Course Name menjadi 1 baris, Q1-Q20 menjadi kolom

data_wide <- data_raw %>%
  select(
    Course.Name,
    Basic.Course,
    Total.Feedback.Given,
    Total.Configured,
    QuestionCode,
    AvgScore
  ) %>%
  pivot_wider(
    names_from = QuestionCode,
    values_from = AvgScore
  )

Cek hasil transformasi

head(data_wide)
## # A tibble: 6 × 24
##   Course.Name     Basic.Course Total.Feedback.Given Total.Configured    Q1    Q2
##   <chr>           <chr>                       <int>            <int> <dbl> <dbl>
## 1 "FY B.VOC FOOD… B.VOC FOOD …                    1               12  3     5   
## 2 "FYBA"          BACHELOR OF…                    1              144  5     5   
## 3 "FY BCOM (ACCO… BACHELOR OF…                   74              119  4.15  3.82
## 4 "FY BCOM (BANK… BACHELOR OF…                   20               33  4.7   4.05
## 5 "FYBMS "        BACHELOR OF…                   26              122  3.88  3.88
## 6 "FYBSC"         BACHELOR OF…                   12              175  3.92  4.25
## # ℹ 18 more variables: Q3 <dbl>, Q4 <dbl>, Q5 <dbl>, Q6 <dbl>, Q7 <dbl>,
## #   Q8 <dbl>, Q9 <dbl>, Q10 <dbl>, Q11 <dbl>, Q12 <dbl>, Q13 <dbl>, Q14 <dbl>,
## #   Q15 <dbl>, Q16 <dbl>, Q17 <dbl>, Q18 <dbl>, Q19 <dbl>, Q20 <dbl>
dim(data_wide)
## [1] 29 24

Membentuk data untuk model PLS Mapping indikator: KD = Kinerja Dosen TMS = Treatment towards Students / Perlakuan terhadap Mahasiswa SP = Sarana Prasarana SAT = Overall Satisfaction

data_pls <- data_wide %>%
  transmute(
    course_name = Course.Name,
    basic_course = Basic.Course,
    total_feedback = Total.Feedback.Given,

    # Kinerja Dosen
    KD1 = Q1,   # syllabus covered
    KD2 = Q2,   # teacher preparation
    KD3 = Q3,   # teacher communication
    KD4 = Q4,   # teaching approach
    KD5 = Q12,  # examples and applications
    KD6 = Q16,  # student-centric learning method

    # Perlakuan terhadap Mahasiswa
    TMS1 = Q5,   # fairness of evaluation
    TMS2 = Q6,   # assignment discussion
    TMS3 = Q10,  # competencies and outcomes informed
    TMS4 = Q11,  # mentor follow-up
    TMS5 = Q13,  # strengths identified
    TMS6 = Q14,  # weaknesses helped
    TMS7 = Q17,  # encouragement in extracurricular activities

    # Sarana Prasarana dan Dukungan Kampus
    SP1 = Q7,   # internship, exchange, field visit
    SP2 = Q8,   # teaching and mentoring support
    SP3 = Q9,   # opportunities to learn and grow
    SP4 = Q15,  # quality improvement process
    SP5 = Q18,  # soft skills and employability skills
    SP6 = Q19,  # ICT tools in teaching

    # Variabel dependen
    SAT = Q20   # overall quality / satisfaction
  )

Hilangkan data kosong jika ada

data_pls_clean <- na.omit(data_pls)

Cek data akhir

head(data_pls_clean)
## # A tibble: 6 × 23
##   course_name    basic_course total_feedback   KD1   KD2   KD3   KD4   KD5   KD6
##   <chr>          <chr>                 <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 "FY B.VOC FOO… B.VOC FOOD …              1  3     5     5     3     5     3   
## 2 "FYBA"         BACHELOR OF…              1  5     5     5     5     5     4   
## 3 "FY BCOM (ACC… BACHELOR OF…             74  4.15  3.82  4.28  3.86  4.23  4.01
## 4 "FY BCOM (BAN… BACHELOR OF…             20  4.7   4.05  4.5   4.35  4.1   4.3 
## 5 "FYBMS "       BACHELOR OF…             26  3.88  3.88  4.12  4     4.08  3.92
## 6 "FYBSC"        BACHELOR OF…             12  3.92  4.25  4.67  3.58  3.83  3.92
## # ℹ 14 more variables: TMS1 <dbl>, TMS2 <dbl>, TMS3 <dbl>, TMS4 <dbl>,
## #   TMS5 <dbl>, TMS6 <dbl>, TMS7 <dbl>, SP1 <dbl>, SP2 <dbl>, SP3 <dbl>,
## #   SP4 <dbl>, SP5 <dbl>, SP6 <dbl>, SAT <dbl>
summary(data_pls_clean)
##     course_name    basic_course total_feedback       KD1             KD2      
##  Length   :29   Length   :29    Min.   : 1.00   Min.   :3.000   Min.   :3.29  
##  N.unique :29   N.unique :16    1st Qu.: 3.00   1st Qu.:3.570   1st Qu.:3.71  
##  N.blank  : 0   N.blank  : 0    Median : 7.00   Median :3.860   Median :4.00  
##  Min.nchar: 4   Min.nchar:11    Mean   :14.31   Mean   :3.953   Mean   :4.09  
##  Max.nchar:32   Max.nchar:45    3rd Qu.:17.00   3rd Qu.:4.540   3rd Qu.:4.35  
##                                 Max.   :74.00   Max.   :5.000   Max.   :5.00  
##       KD3             KD4             KD5             KD6       
##  Min.   :3.000   Min.   :2.670   Min.   :1.670   Min.   :2.500  
##  1st Qu.:3.800   1st Qu.:3.140   1st Qu.:3.790   1st Qu.:3.620  
##  Median :4.210   Median :3.620   Median :4.100   Median :3.860  
##  Mean   :4.197   Mean   :3.716   Mean   :4.067   Mean   :3.784  
##  3rd Qu.:4.500   3rd Qu.:4.110   3rd Qu.:4.500   3rd Qu.:4.040  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       TMS1            TMS2           TMS3           TMS4            TMS5      
##  Min.   :3.290   Min.   :2.67   Min.   :3.00   Min.   :2.000   Min.   :1.330  
##  1st Qu.:4.000   1st Qu.:3.64   1st Qu.:3.50   1st Qu.:3.370   1st Qu.:3.070  
##  Median :4.250   Median :4.00   Median :4.15   Median :3.760   Median :3.710  
##  Mean   :4.216   Mean   :3.91   Mean   :3.98   Mean   :3.719   Mean   :3.615  
##  3rd Qu.:4.500   3rd Qu.:4.24   3rd Qu.:4.43   3rd Qu.:4.070   3rd Qu.:4.270  
##  Max.   :5.000   Max.   :5.00   Max.   :5.00   Max.   :5.000   Max.   :5.000  
##       TMS6            TMS7            SP1             SP2             SP3      
##  Min.   :2.430   Min.   :3.000   Min.   :2.000   Min.   :1.330   Min.   :2.67  
##  1st Qu.:3.250   1st Qu.:3.670   1st Qu.:3.430   1st Qu.:3.330   1st Qu.:3.50  
##  Median :3.760   Median :4.000   Median :3.700   Median :3.600   Median :3.71  
##  Mean   :3.705   Mean   :3.901   Mean   :3.619   Mean   :3.578   Mean   :3.78  
##  3rd Qu.:4.040   3rd Qu.:4.190   3rd Qu.:4.000   3rd Qu.:4.110   3rd Qu.:4.03  
##  Max.   :5.000   Max.   :4.670   Max.   :5.000   Max.   :5.000   Max.   :5.00  
##       SP4             SP5             SP6             SAT       
##  Min.   :2.670   Min.   :2.000   Min.   :2.330   Min.   :2.330  
##  1st Qu.:3.400   1st Qu.:3.540   1st Qu.:3.000   1st Qu.:3.430  
##  Median :3.790   Median :4.000   Median :3.500   Median :3.940  
##  Mean   :3.778   Mean   :3.853   Mean   :3.583   Mean   :3.812  
##  3rd Qu.:4.070   3rd Qu.:4.130   3rd Qu.:4.000   3rd Qu.:4.110  
##  Max.   :4.780   Max.   :5.000   Max.   :5.000   Max.   :4.560

Model PLS-SEM

Nama konstruk laten

latent_vars <- c("KD", "TMS", "SP", "SAT")

Inner model / structural model KD, TMS, SP memengaruhi SAT

inner_model <- matrix(0, nrow = 4, ncol = 4)
colnames(inner_model) <- rownames(inner_model) <- latent_vars

inner_model["SAT", "KD"]  <- 1
inner_model["SAT", "TMS"] <- 1
inner_model["SAT", "SP"]  <- 1

inner_model
##     KD TMS SP SAT
## KD   0   0  0   0
## TMS  0   0  0   0
## SP   0   0  0   0
## SAT  1   1  1   0

Outer model / measurement model

outer_model <- list(
  KD  = c("KD1", "KD2", "KD3", "KD4", "KD5", "KD6"),
  TMS = c("TMS1", "TMS2", "TMS3", "TMS4", "TMS5", "TMS6", "TMS7"),
  SP  = c("SP1", "SP2", "SP3", "SP4", "SP5", "SP6"),
  SAT = c("SAT")
)

Mode pengukuran A = reflective measurement

modes <- c("A", "A", "A", "A")

Data numerik untuk PLS

pls_data <- data_pls_clean %>%
  select(KD1:SAT)

Jalankan PLS-SEM

model_pls <- plspm(
  Data = pls_data,
  path_matrix = inner_model,
  blocks = outer_model,
  modes = modes,
  scheme = "path",
  scaled = TRUE,
  boot.val = TRUE,
  br = 5000
)
## Warning: Setting row names on a tibble is deprecated.

Plot Inner Model / Path Diagram

if (!require(DiagrammeR)) {
  install.packages("DiagrammeR", dependencies = TRUE)
  library(DiagrammeR)
}
## Loading required package: DiagrammeR
## 
## Attaching package: 'DiagrammeR'
## The following object is masked from 'package:plspm':
## 
##     get_paths
# Ambil nilai path coefficient
path_coef <- model_pls$path_coefs

coef_KD_SAT  <- round(path_coef["SAT", "KD"], 3)
coef_TMS_SAT <- round(path_coef["SAT", "TMS"], 3)
coef_SP_SAT  <- round(path_coef["SAT", "SP"], 3)

# Path Diagram
DiagrammeR::grViz(paste0("
digraph pls_model {

  graph [layout = dot, rankdir = LR]

  node [
    shape = box,
    style = 'rounded, filled',
    fillcolor = '#E8F0FE',
    color = '#2B4C7E',
    fontname = 'Arial',
    fontsize = 12
  ]

  KD  [label = 'Kinerja Dosen\\n(KD)']
  TMS [label = 'Perlakuan terhadap\\nMahasiswa (TMS)']
  SP  [label = 'Sarana Prasarana\\n(SP)']
  SAT [label = 'Overall Satisfaction\\n(SAT)']

  edge [
    fontname = 'Arial',
    fontsize = 11,
    arrowsize = 0.8
  ]

  # Garis merah putus-putus karena nilainya negatif / tidak signifikan
  KD -> SAT [
    label = '", coef_KD_SAT, "',
    color = 'red',
    fontcolor = 'red',
    style = 'dashed'
  ]

  # Garis normal
  TMS -> SAT [
    label = '", coef_TMS_SAT, "',
    color = '#333333',
    fontcolor = '#333333'
  ]

  # Garis hijau dan tebal karena SP -> SAT paling signifikan
  SP -> SAT [
    label = '", coef_SP_SAT, "',
    color = 'darkgreen',
    fontcolor = 'darkgreen',
    penwidth = 2.5
  ]
}
"))

Scatter Plot Korelasi SP terhadap SAT

data_scatter <- data_pls_clean %>%
  mutate(
    Sarana_Prasarana = rowMeans(select(., SP1:SP6), na.rm = TRUE),
    Overall_Satisfaction = SAT
  )

# Korelasi antara SP dan SAT
cor_sp_sat <- cor(
  data_scatter$Sarana_Prasarana,
  data_scatter$Overall_Satisfaction,
  use = "complete.obs"
)

cor_sp_sat
## [1] 0.8624027
# Scatter plot
ggplot(data_scatter, aes(x = Sarana_Prasarana, y = Overall_Satisfaction)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(
    title = "Hubungan Sarana Prasarana terhadap Overall Satisfaction",
    subtitle = paste0("Korelasi = ", round(cor_sp_sat, 3), 
                      " | p-value SP -> SAT = 0.002"),
    x = "Sarana Prasarana",
    y = "Overall Satisfaction"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Loading Plot

loading_data <- model_pls$outer_model %>%
  select(block, name, loading) %>%
  mutate(
    block = recode(
      block,
      "KD" = "Kinerja Dosen",
      "TMS" = "Perlakuan terhadap Mahasiswa",
      "SP" = "Sarana Prasarana",
      "SAT" = "Overall Satisfaction"
    )
  )

# Lihat tabel loading
loading_data
##                           block name   loading
## 1                 Kinerja Dosen  KD1 0.8600602
## 2                 Kinerja Dosen  KD2 0.6977578
## 3                 Kinerja Dosen  KD3 0.7982069
## 4                 Kinerja Dosen  KD4 0.8874880
## 5                 Kinerja Dosen  KD5 0.8275934
## 6                 Kinerja Dosen  KD6 0.8086606
## 7  Perlakuan terhadap Mahasiswa TMS1 0.7887433
## 8  Perlakuan terhadap Mahasiswa TMS2 0.8149639
## 9  Perlakuan terhadap Mahasiswa TMS3 0.9031043
## 10 Perlakuan terhadap Mahasiswa TMS4 0.7446640
## 11 Perlakuan terhadap Mahasiswa TMS5 0.8944322
## 12 Perlakuan terhadap Mahasiswa TMS6 0.8284409
## 13 Perlakuan terhadap Mahasiswa TMS7 0.7432445
## 14             Sarana Prasarana  SP1 0.7570540
## 15             Sarana Prasarana  SP2 0.8534969
## 16             Sarana Prasarana  SP3 0.7673543
## 17             Sarana Prasarana  SP4 0.9345524
## 18             Sarana Prasarana  SP5 0.8940917
## 19             Sarana Prasarana  SP6 0.2018356
## 20         Overall Satisfaction  SAT 1.0000000
# Plot loading indikator
ggplot(loading_data, aes(x = reorder(name, loading), y = loading)) +
  geom_col() +
  coord_flip() +
  facet_wrap(~ block, scales = "free_y") +
  labs(
    title = "Loading Plot Indikator pada Setiap Variabel Laten",
    x = "Indikator",
    y = "Outer Loading"
  ) +
  theme_minimal()

Ringkasan model

summary(model_pls)
## PARTIAL LEAST SQUARES PATH MODELING (PLS-PM) 
## 
## ---------------------------------------------------------- 
## MODEL SPECIFICATION 
## 1   Number of Cases      29 
## 2   Latent Variables     4 
## 3   Manifest Variables   20 
## 4   Scale of Data        Standardized Data 
## 5   Non-Metric PLS       FALSE 
## 6   Weighting Scheme     path 
## 7   Tolerance Crit       1e-06 
## 8   Max Num Iters        100 
## 9   Convergence Iters    3 
## 10  Bootstrapping        TRUE 
## 11  Bootstrap samples    5000 
## 
## ---------------------------------------------------------- 
## BLOCKS DEFINITION 
##     Block         Type   Size   Mode
## 1      KD    Exogenous      6      A
## 2     TMS    Exogenous      7      A
## 3      SP    Exogenous      6      A
## 4     SAT   Endogenous      1      A
## 
## ---------------------------------------------------------- 
## BLOCKS UNIDIMENSIONALITY 
##      Mode  MVs  C.alpha  DG.rho  eig.1st  eig.2nd
## KD      A    6    0.900   0.924     4.02    0.970
## TMS     A    7    0.917   0.934     4.70    0.678
## SP      A    6    0.841   0.891     3.61    1.126
## SAT     A    1    1.000   1.000     1.00    0.000
## 
## ---------------------------------------------------------- 
## OUTER MODEL 
##           weight  loading  communality  redundancy
## KD                                                
##   1 KD1   0.2288    0.860       0.7397       0.000
##   1 KD2   0.1218    0.698       0.4869       0.000
##   1 KD3   0.1832    0.798       0.6371       0.000
##   1 KD4   0.2365    0.887       0.7876       0.000
##   1 KD5   0.1919    0.828       0.6849       0.000
##   1 KD6   0.2514    0.809       0.6539       0.000
## TMS                                               
##   2 TMS1  0.1366    0.789       0.6221       0.000
##   2 TMS2  0.1590    0.815       0.6642       0.000
##   2 TMS3  0.1749    0.903       0.8156       0.000
##   2 TMS4  0.1684    0.745       0.5545       0.000
##   2 TMS5  0.2288    0.894       0.8000       0.000
##   2 TMS6  0.1873    0.828       0.6863       0.000
##   2 TMS7  0.1608    0.743       0.5524       0.000
## SP                                                
##   3 SP1   0.2022    0.757       0.5731       0.000
##   3 SP2   0.2457    0.853       0.7285       0.000
##   3 SP3   0.1912    0.767       0.5888       0.000
##   3 SP4   0.2708    0.935       0.8734       0.000
##   3 SP5   0.2559    0.894       0.7994       0.000
##   3 SP6   0.0427    0.202       0.0407       0.000
## SAT                                               
##   4 SAT   1.0000    1.000       1.0000       0.796
## 
## ---------------------------------------------------------- 
## CROSSLOADINGS 
##              KD    TMS     SP    SAT
## KD                                  
##   1 KD1   0.860  0.793  0.765  0.702
##   1 KD2   0.698  0.589  0.368  0.374
##   1 KD3   0.798  0.664  0.571  0.562
##   1 KD4   0.887  0.897  0.855  0.725
##   1 KD5   0.828  0.753  0.659  0.589
##   1 KD6   0.809  0.829  0.833  0.771
## TMS                                 
##   2 TMS1  0.786  0.789  0.687  0.530
##   2 TMS2  0.818  0.815  0.750  0.616
##   2 TMS3  0.794  0.903  0.800  0.678
##   2 TMS4  0.693  0.745  0.687  0.653
##   2 TMS5  0.818  0.894  0.875  0.887
##   2 TMS6  0.764  0.828  0.764  0.726
##   2 TMS7  0.726  0.743  0.641  0.623
## SP                                  
##   3 SP1   0.527  0.583  0.757  0.647
##   3 SP2   0.741  0.845  0.853  0.786
##   3 SP3   0.701  0.702  0.767  0.612
##   3 SP4   0.837  0.884  0.935  0.866
##   3 SP5   0.761  0.788  0.894  0.819
##   3 SP6   0.440  0.329  0.202  0.136
## SAT                                 
##   4 SAT   0.787  0.838  0.891  1.000
## 
## ---------------------------------------------------------- 
## INNER MODEL 
## $SAT
##              Estimate   Std. Error     t value   Pr(>|t|)
## Intercept    4.01e-16       0.0902    4.44e-15    1.00000
## KD          -1.99e-02       0.2645   -7.54e-02    0.94051
## TMS          1.61e-01       0.3315    4.86e-01    0.63136
## SP           7.60e-01       0.2236    3.40e+00    0.00226
## 
## ---------------------------------------------------------- 
## CORRELATIONS BETWEEN LVs 
##         KD    TMS     SP    SAT
## KD   1.000  0.940  0.863  0.787
## TMS  0.940  1.000  0.915  0.838
## SP   0.863  0.915  1.000  0.891
## SAT  0.787  0.838  0.891  1.000
## 
## ---------------------------------------------------------- 
## SUMMARY INNER MODEL 
##            Type     R2  Block_Communality  Mean_Redundancy    AVE
## KD    Exogenous  0.000              0.665            0.000  0.665
## TMS   Exogenous  0.000              0.671            0.000  0.671
## SP    Exogenous  0.000              0.601            0.000  0.601
## SAT  Endogenous  0.796              1.000            0.796  1.000
## 
## ---------------------------------------------------------- 
## GOODNESS-OF-FIT 
## [1]  0.7177
## 
## ---------------------------------------------------------- 
## TOTAL EFFECTS 
##    relationships   direct  indirect    total
## 1      KD -> TMS   0.0000         0   0.0000
## 2       KD -> SP   0.0000         0   0.0000
## 3      KD -> SAT  -0.0199         0  -0.0199
## 4      TMS -> SP   0.0000         0   0.0000
## 5     TMS -> SAT   0.1610         0   0.1610
## 6      SP -> SAT   0.7604         0   0.7604
## 
## --------------------------------------------------------- 
## BOOTSTRAP VALIDATION 
## weights 
##           Original  Mean.Boot  Std.Error  perc.025  perc.975
## KD-KD1      0.2288     0.2314   4.55e-02    0.1656     0.340
## KD-KD2      0.1218     0.1170   5.36e-02   -0.0208     0.192
## KD-KD3      0.1832     0.1780   3.76e-02    0.0814     0.235
## KD-KD4      0.2365     0.2453   4.98e-02    0.1742     0.361
## KD-KD5      0.1919     0.1703   5.32e-02    0.0281     0.234
## KD-KD6      0.2514     0.2535   4.41e-02    0.1890     0.356
## TMS-TMS1    0.1366     0.1363   1.59e-02    0.1043     0.167
## TMS-TMS2    0.1590     0.1544   2.02e-02    0.1069     0.188
## TMS-TMS3    0.1749     0.1774   2.26e-02    0.1415     0.227
## TMS-TMS4    0.1684     0.1669   1.73e-02    0.1307     0.198
## TMS-TMS5    0.2288     0.2290   2.40e-02    0.1918     0.287
## TMS-TMS6    0.1873     0.1907   2.35e-02    0.1533     0.245
## TMS-TMS7    0.1608     0.1562   2.80e-02    0.0930     0.203
## SP-SP1      0.2022     0.2014   2.37e-02    0.1531     0.247
## SP-SP2      0.2457     0.2354   2.75e-02    0.1643     0.275
## SP-SP3      0.1912     0.1854   3.47e-02    0.1002     0.237
## SP-SP4      0.2708     0.2675   2.19e-02    0.2279     0.314
## SP-SP5      0.2559     0.2587   2.78e-02    0.2166     0.322
## SP-SP6      0.0427     0.0448   5.00e-02   -0.0510     0.151
## SAT-SAT     1.0000     1.0000   1.22e-16    1.0000     1.000
## 
## loadings 
##           Original  Mean.Boot  Std.Error  perc.025  perc.975
## KD-KD1       0.860      0.866   7.52e-02     0.768     0.942
## KD-KD2       0.698      0.666   1.85e-01     0.179     0.903
## KD-KD3       0.798      0.766   1.40e-01     0.368     0.924
## KD-KD4       0.887      0.895   6.98e-02     0.829     0.960
## KD-KD5       0.828      0.795   1.30e-01     0.409     0.927
## KD-KD6       0.809      0.823   8.25e-02     0.694     0.919
## TMS-TMS1     0.789      0.783   7.02e-02     0.620     0.891
## TMS-TMS2     0.815      0.805   7.10e-02     0.635     0.915
## TMS-TMS3     0.903      0.905   2.56e-02     0.853     0.955
## TMS-TMS4     0.745      0.747   1.10e-01     0.498     0.912
## TMS-TMS5     0.894      0.898   3.15e-02     0.827     0.949
## TMS-TMS6     0.828      0.835   5.77e-02     0.709     0.925
## TMS-TMS7     0.743      0.733   9.18e-02     0.516     0.873
## SP-SP1       0.757      0.754   8.57e-02     0.551     0.879
## SP-SP2       0.853      0.846   7.43e-02     0.655     0.943
## SP-SP3       0.767      0.756   1.25e-01     0.459     0.942
## SP-SP4       0.935      0.937   2.28e-02     0.889     0.974
## SP-SP5       0.894      0.902   2.57e-02     0.846     0.947
## SP-SP6       0.202      0.205   1.95e-01    -0.189     0.587
## SAT-SAT      1.000      1.000   6.70e-17     1.000     1.000
## 
## paths 
##             Original  Mean.Boot  Std.Error  perc.025  perc.975
## KD -> SAT    -0.0199   3.76e-05      0.260    -0.504     0.525
## TMS -> SAT    0.1610   1.69e-01      0.366    -0.550     0.927
## SP -> SAT     0.7604   7.36e-01      0.222     0.215     1.092
## 
## rsq 
##      Original  Mean.Boot  Std.Error  perc.025  perc.975
## SAT     0.796      0.817     0.0798     0.635     0.942
## 
## total.efs 
##             Original  Mean.Boot  Std.Error  perc.025  perc.975
## KD -> TMS     0.0000   0.00e+00      0.000     0.000     0.000
## KD -> SP      0.0000   0.00e+00      0.000     0.000     0.000
## KD -> SAT    -0.0199   3.76e-05      0.260    -0.504     0.525
## TMS -> SP     0.0000   0.00e+00      0.000     0.000     0.000
## TMS -> SAT    0.1610   1.69e-01      0.366    -0.550     0.927
## SP -> SAT     0.7604   7.36e-01      0.222     0.215     1.092

Path coefficient

model_pls$path_coefs
##              KD       TMS        SP SAT
## KD   0.00000000 0.0000000 0.0000000   0
## TMS  0.00000000 0.0000000 0.0000000   0
## SP   0.00000000 0.0000000 0.0000000   0
## SAT -0.01993401 0.1610217 0.7604255   0

Nilai R-square

model_pls$inner_model
## $SAT
##                Estimate Std. Error       t value    Pr(>|t|)
## Intercept  4.006247e-16 0.09023449  4.439818e-15 1.000000000
## KD        -1.993401e-02 0.26445199 -7.537855e-02 0.940513488
## TMS        1.610217e-01 0.33148045  4.857653e-01 0.631364020
## SP         7.604255e-01 0.22359825  3.400856e+00 0.002261987

Outer loading indikator

model_pls$outer_model
##    name block     weight   loading communality redundancy
## 1   KD1    KD 0.22880638 0.8600602  0.73970358  0.0000000
## 2   KD2    KD 0.12180780 0.6977578  0.48686598  0.0000000
## 3   KD3    KD 0.18315762 0.7982069  0.63713427  0.0000000
## 4   KD4    KD 0.23648026 0.8874880  0.78763500  0.0000000
## 5   KD5    KD 0.19189875 0.8275934  0.68491080  0.0000000
## 6   KD6    KD 0.25144689 0.8086606  0.65393192  0.0000000
## 7  TMS1   TMS 0.13659454 0.7887433  0.62211593  0.0000000
## 8  TMS2   TMS 0.15897941 0.8149639  0.66416623  0.0000000
## 9  TMS3   TMS 0.17486437 0.9031043  0.81559733  0.0000000
## 10 TMS4   TMS 0.16838337 0.7446640  0.55452453  0.0000000
## 11 TMS5   TMS 0.22884212 0.8944322  0.80000900  0.0000000
## 12 TMS6   TMS 0.18734191 0.8284409  0.68631429  0.0000000
## 13 TMS7   TMS 0.16078723 0.7432445  0.55241244  0.0000000
## 14  SP1    SP 0.20215230 0.7570540  0.57313075  0.0000000
## 15  SP2    SP 0.24567928 0.8534969  0.72845689  0.0000000
## 16  SP3    SP 0.19120828 0.7673543  0.58883262  0.0000000
## 17  SP4    SP 0.27083110 0.9345524  0.87338822  0.0000000
## 18  SP5    SP 0.25593489 0.8940917  0.79940000  0.0000000
## 19  SP6    SP 0.04267668 0.2018356  0.04073763  0.0000000
## 20  SAT   SAT 1.00000000 1.0000000  1.00000000  0.7964434

Reliability dan validity

model_pls$unidim
##     Mode MVs   C.alpha    DG.rho  eig.1st   eig.2nd
## KD     A   6 0.9004978 0.9238082 4.017739 0.9697862
## TMS    A   7 0.9174276 0.9344934 4.703818 0.6784410
## SP     A   6 0.8408027 0.8909568 3.606143 1.1263341
## SAT    A   1 1.0000000 1.0000000 1.000000 0.0000000

Goodness of Fit

model_pls$gof
## [1] 0.7177342

Hasil bootstrap path coefficient

model_pls$boot$paths
##               Original    Mean.Boot Std.Error   perc.025  perc.975
## KD -> SAT  -0.01993401 3.755729e-05 0.2604939 -0.5036651 0.5246199
## TMS -> SAT  0.16102170 1.689920e-01 0.3663055 -0.5496378 0.9265040
## SP -> SAT   0.76042552 7.364625e-01 0.2222835  0.2154554 1.0918106

Simpan hasil ke file CSV

write.csv(model_pls$path_coefs, "hasil_path_coefficient.csv")
write.csv(model_pls$outer_model, "hasil_outer_loading.csv", row.names = FALSE)
write.csv(model_pls$unidim, "hasil_reliability_validity.csv")
write.csv(model_pls$inner_model, "hasil_inner_model_rsquare.csv", row.names = FALSE)
write.csv(model_pls$boot$paths, "hasil_bootstrap_paths.csv")

Visualisasi

Rata-rata setiap konstruk

data_construct <- data_pls_clean %>%
  mutate(
    Kinerja_Dosen = rowMeans(select(., KD1:KD6), na.rm = TRUE),
    Perlakuan_Mahasiswa = rowMeans(select(., TMS1:TMS7), na.rm = TRUE),
    Sarana_Prasarana = rowMeans(select(., SP1:SP6), na.rm = TRUE),
    Overall_Satisfaction = SAT
  ) %>%
  select(
    course_name,
    Kinerja_Dosen,
    Perlakuan_Mahasiswa,
    Sarana_Prasarana,
    Overall_Satisfaction
  )

Ubah ke format panjang untuk visualisasi

data_long <- data_construct %>%
  pivot_longer(
    cols = c(
      Kinerja_Dosen,
      Perlakuan_Mahasiswa,
      Sarana_Prasarana,
      Overall_Satisfaction
    ),
    names_to = "Variabel",
    values_to = "Nilai"
  )

Boxplot karakteristik data

ggplot(data_long, aes(x = Variabel, y = Nilai)) +
  geom_boxplot() +
  labs(
    title = "Distribusi Variabel Penelitian",
    x = "Variabel",
    y = "Nilai Rata-rata"
  ) +
  theme_minimal()

Barplot rata-rata variabel

data_long %>%
  group_by(Variabel) %>%
  summarise(Rata_rata = mean(Nilai, na.rm = TRUE)) %>%
  ggplot(aes(x = Variabel, y = Rata_rata)) +
  geom_col() +
  labs(
    title = "Rata-rata Konstruk Penelitian",
    x = "Variabel",
    y = "Rata-rata"
  ) +
  theme_minimal()