library(lavaan)
## Warning: package 'lavaan' was built under R version 4.5.3
## This is lavaan 0.6-21
## lavaan is FREE software! Please report any bugs.
library(semPlot)
## Warning: package 'semPlot' was built under R version 4.5.3
library(psych)
## Warning: package 'psych' was built under R version 4.5.3
##
## Attaching package: 'psych'
## The following object is masked from 'package:lavaan':
##
## cor2cov
library(car)
## Warning: package 'car' was built under R version 4.5.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.5.3
## Registered S3 method overwritten by 'car':
## method from
## na.action.merMod lme4
##
## Attaching package: 'car'
## The following object is masked from 'package:psych':
##
## logit
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(semTools)
## Warning: package 'semTools' was built under R version 4.5.3
##
## ###############################################################################
## This is semTools 0.5-8
## All users of R (or SEM) are invited to submit functions or ideas for functions.
## ###############################################################################
##
## Attaching package: 'semTools'
## The following objects are masked from 'package:psych':
##
## reliability, skew
data <- read.csv("C:/Users/Lenovo/Downloads/WA_Fn-UseC_-HR-Employee-Attrition (1).csv")
dim(data)
## [1] 1470 35
str(data)
## 'data.frame': 1470 obs. of 35 variables:
## $ Age : int 41 49 37 33 27 32 59 30 38 36 ...
## $ Attrition : chr "Yes" "No" "Yes" "No" ...
## $ BusinessTravel : chr "Travel_Rarely" "Travel_Frequently" "Travel_Rarely" "Travel_Frequently" ...
## $ DailyRate : int 1102 279 1373 1392 591 1005 1324 1358 216 1299 ...
## $ Department : chr "Sales" "Research & Development" "Research & Development" "Research & Development" ...
## $ DistanceFromHome : int 1 8 2 3 2 2 3 24 23 27 ...
## $ Education : int 2 1 2 4 1 2 3 1 3 3 ...
## $ EducationField : chr "Life Sciences" "Life Sciences" "Other" "Life Sciences" ...
## $ EmployeeCount : int 1 1 1 1 1 1 1 1 1 1 ...
## $ EmployeeNumber : int 1 2 4 5 7 8 10 11 12 13 ...
## $ EnvironmentSatisfaction : int 2 3 4 4 1 4 3 4 4 3 ...
## $ Gender : chr "Female" "Male" "Male" "Female" ...
## $ HourlyRate : int 94 61 92 56 40 79 81 67 44 94 ...
## $ JobInvolvement : int 3 2 2 3 3 3 4 3 2 3 ...
## $ JobLevel : int 2 2 1 1 1 1 1 1 3 2 ...
## $ JobRole : chr "Sales Executive" "Research Scientist" "Laboratory Technician" "Research Scientist" ...
## $ JobSatisfaction : int 4 2 3 3 2 4 1 3 3 3 ...
## $ MaritalStatus : chr "Single" "Married" "Single" "Married" ...
## $ MonthlyIncome : int 5993 5130 2090 2909 3468 3068 2670 2693 9526 5237 ...
## $ MonthlyRate : int 19479 24907 2396 23159 16632 11864 9964 13335 8787 16577 ...
## $ NumCompaniesWorked : int 8 1 6 1 9 0 4 1 0 6 ...
## $ Over18 : chr "Y" "Y" "Y" "Y" ...
## $ OverTime : chr "Yes" "No" "Yes" "Yes" ...
## $ PercentSalaryHike : int 11 23 15 11 12 13 20 22 21 13 ...
## $ PerformanceRating : int 3 4 3 3 3 3 4 4 4 3 ...
## $ RelationshipSatisfaction: int 1 4 2 3 4 3 1 2 2 2 ...
## $ StandardHours : int 80 80 80 80 80 80 80 80 80 80 ...
## $ StockOptionLevel : int 0 1 0 0 1 0 3 1 0 2 ...
## $ TotalWorkingYears : int 8 10 7 8 6 8 12 1 10 17 ...
## $ TrainingTimesLastYear : int 0 3 3 3 3 2 3 2 2 3 ...
## $ WorkLifeBalance : int 1 3 3 3 3 2 2 3 3 2 ...
## $ YearsAtCompany : int 6 10 0 8 2 7 1 1 9 7 ...
## $ YearsInCurrentRole : int 4 7 0 7 2 7 0 0 7 7 ...
## $ YearsSinceLastPromotion : int 0 1 0 3 2 3 0 0 1 7 ...
## $ YearsWithCurrManager : int 5 7 0 0 2 6 0 0 8 7 ...
head(data, 5)
## Age Attrition BusinessTravel DailyRate Department
## 1 41 Yes Travel_Rarely 1102 Sales
## 2 49 No Travel_Frequently 279 Research & Development
## 3 37 Yes Travel_Rarely 1373 Research & Development
## 4 33 No Travel_Frequently 1392 Research & Development
## 5 27 No Travel_Rarely 591 Research & Development
## DistanceFromHome Education EducationField EmployeeCount EmployeeNumber
## 1 1 2 Life Sciences 1 1
## 2 8 1 Life Sciences 1 2
## 3 2 2 Other 1 4
## 4 3 4 Life Sciences 1 5
## 5 2 1 Medical 1 7
## EnvironmentSatisfaction Gender HourlyRate JobInvolvement JobLevel
## 1 2 Female 94 3 2
## 2 3 Male 61 2 2
## 3 4 Male 92 2 1
## 4 4 Female 56 3 1
## 5 1 Male 40 3 1
## JobRole JobSatisfaction MaritalStatus MonthlyIncome MonthlyRate
## 1 Sales Executive 4 Single 5993 19479
## 2 Research Scientist 2 Married 5130 24907
## 3 Laboratory Technician 3 Single 2090 2396
## 4 Research Scientist 3 Married 2909 23159
## 5 Laboratory Technician 2 Married 3468 16632
## NumCompaniesWorked Over18 OverTime PercentSalaryHike PerformanceRating
## 1 8 Y Yes 11 3
## 2 1 Y No 23 4
## 3 6 Y Yes 15 3
## 4 1 Y Yes 11 3
## 5 9 Y No 12 3
## RelationshipSatisfaction StandardHours StockOptionLevel TotalWorkingYears
## 1 1 80 0 8
## 2 4 80 1 10
## 3 2 80 0 7
## 4 3 80 0 8
## 5 4 80 1 6
## TrainingTimesLastYear WorkLifeBalance YearsAtCompany YearsInCurrentRole
## 1 0 1 6 4
## 2 3 3 10 7
## 3 3 3 0 0
## 4 3 3 8 7
## 5 3 3 2 2
## YearsSinceLastPromotion YearsWithCurrManager
## 1 0 5
## 2 1 7
## 3 0 0
## 4 3 0
## 5 2 2
names(data)
## [1] "Age" "Attrition"
## [3] "BusinessTravel" "DailyRate"
## [5] "Department" "DistanceFromHome"
## [7] "Education" "EducationField"
## [9] "EmployeeCount" "EmployeeNumber"
## [11] "EnvironmentSatisfaction" "Gender"
## [13] "HourlyRate" "JobInvolvement"
## [15] "JobLevel" "JobRole"
## [17] "JobSatisfaction" "MaritalStatus"
## [19] "MonthlyIncome" "MonthlyRate"
## [21] "NumCompaniesWorked" "Over18"
## [23] "OverTime" "PercentSalaryHike"
## [25] "PerformanceRating" "RelationshipSatisfaction"
## [27] "StandardHours" "StockOptionLevel"
## [29] "TotalWorkingYears" "TrainingTimesLastYear"
## [31] "WorkLifeBalance" "YearsAtCompany"
## [33] "YearsInCurrentRole" "YearsSinceLastPromotion"
## [35] "YearsWithCurrManager"
data_selected <- data %>%
select(
MonthlyIncome, Education, JobLevel, TotalWorkingYears, NumCompaniesWorked,
JobSatisfaction, EnvironmentSatisfaction, RelationshipSatisfaction,
WorkLifeBalance, JobInvolvement,
YearsAtCompany, YearsInCurrentRole, YearsSinceLastPromotion,
TrainingTimesLastYear, PerformanceRating
)
str(data_selected)
## 'data.frame': 1470 obs. of 15 variables:
## $ MonthlyIncome : int 5993 5130 2090 2909 3468 3068 2670 2693 9526 5237 ...
## $ Education : int 2 1 2 4 1 2 3 1 3 3 ...
## $ JobLevel : int 2 2 1 1 1 1 1 1 3 2 ...
## $ TotalWorkingYears : int 8 10 7 8 6 8 12 1 10 17 ...
## $ NumCompaniesWorked : int 8 1 6 1 9 0 4 1 0 6 ...
## $ JobSatisfaction : int 4 2 3 3 2 4 1 3 3 3 ...
## $ EnvironmentSatisfaction : int 2 3 4 4 1 4 3 4 4 3 ...
## $ RelationshipSatisfaction: int 1 4 2 3 4 3 1 2 2 2 ...
## $ WorkLifeBalance : int 1 3 3 3 3 2 2 3 3 2 ...
## $ JobInvolvement : int 3 2 2 3 3 3 4 3 2 3 ...
## $ YearsAtCompany : int 6 10 0 8 2 7 1 1 9 7 ...
## $ YearsInCurrentRole : int 4 7 0 7 2 7 0 0 7 7 ...
## $ YearsSinceLastPromotion : int 0 1 0 3 2 3 0 0 1 7 ...
## $ TrainingTimesLastYear : int 0 3 3 3 3 2 3 2 2 3 ...
## $ PerformanceRating : int 3 4 3 3 3 3 4 4 4 3 ...
dim(data_selected)
## [1] 1470 15
# 3.1 Cek Missing Value dan Duplikasi
sum(is.na(data_selected))
## [1] 0
colMeans(is.na(data_selected)) * 100
## MonthlyIncome Education JobLevel
## 0 0 0
## TotalWorkingYears NumCompaniesWorked JobSatisfaction
## 0 0 0
## EnvironmentSatisfaction RelationshipSatisfaction WorkLifeBalance
## 0 0 0
## JobInvolvement YearsAtCompany YearsInCurrentRole
## 0 0 0
## YearsSinceLastPromotion TrainingTimesLastYear PerformanceRating
## 0 0 0
duplikat <- data_selected[duplicated(data_selected), ]
nrow(duplikat)
## [1] 0
# 3.2 Konversi ke Numerik
data_numeric <- data_selected
for (col in colnames(data_numeric)) {
if (!is.numeric(data_numeric[[col]])) {
data_numeric[[col]] <- as.numeric(as.factor(data_numeric[[col]]))
}
}
str(data_numeric)
## 'data.frame': 1470 obs. of 15 variables:
## $ MonthlyIncome : int 5993 5130 2090 2909 3468 3068 2670 2693 9526 5237 ...
## $ Education : int 2 1 2 4 1 2 3 1 3 3 ...
## $ JobLevel : int 2 2 1 1 1 1 1 1 3 2 ...
## $ TotalWorkingYears : int 8 10 7 8 6 8 12 1 10 17 ...
## $ NumCompaniesWorked : int 8 1 6 1 9 0 4 1 0 6 ...
## $ JobSatisfaction : int 4 2 3 3 2 4 1 3 3 3 ...
## $ EnvironmentSatisfaction : int 2 3 4 4 1 4 3 4 4 3 ...
## $ RelationshipSatisfaction: int 1 4 2 3 4 3 1 2 2 2 ...
## $ WorkLifeBalance : int 1 3 3 3 3 2 2 3 3 2 ...
## $ JobInvolvement : int 3 2 2 3 3 3 4 3 2 3 ...
## $ YearsAtCompany : int 6 10 0 8 2 7 1 1 9 7 ...
## $ YearsInCurrentRole : int 4 7 0 7 2 7 0 0 7 7 ...
## $ YearsSinceLastPromotion : int 0 1 0 3 2 3 0 0 1 7 ...
## $ TrainingTimesLastYear : int 0 3 3 3 3 2 3 2 2 3 ...
## $ PerformanceRating : int 3 4 3 3 3 3 4 4 4 3 ...
summary(data_numeric)
## MonthlyIncome Education JobLevel TotalWorkingYears
## Min. : 1009 Min. :1.000 Min. :1.000 Min. : 0.00
## 1st Qu.: 2911 1st Qu.:2.000 1st Qu.:1.000 1st Qu.: 6.00
## Median : 4919 Median :3.000 Median :2.000 Median :10.00
## Mean : 6503 Mean :2.913 Mean :2.064 Mean :11.28
## 3rd Qu.: 8379 3rd Qu.:4.000 3rd Qu.:3.000 3rd Qu.:15.00
## Max. :19999 Max. :5.000 Max. :5.000 Max. :40.00
## NumCompaniesWorked JobSatisfaction EnvironmentSatisfaction
## Min. :0.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:2.000
## Median :2.000 Median :3.000 Median :3.000
## Mean :2.693 Mean :2.729 Mean :2.722
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :9.000 Max. :4.000 Max. :4.000
## RelationshipSatisfaction WorkLifeBalance JobInvolvement YearsAtCompany
## Min. :1.000 Min. :1.000 Min. :1.00 Min. : 0.000
## 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.00 1st Qu.: 3.000
## Median :3.000 Median :3.000 Median :3.00 Median : 5.000
## Mean :2.712 Mean :2.761 Mean :2.73 Mean : 7.008
## 3rd Qu.:4.000 3rd Qu.:3.000 3rd Qu.:3.00 3rd Qu.: 9.000
## Max. :4.000 Max. :4.000 Max. :4.00 Max. :40.000
## YearsInCurrentRole YearsSinceLastPromotion TrainingTimesLastYear
## Min. : 0.000 Min. : 0.000 Min. :0.000
## 1st Qu.: 2.000 1st Qu.: 0.000 1st Qu.:2.000
## Median : 3.000 Median : 1.000 Median :3.000
## Mean : 4.229 Mean : 2.188 Mean :2.799
## 3rd Qu.: 7.000 3rd Qu.: 3.000 3rd Qu.:3.000
## Max. :18.000 Max. :15.000 Max. :6.000
## PerformanceRating
## Min. :3.000
## 1st Qu.:3.000
## Median :3.000
## Mean :3.154
## 3rd Qu.:3.000
## Max. :4.000
describe(data_numeric)
## vars n mean sd median trimmed mad min
## MonthlyIncome 1 1470 6502.93 4707.96 4919 5667.24 3260.24 1009
## Education 2 1470 2.91 1.02 3 2.98 1.48 1
## JobLevel 3 1470 2.06 1.11 2 1.90 1.48 1
## TotalWorkingYears 4 1470 11.28 7.78 10 10.37 5.93 0
## NumCompaniesWorked 5 1470 2.69 2.50 2 2.36 1.48 0
## JobSatisfaction 6 1470 2.73 1.10 3 2.79 1.48 1
## EnvironmentSatisfaction 7 1470 2.72 1.09 3 2.78 1.48 1
## RelationshipSatisfaction 8 1470 2.71 1.08 3 2.77 1.48 1
## WorkLifeBalance 9 1470 2.76 0.71 3 2.77 0.00 1
## JobInvolvement 10 1470 2.73 0.71 3 2.74 0.00 1
## YearsAtCompany 11 1470 7.01 6.13 5 5.99 4.45 0
## YearsInCurrentRole 12 1470 4.23 3.62 3 3.85 4.45 0
## YearsSinceLastPromotion 13 1470 2.19 3.22 1 1.48 1.48 0
## TrainingTimesLastYear 14 1470 2.80 1.29 3 2.72 1.48 0
## PerformanceRating 15 1470 3.15 0.36 3 3.07 0.00 3
## max range skew kurtosis se
## MonthlyIncome 19999 18990 1.37 0.99 122.79
## Education 5 4 -0.29 -0.56 0.03
## JobLevel 5 4 1.02 0.39 0.03
## TotalWorkingYears 40 40 1.11 0.91 0.20
## NumCompaniesWorked 9 9 1.02 0.00 0.07
## JobSatisfaction 4 3 -0.33 -1.22 0.03
## EnvironmentSatisfaction 4 3 -0.32 -1.20 0.03
## RelationshipSatisfaction 4 3 -0.30 -1.19 0.03
## WorkLifeBalance 4 3 -0.55 0.41 0.02
## JobInvolvement 4 3 -0.50 0.26 0.02
## YearsAtCompany 40 40 1.76 3.91 0.16
## YearsInCurrentRole 18 18 0.92 0.47 0.09
## YearsSinceLastPromotion 15 15 1.98 3.59 0.08
## TrainingTimesLastYear 6 6 0.55 0.48 0.03
## PerformanceRating 4 1 1.92 1.68 0.01
Variabel MonthlyIncome memiliki rata-rata sebesar 6.502,93 dengan rentang yang cukup lebar (1.009–19.999), menunjukkan adanya ketimpangan pendapatan antar karyawan. Variabel kepuasan kerja (JobSatisfaction, EnvironmentSatisfaction, RelationshipSatisfaction) semuanya berskala 1–4 dengan rata-rata sekitar 2,7 yang berarti karyawan secara umum berada pada tingkat kepuasan sedang. Dari nilai skewness, variabel MonthlyIncome, YearsAtCompany, dan YearsSinceLastPromotion menunjukkan distribusi yang condong ke kanan (positively skewed), mengindikasikan sebagian besar karyawan memiliki pendapatan dan masa kerja yang relatif rendah dengan sebagian kecil yang sangat tinggi.
data_z <- as.data.frame(lapply(data_numeric, function(x) {
if (is.numeric(x)) (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
else x
}))
head(data_z)
## MonthlyIncome Education JobLevel TotalWorkingYears NumCompaniesWorked
## 1 -0.1083127 -0.8913849 -0.05776789 -0.4214990 2.1244130
## 2 -0.2916193 -1.8677901 -0.05776789 -0.1644554 -0.6778187
## 3 -0.9373347 -0.8913849 -0.96115930 -0.5500208 1.3237753
## 4 -0.7633739 1.0614255 -0.96115930 -0.4214990 -0.6778187
## 5 -0.6446387 -1.8677901 -0.96115930 -0.6785426 2.5247318
## 6 -0.7296013 -0.8913849 -0.96115930 -0.4214990 -1.0781375
## JobSatisfaction EnvironmentSatisfaction RelationshipSatisfaction
## 1 1.1528613 -0.6603060 -1.5836393
## 2 -0.6606284 0.2545383 1.1910327
## 3 0.2461164 1.1693826 -0.6587487
## 4 0.2461164 1.1693826 0.2661420
## 5 -0.6606284 -1.5751502 1.1910327
## 6 1.1528613 1.1693826 0.2661420
## WorkLifeBalance JobInvolvement YearsAtCompany YearsInCurrentRole
## 1 -2.4929720 0.379543 -0.164557109 -0.06327437
## 2 0.3379811 -1.025818 0.488341541 0.76473737
## 3 0.3379811 -1.025818 -1.143905083 -1.16729002
## 4 0.3379811 0.379543 0.161892216 0.76473737
## 5 0.3379811 0.379543 -0.817455758 -0.61528219
## 6 -1.0774954 0.379543 -0.001332446 0.76473737
## YearsSinceLastPromotion TrainingTimesLastYear PerformanceRating
## 1 -0.67891464 -2.1712429 -0.426085
## 2 -0.36858985 0.1556541 2.345353
## 3 -0.67891464 0.1556541 -0.426085
## 4 0.25205973 0.1556541 -0.426085
## 5 -0.05826506 0.1556541 -0.426085
## 6 0.25205973 -0.6199782 -0.426085
round(colMeans(data_z), 4)
## MonthlyIncome Education JobLevel
## 0 0 0
## TotalWorkingYears NumCompaniesWorked JobSatisfaction
## 0 0 0
## EnvironmentSatisfaction RelationshipSatisfaction WorkLifeBalance
## 0 0 0
## JobInvolvement YearsAtCompany YearsInCurrentRole
## 0 0 0
## YearsSinceLastPromotion TrainingTimesLastYear PerformanceRating
## 0 0 0
par(mfrow = c(3, 5), mar = c(4, 4, 2, 1))
for (col in colnames(data_z)) {
hist(data_z[[col]], main = col, xlab = col,
col = "darkblue", border = "white")
}
par(mfrow = c(1, 1))
Histogram menunjukkan bahwa sebagian besar variabel tidak berdistribusi normal secara univariat. Variabel MonthlyIncome, YearsAtCompany, dan YearsSinceLastPromotion terlihat sangat condong ke kanan. Variabel PerformanceRating memiliki distribusi yang sangat tidak normal karena hampir seluruh nilai terkonsentrasi pada skor 3, dengan sangat sedikit karyawan yang mendapat skor 4. Kondisi ini mengantisipasi kemungkinan pelanggaran normalitas multivariat yang akan dikonfirmasi pada uji Mardia.
#7.1 Uji Normalitas Multivariat
mardia(data_z)
## Call: mardia(x = data_z)
##
## Mardia tests of multivariate skew and kurtosis
## Use describe(x) the to get univariate tests
## n.obs = 1470 num.vars = 15
## b1p = 32.79 skew = 8033.95 with probability <= 0
## small sample skew = 8052.4 with probability <= 0
## b2p = 283.44 kurtosis = 24.14 with probability <= 0
Hasil uji Mardia menunjukkan bahwa data tidak memenuhi asumsi normalitas multivariat, ditandai dengan nilai p-value pada uji skewness dan kurtosis multivariat yang kurang dari 0,05. Meskipun demikian, dengan jumlah sampel n = 1.470 yang tergolong besar, estimasi Maximum Likelihood (MLE) pada CB-SEM masih cukup robust terhadap pelanggaran normalitas ringan hingga sedang
#7.2 KMO
r <- cor(data_z)
KMO(r)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = r)
## Overall MSA = 0.77
## MSA for each item =
## MonthlyIncome Education JobLevel
## 0.72 0.79 0.72
## TotalWorkingYears NumCompaniesWorked JobSatisfaction
## 0.88 0.44 0.53
## EnvironmentSatisfaction RelationshipSatisfaction WorkLifeBalance
## 0.41 0.44 0.41
## JobInvolvement YearsAtCompany YearsInCurrentRole
## 0.43 0.76 0.79
## YearsSinceLastPromotion TrainingTimesLastYear PerformanceRating
## 0.90 0.61 0.38
Nilai Overall MSA = 0,77 menunjukkan bahwa data memadai untuk dilakukan analisis faktor, karena memenuhi syarat minimum MSA > 0,50. Nilai 0,77 termasuk dalam kategori “baik” (middling to meritorious). Namun beberapa indikator seperti PerformanceRating (MSA = 0,38), EnvironmentSatisfaction (0,41), dan WorkLifeBalance (0,41) memiliki MSA individual di bawah 0,50, yang mengindikasikan bahwa indikator-indikator tersebut kurang berkorelasi dengan indikator lainnya dan perlu diperhatikan pada tahap evaluasi outer model.
#7.3 Uji Multikolinearitas (VIF)
data_vif <- na.omit(data_z)
model_vif <- lm(YearsAtCompany ~ MonthlyIncome + Education + JobLevel +
TotalWorkingYears + NumCompaniesWorked +
JobSatisfaction + EnvironmentSatisfaction +
RelationshipSatisfaction + WorkLifeBalance +
JobInvolvement + YearsInCurrentRole +
YearsSinceLastPromotion + TrainingTimesLastYear +
PerformanceRating,
data = data_vif)
vif(model_vif)
## MonthlyIncome Education JobLevel
## 10.634626 1.036938 11.077538
## TotalWorkingYears NumCompaniesWorked JobSatisfaction
## 3.135168 1.147120 1.005181
## EnvironmentSatisfaction RelationshipSatisfaction WorkLifeBalance
## 1.004573 1.008755 1.009636
## JobInvolvement YearsInCurrentRole YearsSinceLastPromotion
## 1.006734 1.660331 1.506960
## TrainingTimesLastYear PerformanceRating
## 1.007030 1.007119
Terdapat dua variabel yang menunjukkan masalah multikolinearitas serius, yaitu MonthlyIncome (VIF = 10,635) dan JobLevel (VIF = 11,078), keduanya melampaui batas VIF > 10. Hal ini dapat dipahami karena secara teori level jabatan yang lebih tinggi memang berkorelasi kuat dengan pendapatan yang lebih besar. Dalam konteks SEM, multikolinearitas antar indikator dalam konstruk yang berbeda masih dapat ditoleransi karena lavaan memperlakukan setiap konstruk sebagai variabel laten yang terpisah. Kedua variabel tetap dipertahankan karena secara teoritis keduanya merupakan representasi yang valid dari konstruk Faktor Sosial Ekonomi Karyawan.
# 8.1 CFA X1 Faktor Sosial Ekonomi Karyawan
model_cfa_x1 <- '
SosialEkonomi =~ MonthlyIncome + Education + JobLevel +
TotalWorkingYears + NumCompaniesWorked
'
fit_x1 <- cfa(model_cfa_x1, data = data_z, std.lv = TRUE)
summary(fit_x1, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 21 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 10
##
## Number of observations 1470
##
## Model Test User Model:
##
## Test statistic 89.619
## Degrees of freedom 5
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 4996.896
## Degrees of freedom 10
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.983
## Tucker-Lewis Index (TLI) 0.966
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -7973.059
## Loglikelihood unrestricted model (H1) -7928.249
##
## Akaike (AIC) 15966.118
## Bayesian (BIC) 16019.048
## Sample-size adjusted Bayesian (SABIC) 15987.281
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.107
## 90 Percent confidence interval - lower 0.088
## 90 Percent confidence interval - upper 0.127
## P-value H_0: RMSEA <= 0.050 0.000
## P-value H_0: RMSEA >= 0.080 0.991
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.044
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## SosialEkonomi =~
## MonthlyIncome 0.969 0.019 50.380 0.000 0.969 0.970
## Education 0.105 0.026 4.005 0.000 0.105 0.105
## JobLevel 0.980 0.019 51.398 0.000 0.980 0.980
## TotalWorkngYrs 0.798 0.022 36.819 0.000 0.798 0.798
## NumCompansWrkd 0.155 0.026 5.925 0.000 0.155 0.155
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .MonthlyIncome 0.060 0.006 9.301 0.000 0.060 0.060
## .Education 0.988 0.036 27.104 0.000 0.988 0.989
## .JobLevel 0.040 0.006 6.211 0.000 0.040 0.040
## .TotalWorkngYrs 0.362 0.014 25.894 0.000 0.362 0.363
## .NumCompansWrkd 0.975 0.036 27.095 0.000 0.975 0.976
## SosialEkonomi 1.000 1.000 1.000
MonthlyIncome (λ = 0,970) dan JobLevel (λ = 0,980) adalah indikator terkuat yang merepresentasikan konstruk Faktor Sosial Ekonomi, keduanya sangat signifikan (p < 0,001). TotalWorkingYears juga memberikan kontribusi yang baik (λ = 0,798). Sebaliknya, Education (λ = 0,105) dan NumCompaniesWorked (λ = 0,155) memiliki loading factor yang sangat rendah dan berada jauh di bawah threshold 0,50, menandakan kedua indikator ini kurang mampu merepresentasikan konstruk secara optimal. Dari sisi fit model, CFI = 0,983 (≥ 0,90 ✓) dan SRMR = 0,044 (< 0,05 ✓) menunjukkan fit yang baik, namun RMSEA = 0,107 (> 0,08 ✗) mengindikasikan adanya error aproksimasi yang cukup besar, kemungkinan dipengaruhi oleh kelemahan dua indikator tersebut.
# 8.2 CFA X2 Kepuasan & Keterlibatan Kerja
model_cfa_x2 <- '
KepuasanKerja =~ JobSatisfaction + EnvironmentSatisfaction +
RelationshipSatisfaction + WorkLifeBalance + JobInvolvement
'
fit_x2 <- cfa(model_cfa_x2, data = data_z, std.lv = TRUE)
summary(fit_x2, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 35 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 10
##
## Number of observations 1470
##
## Model Test User Model:
##
## Test statistic 2.591
## Degrees of freedom 5
## P-value (Chi-square) 0.763
##
## Model Test Baseline Model:
##
## Test statistic 5.435
## Degrees of freedom 10
## P-value 0.860
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) -0.055
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -10425.275
## Loglikelihood unrestricted model (H1) -10423.980
##
## Akaike (AIC) 20870.551
## Bayesian (BIC) 20923.481
## Sample-size adjusted Bayesian (SABIC) 20891.714
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.025
## P-value H_0: RMSEA <= 0.050 1.000
## P-value H_0: RMSEA >= 0.080 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.011
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## KepuasanKerja =~
## JobSatisfactin 0.096 0.110 0.873 0.383 0.096 0.096
## EnvrnmntStsfct -0.040 0.095 -0.421 0.673 -0.040 -0.040
## RltnshpStsfctn -0.227 0.220 -1.034 0.301 -0.227 -0.227
## WorkLifeBalanc -0.071 0.101 -0.705 0.481 -0.071 -0.071
## JobInvolvement -0.127 0.131 -0.969 0.332 -0.127 -0.127
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .JobSatisfactin 0.990 0.042 23.686 0.000 0.990 0.991
## .EnvrnmntStsfct 0.998 0.038 26.597 0.000 0.998 0.998
## .RltnshpStsfctn 0.948 0.105 9.005 0.000 0.948 0.948
## .WorkLifeBalanc 0.994 0.039 25.369 0.000 0.994 0.995
## .JobInvolvement 0.983 0.049 20.207 0.000 0.983 0.984
## KepuasanKerja 1.000 1.000 1.000
Seluruh loading factor dari kelima indikator kepuasan kerja sangat kecil dan tidak ada satupun yang signifikan secara statistik (semua p-value > 0,05). Nilai loading tertinggi hanya -0,227 pada RelationshipSatisfaction. Hal ini mengindikasikan bahwa kelima indikator tersebut tidak berkorelasi satu sama lain dan tidak secara konsisten mengukur satu konstruk laten yang sama. Dari sisi fit, nilai CFI = 1,000 dan RMSEA = 0,000 tampak sempurna, namun TLI = -0,055 yang negatif justru menjadi sinyal peringatan bahwa model ini terlalu just-identified dan tidak memiliki daya diskriminasi yang memadai. Kondisi ini menunjukkan bahwa variabel-variabel kepuasan dalam dataset IBM HR ini bersifat independen satu sama lain, bukan cerminan dari satu konstruk laten tunggal.
# 8.3 CFA Y Kesejahteraan & Retensi Karyawan
model_cfa_y <- '
KesejahteraanKaryawan =~ YearsAtCompany + YearsInCurrentRole +
YearsSinceLastPromotion + TrainingTimesLastYear +
PerformanceRating
'
fit_y <- cfa(model_cfa_y, data = data_z, std.lv = TRUE)
summary(fit_y, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 15 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 10
##
## Number of observations 1470
##
## Model Test User Model:
##
## Test statistic 4.203
## Degrees of freedom 5
## P-value (Chi-square) 0.521
##
## Model Test Baseline Model:
##
## Test statistic 2008.547
## Degrees of freedom 10
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.001
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -9424.526
## Loglikelihood unrestricted model (H1) -9422.424
##
## Akaike (AIC) 18869.051
## Bayesian (BIC) 18921.981
## Sample-size adjusted Bayesian (SABIC) 18890.214
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.033
## P-value H_0: RMSEA <= 0.050 0.998
## P-value H_0: RMSEA >= 0.080 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.008
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv
## KesejahteraanKaryawan =~
## YearsAtCompany 0.925 0.023 40.594 0.000 0.925
## YearsInCrrntRl 0.820 0.024 34.867 0.000 0.820
## YrsSncLstPrmtn 0.668 0.024 27.380 0.000 0.668
## TranngTmsLstYr 0.001 0.028 0.024 0.981 0.001
## PerformancRtng 0.015 0.028 0.543 0.587 0.015
## Std.all
##
## 0.925
## 0.820
## 0.668
## 0.001
## 0.015
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .YearsAtCompany 0.144 0.022 6.646 0.000 0.144 0.145
## .YearsInCrrntRl 0.327 0.020 15.950 0.000 0.327 0.327
## .YrsSncLstPrmtn 0.553 0.023 23.858 0.000 0.553 0.553
## .TranngTmsLstYr 0.999 0.037 27.111 0.000 0.999 1.000
## .PerformancRtng 0.999 0.037 27.110 0.000 0.999 1.000
## KesejhtrnKrywn 1.000 1.000 1.000
YearsAtCompany (λ = 0,925), YearsInCurrentRole (λ = 0,820), dan YearsSinceLastPromotion (λ = 0,668) adalah indikator yang kuat dan signifikan (p < 0,001) dalam merepresentasikan konstruk Kesejahteraan & Retensi Karyawan. Ketiga indikator ini secara konsisten mengukur dimensi tenure atau lamanya keterikatan karyawan dengan perusahaan. Sebaliknya, TrainingTimesLastYear (λ = 0,001) dan PerformanceRating (λ = 0,015) tidak signifikan sama sekali (p > 0,05), menunjukkan bahwa kedua indikator ini tidak berkaitan dengan konstruk yang sama. Fit model sangat baik: CFI = 1,000, RMSEA = 0,000, dan SRMR = 0,008.
semPaths(fit_x1,
what = "path", whatLabels = "std",
style = "ram", layout = "tree", rotation = 2,
sizeMan = 7, sizeLat = 9,
edge.label.cex = 1.2, label.cex = 1.1,
color = list(lat = "darkblue", man = "lightyellow"))
semPaths(fit_x2,
what = "path", whatLabels = "std",
style = "ram", layout = "tree", rotation = 2,
sizeMan = 7, sizeLat = 9,
edge.label.cex = 1.2, label.cex = 1.1,
color = list(lat = "brown", man = "lightyellow"))
semPaths(fit_y,
what = "path", whatLabels = "std",
style = "ram", layout = "tree", rotation = 2,
sizeMan = 7, sizeLat = 9,
edge.label.cex = 1.2, label.cex = 1.1,
color = list(lat = "darkgreen", man = "lightyellow"))
Diagram tersebut memvisualisasikan besaran loading factor (nilai pada panah) dari setiap indikator ke konstruk latennya. Pada diagram X1, terlihat jelas dominasi MonthlyIncome dan JobLevel dengan panah tebal mendekati nilai 1,0, sementara Education dan NumCompaniesWorked memiliki panah sangat tipis mendekati 0. Pada diagram X2, semua panah tampak sangat tipis yang mengkonfirmasi lemahnya hubungan antara indikator kepuasan dengan konstruk latennya. Pada diagram Y, tiga indikator pertama memiliki panah yang tebal dan signifikan, sedangkan TrainingTimesLastYear dan PerformanceRating hampir tidak terlihat.
cfa_fits <- data.frame(
Konstruk = c("SosialEkonomi (X1)", "KepuasanKerja (X2)",
"KesejahteraanKaryawan (Y)"),
CFI = c(fitMeasures(fit_x1, "cfi"),
fitMeasures(fit_x2, "cfi"),
fitMeasures(fit_y, "cfi")),
TLI = c(fitMeasures(fit_x1, "tli"),
fitMeasures(fit_x2, "tli"),
fitMeasures(fit_y, "tli")),
RMSEA = c(fitMeasures(fit_x1, "rmsea"),
fitMeasures(fit_x2, "rmsea"),
fitMeasures(fit_y, "rmsea")),
SRMR = c(fitMeasures(fit_x1, "srmr"),
fitMeasures(fit_x2, "srmr"),
fitMeasures(fit_y, "srmr")),
ChiSquare = c(fitMeasures(fit_x1, "chisq"),
fitMeasures(fit_x2, "chisq"),
fitMeasures(fit_y, "chisq")),
p_value = c(fitMeasures(fit_x1, "pvalue"),
fitMeasures(fit_x2, "pvalue"),
fitMeasures(fit_y, "pvalue"))
)
cfa_fits[, -1] <- round(cfa_fits[, -1], 4)
print(cfa_fits)
## Konstruk CFI TLI RMSEA SRMR ChiSquare p_value
## 1 SosialEkonomi (X1) 0.983 0.9661 0.1073 0.0442 89.6190 0.0000
## 2 KepuasanKerja (X2) 1.000 -0.0554 0.0000 0.0108 2.5910 0.7627
## 3 KesejahteraanKaryawan (Y) 1.000 1.0008 0.0000 0.0081 4.2034 0.5205
Dari tabel ringkasan fit indeks, konstruk Y (KesejahteraanKaryawan) memiliki fit terbaik secara keseluruhan dengan RMSEA = 0,000 dan SRMR = 0,008. Konstruk X2 (KepuasanKerja) menunjukkan nilai CFI sempurna namun TLI negatif yang mengindikasikan model terlalu sederhana. Konstruk X1 memiliki RMSEA yang melampaui batas 0,08, namun CFI dan SRMR-nya masih dalam batas yang dapat diterima.
# 11.1 AVE dan CR
hitung_AVE <- function(fit) {
std <- standardizedSolution(fit)
lambda <- std$est[std$op == "=~"]
AVE <- sum(lambda^2) / length(lambda)
return(round(AVE, 4))
}
hitung_CR <- function(fit) {
std <- standardizedSolution(fit)
lambda <- std$est[std$op == "=~"]
theta <- 1 - lambda^2
CR <- sum(lambda)^2 / (sum(lambda)^2 + sum(theta))
return(round(CR, 4))
}
# 11.2 Tabel AVE dan CR
hasil_validitas <- data.frame(
Konstruk = c("SosialEkonomi (X1)", "KepuasanKerja (X2)",
"KesejahteraanKaryawan (Y)"),
AVE = c(hitung_AVE(fit_x1), hitung_AVE(fit_x2), hitung_AVE(fit_y)),
CR = c(hitung_CR(fit_x1), hitung_CR(fit_x2), hitung_CR(fit_y))
)
print(hasil_validitas)
## Konstruk AVE CR
## 1 SosialEkonomi (X1) 0.5146 0.7886
## 2 KepuasanKerja (X2) 0.0167 0.0270
## 3 KesejahteraanKaryawan (Y) 0.3951 0.6612
Hanya konstruk X1 (SosialEkonomi) yang memenuhi kedua kriteria validitas dan reliabilitas dengan AVE = 0,5146 (> 0,50 ✓) dan CR = 0,7886 (> 0,70 ✓). Konstruk X2 (KepuasanKerja) memiliki AVE = 0,0167 dan CR = 0,0270 yang sangat jauh dari threshold, mengkonfirmasi bahwa kelima indikator kepuasan kerja tidak valid sebagai satu konstruk laten. Konstruk Y memiliki AVE = 0,3951 (< 0,50 ✗) dan CR = 0,6612 (< 0,70 ✗) yang belum memenuhi standar, terutama karena dua indikator (TrainingTimesLastYear dan PerformanceRating) yang tidak berkontribusi secara signifikan.
# 11.3 Cronbach Alpha
reliability(fit_x1)
## Warning in reliability(fit_x1):
## The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
##
## It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
##
## The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
## SosialEkonomi
## alpha 0.7297045
## omega 0.7885891
## omega2 0.7885891
## omega3 0.7536009
## avevar 0.5146242
reliability(fit_x2)
## Warning in reliability(fit_x2):
## The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
##
## It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
##
## The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
## KepuasanKerja
## alpha 0.003056084
## omega 0.027004607
## omega2 0.027004607
## omega3 0.027223691
## avevar 0.016706834
reliability(fit_y)
## Warning in reliability(fit_y):
## The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
##
## It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
##
## The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
## KesejahteraanKaryawan
## alpha 0.5495978
## omega 0.6611689
## omega2 0.6611689
## omega3 0.6613726
## avevar 0.3951056
Nilai Cronbach Alpha mengkonfirmasi temuan sebelumnya. Konstruk X1 memiliki alpha = 0,730 yang memenuhi syarat reliabilitas (> 0,70 ✓). Konstruk X2 memiliki alpha = 0,003 yang sangat rendah, menegaskan bahwa indikator-indikator kepuasan kerja tidak konsisten mengukur hal yang sama. Konstruk Y memiliki alpha = 0,550 yang belum mencapai threshold 0,70, terutama akibat kontribusi nol dari dua indikator terakhir.
# 11.4 Validitas Diskriminan
model_cfa_gabungan <- '
SosialEkonomi =~ MonthlyIncome + Education + JobLevel +
TotalWorkingYears + NumCompaniesWorked
KepuasanKerja =~ JobSatisfaction + EnvironmentSatisfaction +
RelationshipSatisfaction + WorkLifeBalance + JobInvolvement
'
fit_gabungan <- cfa(model_cfa_gabungan, data = data_z, std.lv = TRUE)
summary(fit_gabungan, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 59 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 21
##
## Number of observations 1470
##
## Model Test User Model:
##
## Test statistic 112.400
## Degrees of freedom 34
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 5024.234
## Degrees of freedom 45
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.984
## Tucker-Lewis Index (TLI) 0.979
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -18397.478
## Loglikelihood unrestricted model (H1) -18341.278
##
## Akaike (AIC) 36836.956
## Bayesian (BIC) 36948.109
## Sample-size adjusted Bayesian (SABIC) 36881.399
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.040
## 90 Percent confidence interval - lower 0.032
## 90 Percent confidence interval - upper 0.048
## P-value H_0: RMSEA <= 0.050 0.982
## P-value H_0: RMSEA >= 0.080 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.028
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## SosialEkonomi =~
## MonthlyIncome 0.969 0.019 50.374 0.000 0.969 0.969
## Education 0.105 0.026 4.005 0.000 0.105 0.105
## JobLevel 0.980 0.019 51.405 0.000 0.980 0.980
## TotalWorkngYrs 0.798 0.022 36.817 0.000 0.798 0.798
## NumCompansWrkd 0.155 0.026 5.925 0.000 0.155 0.155
## KepuasanKerja =~
## JobSatisfactin 0.065 0.085 0.763 0.446 0.065 0.065
## EnvrnmntStsfct -0.082 0.091 -0.909 0.363 -0.082 -0.083
## RltnshpStsfctn -0.082 0.091 -0.908 0.364 -0.082 -0.082
## WorkLifeBalanc -0.293 0.243 -1.208 0.227 -0.293 -0.293
## JobInvolvement 0.022 0.078 0.276 0.783 0.022 0.022
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## SosialEkonomi ~~
## KepuasanKerja -0.120 0.110 -1.090 0.276 -0.120 -0.120
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .MonthlyIncome 0.060 0.006 9.322 0.000 0.060 0.060
## .Education 0.988 0.036 27.104 0.000 0.988 0.989
## .JobLevel 0.039 0.006 6.192 0.000 0.039 0.039
## .TotalWorkngYrs 0.362 0.014 25.894 0.000 0.362 0.363
## .NumCompansWrkd 0.975 0.036 27.095 0.000 0.975 0.976
## .JobSatisfactin 0.995 0.038 26.044 0.000 0.995 0.996
## .EnvrnmntStsfct 0.993 0.039 25.243 0.000 0.993 0.993
## .RltnshpStsfctn 0.993 0.039 25.250 0.000 0.993 0.993
## .WorkLifeBalanc 0.913 0.146 6.271 0.000 0.913 0.914
## .JobInvolvement 0.999 0.037 27.009 0.000 0.999 1.000
## SosialEkonomi 1.000 1.000 1.000
## KepuasanKerja 1.000 1.000 1.000
inspect(fit_gabungan, "cor.lv")
## SslEkn KpsnKr
## SosialEkonomi 1.00
## KepuasanKerja -0.12 1.00
htmt(model_cfa_gabungan, data = data_z)
## SslEkn KpsnKr
## SosialEkonomi 1.000
## KepuasanKerja 0.197 1.000
Korelasi antar konstruk laten (Fornell-Larcker) menunjukkan nilai -0,12 antara SosialEkonomi dan KepuasanKerja, yang sangat kecil dan mengindikasikan kedua konstruk bersifat hampir independen satu sama lain. Nilai HTMT = 0,197 jauh di bawah batas 0,85, sehingga validitas diskriminan terpenuhi — artinya konstruk SosialEkonomi dan KepuasanKerja benar-benar mengukur hal yang berbeda dan tidak tumpang tindih.
model_sem <- '
SosialEkonomi =~ MonthlyIncome + Education + JobLevel +
TotalWorkingYears + NumCompaniesWorked
KepuasanKerja =~ JobSatisfaction + EnvironmentSatisfaction +
RelationshipSatisfaction + WorkLifeBalance + JobInvolvement
KesejahteraanKaryawan =~ YearsAtCompany + YearsInCurrentRole +
YearsSinceLastPromotion + TrainingTimesLastYear +
PerformanceRating
KesejahteraanKaryawan ~ SosialEkonomi + KepuasanKerja
'
fit_sem <- sem(model_sem, data = data_z, std.lv = TRUE)
summary(fit_sem, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 74 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 33
##
## Number of observations 1470
##
## Model Test User Model:
##
## Test statistic 613.890
## Degrees of freedom 87
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 8024.161
## Degrees of freedom 105
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.933
## Tucker-Lewis Index (TLI) 0.920
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -27574.957
## Loglikelihood unrestricted model (H1) -27268.012
##
## Akaike (AIC) 55215.913
## Bayesian (BIC) 55390.583
## Sample-size adjusted Bayesian (SABIC) 55285.752
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.064
## 90 Percent confidence interval - lower 0.059
## 90 Percent confidence interval - upper 0.069
## P-value H_0: RMSEA <= 0.050 0.000
## P-value H_0: RMSEA >= 0.080 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.041
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv
## SosialEkonomi =~
## MonthlyIncome 0.968 0.019 50.372 0.000 0.968
## Education 0.106 0.026 4.020 0.000 0.106
## JobLevel 0.980 0.019 51.590 0.000 0.980
## TotalWorkngYrs 0.802 0.022 37.076 0.000 0.802
## NumCompansWrkd 0.152 0.026 5.783 0.000 0.152
## KepuasanKerja =~
## JobSatisfactin 0.066 0.086 0.770 0.441 0.066
## EnvrnmntStsfct -0.084 0.091 -0.924 0.356 -0.084
## RltnshpStsfctn -0.084 0.091 -0.927 0.354 -0.084
## WorkLifeBalanc -0.287 0.232 -1.238 0.216 -0.287
## JobInvolvement 0.022 0.079 0.279 0.781 0.022
## KesejahteraanKaryawan =~
## YearsAtCompany 0.793 0.019 40.896 0.000 0.960
## YearsInCrrntRl 0.652 0.019 34.455 0.000 0.790
## YrsSncLstPrmtn 0.537 0.020 26.848 0.000 0.650
## TranngTmsLstYr 0.001 0.022 0.032 0.974 0.001
## PerformancRtng 0.007 0.022 0.304 0.761 0.008
## Std.all
##
## 0.968
## 0.106
## 0.981
## 0.802
## 0.152
##
## 0.066
## -0.084
## -0.084
## -0.287
## 0.022
##
## 0.961
## 0.790
## 0.650
## 0.001
## 0.008
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## KesejahteraanKaryawan ~
## SosialEkonomi 0.681 0.036 18.928 0.000 0.563 0.563
## KepuasanKerja -0.011 0.089 -0.118 0.906 -0.009 -0.009
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## SosialEkonomi ~~
## KepuasanKerja -0.122 0.110 -1.114 0.265 -0.122 -0.122
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .MonthlyIncome 0.063 0.006 10.582 0.000 0.063 0.063
## .Education 0.988 0.036 27.104 0.000 0.988 0.989
## .JobLevel 0.038 0.006 6.650 0.000 0.038 0.038
## .TotalWorkngYrs 0.356 0.014 25.873 0.000 0.356 0.357
## .NumCompansWrkd 0.976 0.036 27.096 0.000 0.976 0.977
## .JobSatisfactin 0.995 0.038 26.008 0.000 0.995 0.996
## .EnvrnmntStsfct 0.992 0.039 25.183 0.000 0.992 0.993
## .RltnshpStsfctn 0.992 0.039 25.159 0.000 0.992 0.993
## .WorkLifeBalanc 0.917 0.136 6.730 0.000 0.917 0.918
## .JobInvolvement 0.999 0.037 27.002 0.000 0.999 1.000
## .YearsAtCompany 0.077 0.018 4.221 0.000 0.077 0.077
## .YearsInCrrntRl 0.376 0.019 20.130 0.000 0.376 0.376
## .YrsSncLstPrmtn 0.577 0.023 24.904 0.000 0.577 0.578
## .TranngTmsLstYr 0.999 0.037 27.111 0.000 0.999 1.000
## .PerformancRtng 0.999 0.037 27.111 0.000 0.999 1.000
## SosialEkonomi 1.000 1.000 1.000
## KepuasanKerja 1.000 1.000 1.000
## .KesejhtrnKrywn 1.000 0.682 0.682
fit_indices <- data.frame(
Indeks = c("Chi-Square", "df", "p-value", "CFI",
"TLI", "RMSEA", "SRMR", "GFI"),
Nilai = round(c(
fitMeasures(fit_sem, "chisq"),
fitMeasures(fit_sem, "df"),
fitMeasures(fit_sem, "pvalue"),
fitMeasures(fit_sem, "cfi"),
fitMeasures(fit_sem, "tli"),
fitMeasures(fit_sem, "rmsea"),
fitMeasures(fit_sem, "srmr"),
fitMeasures(fit_sem, "gfi")
), 4),
Threshold = c("> 0.05", "—", "> 0.05", ">= 0.90",
">= 0.90", "< 0.08", "< 0.05", ">= 0.90")
)
print(fit_indices)
## Indeks Nilai Threshold
## chisq Chi-Square 613.8904 > 0.05
## df df 87.0000 —
## pvalue p-value 0.0000 > 0.05
## cfi CFI 0.9335 >= 0.90
## tli TLI 0.9197 >= 0.90
## rmsea RMSEA 0.0642 < 0.08
## srmr SRMR 0.0413 < 0.05
## gfi GFI 0.9568 >= 0.90
Secara keseluruhan model SEM menunjukkan fit yang cukup baik. CFI = 0,9335 (≥ 0,90 ✓), TLI = 0,9197 (≥ 0,90 ✓), RMSEA = 0,0642 (< 0,08 ✓), SRMR = 0,0413 (< 0,05 ✓), dan GFI = 0,9568 (≥ 0,90 ✓) semuanya memenuhi threshold. Hanya nilai Chi-Square yang signifikan (p < 0,05 ✗), namun hal ini lazim terjadi pada sampel besar (n = 1.470) karena Chi-Square sangat sensitif terhadap ukuran sampel sehingga hampir selalu menolak H0 pada n > 500.
hasil_sem <- parameterEstimates(fit_sem, standardized = TRUE)
path_coef <- hasil_sem[hasil_sem$op == "~",
c("lhs", "rhs", "est", "se", "z", "pvalue", "std.all")]
colnames(path_coef) <- c("Endogen", "Eksogen", "Estimasi",
"Std.Error", "z-value", "p-value", "Std.Koef")
path_coef[, 3:7] <- round(path_coef[, 3:7], 4)
print(path_coef)
## Endogen Eksogen Estimasi Std.Error z.value p.value
## 16 KesejahteraanKaryawan SosialEkonomi 0.681 0.036 18.928 0.000
## 17 KesejahteraanKaryawan KepuasanKerja -0.011 0.089 -0.118 0.906
## Std.Koef
## 16 0.563
## 17 -0.009
Hasil uji hipotesis menunjukkan dua temuan utama. Pertama, H1 diterima: Faktor Sosial Ekonomi (X1) berpengaruh positif dan signifikan terhadap Kesejahteraan Karyawan (β = 0,563, p < 0,001), artinya karyawan dengan pendapatan lebih tinggi, level jabatan lebih senior, dan pengalaman kerja lebih panjang cenderung memiliki masa kerja dan stabilitas karir yang lebih baik di perusahaan. Kedua, H2 ditolak: Kepuasan Kerja (X2) tidak berpengaruh signifikan terhadap Kesejahteraan Karyawan (β = -0,009, p = 0,906), yang konsisten dengan temuan pada evaluasi outer model bahwa konstruk X2 memang tidak valid sebagai satu kesatuan konstruk laten.
semPaths(fit_sem,
what = "path",
whatLabels = "std",
style = "ram",
layout = "tree2",
rotation = 2,
sizeMan = 5,
sizeLat = 8,
edge.label.cex = 0.9,
label.cex = 0.9,
color = list(lat = "lightblue", man = "lightyellow"),
edge.color = "gray40")
Path diagram SEM lengkap memperlihatkan struktur hubungan antar ketiga konstruk laten beserta seluruh indikatornya secara simultan. Panah tebal dari SosialEkonomi ke KesejahteraanKaryawan (β = 0,563) mencerminkan pengaruh yang kuat dan signifikan. Sebaliknya, panah dari KepuasanKerja ke KesejahteraanKaryawan hampir tidak terlihat (β = -0,009), mengkonfirmasi tidak adanya pengaruh yang berarti. Pada sisi indikator, dominasi MonthlyIncome dan JobLevel pada konstruk X1 serta lemahnya indikator-indikator X2 terlihat jelas dari ketebalan panah masing-masing.