1 Pendahuluan

Sumber daya manusia merupakan salah satu aset penting dalam keberhasilan organisasi. Kinerja karyawan tidak hanya dipengaruhi oleh kemampuan teknis, tetapi juga oleh faktor psikologis dan perilaku organisasi. Salah satu faktor penting yang banyak dikaji dalam perilaku organisasi adalah organizational commitment atau komitmen organisasi.

Organizational commitment menggambarkan sejauh mana seorang karyawan memiliki keterikatan, loyalitas, dan keinginan untuk tetap menjadi bagian dari organisasi. Komitmen organisasi umumnya dibagi menjadi tiga dimensi utama, yaitu affective commitment, continuance commitment, dan normative commitment. Affective commitment berkaitan dengan keterikatan emosional karyawan terhadap organisasi. Continuance commitment berkaitan dengan pertimbangan biaya atau konsekuensi apabila karyawan meninggalkan organisasi. Sementara itu, normative commitment berkaitan dengan rasa kewajiban moral karyawan untuk tetap berkontribusi kepada organisasi.

Selain komitmen organisasi, Organizational Citizenship Behavior (OCB) juga memiliki peran penting dalam mendukung efektivitas organisasi. OCB merupakan perilaku sukarela karyawan yang dilakukan di luar tuntutan formal pekerjaan, seperti membantu rekan kerja, menjaga hubungan kerja yang baik, menunjukkan kepedulian terhadap organisasi, serta berkontribusi terhadap lingkungan kerja yang positif. Meskipun tidak selalu tercantum dalam deskripsi pekerjaan formal, OCB dapat memberikan dampak positif terhadap kinerja organisasi secara keseluruhan.

Dalam konteks organisasi, karyawan yang memiliki komitmen tinggi cenderung lebih bersedia menunjukkan perilaku positif di luar tugas formalnya. Perilaku tersebut kemudian dapat berkontribusi terhadap peningkatan job performance atau kinerja pekerjaan. Dengan demikian, OCB dapat dipandang sebagai mekanisme yang menjelaskan bagaimana komitmen organisasi dapat memengaruhi kinerja karyawan.

Penelitian ini bertujuan untuk menganalisis pengaruh organizational commitment terhadap job performance melalui organizational citizenship behavior. Organizational commitment dalam penelitian ini direpresentasikan oleh tiga konstruk, yaitu affective commitment, continuance commitment, dan normative commitment. Metode yang digunakan adalah Partial Least Squares Structural Equation Modeling (PLS-SEM) karena metode ini mampu menganalisis hubungan antar konstruk laten secara simultan, baik pada model pengukuran maupun model struktural.

2 Tujuan Penelitian

Berdasarkan latar belakang yang telah dijelaskan, tujuan penelitian ini adalah sebagai berikut:

  1. Menganalisis pengaruh Affective Commitment terhadap Organizational Citizenship Behavior.
  2. Menganalisis pengaruh Continuance Commitment terhadap Organizational Citizenship Behavior.
  3. Menganalisis pengaruh Normative Commitment terhadap Organizational Citizenship Behavior.
  4. Menganalisis pengaruh Organizational Citizenship Behavior terhadap Job Performance.
  5. Menganalisis pengaruh Affective Commitment terhadap Job Performance.
  6. Menganalisis pengaruh Continuance Commitment terhadap Job Performance.
  7. Menganalisis pengaruh Normative Commitment terhadap Job Performance.
  8. Menganalisis peran Organizational Citizenship Behavior sebagai variabel mediasi dalam hubungan antara Organizational Commitment dan Job Performance.

3 Hipotesis Penelitian

Penelitian ini menggunakan model konseptual yang menempatkan Affective Commitment, Continuance Commitment, dan Normative Commitment sebagai variabel eksogen. Organizational Citizenship Behavior berperan sebagai variabel mediasi, sedangkan Job Performance menjadi variabel endogen utama.

Berdasarkan model konseptual tersebut, hipotesis penelitian yang diajukan adalah sebagai berikut:

H1: Affective Commitment berpengaruh positif terhadap Organizational Citizenship Behavior.

H2: Continuance Commitment berpengaruh positif terhadap Organizational Citizenship Behavior.

H3: Normative Commitment berpengaruh positif terhadap Organizational Citizenship Behavior.

H4: Organizational Citizenship Behavior berpengaruh positif terhadap Job Performance.

H5: Affective Commitment berpengaruh positif terhadap Job Performance.

H6: Continuance Commitment berpengaruh positif terhadap Job Performance.

H7: Normative Commitment berpengaruh positif terhadap Job Performance.

H8: Organizational Citizenship Behavior memediasi pengaruh Affective Commitment terhadap Job Performance.

H9: Organizational Citizenship Behavior memediasi pengaruh Continuance Commitment terhadap Job Performance.

H10: Organizational Citizenship Behavior memediasi pengaruh Normative Commitment terhadap Job Performance.

4 Metodologi Penelitian

Penelitian ini menggunakan pendekatan kuantitatif dengan metode Partial Least Squares Structural Equation Modeling (PLS-SEM).

Dataset yang digunakan adalah Data_OC_OCB_JP.csv. Konstruk yang dianalisis terdiri dari:

Kode Konstruk Peran
AC Affective Commitment Eksogen
CC Continuance Commitment Eksogen
NC Normative Commitment Eksogen
OCB Organizational Citizenship Behavior Mediasi
JP Job Performance Endogen

Model struktural yang digunakan:

AC  ──→
       │
CC  ──→ OCB ──→ JP
       │
NC  ──→

AC  ─────────→ JP
CC  ─────────→ JP
NC  ─────────→ JP

Tahapan analisis:

  1. Import data
  2. Data understanding
  3. Preprocessing
  4. Statistik deskriptif
  5. Spesifikasi model PLS-SEM
  6. Evaluasi outer model
  7. Evaluasi inner model
  8. Analisis mediasi
  9. Pembahasan dan kesimpulan

5 Import Data

5.1 Import Library

library(readr)
library(dplyr)
library(psych)
library(plspm)
library(knitr)
library(kableExtra)
library(ggplot2)
library(corrplot)
install.packages(c(
  "readr",
  "dplyr",
  "psych",
  "plspm",
  "knitr",
  "kableExtra",
  "ggplot2",
  "corrplot"
))

5.2 Import Dataset

data <- read_csv("Data_OC_OCB_JP.csv")
dim(data)
## [1] 336  36
names(data)
##  [1] "No"             "Gender"         "Marital status" "Age"           
##  [5] "Education"      "Position"       "AC1"            "AC2"           
##  [9] "AC3"            "AC4"            "AC5"            "AC6"           
## [13] "CC1"            "CC2"            "CC3"            "CC4"           
## [17] "CC5"            "CC6"            "NC1"            "NC2"           
## [21] "NC3"            "NC4"            "NC5"            "NC6"           
## [25] "OCB1"           "OCB2"           "OCB3"           "OCB4"          
## [29] "OCB5"           "OCB6"           "OCB7"           "OCB8"          
## [33] "JP1"            "JP2"            "JP3"            "JP4"
str(data)
## spc_tbl_ [336 × 36] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ No            : num [1:336] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Gender        : chr [1:336] "Male" "Male" "Male" "Female" ...
##  $ Marital status: chr [1:336] "Married" "Married" "Married" "Married" ...
##  $ Age           : chr [1:336] "36-45" "36-45" "36-45" "25-35" ...
##  $ Education     : chr [1:336] "University" "University" "University" "High School" ...
##  $ Position      : chr [1:336] "Manager/Leader" "Manager/Leader" "Employee" "Chief/Deputy Chief of Staff" ...
##  $ AC1           : num [1:336] 5 4 3 6 3 3 5 5 5 6 ...
##  $ AC2           : num [1:336] 5 4 3 6 3 5 5 4 5 6 ...
##  $ AC3           : num [1:336] 5 4 3 6 3 5 5 5 6 6 ...
##  $ AC4           : num [1:336] 4 3 3 6 3 5 4 5 5 5 ...
##  $ AC5           : num [1:336] 5 4 2 5 3 3 4 5 5 5 ...
##  $ AC6           : num [1:336] 4 4 2 6 3 7 4 4 4 4 ...
##  $ CC1           : num [1:336] 5 4 6 6 3 3 4 4 6 6 ...
##  $ CC2           : num [1:336] 5 5 6 6 4 3 4 4 6 5 ...
##  $ CC3           : num [1:336] 6 6 6 6 3 3 5 4 6 5 ...
##  $ CC4           : num [1:336] 6 6 6 6 4 3 5 4 6 4 ...
##  $ CC5           : num [1:336] 6 6 6 6 4 5 5 4 6 5 ...
##  $ CC6           : num [1:336] 7 6 6 6 4 3 5 4 6 5 ...
##  $ NC1           : num [1:336] 5 6 7 6 3 5 3 4 5 4 ...
##  $ NC2           : num [1:336] 5 6 6 6 4 5 3 4 5 4 ...
##  $ NC3           : num [1:336] 4 4 5 6 4 5 4 5 5 6 ...
##  $ NC4           : num [1:336] 5 6 3 7 4 3 5 5 5 6 ...
##  $ NC5           : num [1:336] 6 6 6 7 3 5 4 5 5 4 ...
##  $ NC6           : num [1:336] 5 6 6 6 3 6 5 4 5 6 ...
##  $ OCB1          : num [1:336] 5 6 6 6 4 4 6 4 6 5 ...
##  $ OCB2          : num [1:336] 6 6 6 6 4 5 6 4 6 5 ...
##  $ OCB3          : num [1:336] 5 5 6 6 4 5 6 4 5 5 ...
##  $ OCB4          : num [1:336] 5 6 6 6 4 5 6 4 5 5 ...
##  $ OCB5          : num [1:336] 5 6 1 6 4 3 6 5 5 5 ...
##  $ OCB6          : num [1:336] 5 6 1 6 4 5 6 5 5 5 ...
##  $ OCB7          : num [1:336] 5 5 6 6 4 6 6 5 6 5 ...
##  $ OCB8          : num [1:336] 5 6 2 6 4 5 6 5 4 5 ...
##  $ JP1           : num [1:336] 6 5 7 6 5 5 5 5 5 6 ...
##  $ JP2           : num [1:336] 5 5 6 6 5 4 5 4 6 5 ...
##  $ JP3           : num [1:336] 5 6 6 6 4 3 4 4 6 5 ...
##  $ JP4           : num [1:336] 4 6 4 6 4 6 5 5 5 5 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   No = col_double(),
##   ..   Gender = col_character(),
##   ..   `Marital status` = col_character(),
##   ..   Age = col_character(),
##   ..   Education = col_character(),
##   ..   Position = col_character(),
##   ..   AC1 = col_double(),
##   ..   AC2 = col_double(),
##   ..   AC3 = col_double(),
##   ..   AC4 = col_double(),
##   ..   AC5 = col_double(),
##   ..   AC6 = col_double(),
##   ..   CC1 = col_double(),
##   ..   CC2 = col_double(),
##   ..   CC3 = col_double(),
##   ..   CC4 = col_double(),
##   ..   CC5 = col_double(),
##   ..   CC6 = col_double(),
##   ..   NC1 = col_double(),
##   ..   NC2 = col_double(),
##   ..   NC3 = col_double(),
##   ..   NC4 = col_double(),
##   ..   NC5 = col_double(),
##   ..   NC6 = col_double(),
##   ..   OCB1 = col_double(),
##   ..   OCB2 = col_double(),
##   ..   OCB3 = col_double(),
##   ..   OCB4 = col_double(),
##   ..   OCB5 = col_double(),
##   ..   OCB6 = col_double(),
##   ..   OCB7 = col_double(),
##   ..   OCB8 = col_double(),
##   ..   JP1 = col_double(),
##   ..   JP2 = col_double(),
##   ..   JP3 = col_double(),
##   ..   JP4 = col_double()
##   .. )
##  - attr(*, "problems")=<pointer: 0x5a005c7a9390>
head(data)
## # A tibble: 6 × 36
##      No Gender `Marital status` Age   Education Position   AC1   AC2   AC3   AC4
##   <dbl> <chr>  <chr>            <chr> <chr>     <chr>    <dbl> <dbl> <dbl> <dbl>
## 1     1 Male   Married          36-45 Universi… Manager…     5     5     5     4
## 2     2 Male   Married          36-45 Universi… Manager…     4     4     4     3
## 3     3 Male   Married          36-45 Universi… Employee     3     3     3     3
## 4     4 Female Married          25-35 High Sch… Chief/D…     6     6     6     6
## 5     5 Female Married          25-35 High Sch… Manager…     3     3     3     3
## 6     6 Male   Married          >55   Master    Worker       3     5     5     5
## # ℹ 26 more variables: AC5 <dbl>, AC6 <dbl>, CC1 <dbl>, CC2 <dbl>, CC3 <dbl>,
## #   CC4 <dbl>, CC5 <dbl>, CC6 <dbl>, NC1 <dbl>, NC2 <dbl>, NC3 <dbl>,
## #   NC4 <dbl>, NC5 <dbl>, NC6 <dbl>, OCB1 <dbl>, OCB2 <dbl>, OCB3 <dbl>,
## #   OCB4 <dbl>, OCB5 <dbl>, OCB6 <dbl>, OCB7 <dbl>, OCB8 <dbl>, JP1 <dbl>,
## #   JP2 <dbl>, JP3 <dbl>, JP4 <dbl>
summary(data)
##        No               Gender      Marital status        Age     
##  Min.   :  1.00   Length   :336   Length   :336    Length   :336  
##  1st Qu.: 84.75   N.unique :  2   N.unique :  2    N.unique :  5  
##  Median :168.50   N.blank  :  0   N.blank  :  0    N.blank  :  0  
##  Mean   :168.50   Min.nchar:  4   Min.nchar:  6    Min.nchar:  3  
##  3rd Qu.:252.25   Max.nchar:  6   Max.nchar:  7    Max.nchar:  5  
##  Max.   :336.00                                                   
##      Education        Position        AC1             AC2       
##  Length   :336   Length   :336   Min.   :1.000   Min.   :1.000  
##  N.unique :  5   N.unique :  5   1st Qu.:4.000   1st Qu.:4.000  
##  N.blank  :  0   N.blank  :  0   Median :5.000   Median :5.000  
##  Min.nchar:  6   Min.nchar:  6   Mean   :4.973   Mean   :5.009  
##  Max.nchar: 11   Max.nchar: 27   3rd Qu.:6.000   3rd Qu.:6.000  
##                                  Max.   :7.000   Max.   :7.000  
##       AC3             AC4            AC5             AC6             CC1       
##  Min.   :1.000   Min.   :1.00   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.00   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :5.000   Median :5.00   Median :5.000   Median :5.000   Median :5.000  
##  Mean   :4.958   Mean   :4.81   Mean   :4.905   Mean   :5.033   Mean   :5.006  
##  3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.00   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##       CC2             CC3             CC4             CC5            CC6       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.00   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.00   1st Qu.:5.000  
##  Median :5.000   Median :5.000   Median :5.000   Median :5.00   Median :5.000  
##  Mean   :5.143   Mean   :5.089   Mean   :5.176   Mean   :5.14   Mean   :5.283  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.00   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.00   Max.   :7.000  
##       NC1             NC2             NC3             NC4       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :5.000   Median :5.000   Median :5.000   Median :5.000  
##  Mean   :4.982   Mean   :4.839   Mean   :5.122   Mean   :4.795  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##       NC5             NC6             OCB1            OCB2            OCB3     
##  Min.   :2.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.00  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:5.000   1st Qu.:4.75  
##  Median :5.000   Median :5.000   Median :5.000   Median :6.000   Median :5.00  
##  Mean   :4.964   Mean   :4.923   Mean   :5.143   Mean   :5.503   Mean   :5.17  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.00  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.00  
##       OCB4            OCB5            OCB6            OCB7      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :5.000   Median :5.000   Median :5.000   Median :5.000  
##  Mean   :5.161   Mean   :4.753   Mean   :4.705   Mean   :4.914  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##       OCB8            JP1             JP2             JP3       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:5.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :5.000   Median :5.000   Median :5.000   Median :5.000  
##  Mean   :4.943   Mean   :5.214   Mean   :5.012   Mean   :4.833  
##  3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000   3rd Qu.:6.000  
##  Max.   :7.000   Max.   :7.000   Max.   :7.000   Max.   :7.000  
##       JP4       
##  Min.   :1.000  
##  1st Qu.:4.000  
##  Median :5.000  
##  Mean   :4.741  
##  3rd Qu.:6.000  
##  Max.   :7.000

6 Data Understanding

6.1 Struktur Kolom Dataset

column_structure <- data.frame(
  No = seq_along(names(data)),
  Variable = names(data),
  Data_Type = sapply(data, function(x) class(x)[1])
)

kable(column_structure, caption = "Struktur Kolom Dataset") %>%
  kable_styling(full_width = FALSE)
Struktur Kolom Dataset
No Variable Data_Type
No 1 No numeric
Gender 2 Gender character
Marital status 3 Marital status character
Age 4 Age character
Education 5 Education character
Position 6 Position character
AC1 7 AC1 numeric
AC2 8 AC2 numeric
AC3 9 AC3 numeric
AC4 10 AC4 numeric
AC5 11 AC5 numeric
AC6 12 AC6 numeric
CC1 13 CC1 numeric
CC2 14 CC2 numeric
CC3 15 CC3 numeric
CC4 16 CC4 numeric
CC5 17 CC5 numeric
CC6 18 CC6 numeric
NC1 19 NC1 numeric
NC2 20 NC2 numeric
NC3 21 NC3 numeric
NC4 22 NC4 numeric
NC5 23 NC5 numeric
NC6 24 NC6 numeric
OCB1 25 OCB1 numeric
OCB2 26 OCB2 numeric
OCB3 27 OCB3 numeric
OCB4 28 OCB4 numeric
OCB5 29 OCB5 numeric
OCB6 30 OCB6 numeric
OCB7 31 OCB7 numeric
OCB8 32 OCB8 numeric
JP1 33 JP1 numeric
JP2 34 JP2 numeric
JP3 35 JP3 numeric
JP4 36 JP4 numeric

6.2 Identifikasi Variabel Demografis dan Item Konstruk

demographic_vars <- c(
  "Gender",
  "Marital_Status",
  "Age",
  "Education",
  "Position"
)

ac_items <- paste0("AC", 1:6)
cc_items <- paste0("CC", 1:6)
nc_items <- paste0("NC", 1:6)
ocb_items <- paste0("OCB", 1:8)
jp_items <- paste0("JP", 1:4)

construct_items <- c(
  ac_items,
  cc_items,
  nc_items,
  ocb_items,
  jp_items
)

variable_groups <- data.frame(
  Construct = c(
    rep("Affective Commitment", length(ac_items)),
    rep("Continuance Commitment", length(cc_items)),
    rep("Normative Commitment", length(nc_items)),
    rep("Organizational Citizenship Behavior", length(ocb_items)),
    rep("Job Performance", length(jp_items))
  ),
  Code = c(
    rep("AC", length(ac_items)),
    rep("CC", length(cc_items)),
    rep("NC", length(nc_items)),
    rep("OCB", length(ocb_items)),
    rep("JP", length(jp_items))
  ),
  Item = construct_items
)

kable(variable_groups, caption = "Pengelompokan Item Konstruk") %>%
  kable_styling(full_width = FALSE)
Pengelompokan Item Konstruk
Construct Code Item
Affective Commitment AC AC1
Affective Commitment AC AC2
Affective Commitment AC AC3
Affective Commitment AC AC4
Affective Commitment AC AC5
Affective Commitment AC AC6
Continuance Commitment CC CC1
Continuance Commitment CC CC2
Continuance Commitment CC CC3
Continuance Commitment CC CC4
Continuance Commitment CC CC5
Continuance Commitment CC CC6
Normative Commitment NC NC1
Normative Commitment NC NC2
Normative Commitment NC NC3
Normative Commitment NC NC4
Normative Commitment NC NC5
Normative Commitment NC NC6
Organizational Citizenship Behavior OCB OCB1
Organizational Citizenship Behavior OCB OCB2
Organizational Citizenship Behavior OCB OCB3
Organizational Citizenship Behavior OCB OCB4
Organizational Citizenship Behavior OCB OCB5
Organizational Citizenship Behavior OCB OCB6
Organizational Citizenship Behavior OCB OCB7
Organizational Citizenship Behavior OCB OCB8
Job Performance JP JP1
Job Performance JP JP2
Job Performance JP JP3
Job Performance JP JP4

6.3 Pemeriksaan Ketersediaan Variabel

required_vars <- c(demographic_vars, construct_items)

variable_check <- data.frame(
  Variable = required_vars,
  Available = required_vars %in% names(data)
)

kable(variable_check, caption = "Pemeriksaan Ketersediaan Variabel") %>%
  kable_styling(full_width = FALSE)
Pemeriksaan Ketersediaan Variabel
Variable Available
Gender TRUE
Marital_Status FALSE
Age TRUE
Education TRUE
Position TRUE
AC1 TRUE
AC2 TRUE
AC3 TRUE
AC4 TRUE
AC5 TRUE
AC6 TRUE
CC1 TRUE
CC2 TRUE
CC3 TRUE
CC4 TRUE
CC5 TRUE
CC6 TRUE
NC1 TRUE
NC2 TRUE
NC3 TRUE
NC4 TRUE
NC5 TRUE
NC6 TRUE
OCB1 TRUE
OCB2 TRUE
OCB3 TRUE
OCB4 TRUE
OCB5 TRUE
OCB6 TRUE
OCB7 TRUE
OCB8 TRUE
JP1 TRUE
JP2 TRUE
JP3 TRUE
JP4 TRUE

6.4 Data Demografis

demographic_data <- data %>%
  select(any_of(demographic_vars))

head(demographic_data)
## # A tibble: 6 × 4
##   Gender Age   Education   Position                   
##   <chr>  <chr> <chr>       <chr>                      
## 1 Male   36-45 University  Manager/Leader             
## 2 Male   36-45 University  Manager/Leader             
## 3 Male   36-45 University  Employee                   
## 4 Female 25-35 High School Chief/Deputy Chief of Staff
## 5 Female 25-35 High School Manager/Leader             
## 6 Male   >55   Master      Worker

6.5 Data Item Konstruk

item_data <- data %>%
  select(all_of(construct_items))

head(item_data)
## # A tibble: 6 × 30
##     AC1   AC2   AC3   AC4   AC5   AC6   CC1   CC2   CC3   CC4   CC5   CC6   NC1
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     5     5     5     4     5     4     5     5     6     6     6     7     5
## 2     4     4     4     3     4     4     4     5     6     6     6     6     6
## 3     3     3     3     3     2     2     6     6     6     6     6     6     7
## 4     6     6     6     6     5     6     6     6     6     6     6     6     6
## 5     3     3     3     3     3     3     3     4     3     4     4     4     3
## 6     3     5     5     5     3     7     3     3     3     3     5     3     5
## # ℹ 17 more variables: NC2 <dbl>, NC3 <dbl>, NC4 <dbl>, NC5 <dbl>, NC6 <dbl>,
## #   OCB1 <dbl>, OCB2 <dbl>, OCB3 <dbl>, OCB4 <dbl>, OCB5 <dbl>, OCB6 <dbl>,
## #   OCB7 <dbl>, OCB8 <dbl>, JP1 <dbl>, JP2 <dbl>, JP3 <dbl>, JP4 <dbl>

6.6 Ringkasan Item Konstruk

describe(item_data) %>%
  as.data.frame() %>%
  select(n, mean, sd, median, min, max, skew, kurtosis) %>%
  kable(digits = 3, caption = "Ringkasan Statistik Item Konstruk") %>%
  kable_styling(full_width = FALSE)
Ringkasan Statistik Item Konstruk
n mean sd median min max skew kurtosis
AC1 336 4.973 1.252 5 1 7 -0.460 -0.164
AC2 336 5.009 1.261 5 1 7 -0.666 0.171
AC3 336 4.958 1.276 5 1 7 -0.619 0.180
AC4 336 4.810 1.384 5 1 7 -0.452 -0.322
AC5 336 4.905 1.353 5 1 7 -0.542 -0.192
AC6 336 5.033 1.394 5 1 7 -0.612 0.086
CC1 336 5.006 1.401 5 1 7 -0.646 -0.038
CC2 336 5.143 1.337 5 1 7 -0.545 -0.106
CC3 336 5.089 1.418 5 1 7 -0.822 0.510
CC4 336 5.176 1.282 5 1 7 -0.820 0.625
CC5 336 5.140 1.354 5 1 7 -0.829 0.652
CC6 336 5.283 1.300 5 1 7 -0.776 0.534
NC1 336 4.982 1.269 5 1 7 -0.490 0.093
NC2 336 4.839 1.240 5 1 7 -0.406 -0.026
NC3 336 5.122 1.222 5 1 7 -0.674 0.658
NC4 336 4.795 1.419 5 1 7 -0.504 -0.245
NC5 336 4.964 1.228 5 2 7 -0.356 -0.472
NC6 336 4.923 1.318 5 1 7 -0.630 0.046
OCB1 336 5.143 1.242 5 1 7 -0.727 0.622
OCB2 336 5.503 1.224 6 1 7 -1.122 1.573
OCB3 336 5.170 1.196 5 1 7 -0.777 0.874
OCB4 336 5.161 1.238 5 1 7 -0.852 0.954
OCB5 336 4.753 1.483 5 1 7 -0.597 -0.121
OCB6 336 4.705 1.494 5 1 7 -0.631 -0.093
OCB7 336 4.914 1.361 5 1 7 -0.751 0.261
OCB8 336 4.943 1.382 5 1 7 -0.602 -0.061
JP1 336 5.214 1.227 5 1 7 -0.856 1.088
JP2 336 5.012 1.302 5 1 7 -0.734 0.472
JP3 336 4.833 1.374 5 1 7 -0.615 0.023
JP4 336 4.741 1.402 5 1 7 -0.650 0.075

6.7 Jumlah Item per Konstruk

number_of_items <- variable_groups %>%
  group_by(Construct, Code) %>%
  summarise(Number_of_Items = n(), .groups = "drop")

kable(number_of_items, caption = "Jumlah Item per Konstruk") %>%
  kable_styling(full_width = FALSE)
Jumlah Item per Konstruk
Construct Code Number_of_Items
Affective Commitment AC 6
Continuance Commitment CC 6
Job Performance JP 4
Normative Commitment NC 6
Organizational Citizenship Behavior OCB 8

7 Preprocessing Data

7.1 Pemeriksaan Missing Value

missing_value <- data.frame(
  Variable = names(data),
  Missing_Value = colSums(is.na(data))
)

kable(missing_value, caption = "Pemeriksaan Missing Value") %>%
  kable_styling(full_width = FALSE)
Pemeriksaan Missing Value
Variable Missing_Value
No No 0
Gender Gender 0
Marital status Marital status 0
Age Age 0
Education Education 0
Position Position 0
AC1 AC1 0
AC2 AC2 0
AC3 AC3 0
AC4 AC4 0
AC5 AC5 0
AC6 AC6 0
CC1 CC1 0
CC2 CC2 0
CC3 CC3 0
CC4 CC4 0
CC5 CC5 0
CC6 CC6 0
NC1 NC1 0
NC2 NC2 0
NC3 NC3 0
NC4 NC4 0
NC5 NC5 0
NC6 NC6 0
OCB1 OCB1 0
OCB2 OCB2 0
OCB3 OCB3 0
OCB4 OCB4 0
OCB5 OCB5 0
OCB6 OCB6 0
OCB7 OCB7 0
OCB8 OCB8 0
JP1 JP1 0
JP2 JP2 0
JP3 JP3 0
JP4 JP4 0
total_missing <- sum(is.na(data))
total_missing
## [1] 0

7.2 Pemeriksaan Duplikasi Data

total_duplicate <- sum(duplicated(data))
total_duplicate
## [1] 0

7.3 Pemeriksaan Tipe Data Item Konstruk

item_data_type <- data.frame(
  Item = construct_items,
  Data_Type = sapply(data[construct_items], function(x) class(x)[1])
)

kable(item_data_type, caption = "Tipe Data Item Konstruk") %>%
  kable_styling(full_width = FALSE)
Tipe Data Item Konstruk
Item Data_Type
AC1 AC1 numeric
AC2 AC2 numeric
AC3 AC3 numeric
AC4 AC4 numeric
AC5 AC5 numeric
AC6 AC6 numeric
CC1 CC1 numeric
CC2 CC2 numeric
CC3 CC3 numeric
CC4 CC4 numeric
CC5 CC5 numeric
CC6 CC6 numeric
NC1 NC1 numeric
NC2 NC2 numeric
NC3 NC3 numeric
NC4 NC4 numeric
NC5 NC5 numeric
NC6 NC6 numeric
OCB1 OCB1 numeric
OCB2 OCB2 numeric
OCB3 OCB3 numeric
OCB4 OCB4 numeric
OCB5 OCB5 numeric
OCB6 OCB6 numeric
OCB7 OCB7 numeric
OCB8 OCB8 numeric
JP1 JP1 numeric
JP2 JP2 numeric
JP3 JP3 numeric
JP4 JP4 numeric

7.4 Konversi Item Konstruk ke Numerik

data_clean <- data

data_clean[construct_items] <- lapply(
  data_clean[construct_items],
  function(x) as.numeric(as.character(x))
)

7.5 Pemeriksaan Rentang Skala Likert

likert_range <- data.frame(
  Item = construct_items,
  Min = sapply(data_clean[construct_items], min, na.rm = TRUE),
  Max = sapply(data_clean[construct_items], max, na.rm = TRUE)
)

likert_range <- likert_range %>%
  mutate(
    Valid_Range = Min >= 1 & Max <= 7
  )

kable(likert_range, caption = "Pemeriksaan Rentang Skala Likert") %>%
  kable_styling(full_width = FALSE)
Pemeriksaan Rentang Skala Likert
Item Min Max Valid_Range
AC1 AC1 1 7 TRUE
AC2 AC2 1 7 TRUE
AC3 AC3 1 7 TRUE
AC4 AC4 1 7 TRUE
AC5 AC5 1 7 TRUE
AC6 AC6 1 7 TRUE
CC1 CC1 1 7 TRUE
CC2 CC2 1 7 TRUE
CC3 CC3 1 7 TRUE
CC4 CC4 1 7 TRUE
CC5 CC5 1 7 TRUE
CC6 CC6 1 7 TRUE
NC1 NC1 1 7 TRUE
NC2 NC2 1 7 TRUE
NC3 NC3 1 7 TRUE
NC4 NC4 1 7 TRUE
NC5 NC5 2 7 TRUE
NC6 NC6 1 7 TRUE
OCB1 OCB1 1 7 TRUE
OCB2 OCB2 1 7 TRUE
OCB3 OCB3 1 7 TRUE
OCB4 OCB4 1 7 TRUE
OCB5 OCB5 1 7 TRUE
OCB6 OCB6 1 7 TRUE
OCB7 OCB7 1 7 TRUE
OCB8 OCB8 1 7 TRUE
JP1 JP1 1 7 TRUE
JP2 JP2 1 7 TRUE
JP3 JP3 1 7 TRUE
JP4 JP4 1 7 TRUE

7.6 Pemeriksaan Missing Value Setelah Konversi

missing_after_conversion <- data.frame(
  Item = construct_items,
  Missing_Value = colSums(is.na(data_clean[construct_items]))
)

kable(missing_after_conversion, caption = "Missing Value Setelah Konversi Numerik") %>%
  kable_styling(full_width = FALSE)
Missing Value Setelah Konversi Numerik
Item Missing_Value
AC1 AC1 0
AC2 AC2 0
AC3 AC3 0
AC4 AC4 0
AC5 AC5 0
AC6 AC6 0
CC1 CC1 0
CC2 CC2 0
CC3 CC3 0
CC4 CC4 0
CC5 CC5 0
CC6 CC6 0
NC1 NC1 0
NC2 NC2 0
NC3 NC3 0
NC4 NC4 0
NC5 NC5 0
NC6 NC6 0
OCB1 OCB1 0
OCB2 OCB2 0
OCB3 OCB3 0
OCB4 OCB4 0
OCB5 OCB5 0
OCB6 OCB6 0
OCB7 OCB7 0
OCB8 OCB8 0
JP1 JP1 0
JP2 JP2 0
JP3 JP3 0
JP4 JP4 0

7.7 Reverse Coding

reverse_items <- c()

data_clean[reverse_items] <- lapply(
  data_clean[reverse_items],
  function(x) 8 - x
)

7.8 Data SEM Final

sem_data <- data_clean %>%
  select(all_of(construct_items))

head(sem_data)
## # A tibble: 6 × 30
##     AC1   AC2   AC3   AC4   AC5   AC6   CC1   CC2   CC3   CC4   CC5   CC6   NC1
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     5     5     5     4     5     4     5     5     6     6     6     7     5
## 2     4     4     4     3     4     4     4     5     6     6     6     6     6
## 3     3     3     3     3     2     2     6     6     6     6     6     6     7
## 4     6     6     6     6     5     6     6     6     6     6     6     6     6
## 5     3     3     3     3     3     3     3     4     3     4     4     4     3
## 6     3     5     5     5     3     7     3     3     3     3     5     3     5
## # ℹ 17 more variables: NC2 <dbl>, NC3 <dbl>, NC4 <dbl>, NC5 <dbl>, NC6 <dbl>,
## #   OCB1 <dbl>, OCB2 <dbl>, OCB3 <dbl>, OCB4 <dbl>, OCB5 <dbl>, OCB6 <dbl>,
## #   OCB7 <dbl>, OCB8 <dbl>, JP1 <dbl>, JP2 <dbl>, JP3 <dbl>, JP4 <dbl>

7.9 Pemeriksaan Akhir Data SEM

final_check <- data.frame(
  Item = names(sem_data),
  Missing_Value = colSums(is.na(sem_data)),
  Min = sapply(sem_data, min, na.rm = TRUE),
  Max = sapply(sem_data, max, na.rm = TRUE)
)

kable(final_check, caption = "Pemeriksaan Akhir Data SEM") %>%
  kable_styling(full_width = FALSE)
Pemeriksaan Akhir Data SEM
Item Missing_Value Min Max
AC1 AC1 0 1 7
AC2 AC2 0 1 7
AC3 AC3 0 1 7
AC4 AC4 0 1 7
AC5 AC5 0 1 7
AC6 AC6 0 1 7
CC1 CC1 0 1 7
CC2 CC2 0 1 7
CC3 CC3 0 1 7
CC4 CC4 0 1 7
CC5 CC5 0 1 7
CC6 CC6 0 1 7
NC1 NC1 0 1 7
NC2 NC2 0 1 7
NC3 NC3 0 1 7
NC4 NC4 0 1 7
NC5 NC5 0 2 7
NC6 NC6 0 1 7
OCB1 OCB1 0 1 7
OCB2 OCB2 0 1 7
OCB3 OCB3 0 1 7
OCB4 OCB4 0 1 7
OCB5 OCB5 0 1 7
OCB6 OCB6 0 1 7
OCB7 OCB7 0 1 7
OCB8 OCB8 0 1 7
JP1 JP1 0 1 7
JP2 JP2 0 1 7
JP3 JP3 0 1 7
JP4 JP4 0 1 7

Dataset yang digunakan terdiri dari 336 observasi dan 36 variabel. Variabel dalam dataset terdiri atas variabel identitas/demografis dan item-item konstruk penelitian. Konstruk utama yang digunakan dalam analisis PLS-SEM adalah Affective Commitment (AC), Continuance Commitment (CC), Normative Commitment (NC), Organizational Citizenship Behavior (OCB), dan Job Performance (JP).

Berdasarkan struktur data, item konstruk AC, CC, NC, OCB, dan JP telah terbaca sebagai variabel numerik. Hal ini menunjukkan bahwa data item kuesioner sudah sesuai untuk digunakan dalam analisis PLS-SEM. Total item konstruk yang digunakan adalah 30 item, terdiri dari 6 item AC, 6 item CC, 6 item NC, 8 item OCB, dan 4 item JP.

Hasil pemeriksaan missing value menunjukkan bahwa tidak terdapat nilai hilang pada seluruh variabel. Selain itu, hasil pemeriksaan duplikasi menunjukkan bahwa tidak ditemukan data responden yang duplikat. Dengan demikian, dataset dapat digunakan tanpa perlu dilakukan imputasi missing value maupun penghapusan data duplikat.

Pemeriksaan rentang skala Likert menunjukkan bahwa seluruh item konstruk berada pada rentang nilai 1 sampai 7. Hal ini sesuai dengan asumsi skala pengukuran yang digunakan dalam dataset. Setelah proses konversi item ke tipe numerik, tidak ditemukan missing value tambahan, sehingga proses konversi tidak menimbulkan masalah pada data.

Pada bagian reverse coding, tidak ada item yang dimasukkan ke dalam daftar reverse_items. Artinya, seluruh item dianalisis sesuai skor aslinya. Namun, hal ini tetap bergantung pada wording asli kuesioner. Jika terdapat item yang secara substantif bersifat negatif, maka item tersebut perlu dibalik skornya sebelum analisis final.

Secara keseluruhan, data telah memenuhi syarat awal untuk dianalisis menggunakan PLS-SEM karena tidak memiliki missing value, tidak memiliki duplikasi, seluruh item konstruk bertipe numerik, dan seluruh nilai item berada dalam rentang skala Likert yang valid.

8 Statistik Deskriptif

8.1 Statistik Deskriptif Variabel Demografis

if ("Gender" %in% names(demographic_data)) {
  gender_table <- demographic_data %>%
    count(Gender) %>%
    mutate(Percentage = round(n / sum(n) * 100, 2))

  kable(gender_table, caption = "Distribusi Gender") %>%
    kable_styling(full_width = FALSE)
}
Distribusi Gender
Gender n Percentage
Female 98 29.17
Male 238 70.83
if ("Marital_Status" %in% names(demographic_data)) {
  marital_table <- demographic_data %>%
    count(Marital_Status) %>%
    mutate(Percentage = round(n / sum(n) * 100, 2))

  kable(marital_table, caption = "Distribusi Status Pernikahan") %>%
    kable_styling(full_width = FALSE)
}
if ("Age" %in% names(demographic_data)) {
  age_table <- demographic_data %>%
    count(Age) %>%
    mutate(Percentage = round(n / sum(n) * 100, 2))

  kable(age_table, caption = "Distribusi Usia") %>%
    kable_styling(full_width = FALSE)
}
Distribusi Usia
Age n Percentage
18-24 6 1.79
25-35 99 29.46
36-45 125 37.20
46-55 64 19.05
>55 42 12.50
if ("Education" %in% names(demographic_data)) {
  education_table <- demographic_data %>%
    count(Education) %>%
    mutate(Percentage = round(n / sum(n) * 100, 2))

  kable(education_table, caption = "Distribusi Pendidikan") %>%
    kable_styling(full_width = FALSE)
}
Distribusi Pendidikan
Education n Percentage
College 52 15.48
Doctorate 3 0.89
High School 86 25.60
Master 17 5.06
University 178 52.98
if ("Position" %in% names(demographic_data)) {
  position_table <- demographic_data %>%
    count(Position) %>%
    mutate(Percentage = round(n / sum(n) * 100, 2))

  kable(position_table, caption = "Distribusi Posisi") %>%
    kable_styling(full_width = FALSE)
}
Distribusi Posisi
Position n Percentage
Board of Directors 13 3.87
Chief/Deputy Chief of Staff 42 12.50
Employee 56 16.67
Manager/Leader 127 37.80
Worker 98 29.17

8.2 Statistik Deskriptif Item Konstruk

item_descriptive <- describe(sem_data) %>%
  as.data.frame() %>%
  select(n, mean, sd, median, min, max, skew, kurtosis)

kable(item_descriptive, digits = 3, caption = "Statistik Deskriptif Item Konstruk") %>%
  kable_styling(full_width = FALSE)
Statistik Deskriptif Item Konstruk
n mean sd median min max skew kurtosis
AC1 336 4.973 1.252 5 1 7 -0.460 -0.164
AC2 336 5.009 1.261 5 1 7 -0.666 0.171
AC3 336 4.958 1.276 5 1 7 -0.619 0.180
AC4 336 4.810 1.384 5 1 7 -0.452 -0.322
AC5 336 4.905 1.353 5 1 7 -0.542 -0.192
AC6 336 5.033 1.394 5 1 7 -0.612 0.086
CC1 336 5.006 1.401 5 1 7 -0.646 -0.038
CC2 336 5.143 1.337 5 1 7 -0.545 -0.106
CC3 336 5.089 1.418 5 1 7 -0.822 0.510
CC4 336 5.176 1.282 5 1 7 -0.820 0.625
CC5 336 5.140 1.354 5 1 7 -0.829 0.652
CC6 336 5.283 1.300 5 1 7 -0.776 0.534
NC1 336 4.982 1.269 5 1 7 -0.490 0.093
NC2 336 4.839 1.240 5 1 7 -0.406 -0.026
NC3 336 5.122 1.222 5 1 7 -0.674 0.658
NC4 336 4.795 1.419 5 1 7 -0.504 -0.245
NC5 336 4.964 1.228 5 2 7 -0.356 -0.472
NC6 336 4.923 1.318 5 1 7 -0.630 0.046
OCB1 336 5.143 1.242 5 1 7 -0.727 0.622
OCB2 336 5.503 1.224 6 1 7 -1.122 1.573
OCB3 336 5.170 1.196 5 1 7 -0.777 0.874
OCB4 336 5.161 1.238 5 1 7 -0.852 0.954
OCB5 336 4.753 1.483 5 1 7 -0.597 -0.121
OCB6 336 4.705 1.494 5 1 7 -0.631 -0.093
OCB7 336 4.914 1.361 5 1 7 -0.751 0.261
OCB8 336 4.943 1.382 5 1 7 -0.602 -0.061
JP1 336 5.214 1.227 5 1 7 -0.856 1.088
JP2 336 5.012 1.302 5 1 7 -0.734 0.472
JP3 336 4.833 1.374 5 1 7 -0.615 0.023
JP4 336 4.741 1.402 5 1 7 -0.650 0.075

8.3 Skor Rata-Rata Konstruk

construct_scores <- sem_data %>%
  mutate(
    AC = rowMeans(select(., all_of(ac_items)), na.rm = TRUE),
    CC = rowMeans(select(., all_of(cc_items)), na.rm = TRUE),
    NC = rowMeans(select(., all_of(nc_items)), na.rm = TRUE),
    OCB = rowMeans(select(., all_of(ocb_items)), na.rm = TRUE),
    JP = rowMeans(select(., all_of(jp_items)), na.rm = TRUE)
  ) %>%
  select(AC, CC, NC, OCB, JP)

head(construct_scores)
## # A tibble: 6 × 5
##      AC    CC    NC   OCB    JP
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  4.67  5.83  5     5.12  5   
## 2  3.83  5.5   5.67  5.75  5.5 
## 3  2.67  6     5.5   4.25  5.75
## 4  5.83  6     6.33  6     6   
## 5  3     3.67  3.5   4     4.5 
## 6  4.67  3.33  4.83  4.75  4.5

8.4 Statistik Deskriptif Konstruk

construct_descriptive <- describe(construct_scores) %>%
  as.data.frame() %>%
  select(n, mean, sd, median, min, max, skew, kurtosis)

kable(construct_descriptive, digits = 3, caption = "Statistik Deskriptif Konstruk") %>%
  kable_styling(full_width = FALSE)
Statistik Deskriptif Konstruk
n mean sd median min max skew kurtosis
AC 336 4.948 1.171 5.000 1.000 7 -0.585 0.240
CC 336 5.139 1.233 5.333 1.000 7 -0.678 0.258
NC 336 4.938 1.088 5.000 1.667 7 -0.344 -0.225
OCB 336 5.036 1.034 5.125 1.125 7 -0.530 0.290
JP 336 4.950 1.085 5.000 1.500 7 -0.514 0.262

8.5 Visualisasi Rata-Rata Konstruk

construct_mean <- construct_scores %>%
  summarise(across(everything(), mean, na.rm = TRUE)) %>%
  tidyr::pivot_longer(
    cols = everything(),
    names_to = "Construct",
    values_to = "Mean"
  )

ggplot(construct_mean, aes(x = Construct, y = Mean)) +
  geom_col() +
  labs(
    title = "Rata-Rata Skor Konstruk",
    x = "Konstruk",
    y = "Rata-Rata"
  ) +
  ylim(0, 7)

8.6 Korelasi Antar Konstruk

construct_correlation <- cor(construct_scores, use = "pairwise.complete.obs")

round(construct_correlation, 3)
##        AC    CC    NC   OCB    JP
## AC  1.000 0.617 0.702 0.494 0.727
## CC  0.617 1.000 0.664 0.566 0.686
## NC  0.702 0.664 1.000 0.617 0.727
## OCB 0.494 0.566 0.617 1.000 0.692
## JP  0.727 0.686 0.727 0.692 1.000
kable(
  round(construct_correlation, 3),
  caption = "Matriks Korelasi Antar Konstruk"
) %>%
  kable_styling(full_width = FALSE)
Matriks Korelasi Antar Konstruk
AC CC NC OCB JP
AC 1.000 0.617 0.702 0.494 0.727
CC 0.617 1.000 0.664 0.566 0.686
NC 0.702 0.664 1.000 0.617 0.727
OCB 0.494 0.566 0.617 1.000 0.692
JP 0.727 0.686 0.727 0.692 1.000
corrplot(
  construct_correlation,
  method = "number",
  type = "upper",
  tl.col = "black",
  tl.srt = 45
)

Berdasarkan distribusi demografis, responden dalam dataset didominasi oleh laki-laki sebanyak 238 responden atau 70,83%, sedangkan responden perempuan berjumlah 98 responden atau 29,17%. Dari sisi usia, kelompok terbesar adalah responden berusia 36–45 tahun sebanyak 125 responden atau 37,20%, diikuti kelompok usia 25–35 tahun sebanyak 99 responden atau 29,46%.

Dari sisi pendidikan, mayoritas responden memiliki tingkat pendidikan University, yaitu sebanyak 178 responden atau 52,98%. Sementara itu, berdasarkan posisi pekerjaan, kelompok terbesar adalah Manager/Leader sebanyak 127 responden atau 37,80%, diikuti oleh Worker sebanyak 98 responden atau 29,17%. Komposisi ini menunjukkan bahwa responden cukup banyak berasal dari kelompok pekerja dengan pengalaman dan posisi kerja yang relatif matang.

Statistik deskriptif item menunjukkan bahwa sebagian besar item memiliki nilai rata-rata di sekitar angka 4,7 sampai 5,5 pada skala 1–7. Hal ini mengindikasikan bahwa secara umum responden cenderung memberikan penilaian positif terhadap item-item organizational commitment, OCB, dan job performance.

Pada tingkat konstruk, rata-rata konstruk berada pada kategori menengah-tinggi. Nilai rata-rata konstruk adalah AC = 4,948, CC = 5,139, NC = 4,938, OCB = 5,036, dan JP = 4,950. Konstruk dengan rata-rata tertinggi adalah Continuance Commitment (CC), sedangkan rata-rata terendah terdapat pada Normative Commitment (NC) dan Job Performance (JP) yang nilainya relatif berdekatan.

Matriks korelasi antar konstruk menunjukkan bahwa seluruh hubungan antar konstruk bernilai positif. Korelasi antara AC dan JP sebesar 0,727, NC dan JP sebesar 0,727, serta OCB dan JP sebesar 0,692. Hal ini menunjukkan bahwa komitmen organisasi dan OCB memiliki hubungan awal yang cukup kuat dengan job performance.

Korelasi antara OCB dan JP yang bernilai positif menunjukkan bahwa semakin tinggi perilaku Organizational Citizenship Behavior, semakin tinggi pula kecenderungan Job Performance. Selain itu, korelasi antara AC, CC, dan NC juga cukup tinggi, yang wajar karena ketiganya merupakan dimensi dari organizational commitment. Namun, korelasi tersebut masih perlu diuji lebih lanjut dalam model PLS-SEM untuk mengetahui pengaruh langsung dan tidak langsung antar konstruk.

9 Spesifikasi PLS-SEM

9.1 Spesifikasi Inner Model

construct_names <- c("AC", "CC", "NC", "OCB", "JP")

inner_model <- matrix(
  c(
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    1, 1, 1, 0, 0,
    1, 1, 1, 1, 0
  ),
  nrow = 5,
  byrow = TRUE
)

colnames(inner_model) <- rownames(inner_model) <- construct_names

inner_model
##     AC CC NC OCB JP
## AC   0  0  0   0  0
## CC   0  0  0   0  0
## NC   0  0  0   0  0
## OCB  1  1  1   0  0
## JP   1  1  1   1  0
kable(
  inner_model,
  caption = "Matriks Inner Model"
) %>%
  kable_styling(full_width = FALSE)
Matriks Inner Model
AC CC NC OCB JP
AC 0 0 0 0 0
CC 0 0 0 0 0
NC 0 0 0 0 0
OCB 1 1 1 0 0
JP 1 1 1 1 0

9.2 Spesifikasi Outer Model

outer_model <- list(
  AC = ac_items,
  CC = cc_items,
  NC = nc_items,
  OCB = ocb_items,
  JP = jp_items
)

outer_model
## $AC
## [1] "AC1" "AC2" "AC3" "AC4" "AC5" "AC6"
## 
## $CC
## [1] "CC1" "CC2" "CC3" "CC4" "CC5" "CC6"
## 
## $NC
## [1] "NC1" "NC2" "NC3" "NC4" "NC5" "NC6"
## 
## $OCB
## [1] "OCB1" "OCB2" "OCB3" "OCB4" "OCB5" "OCB6" "OCB7" "OCB8"
## 
## $JP
## [1] "JP1" "JP2" "JP3" "JP4"
outer_model_table <- data.frame(
  Construct = rep(names(outer_model), lengths(outer_model)),
  Item = unlist(outer_model)
)

kable(
  outer_model_table,
  caption = "Spesifikasi Outer Model"
) %>%
  kable_styling(full_width = FALSE)
Spesifikasi Outer Model
Construct Item
AC1 AC AC1
AC2 AC AC2
AC3 AC AC3
AC4 AC AC4
AC5 AC AC5
AC6 AC AC6
CC1 CC CC1
CC2 CC CC2
CC3 CC CC3
CC4 CC CC4
CC5 CC CC5
CC6 CC CC6
NC1 NC NC1
NC2 NC NC2
NC3 NC NC3
NC4 NC NC4
NC5 NC NC5
NC6 NC NC6
OCB1 OCB OCB1
OCB2 OCB OCB2
OCB3 OCB OCB3
OCB4 OCB OCB4
OCB5 OCB OCB5
OCB6 OCB OCB6
OCB7 OCB OCB7
OCB8 OCB OCB8
JP1 JP JP1
JP2 JP JP2
JP3 JP JP3
JP4 JP JP4

9.3 Mode Pengukuran

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

measurement_modes <- data.frame(
  Construct = construct_names,
  Mode = modes,
  Measurement_Type = rep("Reflective", length(modes))
)

kable(
  measurement_modes,
  caption = "Mode Pengukuran Konstruk"
) %>%
  kable_styling(full_width = FALSE)
Mode Pengukuran Konstruk
Construct Mode Measurement_Type
AC A Reflective
CC A Reflective
NC A Reflective
OCB A Reflective
JP A Reflective

9.4 Menjalankan Model PLS-SEM

pls_model <- plspm(
  Data = sem_data,
  path_matrix = inner_model,
  blocks = outer_model,
  modes = modes,
  scaled = TRUE
)
summary(pls_model)
## PARTIAL LEAST SQUARES PATH MODELING (PLS-PM) 
## 
## ---------------------------------------------------------- 
## MODEL SPECIFICATION 
## 1   Number of Cases      336 
## 2   Latent Variables     5 
## 3   Manifest Variables   30 
## 4   Scale of Data        Standardized Data 
## 5   Non-Metric PLS       FALSE 
## 6   Weighting Scheme     centroid 
## 7   Tolerance Crit       1e-06 
## 8   Max Num Iters        100 
## 9   Convergence Iters    3 
## 10  Bootstrapping        FALSE 
## 11  Bootstrap samples    NULL 
## 
## ---------------------------------------------------------- 
## BLOCKS DEFINITION 
##     Block         Type   Size   Mode
## 1      AC    Exogenous      6      A
## 2      CC    Exogenous      6      A
## 3      NC    Exogenous      6      A
## 4     OCB   Endogenous      8      A
## 5      JP   Endogenous      4      A
## 
## ---------------------------------------------------------- 
## BLOCKS UNIDIMENSIONALITY 
##      Mode  MVs  C.alpha  DG.rho  eig.1st  eig.2nd
## AC      A    6    0.947   0.958     4.75    0.527
## CC      A    6    0.960   0.968     5.01    0.324
## NC      A    6    0.922   0.939     4.32    0.648
## OCB     A    8    0.908   0.926     4.89    1.126
## JP      A    4    0.833   0.890     2.68    0.617
## 
## ---------------------------------------------------------- 
## OUTER MODEL 
##           weight  loading  communality  redundancy
## AC                                                
##   1 AC1    0.186    0.917        0.841       0.000
##   1 AC2    0.200    0.925        0.856       0.000
##   1 AC3    0.193    0.925        0.856       0.000
##   1 AC4    0.191    0.912        0.831       0.000
##   1 AC5    0.184    0.856        0.732       0.000
##   1 AC6    0.168    0.797        0.635       0.000
## CC                                                
##   2 CC1    0.179    0.881        0.777       0.000
##   2 CC2    0.181    0.926        0.857       0.000
##   2 CC3    0.194    0.945        0.893       0.000
##   2 CC4    0.182    0.900        0.809       0.000
##   2 CC5    0.183    0.930        0.865       0.000
##   2 CC6    0.176    0.900        0.810       0.000
## NC                                                
##   3 NC1    0.190    0.828        0.686       0.000
##   3 NC2    0.191    0.851        0.725       0.000
##   3 NC3    0.192    0.833        0.694       0.000
##   3 NC4    0.204    0.853        0.727       0.000
##   3 NC5    0.211    0.890        0.793       0.000
##   3 NC6    0.190    0.835        0.698       0.000
## OCB                                               
##   4 OCB1   0.179    0.859        0.737       0.339
##   4 OCB2   0.212    0.821        0.674       0.310
##   4 OCB3   0.163    0.733        0.537       0.247
##   4 OCB4   0.166    0.804        0.646       0.297
##   4 OCB5   0.127    0.724        0.524       0.241
##   4 OCB6   0.106    0.644        0.415       0.191
##   4 OCB7   0.164    0.847        0.717       0.329
##   4 OCB8   0.153    0.785        0.617       0.283
## JP                                                
##   5 JP1    0.303    0.807        0.652       0.478
##   5 JP2    0.235    0.703        0.495       0.363
##   5 JP3    0.339    0.895        0.801       0.588
##   5 JP4    0.336    0.853        0.728       0.534
## 
## ---------------------------------------------------------- 
## CROSSLOADINGS 
##              AC     CC     NC    OCB     JP
## AC                                         
##   1 AC1   0.917  0.558  0.611  0.446  0.661
##   1 AC2   0.925  0.545  0.653  0.489  0.703
##   1 AC3   0.925  0.545  0.644  0.464  0.687
##   1 AC4   0.912  0.533  0.638  0.449  0.686
##   1 AC5   0.856  0.548  0.623  0.462  0.632
##   1 AC6   0.797  0.552  0.567  0.434  0.569
## CC                                         
##   2 CC1   0.594  0.881  0.619  0.521  0.631
##   2 CC2   0.576  0.926  0.608  0.522  0.639
##   2 CC3   0.621  0.945  0.666  0.544  0.699
##   2 CC4   0.511  0.900  0.577  0.565  0.603
##   2 CC5   0.555  0.930  0.584  0.533  0.641
##   2 CC6   0.503  0.900  0.576  0.538  0.590
## NC                                         
##   3 NC1   0.648  0.543  0.828  0.492  0.633
##   3 NC2   0.658  0.584  0.851  0.498  0.634
##   3 NC3   0.563  0.510  0.833  0.549  0.588
##   3 NC4   0.581  0.564  0.853  0.576  0.635
##   3 NC5   0.561  0.582  0.890  0.620  0.629
##   3 NC6   0.563  0.592  0.835  0.521  0.605
## OCB                                        
##   4 OCB1  0.446  0.447  0.539  0.859  0.675
##   4 OCB2  0.536  0.642  0.633  0.821  0.686
##   4 OCB3  0.423  0.405  0.526  0.733  0.570
##   4 OCB4  0.413  0.481  0.515  0.804  0.543
##   4 OCB5  0.283  0.427  0.359  0.724  0.424
##   4 OCB6  0.283  0.264  0.344  0.644  0.358
##   4 OCB7  0.373  0.481  0.519  0.847  0.557
##   4 OCB8  0.367  0.424  0.470  0.785  0.539
## JP                                         
##   5 JP1   0.556  0.569  0.611  0.594  0.807
##   5 JP2   0.385  0.397  0.461  0.564  0.703
##   5 JP3   0.662  0.659  0.663  0.618  0.895
##   5 JP4   0.762  0.610  0.633  0.575  0.853
## 
## ---------------------------------------------------------- 
## INNER MODEL 
## $OCB
##              Estimate   Std. Error     t value   Pr(>|t|)
## Intercept   -1.74e-16       0.0404   -4.31e-15   1.00e+00
## AC           4.63e-02       0.0589    7.87e-01   4.32e-01
## CC           2.78e-01       0.0561    4.96e+00   1.15e-06
## NC           4.24e-01       0.0621    6.83e+00   4.01e-11
## 
## $JP
##             Estimate   Std. Error    t value   Pr(>|t|)
## Intercept   1.75e-17       0.0284   6.17e-16   1.00e+00
## AC          3.50e-01       0.0414   8.44e+00   1.03e-15
## CC          1.85e-01       0.0409   4.53e+00   8.09e-06
## NC          1.53e-01       0.0466   3.28e+00   1.13e-03
## OCB         3.28e-01       0.0386   8.51e+00   6.16e-16
## 
## ---------------------------------------------------------- 
## CORRELATIONS BETWEEN LVs 
##         AC     CC     NC    OCB     JP
## AC   1.000  0.614  0.701  0.514  0.739
## CC   0.614  1.000  0.663  0.588  0.694
## NC   0.701  0.663  1.000  0.641  0.731
## OCB  0.514  0.588  0.641  1.000  0.715
## JP   0.739  0.694  0.731  0.715  1.000
## 
## ---------------------------------------------------------- 
## SUMMARY INNER MODEL 
##            Type     R2  Block_Communality  Mean_Redundancy    AVE
## AC    Exogenous  0.000              0.792            0.000  0.792
## CC    Exogenous  0.000              0.835            0.000  0.835
## NC    Exogenous  0.000              0.720            0.000  0.720
## OCB  Endogenous  0.459              0.609            0.279  0.609
## JP   Endogenous  0.734              0.669            0.491  0.669
## 
## ---------------------------------------------------------- 
## GOODNESS-OF-FIT 
## [1]  0.6558
## 
## ---------------------------------------------------------- 
## TOTAL EFFECTS 
##     relationships  direct  indirect   total
## 1        AC -> CC  0.0000    0.0000  0.0000
## 2        AC -> NC  0.0000    0.0000  0.0000
## 3       AC -> OCB  0.0463    0.0000  0.0463
## 4        AC -> JP  0.3495    0.0152  0.3648
## 5        CC -> NC  0.0000    0.0000  0.0000
## 6       CC -> OCB  0.2782    0.0000  0.2782
## 7        CC -> JP  0.1854    0.0913  0.2767
## 8       NC -> OCB  0.4242    0.0000  0.4242
## 9        NC -> JP  0.1531    0.1392  0.2923
## 10      OCB -> JP  0.3282    0.0000  0.3282

9.5 Visualisasi Model PLS-SEM

plot(pls_model)

10 Evaluasi Outer Model

10.1 Outer Loading

outer_loading <- pls_model$outer_model %>%
  select(block, name, weight, loading, communality, redundancy)

kable(
  outer_loading,
  digits = 3,
  caption = "Outer Loading"
) %>%
  kable_styling(full_width = FALSE)
Outer Loading
block name weight loading communality redundancy
AC AC1 0.186 0.917 0.841 0.000
AC AC2 0.200 0.925 0.856 0.000
AC AC3 0.193 0.925 0.856 0.000
AC AC4 0.191 0.912 0.831 0.000
AC AC5 0.184 0.856 0.732 0.000
AC AC6 0.168 0.797 0.635 0.000
CC CC1 0.179 0.881 0.777 0.000
CC CC2 0.181 0.926 0.857 0.000
CC CC3 0.194 0.945 0.893 0.000
CC CC4 0.182 0.900 0.809 0.000
CC CC5 0.183 0.930 0.865 0.000
CC CC6 0.176 0.900 0.810 0.000
NC NC1 0.190 0.828 0.686 0.000
NC NC2 0.191 0.851 0.725 0.000
NC NC3 0.192 0.833 0.694 0.000
NC NC4 0.204 0.853 0.727 0.000
NC NC5 0.211 0.890 0.793 0.000
NC NC6 0.190 0.835 0.698 0.000
OCB OCB1 0.179 0.859 0.737 0.339
OCB OCB2 0.212 0.821 0.674 0.310
OCB OCB3 0.163 0.733 0.537 0.247
OCB OCB4 0.166 0.804 0.646 0.297
OCB OCB5 0.127 0.724 0.524 0.241
OCB OCB6 0.106 0.644 0.415 0.191
OCB OCB7 0.164 0.847 0.717 0.329
OCB OCB8 0.153 0.785 0.617 0.283
JP JP1 0.303 0.807 0.652 0.478
JP JP2 0.235 0.703 0.495 0.363
JP JP3 0.339 0.895 0.801 0.588
JP JP4 0.336 0.853 0.728 0.534

10.2 Keputusan Outer Loading

outer_loading_decision <- outer_loading %>%
  mutate(
    Loading_Criteria = case_when(
      loading >= 0.70 ~ "Memenuhi",
      loading >= 0.50 & loading < 0.70 ~ "Dipertimbangkan",
      loading < 0.50 ~ "Tidak Memenuhi"
    )
  )

kable(
  outer_loading_decision,
  digits = 3,
  caption = "Keputusan Outer Loading"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Outer Loading
block name weight loading communality redundancy Loading_Criteria
AC AC1 0.186 0.917 0.841 0.000 Memenuhi
AC AC2 0.200 0.925 0.856 0.000 Memenuhi
AC AC3 0.193 0.925 0.856 0.000 Memenuhi
AC AC4 0.191 0.912 0.831 0.000 Memenuhi
AC AC5 0.184 0.856 0.732 0.000 Memenuhi
AC AC6 0.168 0.797 0.635 0.000 Memenuhi
CC CC1 0.179 0.881 0.777 0.000 Memenuhi
CC CC2 0.181 0.926 0.857 0.000 Memenuhi
CC CC3 0.194 0.945 0.893 0.000 Memenuhi
CC CC4 0.182 0.900 0.809 0.000 Memenuhi
CC CC5 0.183 0.930 0.865 0.000 Memenuhi
CC CC6 0.176 0.900 0.810 0.000 Memenuhi
NC NC1 0.190 0.828 0.686 0.000 Memenuhi
NC NC2 0.191 0.851 0.725 0.000 Memenuhi
NC NC3 0.192 0.833 0.694 0.000 Memenuhi
NC NC4 0.204 0.853 0.727 0.000 Memenuhi
NC NC5 0.211 0.890 0.793 0.000 Memenuhi
NC NC6 0.190 0.835 0.698 0.000 Memenuhi
OCB OCB1 0.179 0.859 0.737 0.339 Memenuhi
OCB OCB2 0.212 0.821 0.674 0.310 Memenuhi
OCB OCB3 0.163 0.733 0.537 0.247 Memenuhi
OCB OCB4 0.166 0.804 0.646 0.297 Memenuhi
OCB OCB5 0.127 0.724 0.524 0.241 Memenuhi
OCB OCB6 0.106 0.644 0.415 0.191 Dipertimbangkan
OCB OCB7 0.164 0.847 0.717 0.329 Memenuhi
OCB OCB8 0.153 0.785 0.617 0.283 Memenuhi
JP JP1 0.303 0.807 0.652 0.478 Memenuhi
JP JP2 0.235 0.703 0.495 0.363 Memenuhi
JP JP3 0.339 0.895 0.801 0.588 Memenuhi
JP JP4 0.336 0.853 0.728 0.534 Memenuhi

10.3 Reliabilitas Konstruk

construct_reliability <- pls_model$unidim %>%
  as.data.frame()

construct_reliability$Construct <- rownames(construct_reliability)

construct_reliability <- construct_reliability %>%
  select(Construct, everything())

kable(
  construct_reliability,
  digits = 3,
  caption = "Reliabilitas Konstruk"
) %>%
  kable_styling(full_width = FALSE)
Reliabilitas Konstruk
Construct Mode MVs C.alpha DG.rho eig.1st eig.2nd
AC AC A 6 0.947 0.958 4.751 0.527
CC CC A 6 0.960 0.968 5.011 0.324
NC NC A 6 0.922 0.939 4.322 0.648
OCB OCB A 8 0.908 0.926 4.886 1.126
JP JP A 4 0.833 0.890 2.678 0.617

10.4 Keputusan Reliabilitas Konstruk

reliability_decision <- construct_reliability %>%
  mutate(
    Cronbach_Alpha_Decision = ifelse(C.alpha >= 0.70, "Memenuhi", "Tidak Memenuhi"),
    Composite_Reliability_Decision = ifelse(DG.rho >= 0.70, "Memenuhi", "Tidak Memenuhi")
  ) %>%
  select(
    Construct,
    C.alpha,
    Cronbach_Alpha_Decision,
    DG.rho,
    Composite_Reliability_Decision
  )

kable(
  reliability_decision,
  digits = 3,
  caption = "Keputusan Reliabilitas Konstruk"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Reliabilitas Konstruk
Construct C.alpha Cronbach_Alpha_Decision DG.rho Composite_Reliability_Decision
AC AC 0.947 Memenuhi 0.958 Memenuhi
CC CC 0.960 Memenuhi 0.968 Memenuhi
NC NC 0.922 Memenuhi 0.939 Memenuhi
OCB OCB 0.908 Memenuhi 0.926 Memenuhi
JP JP 0.833 Memenuhi 0.890 Memenuhi

10.5 Average Variance Extracted

ave_table <- pls_model$inner_summary %>%
  as.data.frame()

ave_table$Construct <- rownames(ave_table)

ave_table <- ave_table %>%
  select(Construct, AVE) %>%
  mutate(
    AVE_Decision = ifelse(AVE >= 0.50, "Memenuhi", "Tidak Memenuhi")
  )

kable(
  ave_table,
  digits = 3,
  caption = "Average Variance Extracted"
) %>%
  kable_styling(full_width = FALSE)
Average Variance Extracted
Construct AVE AVE_Decision
AC AC 0.792 Memenuhi
CC CC 0.835 Memenuhi
NC NC 0.720 Memenuhi
OCB OCB 0.609 Memenuhi
JP JP 0.669 Memenuhi

10.6 Cross Loading

cross_loading <- pls_model$crossloadings

kable(
  cross_loading,
  digits = 3,
  caption = "Cross Loading"
) %>%
  kable_styling(full_width = FALSE)
Cross Loading
name block AC CC NC OCB JP
AC1 AC 0.917 0.558 0.611 0.446 0.661
AC2 AC 0.925 0.545 0.653 0.489 0.703
AC3 AC 0.925 0.545 0.644 0.464 0.687
AC4 AC 0.912 0.533 0.638 0.449 0.686
AC5 AC 0.856 0.548 0.623 0.462 0.632
AC6 AC 0.797 0.552 0.567 0.434 0.569
CC1 CC 0.594 0.881 0.619 0.521 0.631
CC2 CC 0.576 0.926 0.608 0.522 0.639
CC3 CC 0.621 0.945 0.666 0.544 0.699
CC4 CC 0.511 0.900 0.577 0.565 0.603
CC5 CC 0.555 0.930 0.584 0.533 0.641
CC6 CC 0.503 0.900 0.576 0.538 0.590
NC1 NC 0.648 0.543 0.828 0.492 0.633
NC2 NC 0.658 0.584 0.851 0.498 0.634
NC3 NC 0.563 0.510 0.833 0.549 0.588
NC4 NC 0.581 0.564 0.853 0.576 0.635
NC5 NC 0.561 0.582 0.890 0.620 0.629
NC6 NC 0.563 0.592 0.835 0.521 0.605
OCB1 OCB 0.446 0.447 0.539 0.859 0.675
OCB2 OCB 0.536 0.642 0.633 0.821 0.686
OCB3 OCB 0.423 0.405 0.526 0.733 0.570
OCB4 OCB 0.413 0.481 0.515 0.804 0.543
OCB5 OCB 0.283 0.427 0.359 0.724 0.424
OCB6 OCB 0.283 0.264 0.344 0.644 0.358
OCB7 OCB 0.373 0.481 0.519 0.847 0.557
OCB8 OCB 0.367 0.424 0.470 0.785 0.539
JP1 JP 0.556 0.569 0.611 0.594 0.807
JP2 JP 0.385 0.397 0.461 0.564 0.703
JP3 JP 0.662 0.659 0.663 0.618 0.895
JP4 JP 0.762 0.610 0.633 0.575 0.853

10.7 Fornell-Larcker Criterion

latent_scores <- pls_model$scores

latent_correlation <- cor(latent_scores)

sqrt_ave <- sqrt(ave_table$AVE)
names(sqrt_ave) <- ave_table$Construct

fornell_larcker <- latent_correlation
diag(fornell_larcker) <- sqrt_ave[colnames(fornell_larcker)]

kable(
  round(fornell_larcker, 3),
  caption = "Fornell-Larcker Criterion"
) %>%
  kable_styling(full_width = FALSE)
Fornell-Larcker Criterion
AC CC NC OCB JP
AC 0.890 0.614 0.700 0.514 0.739
CC 0.614 0.914 0.663 0.588 0.694
NC 0.700 0.663 0.849 0.641 0.731
OCB 0.514 0.588 0.641 0.780 0.715
JP 0.739 0.694 0.731 0.715 0.818

10.8 HTMT

calculate_htmt <- function(data, construct_list) {
  construct_names <- names(construct_list)
  htmt_matrix <- matrix(
    NA,
    nrow = length(construct_names),
    ncol = length(construct_names)
  )

  rownames(htmt_matrix) <- colnames(htmt_matrix) <- construct_names

  for (i in seq_along(construct_names)) {
    for (j in seq_along(construct_names)) {
      if (i == j) {
        htmt_matrix[i, j] <- 1
      } else {
        items_i <- construct_list[[i]]
        items_j <- construct_list[[j]]

        heterotrait_corr <- abs(cor(data[, items_i], data[, items_j], use = "pairwise.complete.obs"))
        mean_heterotrait <- mean(heterotrait_corr, na.rm = TRUE)

        monotrait_i <- abs(cor(data[, items_i], use = "pairwise.complete.obs"))
        monotrait_j <- abs(cor(data[, items_j], use = "pairwise.complete.obs"))

        monotrait_i <- monotrait_i[upper.tri(monotrait_i)]
        monotrait_j <- monotrait_j[upper.tri(monotrait_j)]

        mean_monotrait_i <- mean(monotrait_i, na.rm = TRUE)
        mean_monotrait_j <- mean(monotrait_j, na.rm = TRUE)

        htmt_matrix[i, j] <- mean_heterotrait / sqrt(mean_monotrait_i * mean_monotrait_j)
      }
    }
  }

  return(htmt_matrix)
}
htmt_matrix <- calculate_htmt(sem_data, outer_model)

kable(
  round(htmt_matrix, 3),
  caption = "HTMT"
) %>%
  kable_styling(full_width = FALSE)
HTMT
AC CC NC OCB JP
AC 1.000 0.645 0.751 0.541 0.815
CC 0.645 1.000 0.704 0.613 0.765
NC 0.751 0.704 1.000 0.683 0.828
OCB 0.541 0.613 0.683 1.000 0.808
JP 0.815 0.765 0.828 0.808 1.000

10.9 Keputusan HTMT

htmt_decision <- as.data.frame(as.table(htmt_matrix)) %>%
  filter(Var1 != Var2) %>%
  mutate(
    Pair = paste(Var1, "-", Var2),
    HTMT = Freq,
    Decision_085 = ifelse(HTMT < 0.85, "Memenuhi", "Tidak Memenuhi"),
    Decision_090 = ifelse(HTMT < 0.90, "Memenuhi", "Tidak Memenuhi")
  ) %>%
  select(Pair, HTMT, Decision_085, Decision_090) %>%
  distinct()

kable(
  htmt_decision,
  digits = 3,
  caption = "Keputusan HTMT"
) %>%
  kable_styling(full_width = FALSE)
Keputusan HTMT
Pair HTMT Decision_085 Decision_090
CC - AC 0.645 Memenuhi Memenuhi
NC - AC 0.751 Memenuhi Memenuhi
OCB - AC 0.541 Memenuhi Memenuhi
JP - AC 0.815 Memenuhi Memenuhi
AC - CC 0.645 Memenuhi Memenuhi
NC - CC 0.704 Memenuhi Memenuhi
OCB - CC 0.613 Memenuhi Memenuhi
JP - CC 0.765 Memenuhi Memenuhi
AC - NC 0.751 Memenuhi Memenuhi
CC - NC 0.704 Memenuhi Memenuhi
OCB - NC 0.683 Memenuhi Memenuhi
JP - NC 0.828 Memenuhi Memenuhi
AC - OCB 0.541 Memenuhi Memenuhi
CC - OCB 0.613 Memenuhi Memenuhi
NC - OCB 0.683 Memenuhi Memenuhi
JP - OCB 0.808 Memenuhi Memenuhi
AC - JP 0.815 Memenuhi Memenuhi
CC - JP 0.765 Memenuhi Memenuhi
NC - JP 0.828 Memenuhi Memenuhi
OCB - JP 0.808 Memenuhi Memenuhi

Evaluasi outer model dilakukan untuk menilai apakah indikator-indikator yang digunakan telah mampu merepresentasikan konstruk laten dengan baik. Evaluasi ini meliputi outer loading, reliabilitas konstruk, validitas konvergen, cross loading, Fornell-Larcker Criterion, dan HTMT.

Berdasarkan hasil outer loading, sebagian besar indikator memiliki nilai loading di atas 0,70. Pada konstruk Affective Commitment (AC), seluruh indikator AC1 sampai AC6 memiliki loading antara 0,797 sampai 0,925, sehingga seluruh indikator AC memenuhi kriteria. Pada konstruk Continuance Commitment (CC), seluruh indikator CC1 sampai CC6 memiliki loading antara 0,881 sampai 0,945, sehingga seluruh indikator CC juga memenuhi kriteria. Pada konstruk Normative Commitment (NC), seluruh indikator NC1 sampai NC6 memiliki loading antara 0,828 sampai 0,890, sehingga seluruh indikator NC memenuhi kriteria outer loading.

Pada konstruk Organizational Citizenship Behavior (OCB), sebagian besar indikator memiliki loading di atas 0,70. Indikator OCB1, OCB2, OCB3, OCB4, OCB5, OCB7, dan OCB8 memenuhi kriteria. Namun, indikator OCB6 memiliki loading sebesar 0,644, sehingga masuk kategori dipertimbangkan. Nilai ini masih berada di atas 0,50, sehingga indikator tersebut tidak harus langsung dihapus. Keputusan untuk mempertahankan atau menghapus OCB6 sebaiknya mempertimbangkan teori, isi item, serta dampaknya terhadap AVE dan reliabilitas konstruk.

Pada konstruk Job Performance (JP), seluruh indikator JP1 sampai JP4 memenuhi kriteria outer loading. Nilai loading JP berada antara 0,703 sampai 0,895. Meskipun JP2 memiliki nilai loading paling rendah di antara indikator JP, yaitu 0,703, nilainya masih berada di atas batas 0,70 sehingga tetap memenuhi kriteria.

Hasil reliabilitas konstruk menunjukkan bahwa seluruh konstruk memiliki Cronbach’s Alpha dan Composite Reliability (DG.rho) di atas 0,70. Nilai Cronbach’s Alpha masing-masing konstruk adalah AC = 0,947, CC = 0,960, NC = 0,922, OCB = 0,908, dan JP = 0,833. Sementara itu, nilai Composite Reliability masing-masing konstruk adalah AC = 0,958, CC = 0,968, NC = 0,939, OCB = 0,926, dan JP = 0,890. Dengan demikian, seluruh konstruk dapat dinyatakan reliabel.

Validitas konvergen dievaluasi menggunakan nilai Average Variance Extracted (AVE). Seluruh konstruk memiliki nilai AVE di atas 0,50, yaitu AC = 0,792, CC = 0,835, NC = 0,720, OCB = 0,609, dan JP = 0,669. Hal ini menunjukkan bahwa masing-masing konstruk mampu menjelaskan lebih dari 50% varians indikator-indikatornya.

Hasil Fornell-Larcker Criterion menunjukkan bahwa nilai akar AVE pada diagonal utama lebih besar dibandingkan korelasi konstruk tersebut dengan konstruk lainnya. Nilai diagonal adalah AC = 0,890, CC = 0,914, NC = 0,849, OCB = 0,780, dan JP = 0,818. Hasil ini menunjukkan bahwa validitas diskriminan berdasarkan Fornell-Larcker telah terpenuhi.

Hasil HTMT juga menunjukkan bahwa seluruh pasangan konstruk memiliki nilai di bawah 0,85 dan 0,90. Nilai HTMT tertinggi adalah NC - JP = 0,828, diikuti AC - JP = 0,815 dan OCB - JP = 0,808. Karena seluruh nilai masih berada di bawah batas 0,85, maka validitas diskriminan berdasarkan HTMT dapat dinyatakan terpenuhi.

Secara keseluruhan, outer model dalam penelitian ini dapat dinyatakan layak. Indikator-indikator konstruk memiliki reliabilitas dan validitas yang baik. Satu indikator, yaitu OCB6, perlu diberi catatan karena loading-nya berada di bawah 0,70, tetapi indikator tersebut masih dapat dipertahankan karena nilai reliabilitas dan AVE konstruk OCB tetap memenuhi kriteria.

11 Evaluasi Inner Model

11.1 Path Coefficient

path_coefficient <- pls_model$path_coefs

kable(
  round(path_coefficient, 3),
  caption = "Path Coefficient"
) %>%
  kable_styling(full_width = FALSE)
Path Coefficient
AC CC NC OCB JP
AC 0.000 0.000 0.000 0.000 0
CC 0.000 0.000 0.000 0.000 0
NC 0.000 0.000 0.000 0.000 0
OCB 0.046 0.278 0.424 0.000 0
JP 0.350 0.185 0.153 0.328 0

11.2 Inner Model Regression Output

pls_model$inner_model
## $OCB
##                Estimate Std. Error       t value     Pr(>|t|)
## Intercept -1.741330e-16 0.04035662 -4.314857e-15 1.000000e+00
## AC         4.634645e-02 0.05889748  7.869003e-01 4.319016e-01
## CC         2.781665e-01 0.05612918  4.955827e+00 1.150192e-06
## NC         4.242437e-01 0.06209484  6.832189e+00 4.006379e-11
## 
## $JP
##               Estimate Std. Error      t value     Pr(>|t|)
## Intercept 1.750744e-17 0.02836384 6.172449e-16 1.000000e+00
## AC        3.495422e-01 0.04143350 8.436222e+00 1.031920e-15
## CC        1.853758e-01 0.04088239 4.534366e+00 8.086858e-06
## NC        1.530503e-01 0.04660926 3.283690e+00 1.134098e-03
## OCB       3.282293e-01 0.03857280 8.509347e+00 6.159504e-16

11.3 R-Square

r_square <- pls_model$inner_summary %>%
  as.data.frame()

r_square$Construct <- rownames(r_square)

r_square <- r_square %>%
  select(Construct, Type, R2)

kable(
  r_square,
  digits = 3,
  caption = "R-Square"
) %>%
  kable_styling(full_width = FALSE)
R-Square
Construct Type R2
AC AC Exogenous 0.000
CC CC Exogenous 0.000
NC NC Exogenous 0.000
OCB OCB Endogenous 0.459
JP JP Endogenous 0.734

11.4 Total Effects

total_effects <- pls_model$effects

kable(
  total_effects,
  digits = 3,
  caption = "Total Effects"
) %>%
  kable_styling(full_width = FALSE)
Total Effects
relationships direct indirect total
AC -> CC 0.000 0.000 0.000
AC -> NC 0.000 0.000 0.000
AC -> OCB 0.046 0.000 0.046
AC -> JP 0.350 0.015 0.365
CC -> NC 0.000 0.000 0.000
CC -> OCB 0.278 0.000 0.278
CC -> JP 0.185 0.091 0.277
NC -> OCB 0.424 0.000 0.424
NC -> JP 0.153 0.139 0.292
OCB -> JP 0.328 0.000 0.328

11.5 Bootstrapping

set.seed(123)

pls_boot <- plspm(
  Data = sem_data,
  path_matrix = inner_model,
  blocks = outer_model,
  modes = modes,
  scaled = TRUE,
  boot.val = TRUE,
  br = 5000
)

11.6 Bootstrapping Path Coefficient

bootstrap_paths <- pls_boot$boot$paths

kable(
  bootstrap_paths,
  digits = 3,
  caption = "Bootstrapping Path Coefficient"
) %>%
  kable_styling(full_width = FALSE)
Bootstrapping Path Coefficient
Original Mean.Boot Std.Error perc.025 perc.975
AC -> OCB 0.046 0.049 0.069 -0.086 0.184
AC -> JP 0.350 0.349 0.057 0.237 0.456
CC -> OCB 0.278 0.279 0.069 0.141 0.410
CC -> JP 0.185 0.186 0.050 0.091 0.286
NC -> OCB 0.424 0.424 0.070 0.287 0.559
NC -> JP 0.153 0.148 0.059 0.033 0.263
OCB -> JP 0.328 0.332 0.043 0.249 0.418

11.7 Keputusan Hipotesis Direct Effect

direct_effect_decision <- bootstrap_paths %>%
  as.data.frame()

direct_effect_decision$Relationship <- rownames(direct_effect_decision)

direct_effect_decision <- direct_effect_decision %>%
  select(Relationship, everything())

if ("perc.025" %in% names(direct_effect_decision) & "perc.975" %in% names(direct_effect_decision)) {
  direct_effect_decision <- direct_effect_decision %>%
    mutate(
      Decision = ifelse(
        perc.025 > 0 | perc.975 < 0,
        "Signifikan",
        "Tidak Signifikan"
      )
    )
}

kable(
  direct_effect_decision,
  digits = 3,
  caption = "Keputusan Hipotesis Direct Effect"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Hipotesis Direct Effect
Relationship Original Mean.Boot Std.Error perc.025 perc.975 Decision
AC -> OCB AC -> OCB 0.046 0.049 0.069 -0.086 0.184 Tidak Signifikan
AC -> JP AC -> JP 0.350 0.349 0.057 0.237 0.456 Signifikan
CC -> OCB CC -> OCB 0.278 0.279 0.069 0.141 0.410 Signifikan
CC -> JP CC -> JP 0.185 0.186 0.050 0.091 0.286 Signifikan
NC -> OCB NC -> OCB 0.424 0.424 0.070 0.287 0.559 Signifikan
NC -> JP NC -> JP 0.153 0.148 0.059 0.033 0.263 Signifikan
OCB -> JP OCB -> JP 0.328 0.332 0.043 0.249 0.418 Signifikan

11.8 Inner VIF

latent_scores_df <- as.data.frame(pls_model$scores)

calculate_vif <- function(model_data, dependent, predictors) {
  
  vif_values <- sapply(predictors, function(predictor) {
    
    other_predictors <- setdiff(predictors, predictor)
    
    if (length(other_predictors) == 0) {
      return(1)
    }
    
    vif_formula <- as.formula(
      paste(predictor, "~", paste(other_predictors, collapse = " + "))
    )
    
    r2 <- summary(lm(vif_formula, data = model_data))$r.squared
    
    1 / (1 - r2)
  })
  
  data.frame(
    Dependent = dependent,
    Predictor = predictors,
    VIF = as.numeric(vif_values)
  )
}

vif_ocb <- calculate_vif(
  model_data = latent_scores_df,
  dependent = "OCB",
  predictors = c("AC", "CC", "NC")
)

vif_jp <- calculate_vif(
  model_data = latent_scores_df,
  dependent = "JP",
  predictors = c("AC", "CC", "NC", "OCB")
)

inner_vif <- bind_rows(vif_ocb, vif_jp)

kable(
  inner_vif,
  digits = 3,
  caption = "Inner VIF"
) %>%
  kable_styling(full_width = FALSE)
Inner VIF
Dependent Predictor VIF
OCB AC 2.130
OCB CC 1.934
OCB NC 2.367
JP AC 2.134
JP CC 2.078
JP NC 2.700
JP OCB 1.849

11.9 Keputusan Inner VIF

inner_vif_decision <- inner_vif %>%
  mutate(
    Decision_3_3 = ifelse(VIF < 3.3, "Memenuhi", "Tidak Memenuhi"),
    Decision_5 = ifelse(VIF < 5, "Memenuhi", "Tidak Memenuhi")
  )

kable(
  inner_vif_decision,
  digits = 3,
  caption = "Keputusan Inner VIF"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Inner VIF
Dependent Predictor VIF Decision_3_3 Decision_5
OCB AC 2.130 Memenuhi Memenuhi
OCB CC 1.934 Memenuhi Memenuhi
OCB NC 2.367 Memenuhi Memenuhi
JP AC 2.134 Memenuhi Memenuhi
JP CC 2.078 Memenuhi Memenuhi
JP NC 2.700 Memenuhi Memenuhi
JP OCB 1.849 Memenuhi Memenuhi

Evaluasi inner model dilakukan untuk menilai hubungan struktural antar konstruk laten. Model struktural dalam penelitian ini menguji pengaruh Affective Commitment, Continuance Commitment, dan Normative Commitment terhadap Organizational Citizenship Behavior dan Job Performance, serta pengaruh Organizational Citizenship Behavior terhadap Job Performance.

Berdasarkan nilai path coefficient, pengaruh Affective Commitment terhadap OCB memiliki koefisien sebesar 0,046. Nilai ini positif, tetapi sangat kecil. Hasil bootstrapping menunjukkan interval kepercayaan -0,086 sampai 0,184, sehingga interval tersebut melewati nol. Dengan demikian, pengaruh Affective Commitment terhadap OCB dinyatakan tidak signifikan. Oleh karena itu, H1 tidak didukung.

Pengaruh Continuance Commitment terhadap OCB memiliki koefisien sebesar 0,278. Hasil bootstrapping menunjukkan interval kepercayaan 0,141 sampai 0,410, sehingga tidak melewati nol. Dengan demikian, Continuance Commitment berpengaruh positif dan signifikan terhadap OCB. Oleh karena itu, H2 didukung.

Pengaruh Normative Commitment terhadap OCB memiliki koefisien sebesar 0,424. Nilai ini merupakan pengaruh terbesar terhadap OCB dibandingkan AC dan CC. Hasil bootstrapping menunjukkan interval kepercayaan 0,287 sampai 0,559, sehingga pengaruh tersebut signifikan. Dengan demikian, Normative Commitment berpengaruh positif dan signifikan terhadap OCB. Oleh karena itu, H3 didukung.

Pengaruh OCB terhadap Job Performance memiliki koefisien sebesar 0,328. Hasil bootstrapping menunjukkan interval kepercayaan 0,249 sampai 0,418, sehingga pengaruh tersebut signifikan. Artinya, semakin tinggi OCB, semakin tinggi pula Job Performance. Dengan demikian, H4 didukung.

Pengaruh Affective Commitment terhadap Job Performance memiliki koefisien sebesar 0,350. Hasil bootstrapping menunjukkan interval kepercayaan 0,237 sampai 0,456, sehingga pengaruh tersebut signifikan. Nilai ini merupakan pengaruh langsung terbesar terhadap Job Performance. Dengan demikian, H5 didukung.

Pengaruh Continuance Commitment terhadap Job Performance memiliki koefisien sebesar 0,185. Hasil bootstrapping menunjukkan interval kepercayaan 0,091 sampai 0,286, sehingga pengaruh tersebut signifikan. Dengan demikian, H6 didukung.

Pengaruh Normative Commitment terhadap Job Performance memiliki koefisien sebesar 0,153. Hasil bootstrapping menunjukkan interval kepercayaan 0,033 sampai 0,263, sehingga pengaruh tersebut signifikan. Dengan demikian, H7 didukung.

Nilai R-Square menunjukkan bahwa konstruk OCB memiliki R² sebesar 0,459. Artinya, Affective Commitment, Continuance Commitment, dan Normative Commitment secara bersama-sama mampu menjelaskan 45,9% variasi OCB. Sementara itu, konstruk Job Performance memiliki R² sebesar 0,734, yang berarti AC, CC, NC, dan OCB secara bersama-sama mampu menjelaskan 73,4% variasi Job Performance. Nilai ini menunjukkan bahwa model memiliki kemampuan penjelasan yang kuat terhadap Job Performance.

Hasil Inner VIF menunjukkan bahwa seluruh nilai VIF berada di bawah 3,3 dan 5. Nilai VIF tertinggi adalah 2,700 pada jalur NC terhadap JP. Karena seluruh nilai VIF masih berada di bawah batas kritis, maka tidak terdapat masalah multikolinearitas serius pada inner model.

Secara keseluruhan, inner model menunjukkan hasil yang baik. Sebagian besar hubungan langsung antar konstruk signifikan, kecuali hubungan Affective Commitment terhadap OCB. Temuan ini menunjukkan bahwa Affective Commitment lebih berperan langsung dalam meningkatkan Job Performance, sedangkan Continuance Commitment dan Normative Commitment berperan dalam meningkatkan Job Performance baik secara langsung maupun melalui OCB.

12 Analisis Mediasi

12.1 Indirect Effect

paths <- pls_model$path_coefs

direct_ac_jp <- paths["JP", "AC"]
direct_cc_jp <- paths["JP", "CC"]
direct_nc_jp <- paths["JP", "NC"]

ac_ocb <- paths["OCB", "AC"]
cc_ocb <- paths["OCB", "CC"]
nc_ocb <- paths["OCB", "NC"]

ocb_jp <- paths["JP", "OCB"]

indirect_ac <- ac_ocb * ocb_jp
indirect_cc <- cc_ocb * ocb_jp
indirect_nc <- nc_ocb * ocb_jp

indirect_effects <- data.frame(
  Relationship = c(
    "AC -> OCB -> JP",
    "CC -> OCB -> JP",
    "NC -> OCB -> JP"
  ),
  Path_A = c(ac_ocb, cc_ocb, nc_ocb),
  Path_B = rep(ocb_jp, 3),
  Indirect_Effect = c(indirect_ac, indirect_cc, indirect_nc)
)

kable(
  indirect_effects,
  digits = 3,
  caption = "Indirect Effect melalui OCB"
) %>%
  kable_styling(full_width = FALSE)
Indirect Effect melalui OCB
Relationship Path_A Path_B Indirect_Effect
AC -> OCB -> JP 0.046 0.328 0.015
CC -> OCB -> JP 0.278 0.328 0.091
NC -> OCB -> JP 0.424 0.328 0.139

12.2 Direct, Indirect, dan Total Effect

total_ac <- direct_ac_jp + indirect_ac
total_cc <- direct_cc_jp + indirect_cc
total_nc <- direct_nc_jp + indirect_nc

mediation_effects <- data.frame(
  Relationship = c(
    "AC -> OCB -> JP",
    "CC -> OCB -> JP",
    "NC -> OCB -> JP"
  ),
  Direct_Effect = c(direct_ac_jp, direct_cc_jp, direct_nc_jp),
  Indirect_Effect = c(indirect_ac, indirect_cc, indirect_nc),
  Total_Effect = c(total_ac, total_cc, total_nc)
)

kable(
  mediation_effects,
  digits = 3,
  caption = "Direct, Indirect, dan Total Effect"
) %>%
  kable_styling(full_width = FALSE)
Direct, Indirect, dan Total Effect
Relationship Direct_Effect Indirect_Effect Total_Effect
AC -> OCB -> JP 0.350 0.015 0.365
CC -> OCB -> JP 0.185 0.091 0.277
NC -> OCB -> JP 0.153 0.139 0.292

12.3 Variance Accounted For

vaf_table <- mediation_effects %>%
  mutate(
    VAF = Indirect_Effect / Total_Effect,
    VAF_Percentage = VAF * 100
  )

kable(
  vaf_table,
  digits = 3,
  caption = "Variance Accounted For"
) %>%
  kable_styling(full_width = FALSE)
Variance Accounted For
Relationship Direct_Effect Indirect_Effect Total_Effect VAF VAF_Percentage
AC -> OCB -> JP 0.350 0.015 0.365 0.042 4.171
CC -> OCB -> JP 0.185 0.091 0.277 0.330 32.999
NC -> OCB -> JP 0.153 0.139 0.292 0.476 47.639

12.4 Keputusan Tipe Mediasi Berdasarkan VAF

mediation_type_vaf <- vaf_table %>%
  mutate(
    Mediation_Type_VAF = case_when(
      abs(VAF) < 0.20 ~ "Tidak ada mediasi",
      abs(VAF) >= 0.20 & abs(VAF) <= 0.80 ~ "Mediasi parsial",
      abs(VAF) > 0.80 ~ "Mediasi penuh"
    )
  ) %>%
  select(
    Relationship,
    Direct_Effect,
    Indirect_Effect,
    Total_Effect,
    VAF,
    VAF_Percentage,
    Mediation_Type_VAF
  )

kable(
  mediation_type_vaf,
  digits = 3,
  caption = "Keputusan Tipe Mediasi Berdasarkan VAF"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Tipe Mediasi Berdasarkan VAF
Relationship Direct_Effect Indirect_Effect Total_Effect VAF VAF_Percentage Mediation_Type_VAF
AC -> OCB -> JP 0.350 0.015 0.365 0.042 4.171 Tidak ada mediasi
CC -> OCB -> JP 0.185 0.091 0.277 0.330 32.999 Mediasi parsial
NC -> OCB -> JP 0.153 0.139 0.292 0.476 47.639 Mediasi parsial

12.5 Bootstrap Indirect Effect

bootstrap_paths <- pls_boot$boot$paths %>%
  as.data.frame()

bootstrap_paths$Relationship <- rownames(bootstrap_paths)

bootstrap_paths <- bootstrap_paths %>%
  select(Relationship, everything())

bootstrap_paths
##           Relationship   Original  Mean.Boot  Std.Error    perc.025  perc.975
## AC -> OCB    AC -> OCB 0.04634645 0.04872844 0.06871671 -0.08633976 0.1841430
## AC -> JP      AC -> JP 0.34954218 0.34930348 0.05654340  0.23691757 0.4564622
## CC -> OCB    CC -> OCB 0.27816651 0.27897459 0.06896379  0.14112892 0.4101935
## CC -> JP      CC -> JP 0.18537576 0.18599615 0.04982557  0.09123003 0.2864905
## NC -> OCB    NC -> OCB 0.42424365 0.42422086 0.06999271  0.28712488 0.5589777
## NC -> JP      NC -> JP 0.15305033 0.14803284 0.05934324  0.03263174 0.2632675
## OCB -> JP    OCB -> JP 0.32822935 0.33183468 0.04297742  0.24905109 0.4181433

12.6 Ringkasan Jalur Mediasi

direct_effect_decision_mediation <- direct_effect_decision %>%
  select(Relationship, Decision)

mediation_path_summary <- data.frame(
  Mediation = c(
    "AC -> OCB -> JP",
    "CC -> OCB -> JP",
    "NC -> OCB -> JP"
  ),
  Path_A = c("AC -> OCB", "CC -> OCB", "NC -> OCB"),
  Path_B = c("OCB -> JP", "OCB -> JP", "OCB -> JP"),
  Direct_Path = c("AC -> JP", "CC -> JP", "NC -> JP")
)

mediation_path_summary <- mediation_path_summary %>%
  left_join(
    direct_effect_decision_mediation,
    by = c("Path_A" = "Relationship")
  ) %>%
  rename(Path_A_Decision = Decision) %>%
  left_join(
    direct_effect_decision_mediation,
    by = c("Path_B" = "Relationship")
  ) %>%
  rename(Path_B_Decision = Decision) %>%
  left_join(
    direct_effect_decision_mediation,
    by = c("Direct_Path" = "Relationship")
  ) %>%
  rename(Direct_Path_Decision = Decision)

kable(
  mediation_path_summary,
  caption = "Ringkasan Jalur Mediasi"
) %>%
  kable_styling(full_width = FALSE)
Ringkasan Jalur Mediasi
Mediation Path_A Path_B Direct_Path Path_A_Decision Path_B_Decision Direct_Path_Decision
AC -> OCB -> JP AC -> OCB OCB -> JP AC -> JP Tidak Signifikan Signifikan Signifikan
CC -> OCB -> JP CC -> OCB OCB -> JP CC -> JP Signifikan Signifikan Signifikan
NC -> OCB -> JP NC -> OCB OCB -> JP NC -> JP Signifikan Signifikan Signifikan

12.7 Keputusan Mediasi

mediation_decision <- mediation_path_summary %>%
  left_join(
    mediation_type_vaf %>%
      select(Relationship, Mediation_Type_VAF),
    by = c("Mediation" = "Relationship")
  ) %>%
  mutate(
    Mediation_Decision = case_when(
      Path_A_Decision == "Signifikan" &
        Path_B_Decision == "Signifikan" &
        Direct_Path_Decision == "Signifikan" ~ "Mediasi parsial",

      Path_A_Decision == "Signifikan" &
        Path_B_Decision == "Signifikan" &
        Direct_Path_Decision == "Tidak Signifikan" ~ "Mediasi penuh",

      TRUE ~ "Tidak ada mediasi"
    )
  )

kable(
  mediation_decision,
  caption = "Keputusan Mediasi"
) %>%
  kable_styling(full_width = FALSE)
Keputusan Mediasi
Mediation Path_A Path_B Direct_Path Path_A_Decision Path_B_Decision Direct_Path_Decision Mediation_Type_VAF Mediation_Decision
AC -> OCB -> JP AC -> OCB OCB -> JP AC -> JP Tidak Signifikan Signifikan Signifikan Tidak ada mediasi Tidak ada mediasi
CC -> OCB -> JP CC -> OCB OCB -> JP CC -> JP Signifikan Signifikan Signifikan Mediasi parsial Mediasi parsial
NC -> OCB -> JP NC -> OCB OCB -> JP NC -> JP Signifikan Signifikan Signifikan Mediasi parsial Mediasi parsial

Analisis mediasi dilakukan untuk melihat apakah Organizational Citizenship Behavior berperan sebagai mediator dalam hubungan antara Affective Commitment, Continuance Commitment, dan Normative Commitment terhadap Job Performance.

Pada jalur AC → OCB → JP, indirect effect yang diperoleh adalah 0,015. Nilai direct effect AC terhadap JP adalah 0,350, sedangkan total effect adalah 0,365. Nilai VAF sebesar 0,042 atau 4,171%. Karena nilai VAF berada di bawah 20% dan jalur AC terhadap OCB tidak signifikan, maka OCB tidak memediasi pengaruh Affective Commitment terhadap Job Performance. Dengan demikian, H8 tidak didukung.

Pada jalur CC → OCB → JP, indirect effect yang diperoleh adalah 0,091. Nilai direct effect CC terhadap JP adalah 0,185, sedangkan total effect adalah 0,277. Nilai VAF sebesar 0,330 atau 32,999%. Karena nilai VAF berada pada rentang 20% sampai 80%, serta jalur CC → OCB, OCB → JP, dan CC → JP sama-sama signifikan, maka OCB berperan sebagai mediator parsial dalam hubungan antara Continuance Commitment dan Job Performance. Dengan demikian, H9 didukung.

Pada jalur NC → OCB → JP, indirect effect yang diperoleh adalah 0,139. Nilai direct effect NC terhadap JP adalah 0,153, sedangkan total effect adalah 0,292. Nilai VAF sebesar 0,476 atau 47,639%. Karena nilai VAF berada pada rentang 20% sampai 80%, serta jalur NC → OCB, OCB → JP, dan NC → JP sama-sama signifikan, maka OCB berperan sebagai mediator parsial dalam hubungan antara Normative Commitment dan Job Performance. Dengan demikian, H10 didukung.

Hasil ini menunjukkan bahwa OCB tidak menjadi mekanisme utama yang menjelaskan hubungan Affective Commitment terhadap Job Performance. Affective Commitment lebih dominan memengaruhi Job Performance secara langsung. Sebaliknya, pada Continuance Commitment dan Normative Commitment, OCB memiliki peran mediasi parsial. Artinya, CC dan NC tidak hanya berpengaruh langsung terhadap Job Performance, tetapi juga dapat meningkatkan Job Performance melalui peningkatan Organizational Citizenship Behavior.

Dari ketiga jalur mediasi, pengaruh mediasi terbesar terdapat pada jalur NC → OCB → JP dengan indirect effect sebesar 0,139 dan VAF sebesar 47,639%. Hal ini menunjukkan bahwa Normative Commitment memiliki kontribusi paling kuat dalam mendorong OCB, yang kemudian berdampak pada peningkatan Job Performance.

13 Pembahasan

Hasil penelitian menunjukkan bahwa model pengukuran telah memenuhi kriteria reliabilitas dan validitas, sehingga seluruh konstruk dapat digunakan untuk mengevaluasi hubungan struktural. Dengan terpenuhinya outer model, pembahasan utama dapat difokuskan pada hubungan antara organizational commitment, organizational citizenship behavior, dan job performance.

Temuan pertama menunjukkan bahwa Affective Commitment tidak berpengaruh signifikan terhadap Organizational Citizenship Behavior, tetapi berpengaruh signifikan terhadap Job Performance. Hal ini menunjukkan bahwa keterikatan emosional karyawan terhadap organisasi lebih banyak tercermin dalam pelaksanaan tugas utama dibandingkan dalam perilaku ekstra-peran. Dengan kata lain, karyawan yang merasa memiliki ikatan emosional dengan organisasi cenderung menunjukkan kinerja yang lebih baik, tetapi tidak selalu menunjukkan perilaku sukarela di luar tugas formalnya.

Temuan kedua menunjukkan bahwa Continuance Commitment berpengaruh positif terhadap Organizational Citizenship Behavior dan Job Performance. Hal ini mengindikasikan bahwa karyawan yang memiliki pertimbangan kuat untuk tetap berada di organisasi juga dapat menunjukkan perilaku kerja positif. Meskipun continuance commitment sering dikaitkan dengan pertimbangan biaya atau konsekuensi apabila meninggalkan organisasi, dalam penelitian ini komitmen tersebut tetap berkontribusi terhadap peningkatan OCB dan kinerja.

Temuan ketiga menunjukkan bahwa Normative Commitment merupakan prediktor paling kuat terhadap Organizational Citizenship Behavior. Hasil ini masuk akal karena normative commitment berkaitan dengan rasa kewajiban moral untuk tetap berkontribusi kepada organisasi. Karyawan yang merasa memiliki tanggung jawab moral terhadap organisasi cenderung lebih bersedia melakukan perilaku sukarela, seperti membantu rekan kerja, menjaga hubungan kerja yang baik, dan mendukung tujuan organisasi.

Organizational Citizenship Behavior terbukti berpengaruh positif terhadap Job Performance. Temuan ini menunjukkan bahwa perilaku sukarela di luar tugas formal dapat mendukung peningkatan kinerja pekerjaan. Karyawan yang memiliki OCB tinggi tidak hanya menjalankan tugas utama, tetapi juga berkontribusi pada lingkungan kerja yang lebih kooperatif dan produktif. Kondisi tersebut dapat membantu meningkatkan efektivitas kerja individu maupun organisasi.

Hasil mediasi menunjukkan bahwa OCB tidak memediasi pengaruh Affective Commitment terhadap Job Performance. Hal ini berarti pengaruh Affective Commitment terhadap Job Performance lebih bersifat langsung. Sebaliknya, OCB memediasi secara parsial pengaruh Continuance Commitment dan Normative Commitment terhadap Job Performance. Artinya, kedua dimensi komitmen tersebut dapat meningkatkan kinerja baik secara langsung maupun melalui peningkatan perilaku OCB.

Secara keseluruhan, hasil penelitian menunjukkan bahwa tidak semua dimensi organizational commitment bekerja melalui mekanisme yang sama. Affective Commitment lebih berperan langsung terhadap Job Performance, sedangkan Continuance Commitment dan Normative Commitment bekerja melalui dua jalur, yaitu jalur langsung terhadap Job Performance dan jalur tidak langsung melalui OCB.

14 Implikasi Penelitian

Hasil penelitian ini memberikan implikasi bahwa organisasi perlu memperhatikan jenis komitmen yang ingin dibangun pada karyawan. Untuk meningkatkan Job Performance secara langsung, organisasi dapat memperkuat Affective Commitment melalui lingkungan kerja yang mendukung, hubungan kerja yang positif, rasa memiliki, dan keterlibatan karyawan dalam organisasi.

Selain itu, karena Normative Commitment terbukti menjadi prediktor paling kuat terhadap OCB, organisasi perlu membangun budaya kerja yang menumbuhkan rasa tanggung jawab moral dan kesadaran untuk berkontribusi. Nilai-nilai organisasi, kepemimpinan yang adil, serta norma kerja yang positif dapat membantu meningkatkan perilaku OCB.

Organisasi juga perlu mendorong OCB karena perilaku ini terbukti berkontribusi terhadap Job Performance. Upaya tersebut dapat dilakukan dengan menciptakan lingkungan kerja kolaboratif, memberikan apresiasi terhadap kontribusi sukarela, serta membangun budaya saling membantu antar karyawan.

15 Kesimpulan

Berdasarkan hasil analisis menggunakan metode Partial Least Squares Structural Equation Modeling (PLS-SEM), model penelitian yang digunakan dalam penelitian ini telah memenuhi kriteria reliabilitas dan validitas. Seluruh konstruk memiliki nilai Cronbach’s Alpha, Composite Reliability, dan Average Variance Extracted (AVE) yang memenuhi batas kriteria yang disarankan. Selain itu, validitas diskriminan berdasarkan Fornell-Larcker Criterion dan HTMT juga menunjukkan hasil yang baik, sehingga konstruk dalam model dapat digunakan untuk mengevaluasi hubungan struktural antar variabel.

Hasil analisis struktural menunjukkan bahwa Affective Commitment tidak berpengaruh signifikan terhadap Organizational Citizenship Behavior. Sebaliknya, Continuance Commitment dan Normative Commitment terbukti berpengaruh positif dan signifikan terhadap Organizational Citizenship Behavior. Temuan ini menunjukkan bahwa rasa kewajiban moral dan pertimbangan untuk tetap berada dalam organisasi lebih berperan dalam mendorong perilaku sukarela karyawan dibandingkan keterikatan emosional semata.

Organizational Citizenship Behavior terbukti berpengaruh positif dan signifikan terhadap Job Performance. Selain itu, Affective Commitment, Continuance Commitment, dan Normative Commitment juga memiliki pengaruh positif dan signifikan terhadap Job Performance. Hasil ini menunjukkan bahwa komitmen organisasi memiliki kontribusi penting terhadap peningkatan kinerja karyawan, baik secara langsung maupun melalui perilaku Organizational Citizenship Behavior.

Hasil analisis mediasi menunjukkan bahwa Organizational Citizenship Behavior tidak memediasi pengaruh Affective Commitment terhadap Job Performance. Namun, Organizational Citizenship Behavior terbukti memediasi secara parsial pengaruh Continuance Commitment dan Normative Commitment terhadap Job Performance. Dengan demikian, peningkatan Job Performance tidak hanya dipengaruhi oleh komitmen organisasi secara langsung, tetapi juga melalui peningkatan perilaku Organizational Citizenship Behavior, terutama pada dimensi Continuance Commitment dan Normative Commitment.

Secara keseluruhan, penelitian ini menunjukkan bahwa Organizational Citizenship Behavior memiliki peran penting dalam hubungan antara organizational commitment dan job performance. Selain itu, hasil penelitian juga menunjukkan bahwa masing-masing dimensi organizational commitment memiliki mekanisme pengaruh yang berbeda terhadap Organizational Citizenship Behavior dan Job Performance.