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()