Import Library

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

1. Import dan Cek Struktur Data

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"

2. Seleksi Variabel

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. Pre-Processing

# 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 ...

4. Statistika Deskriptif

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.

5. Normalisasi Z-Score

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

6. Visualisasi Distribusi Data

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. Uji Asumsi

#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. Confirmatory Factor Analysis (CFA) per Konstruk

# 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.

9. Visualisasi CFA

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.

10. Fit Indeks CFA

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. Evaluasi Model

# 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.

12. Structural Equation Modeling (SEM)

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

13. Evaluasi Model SEM

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.

14. Uji Hipotesis dan Koefisien

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.

15. Visualisasi SEM

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.