library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("mnormt")
library(psych)
##
## Attaching package: 'psych'
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(knitr)
# install.packages("kableExtra")
library(kableExtra)
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
library(MVN)
## Registered S3 method overwritten by 'lme4':
## method from
## na.action.merMod car
##
## Attaching package: 'MVN'
##
## The following object is masked from 'package:psych':
##
## mardia
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:psych':
##
## logit
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
# install.packages("semPlot")
library(semPlot)
data <- read.csv("train.csv")
head(data)
## X id Gender Customer.Type Age Type.of.Travel Class
## 1 0 70172 Male Loyal Customer 13 Personal Travel Eco Plus
## 2 1 5047 Male disloyal Customer 25 Business travel Business
## 3 2 110028 Female Loyal Customer 26 Business travel Business
## 4 3 24026 Female Loyal Customer 25 Business travel Business
## 5 4 119299 Male Loyal Customer 61 Business travel Business
## 6 5 111157 Female Loyal Customer 26 Personal Travel Eco
## Flight.Distance Inflight.wifi.service Departure.Arrival.time.convenient
## 1 460 3 4
## 2 235 3 2
## 3 1142 2 2
## 4 562 2 5
## 5 214 3 3
## 6 1180 3 4
## Ease.of.Online.booking Gate.location Food.and.drink Online.boarding
## 1 3 1 5 3
## 2 3 3 1 3
## 3 2 2 5 5
## 4 5 5 2 2
## 5 3 3 4 5
## 6 2 1 1 2
## Seat.comfort Inflight.entertainment On.board.service Leg.room.service
## 1 5 5 4 3
## 2 1 1 1 5
## 3 5 5 4 3
## 4 2 2 2 5
## 5 5 3 3 4
## 6 1 1 3 4
## Baggage.handling Checkin.service Inflight.service Cleanliness
## 1 4 4 5 5
## 2 3 1 4 1
## 3 4 4 4 5
## 4 3 1 4 2
## 5 4 3 3 3
## 6 4 4 4 1
## Departure.Delay.in.Minutes Arrival.Delay.in.Minutes satisfaction
## 1 25 18 neutral or dissatisfied
## 2 1 6 neutral or dissatisfied
## 3 0 0 satisfied
## 4 11 9 neutral or dissatisfied
## 5 0 0 satisfied
## 6 0 0 neutral or dissatisfied
dim(data)
## [1] 103904 25
Dataset terdiri dari 103904 baris dan 25 kolom
No. <- c(1:23)
Variabel <- c("Gender",
"Customer Type",
"Age",
"Type of Travel",
"Class",
"Flight distance",
"Inflight wifi service",
"Departure/Arrival time convenient",
"Ease of Online booking",
"Gate location",
"Food and drink",
"Online boarding",
"Seat comfort",
"Inflight entertainment",
"On-board service",
"Leg room service",
"Baggage handling",
"Check-in service",
"Inflight service",
"Cleanliness",
"Departure Delay in Minutes",
"Arrival Delay in Minutes",
"Satisfaction")
Deskripsi <- c("Jenis kelamin penumpang (Wanita, Pria)",
"Jenis pelanggan (Pelanggan setia, pelanggan tidak setia)",
"Usia sebenarnya dari penumpang",
"Tujuan penerbangan penumpang (Perjalanan Pribadi, Perjalanan Bisnis)",
"Kelas perjalanan di pesawat penumpang (Business, Eco, Eco Plus)",
"Jarak penerbangan perjalanan",
"Tingkat kepuasan layanan wifi dalam pesawat (0:Tidak Berlaku; 1-5)",
"Tingkat kepuasan waktu Keberangkatan/Kedatangan",
"Tingkat kepuasan pemesanan online",
"Tingkat kepuasan lokasi Gate",
"Tingkat kepuasan Makanan dan minuman",
"Tingkat kepuasan boarding online",
"Tingkat kepuasan kenyamanan Kursi",
"Tingkat kepuasan hiburan dalam pesawat",
"Tingkat kepuasan layanan On-board",
"Tingkat kepuasan layanan kamar kaki",
"Tingkat kepuasan penanganan bagasi",
"Tingkat kepuasan layanan Check-in",
"Tingkat kepuasan layanan dalam pesawat",
"Tingkat kepuasan Kebersihan",
"Menit tertunda saat keberangkatan",
"Menit tertunda saat Kedatangan",
"Tingkat kepuasan maskapai penerbangan (Kepuasan, netral atau ketidakpuasan)"
)
data.frame(No., Variabel, Deskripsi) %>%
kbl() %>%
kable_styling(bootstrap_options = c("bordered", "stripped", "hover"),
full_width = T)
| No. | Variabel | Deskripsi |
|---|---|---|
| 1 | Gender | Jenis kelamin penumpang (Wanita, Pria) |
| 2 | Customer Type | Jenis pelanggan (Pelanggan setia, pelanggan tidak setia) |
| 3 | Age | Usia sebenarnya dari penumpang |
| 4 | Type of Travel | Tujuan penerbangan penumpang (Perjalanan Pribadi, Perjalanan Bisnis) |
| 5 | Class | Kelas perjalanan di pesawat penumpang (Business, Eco, Eco Plus) |
| 6 | Flight distance | Jarak penerbangan perjalanan |
| 7 | Inflight wifi service | Tingkat kepuasan layanan wifi dalam pesawat (0:Tidak Berlaku; 1-5) |
| 8 | Departure/Arrival time convenient | Tingkat kepuasan waktu Keberangkatan/Kedatangan |
| 9 | Ease of Online booking | Tingkat kepuasan pemesanan online |
| 10 | Gate location | Tingkat kepuasan lokasi Gate |
| 11 | Food and drink | Tingkat kepuasan Makanan dan minuman |
| 12 | Online boarding | Tingkat kepuasan boarding online |
| 13 | Seat comfort | Tingkat kepuasan kenyamanan Kursi |
| 14 | Inflight entertainment | Tingkat kepuasan hiburan dalam pesawat |
| 15 | On-board service | Tingkat kepuasan layanan On-board |
| 16 | Leg room service | Tingkat kepuasan layanan kamar kaki |
| 17 | Baggage handling | Tingkat kepuasan penanganan bagasi |
| 18 | Check-in service | Tingkat kepuasan layanan Check-in |
| 19 | Inflight service | Tingkat kepuasan layanan dalam pesawat |
| 20 | Cleanliness | Tingkat kepuasan Kebersihan |
| 21 | Departure Delay in Minutes | Menit tertunda saat keberangkatan |
| 22 | Arrival Delay in Minutes | Menit tertunda saat Kedatangan |
| 23 | Satisfaction | Tingkat kepuasan maskapai penerbangan (Kepuasan, netral atau ketidakpuasan) |
str(data)
## 'data.frame': 103904 obs. of 25 variables:
## $ X : int 0 1 2 3 4 5 6 7 8 9 ...
## $ id : int 70172 5047 110028 24026 119299 111157 82113 96462 79485 65725 ...
## $ Gender : chr "Male" "Male" "Female" "Female" ...
## $ Customer.Type : chr "Loyal Customer" "disloyal Customer" "Loyal Customer" "Loyal Customer" ...
## $ Age : int 13 25 26 25 61 26 47 52 41 20 ...
## $ Type.of.Travel : chr "Personal Travel" "Business travel" "Business travel" "Business travel" ...
## $ Class : chr "Eco Plus" "Business" "Business" "Business" ...
## $ Flight.Distance : int 460 235 1142 562 214 1180 1276 2035 853 1061 ...
## $ Inflight.wifi.service : int 3 3 2 2 3 3 2 4 1 3 ...
## $ Departure.Arrival.time.convenient: int 4 2 2 5 3 4 4 3 2 3 ...
## $ Ease.of.Online.booking : int 3 3 2 5 3 2 2 4 2 3 ...
## $ Gate.location : int 1 3 2 5 3 1 3 4 2 4 ...
## $ Food.and.drink : int 5 1 5 2 4 1 2 5 4 2 ...
## $ Online.boarding : int 3 3 5 2 5 2 2 5 3 3 ...
## $ Seat.comfort : int 5 1 5 2 5 1 2 5 3 3 ...
## $ Inflight.entertainment : int 5 1 5 2 3 1 2 5 1 2 ...
## $ On.board.service : int 4 1 4 2 3 3 3 5 1 2 ...
## $ Leg.room.service : int 3 5 3 5 4 4 3 5 2 3 ...
## $ Baggage.handling : int 4 3 4 3 4 4 4 5 1 4 ...
## $ Checkin.service : int 4 1 4 1 3 4 3 4 4 4 ...
## $ Inflight.service : int 5 4 4 4 3 4 5 5 1 3 ...
## $ Cleanliness : int 5 1 5 2 3 1 2 4 2 2 ...
## $ Departure.Delay.in.Minutes : int 25 1 0 11 0 0 9 4 0 0 ...
## $ Arrival.Delay.in.Minutes : num 18 6 0 9 0 0 23 0 0 0 ...
## $ satisfaction : chr "neutral or dissatisfied" "neutral or dissatisfied" "satisfied" "neutral or dissatisfied" ...
describe(data)
## vars n mean sd median
## X 1 103904 51951.50 29994.65 51951.5
## id 2 103904 64924.21 37463.81 64856.5
## Gender* 3 103904 1.49 0.50 1.0
## Customer.Type* 4 103904 1.82 0.39 2.0
## Age 5 103904 39.38 15.11 40.0
## Type.of.Travel* 6 103904 1.31 0.46 1.0
## Class* 7 103904 1.59 0.62 2.0
## Flight.Distance 8 103904 1189.45 997.15 843.0
## Inflight.wifi.service 9 103904 2.73 1.33 3.0
## Departure.Arrival.time.convenient 10 103904 3.06 1.53 3.0
## Ease.of.Online.booking 11 103904 2.76 1.40 3.0
## Gate.location 12 103904 2.98 1.28 3.0
## Food.and.drink 13 103904 3.20 1.33 3.0
## Online.boarding 14 103904 3.25 1.35 3.0
## Seat.comfort 15 103904 3.44 1.32 4.0
## Inflight.entertainment 16 103904 3.36 1.33 4.0
## On.board.service 17 103904 3.38 1.29 4.0
## Leg.room.service 18 103904 3.35 1.32 4.0
## Baggage.handling 19 103904 3.63 1.18 4.0
## Checkin.service 20 103904 3.30 1.27 3.0
## Inflight.service 21 103904 3.64 1.18 4.0
## Cleanliness 22 103904 3.29 1.31 3.0
## Departure.Delay.in.Minutes 23 103904 14.82 38.23 0.0
## Arrival.Delay.in.Minutes 24 103594 15.18 38.70 0.0
## satisfaction* 25 103904 1.43 0.50 1.0
## trimmed mad min max range skew
## X 51951.50 38512.02 0 103903 103903 0.00
## id 64910.76 48051.07 1 129880 129879 0.00
## Gender* 1.49 0.00 1 2 1 0.03
## Customer.Type* 1.90 0.00 1 2 1 -1.64
## Age 39.40 17.79 7 85 78 0.00
## Type.of.Travel* 1.26 0.00 1 2 1 0.82
## Class* 1.53 1.48 1 3 2 0.54
## Flight.Distance 1042.84 766.50 31 4983 4952 1.11
## Inflight.wifi.service 2.70 1.48 0 5 5 0.04
## Departure.Arrival.time.convenient 3.14 1.48 0 5 5 -0.33
## Ease.of.Online.booking 2.75 1.48 0 5 5 -0.02
## Gate.location 2.97 1.48 0 5 5 -0.06
## Food.and.drink 3.25 1.48 0 5 5 -0.15
## Online.boarding 3.34 1.48 0 5 5 -0.45
## Seat.comfort 3.55 1.48 0 5 5 -0.48
## Inflight.entertainment 3.45 1.48 0 5 5 -0.37
## On.board.service 3.48 1.48 0 5 5 -0.42
## Leg.room.service 3.44 1.48 0 5 5 -0.35
## Baggage.handling 3.75 1.48 1 5 4 -0.68
## Checkin.service 3.38 1.48 0 5 5 -0.36
## Inflight.service 3.76 1.48 0 5 5 -0.69
## Cleanliness 3.36 1.48 0 5 5 -0.30
## Departure.Delay.in.Minutes 5.83 0.00 0 1592 1592 6.73
## Arrival.Delay.in.Minutes 6.09 0.00 0 1584 1584 6.60
## satisfaction* 1.42 0.00 1 2 1 0.27
## kurtosis se
## X -1.20 93.05
## id -1.20 116.22
## Gender* -2.00 0.00
## Customer.Type* 0.70 0.00
## Age -0.72 0.05
## Type.of.Travel* -1.33 0.00
## Class* -0.62 0.00
## Flight.Distance 0.27 3.09
## Inflight.wifi.service -0.85 0.00
## Departure.Arrival.time.convenient -1.04 0.00
## Ease.of.Online.booking -0.91 0.00
## Gate.location -1.03 0.00
## Food.and.drink -1.15 0.00
## Online.boarding -0.70 0.00
## Seat.comfort -0.93 0.00
## Inflight.entertainment -1.06 0.00
## On.board.service -0.89 0.00
## Leg.room.service -0.98 0.00
## Baggage.handling -0.39 0.00
## Checkin.service -0.83 0.00
## Inflight.service -0.36 0.00
## Cleanliness -1.01 0.00
## Departure.Delay.in.Minutes 100.26 0.12
## Arrival.Delay.in.Minutes 94.53 0.12
## satisfaction* -1.93 0.00
# cek missing value
colSums(is.na(data))
## X id
## 0 0
## Gender Customer.Type
## 0 0
## Age Type.of.Travel
## 0 0
## Class Flight.Distance
## 0 0
## Inflight.wifi.service Departure.Arrival.time.convenient
## 0 0
## Ease.of.Online.booking Gate.location
## 0 0
## Food.and.drink Online.boarding
## 0 0
## Seat.comfort Inflight.entertainment
## 0 0
## On.board.service Leg.room.service
## 0 0
## Baggage.handling Checkin.service
## 0 0
## Inflight.service Cleanliness
## 0 0
## Departure.Delay.in.Minutes Arrival.Delay.in.Minutes
## 0 310
## satisfaction
## 0
terdapat missing value pada variabel Arrival.Delay.in.Minutes
# Cek data duplikat
sum(duplicated(data))
## [1] 0
Tidak ada data duplikat
# Membuat tabel frekuensi
freq <- table(data$satisfaction)
# Membuat barplot
bp <- barplot(
freq,
main = "Distribusi Satisfaction",
xlab = "Kategori Satisfaction",
ylab = "Frekuensi",
col = c("skyblue", "pink"),
ylim = c(0, max(freq) + 5000)
)
# Menambahkan angka di atas batang
text(
x = bp,
y = freq,
label = freq,
pos = 3,
cex = 0.8,
col = "black"
)
Berdasarkan grafik distribusi satisfaction, jumlah pelanggan dengan kategori neutral or dissatisfied lebih banyak dibandingkan pelanggan yang satisfied. Hal ini menunjukkan bahwa tingkat kepuasan pelanggan masih cenderung rendah karena masih banyak penumpang yang merasa netral atau kurang puas terhadap layanan maskapai.
# Memilih hanya variabel numerik
data_num <- data[sapply(data, is.numeric)]
# Mengatur layout plot
par(mfrow = c(3, 3))
# Membuat histogram untuk semua variabel numerik
for(i in names(data_num)) {
hist(
data_num[[i]],
main = paste("Histogram", i),
xlab = i,
col = "skyblue",
border = "white"
)
}
# Mengembalikan layout normal
par(mfrow = c(1,1))
Berdasarkan histogram, sebagian besar variabel layanan memiliki nilai 3–5, sehingga menunjukkan bahwa pelanggan cukup puas terhadap layanan maskapai. Variabel Age memiliki distribusi yang cukup normal dengan dominasi usia produktif. Sementara itu, Flight.Distance, Departure.Delay.in.Minutes, dan Arrival.Delay.in.Minutes cenderung miring ke kanan karena sebagian besar data berada pada nilai rendah, tetapi terdapat beberapa nilai ekstrem atau outlier. Secara keseluruhan, data menunjukkan tingkat kepuasan pelanggan yang cukup baik dengan beberapa variabel yang masih memiliki nilai ekstrem.
# Ambil semua variabel numerik
data_num <- data[, sapply(data, is.numeric)]
# Hapus kolom yang bukan variabel analisis
data_num <- subset(data_num, select = -c(X, id))
# Transformasi log
data_log <- log1p(data_num)
# Atur margin
par(mar = c(10,4,4,2))
# Boxplot
boxplot(
data_log,
col = "lightblue",
las = 2,
cex.axis = 0.7,
main = "Boxplot Deteksi Outlier"
)
Berdasarkan visualisasi boxplot, sebagian besar variabel layanan memiliki distribusi data yang relatif stabil dan tidak menunjukkan banyak outlier. Hal ini disebabkan karena variabel tersebut menggunakan skala penilaian terbatas antara 0–5 sehingga rentang datanya sempit. Sementara itu, variabel Flight Distance, Check-in Service, Departure Delay in Minutes, dan Arrival Delay in Minutes menunjukkan cukup banyak outlier, terutama pada nilai keterlambatan penerbangan. Outlier tersebut merepresentasikan adanya beberapa penerbangan dengan keterlambatan yang jauh lebih tinggi dibanding mayoritas data lainnya. Sebelum visualisasi dilakukan, data numerik ditransformasikan menggunakan log1p() untuk mengurangi skewness dan membuat persebaran data lebih proporsional sehingga boxplot lebih mudah dianalisis.
# Memilih hanya variabel numerik
data_num <- data[sapply(data, is.numeric)]
# Mengecek outlier dengan metode IQR
for(i in names(data_num)) {
Q1 <- quantile(data_num[[i]], 0.25, na.rm = TRUE)
Q3 <- quantile(data_num[[i]], 0.75, na.rm = TRUE)
IQR_value <- IQR(data_num[[i]], na.rm = TRUE)
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
outlier <- data_num[[i]][
data_num[[i]] < lower_bound |
data_num[[i]] > upper_bound
]
cat("\n========================\n")
cat("Variabel :", i, "\n")
cat("Jumlah Outlier :", length(outlier), "\n")
}
##
## ========================
## Variabel : X
## Jumlah Outlier : 0
##
## ========================
## Variabel : id
## Jumlah Outlier : 0
##
## ========================
## Variabel : Age
## Jumlah Outlier : 0
##
## ========================
## Variabel : Flight.Distance
## Jumlah Outlier : 2291
##
## ========================
## Variabel : Inflight.wifi.service
## Jumlah Outlier : 0
##
## ========================
## Variabel : Departure.Arrival.time.convenient
## Jumlah Outlier : 0
##
## ========================
## Variabel : Ease.of.Online.booking
## Jumlah Outlier : 0
##
## ========================
## Variabel : Gate.location
## Jumlah Outlier : 0
##
## ========================
## Variabel : Food.and.drink
## Jumlah Outlier : 0
##
## ========================
## Variabel : Online.boarding
## Jumlah Outlier : 0
##
## ========================
## Variabel : Seat.comfort
## Jumlah Outlier : 0
##
## ========================
## Variabel : Inflight.entertainment
## Jumlah Outlier : 0
##
## ========================
## Variabel : On.board.service
## Jumlah Outlier : 0
##
## ========================
## Variabel : Leg.room.service
## Jumlah Outlier : 0
##
## ========================
## Variabel : Baggage.handling
## Jumlah Outlier : 0
##
## ========================
## Variabel : Checkin.service
## Jumlah Outlier : 12891
##
## ========================
## Variabel : Inflight.service
## Jumlah Outlier : 0
##
## ========================
## Variabel : Cleanliness
## Jumlah Outlier : 0
##
## ========================
## Variabel : Departure.Delay.in.Minutes
## Jumlah Outlier : 14529
##
## ========================
## Variabel : Arrival.Delay.in.Minutes
## Jumlah Outlier : 14264
Outlier pada data penerbangan tidak selalu dianggap sebagai kesalahan data, melainkan dapat merepresentasikan kondisi nyata di lapangan, seperti keterlambatan ekstrem akibat cuaca, gangguan teknis, atau kondisi operasional tertentu. Oleh karena itu, outlier tidak langsung dihapus, tetapi dipertimbangkan berdasarkan konteks analisis.
# Menghapus kolom index yang tidak digunakan
data <- subset(data, select = -c(X, id))
# Melihat dimensi data terbaru
dim(data)
## [1] 103904 23
head(data)
## Gender Customer.Type Age Type.of.Travel Class Flight.Distance
## 1 Male Loyal Customer 13 Personal Travel Eco Plus 460
## 2 Male disloyal Customer 25 Business travel Business 235
## 3 Female Loyal Customer 26 Business travel Business 1142
## 4 Female Loyal Customer 25 Business travel Business 562
## 5 Male Loyal Customer 61 Business travel Business 214
## 6 Female Loyal Customer 26 Personal Travel Eco 1180
## Inflight.wifi.service Departure.Arrival.time.convenient
## 1 3 4
## 2 3 2
## 3 2 2
## 4 2 5
## 5 3 3
## 6 3 4
## Ease.of.Online.booking Gate.location Food.and.drink Online.boarding
## 1 3 1 5 3
## 2 3 3 1 3
## 3 2 2 5 5
## 4 5 5 2 2
## 5 3 3 4 5
## 6 2 1 1 2
## Seat.comfort Inflight.entertainment On.board.service Leg.room.service
## 1 5 5 4 3
## 2 1 1 1 5
## 3 5 5 4 3
## 4 2 2 2 5
## 5 5 3 3 4
## 6 1 1 3 4
## Baggage.handling Checkin.service Inflight.service Cleanliness
## 1 4 4 5 5
## 2 3 1 4 1
## 3 4 4 4 5
## 4 3 1 4 2
## 5 4 3 3 3
## 6 4 4 4 1
## Departure.Delay.in.Minutes Arrival.Delay.in.Minutes satisfaction
## 1 25 18 neutral or dissatisfied
## 2 1 6 neutral or dissatisfied
## 3 0 0 satisfied
## 4 11 9 neutral or dissatisfied
## 5 0 0 satisfied
## 6 0 0 neutral or dissatisfied
Kolom X dan id dihapus karena hanya berfungsi sebagai identitas data dan tidak digunakan dalam analisis SEM maupun CFA.
data$Arrival.Delay.in.Minutes[ is.na(data$Arrival.Delay.in.Minutes) ] <- median( data$Arrival.Delay.in.Minutes, na.rm = TRUE )
# Mengecek kembali missing value
colSums(is.na(data))
## Gender Customer.Type
## 0 0
## Age Type.of.Travel
## 0 0
## Class Flight.Distance
## 0 0
## Inflight.wifi.service Departure.Arrival.time.convenient
## 0 0
## Ease.of.Online.booking Gate.location
## 0 0
## Food.and.drink Online.boarding
## 0 0
## Seat.comfort Inflight.entertainment
## 0 0
## On.board.service Leg.room.service
## 0 0
## Baggage.handling Checkin.service
## 0 0
## Inflight.service Cleanliness
## 0 0
## Departure.Delay.in.Minutes Arrival.Delay.in.Minutes
## 0 0
## satisfaction
## 0
Missing value ditangani menggunakan metode imputasi median karena variabel keterlambatan memiliki distribusi yang cenderung skewed dan mengandung outlier, sehingga median lebih stabil dibanding mean.
# Mengubah variabel kategorik menjadi factor
data$Gender <- as.factor(data$Gender)
data$Customer.Type <- as.factor(
data$Customer.Type
)
data$Type.of.Travel <- as.factor(
data$Type.of.Travel
)
data$Class <- as.factor(data$Class)
data$satisfaction <- as.factor(
data$satisfaction
)
# Melihat struktur data terbaru
str(data)
## 'data.frame': 103904 obs. of 23 variables:
## $ Gender : Factor w/ 2 levels "Female","Male": 2 2 1 1 2 1 2 1 1 2 ...
## $ Customer.Type : Factor w/ 2 levels "disloyal Customer",..: 2 1 2 2 2 2 2 2 2 1 ...
## $ Age : int 13 25 26 25 61 26 47 52 41 20 ...
## $ Type.of.Travel : Factor w/ 2 levels "Business travel",..: 2 1 1 1 1 2 2 1 1 1 ...
## $ Class : Factor w/ 3 levels "Business","Eco",..: 3 1 1 1 1 2 2 1 1 2 ...
## $ Flight.Distance : int 460 235 1142 562 214 1180 1276 2035 853 1061 ...
## $ Inflight.wifi.service : int 3 3 2 2 3 3 2 4 1 3 ...
## $ Departure.Arrival.time.convenient: int 4 2 2 5 3 4 4 3 2 3 ...
## $ Ease.of.Online.booking : int 3 3 2 5 3 2 2 4 2 3 ...
## $ Gate.location : int 1 3 2 5 3 1 3 4 2 4 ...
## $ Food.and.drink : int 5 1 5 2 4 1 2 5 4 2 ...
## $ Online.boarding : int 3 3 5 2 5 2 2 5 3 3 ...
## $ Seat.comfort : int 5 1 5 2 5 1 2 5 3 3 ...
## $ Inflight.entertainment : int 5 1 5 2 3 1 2 5 1 2 ...
## $ On.board.service : int 4 1 4 2 3 3 3 5 1 2 ...
## $ Leg.room.service : int 3 5 3 5 4 4 3 5 2 3 ...
## $ Baggage.handling : int 4 3 4 3 4 4 4 5 1 4 ...
## $ Checkin.service : int 4 1 4 1 3 4 3 4 4 4 ...
## $ Inflight.service : int 5 4 4 4 3 4 5 5 1 3 ...
## $ Cleanliness : int 5 1 5 2 3 1 2 4 2 2 ...
## $ Departure.Delay.in.Minutes : int 25 1 0 11 0 0 9 4 0 0 ...
## $ Arrival.Delay.in.Minutes : num 18 6 0 9 0 0 23 0 0 0 ...
## $ satisfaction : Factor w/ 2 levels "neutral or dissatisfied",..: 1 1 2 1 2 1 1 2 1 1 ...
Transformasi dilakukan agar variabel kategorik dapat dikenali sebagai data kategorikal oleh R saat proses analisis statistik dan SEM.
# Memilih hanya variabel numerik
numeric_data <- data[
, sapply(data, is.numeric)
]
# Menampilkan nama variabel numerik
names(numeric_data)
## [1] "Age" "Flight.Distance"
## [3] "Inflight.wifi.service" "Departure.Arrival.time.convenient"
## [5] "Ease.of.Online.booking" "Gate.location"
## [7] "Food.and.drink" "Online.boarding"
## [9] "Seat.comfort" "Inflight.entertainment"
## [11] "On.board.service" "Leg.room.service"
## [13] "Baggage.handling" "Checkin.service"
## [15] "Inflight.service" "Cleanliness"
## [17] "Departure.Delay.in.Minutes" "Arrival.Delay.in.Minutes"
Variabel numerik dipisahkan untuk mempermudah proses standardisasi dan analisis lanjutan.
# Standardisasi variabel numerik
numeric_scaled <- scale(numeric_data)
# Mengubah hasil menjadi data frame
numeric_scaled <- as.data.frame( numeric_scaled )
# Menampilkan hasil standardisasi
head(numeric_scaled)
## Age Flight.Distance Inflight.wifi.service
## 1 -1.7452709 -0.731535240 0.2035780
## 2 -0.9513557 -0.957178938 0.2035780
## 3 -0.8851961 -0.047584120 -0.5495308
## 4 -0.9513557 -0.629243430 -0.5495308
## 5 1.4303901 -0.978239017 0.2035780
## 6 -0.8851961 -0.009475406 0.2035780
## Departure.Arrival.time.convenient Ease.of.Online.booking Gate.location
## 1 0.61616893 0.1737753 -1.54731528
## 2 -0.69524181 0.1737753 0.01809417
## 3 -0.69524181 -0.5410570 -0.76461055
## 4 1.27187431 1.6034399 1.58350362
## 5 -0.03953644 0.1737753 0.01809417
## 6 0.61616893 -0.5410570 -1.54731528
## Food.and.drink Online.boarding Seat.comfort Inflight.entertainment
## 1 1.3522579 -0.1855307 1.183094 1.2316984
## 2 -1.6563179 -0.1855307 -1.849306 -1.7690727
## 3 1.3522579 1.2964898 1.183094 1.2316984
## 4 -0.9041740 -0.9265410 -1.091206 -1.0188800
## 5 0.6001139 1.2964898 1.183094 -0.2686872
## 6 -1.6563179 -0.9265410 -1.849306 -1.7690727
## On.board.service Leg.room.service Baggage.handling Checkin.service
## 1 0.4794003 -0.2668392 0.3117670 0.5497960
## 2 -1.8491516 1.2533744 -0.5350423 -1.8210037
## 3 0.4794003 -0.2668392 0.3117670 0.5497960
## 4 -1.0729677 1.2533744 -0.5350423 -1.8210037
## 5 -0.2967837 0.4932676 0.3117670 -0.2404706
## 6 -0.2967837 0.4932676 0.3117670 0.5497960
## Inflight.service Cleanliness Departure.Delay.in.Minutes
## 1 1.1564303 1.3058634 0.26639136
## 2 0.3058464 -1.7422831 -0.36137308
## 3 0.3058464 1.3058634 -0.38752993
## 4 0.3058464 -0.9802465 -0.09980456
## 5 -0.5447375 -0.2182099 -0.38752993
## 6 0.3058464 -1.7422831 -0.38752993
## Arrival.Delay.in.Minutes
## 1 0.0741688
## 2 -0.2363116
## 3 -0.3915519
## 4 -0.1586915
## 5 -0.3915519
## 6 -0.3915519
Standardisasi dilakukan agar seluruh variabel numerik memiliki skala yang sebanding dengan rata-rata 0 dan standar deviasi 1. Hal ini penting dalam SEM agar perbedaan skala antar variabel tidak memengaruhi hasil analisis.
# Menggunakan data numerik yang sudah distandardisasi
data_final <- numeric_scaled
# Melihat struktur dataset final
str(data_final)
## 'data.frame': 103904 obs. of 18 variables:
## $ Age : num -1.745 -0.951 -0.885 -0.951 1.43 ...
## $ Flight.Distance : num -0.7315 -0.9572 -0.0476 -0.6292 -0.9782 ...
## $ Inflight.wifi.service : num 0.204 0.204 -0.55 -0.55 0.204 ...
## $ Departure.Arrival.time.convenient: num 0.6162 -0.6952 -0.6952 1.2719 -0.0395 ...
## $ Ease.of.Online.booking : num 0.174 0.174 -0.541 1.603 0.174 ...
## $ Gate.location : num -1.5473 0.0181 -0.7646 1.5835 0.0181 ...
## $ Food.and.drink : num 1.352 -1.656 1.352 -0.904 0.6 ...
## $ Online.boarding : num -0.186 -0.186 1.296 -0.927 1.296 ...
## $ Seat.comfort : num 1.18 -1.85 1.18 -1.09 1.18 ...
## $ Inflight.entertainment : num 1.232 -1.769 1.232 -1.019 -0.269 ...
## $ On.board.service : num 0.479 -1.849 0.479 -1.073 -0.297 ...
## $ Leg.room.service : num -0.267 1.253 -0.267 1.253 0.493 ...
## $ Baggage.handling : num 0.312 -0.535 0.312 -0.535 0.312 ...
## $ Checkin.service : num 0.55 -1.82 0.55 -1.82 -0.24 ...
## $ Inflight.service : num 1.156 0.306 0.306 0.306 -0.545 ...
## $ Cleanliness : num 1.306 -1.742 1.306 -0.98 -0.218 ...
## $ Departure.Delay.in.Minutes : num 0.2664 -0.3614 -0.3875 -0.0998 -0.3875 ...
## $ Arrival.Delay.in.Minutes : num 0.0742 -0.2363 -0.3916 -0.1587 -0.3916 ...
# Menampilkan beberapa data awal
head(data_final)
## Age Flight.Distance Inflight.wifi.service
## 1 -1.7452709 -0.731535240 0.2035780
## 2 -0.9513557 -0.957178938 0.2035780
## 3 -0.8851961 -0.047584120 -0.5495308
## 4 -0.9513557 -0.629243430 -0.5495308
## 5 1.4303901 -0.978239017 0.2035780
## 6 -0.8851961 -0.009475406 0.2035780
## Departure.Arrival.time.convenient Ease.of.Online.booking Gate.location
## 1 0.61616893 0.1737753 -1.54731528
## 2 -0.69524181 0.1737753 0.01809417
## 3 -0.69524181 -0.5410570 -0.76461055
## 4 1.27187431 1.6034399 1.58350362
## 5 -0.03953644 0.1737753 0.01809417
## 6 0.61616893 -0.5410570 -1.54731528
## Food.and.drink Online.boarding Seat.comfort Inflight.entertainment
## 1 1.3522579 -0.1855307 1.183094 1.2316984
## 2 -1.6563179 -0.1855307 -1.849306 -1.7690727
## 3 1.3522579 1.2964898 1.183094 1.2316984
## 4 -0.9041740 -0.9265410 -1.091206 -1.0188800
## 5 0.6001139 1.2964898 1.183094 -0.2686872
## 6 -1.6563179 -0.9265410 -1.849306 -1.7690727
## On.board.service Leg.room.service Baggage.handling Checkin.service
## 1 0.4794003 -0.2668392 0.3117670 0.5497960
## 2 -1.8491516 1.2533744 -0.5350423 -1.8210037
## 3 0.4794003 -0.2668392 0.3117670 0.5497960
## 4 -1.0729677 1.2533744 -0.5350423 -1.8210037
## 5 -0.2967837 0.4932676 0.3117670 -0.2404706
## 6 -0.2967837 0.4932676 0.3117670 0.5497960
## Inflight.service Cleanliness Departure.Delay.in.Minutes
## 1 1.1564303 1.3058634 0.26639136
## 2 0.3058464 -1.7422831 -0.36137308
## 3 0.3058464 1.3058634 -0.38752993
## 4 0.3058464 -0.9802465 -0.09980456
## 5 -0.5447375 -0.2182099 -0.38752993
## 6 0.3058464 -1.7422831 -0.38752993
## Arrival.Delay.in.Minutes
## 1 0.0741688
## 2 -0.2363116
## 3 -0.3915519
## 4 -0.1586915
## 5 -0.3915519
## 6 -0.3915519
Dataset final menggunakan hasil standardisasi variabel numerik agar seluruh variabel memiliki skala yang setara. Hal ini penting dalam analisis SEM dan CFA karena perbedaan skala antar variabel dapat memengaruhi estimasi model.
Sebelum melakukan Confirmatory Factor Analysis (CFA) dan Structural Equation Modeling (SEM), perlu dilakukan beberapa uji asumsi agar data memenuhi syarat analisis. Uji asumsi meliputi normalitas, multikolinearitas, kecukupan sampel, dan deteksi outlier multivariat.
# Melihat skewness dan kurtosis
normalitas <- describe(data_final)[ , c("mean", "sd", "skew", "kurtosis") ]
normalitas
## mean sd skew kurtosis
## Age 0 1 0.00 -0.72
## Flight.Distance 0 1 1.11 0.27
## Inflight.wifi.service 0 1 0.04 -0.85
## Departure.Arrival.time.convenient 0 1 -0.33 -1.04
## Ease.of.Online.booking 0 1 -0.02 -0.91
## Gate.location 0 1 -0.06 -1.03
## Food.and.drink 0 1 -0.15 -1.15
## Online.boarding 0 1 -0.45 -0.70
## Seat.comfort 0 1 -0.48 -0.93
## Inflight.entertainment 0 1 -0.37 -1.06
## On.board.service 0 1 -0.42 -0.89
## Leg.room.service 0 1 -0.35 -0.98
## Baggage.handling 0 1 -0.68 -0.39
## Checkin.service 0 1 -0.36 -0.83
## Inflight.service 0 1 -0.69 -0.36
## Cleanliness 0 1 -0.30 -1.01
## Departure.Delay.in.Minutes 0 1 6.73 100.26
## Arrival.Delay.in.Minutes 0 1 6.61 94.76
Berdasarkan hasil uji normalitas menggunakan nilai skewness dan kurtosis, sebagian besar variabel memiliki distribusi yang mendekati normal. Hal ini ditunjukkan oleh nilai skewness yang berada di sekitar rentang -2 hingga 2 dan nilai kurtosis yang masih berada dalam batas normal, sehingga data dinilai cukup baik untuk analisis SEM-CFA.
Variabel layanan seperti Inflight wifi service, Online boarding, Seat comfort, Food and drink, hingga Cleanliness memiliki nilai skewness negatif kecil yang menunjukkan distribusi data sedikit condong ke kiri. Artinya, sebagian besar responden memberikan penilaian yang cukup tinggi terhadap layanan maskapai. Selain itu, nilai kurtosis yang cenderung negatif menunjukkan distribusi data lebih datar dibanding distribusi normal.
Variabel Age memiliki distribusi yang cukup simetris dengan skewness sebesar 0,00 dan kurtosis sebesar -0,72 sehingga mendekati distribusi normal. Sementara itu, variabel Flight Distance memiliki skewness sebesar 1,11 yang menunjukkan distribusi miring ke kanan karena mayoritas penerbangan memiliki jarak yang relatif pendek, namun masih terdapat beberapa penerbangan dengan jarak sangat jauh.
Di sisi lain, variabel Departure Delay in Minutes dan Arrival Delay in Minutes memiliki nilai skewness yang sangat tinggi, masing-masing sebesar 6,73 dan 6,61. Hal ini menunjukkan distribusi data sangat miring ke kanan akibat adanya beberapa keterlambatan ekstrem pada penerbangan. Oleh karena itu, kedua variabel tersebut mengandung outlier yang cukup besar dibandingkan variabel lainnya.
Sys.setlocale("LC_ALL", "English")
## Warning in Sys.setlocale("LC_ALL", "English"): using locale code page other
## than 65001 ("UTF-8") may cause problems
## [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
set.seed(123)
sample_data <- data_final[sample(nrow(data_final), 3000), ]
mvn_result <- MVN::mvn(
data = sample_data,
mvn_test = "mardia"
)
mvn_result$multivariate_normality
## Test Statistic p.value Method MVN
## 1 Mardia Skewness 32954.76 <0.001 asymptotic <U+2717> Not normal
## 2 Mardia Kurtosis 144.80 <0.001 asymptotic <U+2717> Not normal
Berdasarkan hasil uji normalitas multivariat menggunakan Mardia Test, diperoleh nilai p-value pada Mardia Skewness dan Mardia Kurtosis masing-masing sebesar <0,001. Nilai tersebut lebih kecil dari taraf signifikansi 0,05 sehingga hipotesis nol ditolak. Hal ini menunjukkan bahwa data tidak memenuhi asumsi normalitas multivariat.
Nilai Mardia Skewness sebesar 32954,76 menunjukkan adanya penyimpangan distribusi data terhadap normalitas dari sisi kemencengan (skewness), sedangkan nilai Mardia Kurtosis sebesar 144,80 menunjukkan adanya penyimpangan dari sisi keruncingan distribusi data (kurtosis). Hasil ini sejalan dengan karakteristik beberapa variabel pada dataset, khususnya variabel Departure Delay in Minutes dan Arrival Delay in Minutes yang memiliki distribusi sangat miring ke kanan akibat adanya outlier atau nilai ekstrem keterlambatan penerbangan.
Meskipun data tidak berdistribusi normal secara multivariat, analisis SEM-CFA masih dapat dilakukan karena jumlah sampel pada penelitian ini sangat besar, yaitu lebih dari 100.000 observasi. Selain itu, metode estimasi pada package lavaan masih cukup robust terhadap pelanggaran normalitas pada ukuran sampel besar.
# Membuat model regresi sementara
model_vif <- lm(
Flight.Distance ~ Age +
Inflight.wifi.service +
Departure.Arrival.time.convenient +
Ease.of.Online.booking +
Gate.location +
Food.and.drink +
Online.boarding +
Seat.comfort +
Inflight.entertainment +
On.board.service +
Leg.room.service +
Baggage.handling +
Checkin.service +
Inflight.service +
Cleanliness +
Departure.Delay.in.Minutes +
Arrival.Delay.in.Minutes,
data = data_final
)
# Menghitung nilai VIF
vif(model_vif)
## Age Inflight.wifi.service
## 1.095177 2.352759
## Departure.Arrival.time.convenient Ease.of.Online.booking
## 1.434601 2.639290
## Gate.location Food.and.drink
## 1.479128 2.165509
## Online.boarding Seat.comfort
## 1.828925 2.362390
## Inflight.entertainment On.board.service
## 3.780579 1.755326
## Leg.room.service Baggage.handling
## 1.289543 1.890176
## Checkin.service Inflight.service
## 1.214760 2.055373
## Cleanliness Departure.Delay.in.Minutes
## 2.848852 12.836277
## Arrival.Delay.in.Minutes
## 12.844551
Berdasarkan hasil uji multikolinearitas menggunakan Variance
Inflation Factor (VIF), sebagian besar variabel memiliki nilai VIF
kurang dari 10 sehingga tidak menunjukkan adanya multikolinearitas yang
serius. Namun, variabel Departure.Delay.in.Minutes dan
Arrival.Delay.in.Minutes memiliki nilai VIF di atas 10,
yaitu masing-masing sebesar 12.836277 dan 12.844551. Hal ini menunjukkan
adanya hubungan yang sangat kuat antara kedua variabel tersebut. Kondisi
ini dapat terjadi karena keterlambatan keberangkatan penerbangan umumnya
berpengaruh langsung terhadap keterlambatan kedatangan. Oleh karena itu,
salah satu variabel delay dapat dipertimbangkan untuk dihapus agar model
SEM menjadi lebih stabil dan terhindar dari masalah
multikolinearitas.
# Menghapus variabel dengan VIF tertinggi
data_final <- subset(
data_final,
select = -Arrival.Delay.in.Minutes
)
# Melihat struktur data terbaru
str(data_final)
## 'data.frame': 103904 obs. of 17 variables:
## $ Age : num -1.745 -0.951 -0.885 -0.951 1.43 ...
## $ Flight.Distance : num -0.7315 -0.9572 -0.0476 -0.6292 -0.9782 ...
## $ Inflight.wifi.service : num 0.204 0.204 -0.55 -0.55 0.204 ...
## $ Departure.Arrival.time.convenient: num 0.6162 -0.6952 -0.6952 1.2719 -0.0395 ...
## $ Ease.of.Online.booking : num 0.174 0.174 -0.541 1.603 0.174 ...
## $ Gate.location : num -1.5473 0.0181 -0.7646 1.5835 0.0181 ...
## $ Food.and.drink : num 1.352 -1.656 1.352 -0.904 0.6 ...
## $ Online.boarding : num -0.186 -0.186 1.296 -0.927 1.296 ...
## $ Seat.comfort : num 1.18 -1.85 1.18 -1.09 1.18 ...
## $ Inflight.entertainment : num 1.232 -1.769 1.232 -1.019 -0.269 ...
## $ On.board.service : num 0.479 -1.849 0.479 -1.073 -0.297 ...
## $ Leg.room.service : num -0.267 1.253 -0.267 1.253 0.493 ...
## $ Baggage.handling : num 0.312 -0.535 0.312 -0.535 0.312 ...
## $ Checkin.service : num 0.55 -1.82 0.55 -1.82 -0.24 ...
## $ Inflight.service : num 1.156 0.306 0.306 0.306 -0.545 ...
## $ Cleanliness : num 1.306 -1.742 1.306 -0.98 -0.218 ...
## $ Departure.Delay.in.Minutes : num 0.2664 -0.3614 -0.3875 -0.0998 -0.3875 ...
# Uji VIF ulang
model_vif2 <- lm(
Flight.Distance ~ Age +
Inflight.wifi.service +
Departure.Arrival.time.convenient +
Ease.of.Online.booking +
Gate.location +
Food.and.drink +
Online.boarding +
Seat.comfort +
Inflight.entertainment +
On.board.service +
Leg.room.service +
Baggage.handling +
Checkin.service +
Inflight.service +
Cleanliness +
Departure.Delay.in.Minutes,
data = data_final
)
vif(model_vif2)
## Age Inflight.wifi.service
## 1.095121 2.352759
## Departure.Arrival.time.convenient Ease.of.Online.booking
## 1.434584 2.639286
## Gate.location Food.and.drink
## 1.479123 2.165247
## Online.boarding Seat.comfort
## 1.828878 2.362387
## Inflight.entertainment On.board.service
## 3.780561 1.755279
## Leg.room.service Baggage.handling
## 1.289533 1.890144
## Checkin.service Inflight.service
## 1.214758 2.054767
## Cleanliness Departure.Delay.in.Minutes
## 2.848812 1.007523
Setelah variabel Arrival.Delay.in.Minutes dihapus, hasil uji multikolinearitas menunjukkan bahwa seluruh variabel memiliki nilai VIF kurang dari 10. Nilai VIF tertinggi terdapat pada variabel Inflight.entertainment sebesar 3.780561, sedangkan variabel lainnya berada di sekitar 1–3. Hal ini menunjukkan bahwa tidak terdapat multikolinearitas yang serius antar variabel independen. Dengan demikian, data telah memenuhi asumsi multikolinearitas dan layak digunakan untuk analisis Confirmatory Factor Analysis (CFA) dan Structural Equation Modeling (SEM).
# Uji KMO
KMO(cor(data_final))
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = cor(data_final))
## Overall MSA = 0.78
## MSA for each item =
## Age Flight.Distance
## 0.56 0.70
## Inflight.wifi.service Departure.Arrival.time.convenient
## 0.73 0.74
## Ease.of.Online.booking Gate.location
## 0.68 0.71
## Food.and.drink Online.boarding
## 0.84 0.73
## Seat.comfort Inflight.entertainment
## 0.84 0.77
## On.board.service Leg.room.service
## 0.83 0.88
## Baggage.handling Checkin.service
## 0.81 0.71
## Inflight.service Cleanliness
## 0.78 0.81
## Departure.Delay.in.Minutes
## 0.50
Berdasarkan hasil uji Kaiser-Meyer-Olkin (KMO), diperoleh nilai Overall MSA sebesar 0.78. Nilai tersebut menunjukkan bahwa data memiliki tingkat kecukupan sampel yang baik dan layak digunakan untuk analisis faktor. Sebagian besar variabel memiliki nilai MSA di atas 0.70 yang menunjukkan kualitas korelasi antar variabel cukup baik. Variabel Departure.Delay.in.Minutes memiliki nilai MSA sebesar 0.50 yang masih berada pada batas minimum penerimaan. Dengan demikian, data memenuhi asumsi kecukupan sampel untuk dilakukan analisis Confirmatory Factor Analysis (CFA) dan Structural Equation Modeling (SEM).
# Bartlett Test
cortest.bartlett( cor(data_final), n = nrow(data_final) )
## $chisq
## [1] 621298.5
##
## $p.value
## [1] 0
##
## $df
## [1] 136
Berdasarkan hasil Bartlett’s Test diperoleh nilai chi-square sebesar 621298.5 dengan derajat kebebasan (df) sebesar 136 dan p-value < 0.05. Hasil tersebut menunjukkan bahwa terdapat korelasi yang signifikan antar variabel sehingga matriks korelasi bukan merupakan identity matrix. Dengan demikian, data dinyatakan layak untuk dilakukan analisis faktor, Confirmatory Factor Analysis (CFA), dan Structural Equation Modeling (SEM).
# Menghitung Mahalanobis Distance
mahalanobis_distance <- mahalanobis(
data_final,
colMeans(data_final),
cov(data_final)
)
# Menentukan cutoff
cutoff <- qchisq(
0.999,
df = ncol(data_final)
)
# Jumlah outlier multivariat
sum(mahalanobis_distance > cutoff)
## [1] 1945
Berdasarkan perhitungan Mahalanobis Distance, diperoleh sebanyak 1945 observasi yang terdeteksi sebagai outlier multivariat. Jumlah tersebut relatif kecil dibandingkan total data yang mencapai lebih dari 100 ribu observasi. Outlier pada dataset penerbangan tidak selalu menunjukkan kesalahan data, melainkan dapat merepresentasikan kondisi nyata seperti keterlambatan ekstrem, gangguan operasional, maupun variasi tingkat kepuasan pelanggan. Oleh karena itu, outlier multivariat tidak langsung dihapus dan tetap dipertahankan dalam analisis agar informasi penting pada data tidak hilang.
# Visualisasi Mahalanobis Distance
plot(
mahalanobis_distance,
pch = 20,
main = "Deteksi Outlier Multivariat",
ylab = "Mahalanobis Distance"
)
# Menambahkan garis cutoff
abline(
h = cutoff,
col = "red",
lwd = 2
)
Visualisasi tersebut menunjukkan hasil deteksi outlier multivariat menggunakan Mahalanobis Distance. Titik-titik hitam merepresentasikan setiap observasi dalam dataset, sedangkan garis merah menunjukkan batas cutoff berdasarkan distribusi chi-square. Observasi yang berada di atas garis merah dikategorikan sebagai outlier multivariat.
Berdasarkan grafik, sebagian besar data berada di bawah batas cutoff sehingga menunjukkan bahwa mayoritas observasi masih berada dalam pola distribusi yang normal. Namun, terdapat beberapa titik yang berada jauh di atas garis cutoff dengan nilai Mahalanobis Distance yang sangat tinggi. Titik-titik tersebut menunjukkan adanya observasi ekstrem atau outlier multivariat pada dataset.
Meskipun demikian, jumlah outlier relatif kecil dibandingkan total data yang mencapai lebih dari 100 ribu observasi. Selain itu, outlier pada data penerbangan dapat merepresentasikan kondisi nyata seperti keterlambatan ekstrem, gangguan operasional, maupun variasi tingkat kepuasan pelanggan. Oleh karena itu, outlier tidak langsung dihapus agar informasi penting dalam data tetap dipertahankan untuk analisis SEM dan CFA.
Confirmatory Factor Analysis (CFA) dilakukan untuk menguji hubungan antara variabel indikator dengan konstruk laten yang telah ditentukan berdasarkan teori dan karakteristik layanan maskapai penerbangan.
#install.packages("lavaan")
library(lavaan)
## This is lavaan 0.6-21
## lavaan is FREE software! Please report any bugs.
##
## Attaching package: 'lavaan'
## The following object is masked from 'package:psych':
##
## cor2cov
model_cfa2 <- '
# Online Service
Online_Service =~
Inflight.wifi.service +
Ease.of.Online.booking
# Comfort
Comfort =~
Seat.comfort +
Cleanliness
# Service Quality
Service_Quality =~
On.board.service +
Inflight.service +
Baggage.handling
# Entertainment
Entertainment =~
Inflight.entertainment +
Food.and.drink
# Accessibility
Accessibility =~
Gate.location +
Departure.Arrival.time.convenient
'
fit_cfa2 <- cfa(
model_cfa2,
data = data_final,
estimator = "MLR"
)
summary(
fit_cfa2,
fit.measures = TRUE,
standardized = TRUE
)
## lavaan 0.6-21 ended normally after 40 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 32
##
## Number of observations 103904
##
## Model Test User Model:
## Standard Scaled
## Test Statistic 34116.114 35137.583
## Degrees of freedom 34 34
## P-value (Chi-square) 0.000 0.000
## Scaling correction factor 0.971
## Yuan-Bentler correction (Mplus variant)
##
## Model Test Baseline Model:
##
## Test statistic 498306.870 390785.775
## Degrees of freedom 55 55
## P-value 0.000 0.000
## Scaling correction factor 1.275
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.932 0.910
## Tucker-Lewis Index (TLI) 0.889 0.855
##
## Robust Comparative Fit Index (CFI) 0.932
## Robust Tucker-Lewis Index (TLI) 0.889
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1389666.405 -1389666.405
## Scaling correction factor 1.354
## for the MLR correction
## Loglikelihood unrestricted model (H1) -1372608.348 -1372608.348
## Scaling correction factor 1.157
## for the MLR correction
##
## Akaike (AIC) 2779396.810 2779396.810
## Bayesian (BIC) 2779702.449 2779702.449
## Sample-size adjusted Bayesian (SABIC) 2779600.752 2779600.752
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.098 0.100
## 90 Percent confidence interval - lower 0.097 0.099
## 90 Percent confidence interval - upper 0.099 0.101
## P-value H_0: RMSEA <= 0.050 0.000 0.000
## P-value H_0: RMSEA >= 0.080 1.000 1.000
##
## Robust RMSEA 0.098
## 90 Percent confidence interval - lower 0.097
## 90 Percent confidence interval - upper 0.099
## P-value H_0: Robust RMSEA <= 0.050 0.000
## P-value H_0: Robust RMSEA >= 0.080 1.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.063 0.063
##
## Parameter Estimates:
##
## Standard errors Sandwich
## Information bread Observed
## Observed information based on Hessian
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Online_Service =~
## Inflght.wf.srv 1.000 0.761 0.761
## Es.f.Onln.bkng 1.238 0.010 121.718 0.000 0.941 0.941
## Comfort =~
## Seat.comfort 1.000 0.773 0.773
## Cleanliness 1.135 0.004 308.741 0.000 0.878 0.878
## Service_Quality =~
## On.board.servc 1.000 0.691 0.691
## Inflight.servc 1.174 0.006 212.967 0.000 0.811 0.811
## Baggage.hndlng 1.102 0.006 195.824 0.000 0.761 0.761
## Entertainment =~
## Inflght.ntrtnm 1.000 0.909 0.909
## Food.and.drink 0.754 0.004 182.707 0.000 0.685 0.685
## Accessibility =~
## Gate.location 1.000 0.671 0.671
## Dprtr.Arrvl.t. 0.987 0.009 115.077 0.000 0.662 0.662
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Online_Service ~~
## Comfort 0.031 0.003 11.400 0.000 0.053 0.053
## Service_Qualty 0.039 0.002 16.292 0.000 0.074 0.074
## Entertainment 0.062 0.004 16.611 0.000 0.090 0.090
## Accessibility 0.361 0.003 108.290 0.000 0.707 0.707
## Comfort ~~
## Service_Qualty 0.079 0.002 39.833 0.000 0.147 0.147
## Entertainment 0.635 0.003 193.902 0.000 0.903 0.903
## Accessibility 0.005 0.002 2.483 0.013 0.010 0.010
## Service_Quality ~~
## Entertainment 0.311 0.004 85.612 0.000 0.496 0.496
## Accessibility 0.030 0.002 13.738 0.000 0.064 0.064
## Entertainment ~~
## Accessibility -0.000 0.003 -0.050 0.960 -0.000 -0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Inflght.wf.srv 0.422 0.005 78.578 0.000 0.422 0.422
## .Es.f.Onln.bkng 0.114 0.007 16.572 0.000 0.114 0.114
## .Seat.comfort 0.402 0.004 111.847 0.000 0.402 0.402
## .Cleanliness 0.230 0.003 91.698 0.000 0.230 0.230
## .On.board.servc 0.523 0.004 146.001 0.000 0.523 0.523
## .Inflight.servc 0.342 0.004 90.396 0.000 0.342 0.342
## .Baggage.hndlng 0.420 0.004 105.167 0.000 0.420 0.420
## .Inflght.ntrtnm 0.174 0.004 48.411 0.000 0.174 0.174
## .Food.and.drink 0.531 0.004 138.457 0.000 0.531 0.531
## .Gate.location 0.549 0.005 107.098 0.000 0.549 0.549
## .Dprtr.Arrvl.t. 0.561 0.005 113.243 0.000 0.561 0.561
## Online_Service 0.578 0.006 94.838 0.000 1.000 1.000
## Comfort 0.598 0.004 146.673 0.000 1.000 1.000
## Service_Qualty 0.477 0.004 125.237 0.000 1.000 1.000
## Entertainment 0.826 0.004 184.332 0.000 1.000 1.000
## Accessibility 0.451 0.005 82.689 0.000 1.000 1.000
fitMeasures(
fit_cfa2,
c(
"chisq",
"df",
"pvalue",
"cfi",
"tli",
"rmsea",
"srmr"
)
)
## chisq df pvalue cfi tli rmsea srmr
## 34116.114 34.000 0.000 0.932 0.889 0.098 0.063
standardizedSolution(fit_cfa2)
## lhs op rhs
## 1 Online_Service =~ Inflight.wifi.service
## 2 Online_Service =~ Ease.of.Online.booking
## 3 Comfort =~ Seat.comfort
## 4 Comfort =~ Cleanliness
## 5 Service_Quality =~ On.board.service
## 6 Service_Quality =~ Inflight.service
## 7 Service_Quality =~ Baggage.handling
## 8 Entertainment =~ Inflight.entertainment
## 9 Entertainment =~ Food.and.drink
## 10 Accessibility =~ Gate.location
## 11 Accessibility =~ Departure.Arrival.time.convenient
## 12 Inflight.wifi.service ~~ Inflight.wifi.service
## 13 Ease.of.Online.booking ~~ Ease.of.Online.booking
## 14 Seat.comfort ~~ Seat.comfort
## 15 Cleanliness ~~ Cleanliness
## 16 On.board.service ~~ On.board.service
## 17 Inflight.service ~~ Inflight.service
## 18 Baggage.handling ~~ Baggage.handling
## 19 Inflight.entertainment ~~ Inflight.entertainment
## 20 Food.and.drink ~~ Food.and.drink
## 21 Gate.location ~~ Gate.location
## 22 Departure.Arrival.time.convenient ~~ Departure.Arrival.time.convenient
## 23 Online_Service ~~ Online_Service
## 24 Comfort ~~ Comfort
## 25 Service_Quality ~~ Service_Quality
## 26 Entertainment ~~ Entertainment
## 27 Accessibility ~~ Accessibility
## 28 Online_Service ~~ Comfort
## 29 Online_Service ~~ Service_Quality
## 30 Online_Service ~~ Entertainment
## 31 Online_Service ~~ Accessibility
## 32 Comfort ~~ Service_Quality
## 33 Comfort ~~ Entertainment
## 34 Comfort ~~ Accessibility
## 35 Service_Quality ~~ Entertainment
## 36 Service_Quality ~~ Accessibility
## 37 Entertainment ~~ Accessibility
## est.std se z pvalue ci.lower ci.upper
## 1 0.761 0.004 212.552 0.000 0.754 0.768
## 2 0.941 0.004 257.557 0.000 0.934 0.948
## 3 0.773 0.002 346.284 0.000 0.769 0.778
## 4 0.878 0.001 624.946 0.000 0.875 0.880
## 5 0.691 0.002 287.098 0.000 0.686 0.695
## 6 0.811 0.002 370.965 0.000 0.807 0.816
## 7 0.761 0.002 311.906 0.000 0.757 0.766
## 8 0.909 0.002 459.523 0.000 0.905 0.912
## 9 0.685 0.003 241.621 0.000 0.680 0.691
## 10 0.671 0.004 177.279 0.000 0.664 0.679
## 11 0.662 0.003 191.070 0.000 0.656 0.669
## 12 0.422 0.005 77.455 0.000 0.411 0.432
## 13 0.114 0.007 16.581 0.000 0.101 0.128
## 14 0.402 0.003 116.451 0.000 0.395 0.409
## 15 0.230 0.002 93.301 0.000 0.225 0.235
## 16 0.523 0.003 157.286 0.000 0.516 0.529
## 17 0.342 0.004 96.364 0.000 0.335 0.349
## 18 0.420 0.004 113.001 0.000 0.413 0.427
## 19 0.174 0.004 48.536 0.000 0.167 0.181
## 20 0.531 0.004 136.571 0.000 0.523 0.538
## 21 0.549 0.005 107.978 0.000 0.539 0.559
## 22 0.561 0.005 122.197 0.000 0.552 0.570
## 23 1.000 0.000 NA NA 1.000 1.000
## 24 1.000 0.000 NA NA 1.000 1.000
## 25 1.000 0.000 NA NA 1.000 1.000
## 26 1.000 0.000 NA NA 1.000 1.000
## 27 1.000 0.000 NA NA 1.000 1.000
## 28 0.053 0.004 11.824 0.000 0.044 0.061
## 29 0.074 0.004 17.177 0.000 0.066 0.082
## 30 0.090 0.005 17.711 0.000 0.080 0.100
## 31 0.707 0.004 194.300 0.000 0.700 0.714
## 32 0.147 0.004 40.892 0.000 0.140 0.154
## 33 0.903 0.003 295.680 0.000 0.897 0.909
## 34 0.010 0.004 2.482 0.013 0.002 0.019
## 35 0.496 0.004 121.920 0.000 0.488 0.504
## 36 0.064 0.005 13.486 0.000 0.055 0.073
## 37 0.000 0.004 -0.050 0.960 -0.008 0.008
Berdasarkan hasil Confirmatory Factor Analysis (CFA), model hasil modifikasi menunjukkan peningkatan goodness of fit dibanding model sebelumnya. Nilai Comparative Fit Index (CFI) sebesar 0.932 menunjukkan model telah memenuhi kriteria fit karena berada di atas 0.90. Nilai Standardized Root Mean Square Residual (SRMR) sebesar 0.063 juga menunjukkan model telah memenuhi kriteria fit karena berada di bawah 0.08. Nilai Tucker-Lewis Index (TLI) sebesar 0.889 mendekati batas kriteria fit, sedangkan nilai RMSEA sebesar 0.098 masih tergolong marginal fit. Namun, mengingat jumlah sampel penelitian yang sangat besar, nilai RMSEA masih dapat ditoleransi.
Selain itu, seluruh indikator pada model CFA hasil modifikasi memiliki nilai loading factor di atas 0.50 sehingga seluruh indikator dinyatakan valid dalam merepresentasikan konstruk laten masing-masing. Dengan demikian, model CFA hasil modifikasi dinilai cukup baik dan layak untuk dilanjutkan ke tahap Structural Equation Modeling (SEM).
Structural Equation Modeling (SEM) dilakukan untuk menguji hubungan antar konstruk laten yang telah dibentuk pada tahap Confirmatory Factor Analysis (CFA). Analisis ini digunakan untuk mengetahui pengaruh antar variabel laten dalam model penelitian.
# Model SEM
model_sem <- '
# Online Service
Online_Service =~
Inflight.wifi.service +
Ease.of.Online.booking
# Comfort
Comfort =~
Seat.comfort +
Cleanliness
# Service Quality
Service_Quality =~
On.board.service +
Inflight.service +
Baggage.handling
# Entertainment
Entertainment =~
Inflight.entertainment +
Food.and.drink
# Accessibility
Accessibility =~
Gate.location +
Departure.Arrival.time.convenient
# =========================
# Structural Model
# =========================
Comfort ~ Online_Service + Accessibility
Service_Quality ~ Online_Service +
Accessibility +
Entertainment
Entertainment ~ Comfort
'
Model SEM dibentuk berdasarkan hubungan antar konstruk laten yang berkaitan dengan kualitas layanan penerbangan dan pengalaman penumpang.
fit_sem <- sem(
model_sem,
data = data_final,
estimator = "MLR"
)
summary(
fit_sem,
fit.measures = TRUE,
standardized = TRUE,
rsquare = TRUE
)
## lavaan 0.6-21 ended normally after 39 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 29
##
## Number of observations 103904
##
## Model Test User Model:
## Standard Scaled
## Test Statistic 50867.369 55063.511
## Degrees of freedom 37 37
## P-value (Chi-square) 0.000 0.000
## Scaling correction factor 0.924
## Yuan-Bentler correction (Mplus variant)
##
## Model Test Baseline Model:
##
## Test statistic 498306.870 390785.775
## Degrees of freedom 55 55
## P-value 0.000 0.000
## Scaling correction factor 1.275
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.898 0.859
## Tucker-Lewis Index (TLI) 0.848 0.791
##
## Robust Comparative Fit Index (CFI) 0.898
## Robust Tucker-Lewis Index (TLI) 0.848
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1398042.033 -1398042.033
## Scaling correction factor 1.453
## for the MLR correction
## Loglikelihood unrestricted model (H1) -1372608.348 -1372608.348
## Scaling correction factor 1.157
## for the MLR correction
##
## Akaike (AIC) 2796142.065 2796142.065
## Bayesian (BIC) 2796419.051 2796419.051
## Sample-size adjusted Bayesian (SABIC) 2796326.888 2796326.888
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.115 0.120
## 90 Percent confidence interval - lower 0.114 0.119
## 90 Percent confidence interval - upper 0.116 0.121
## P-value H_0: RMSEA <= 0.050 0.000 0.000
## P-value H_0: RMSEA >= 0.080 1.000 1.000
##
## Robust RMSEA 0.115
## 90 Percent confidence interval - lower 0.114
## 90 Percent confidence interval - upper 0.116
## P-value H_0: Robust RMSEA <= 0.050 0.000
## P-value H_0: Robust RMSEA >= 0.080 1.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.070 0.070
##
## Parameter Estimates:
##
## Standard errors Sandwich
## Information bread Observed
## Observed information based on Hessian
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Online_Service =~
## Inflght.wf.srv 1.000 0.752 0.752
## Es.f.Onln.bkng 1.267 0.010 124.181 0.000 0.952 0.952
## Comfort =~
## Seat.comfort 1.000 0.773 0.773
## Cleanliness 1.136 0.004 279.285 0.000 0.877 0.877
## Service_Quality =~
## On.board.servc 1.000 0.683 0.683
## Inflight.servc 1.187 0.006 186.937 0.000 0.811 0.811
## Baggage.hndlng 1.126 0.006 179.194 0.000 0.769 0.769
## Entertainment =~
## Inflght.ntrtnm 1.000 0.859 0.859
## Food.and.drink 0.875 0.006 138.039 0.000 0.751 0.751
## Accessibility =~
## Gate.location 1.000 0.677 0.677
## Dprtr.Arrvl.t. 0.969 0.008 117.757 0.000 0.656 0.656
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Comfort ~
## Online_Service 0.116 0.009 12.969 0.000 0.113 0.113
## Accessibility -0.085 0.010 -8.839 0.000 -0.075 -0.075
## Service_Quality ~
## Online_Service 0.004 0.006 0.558 0.577 0.004 0.004
## Accessibility 0.061 0.008 7.537 0.000 0.061 0.061
## Entertainment 0.261 0.005 49.023 0.000 0.329 0.329
## Entertainment ~
## Comfort 1.036 0.004 245.128 0.000 0.932 0.932
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Online_Service ~~
## Accessibility 0.358 0.003 107.176 0.000 0.702 0.702
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .Inflght.wf.srv 0.435 0.005 83.072 0.000 0.435 0.435
## .Es.f.Onln.bkng 0.093 0.007 13.734 0.000 0.093 0.093
## .Seat.comfort 0.403 0.004 109.874 0.000 0.403 0.403
## .Cleanliness 0.230 0.003 84.405 0.000 0.230 0.230
## .On.board.servc 0.534 0.004 142.027 0.000 0.534 0.534
## .Inflight.servc 0.343 0.004 82.545 0.000 0.343 0.343
## .Baggage.hndlng 0.409 0.004 97.049 0.000 0.409 0.409
## .Inflght.ntrtnm 0.262 0.006 43.824 0.000 0.262 0.262
## .Food.and.drink 0.436 0.004 98.182 0.000 0.436 0.436
## .Gate.location 0.541 0.005 105.460 0.000 0.541 0.541
## .Dprtr.Arrvl.t. 0.569 0.005 117.726 0.000 0.569 0.569
## Online_Service 0.565 0.006 95.284 0.000 1.000 1.000
## .Comfort 0.593 0.004 142.746 0.000 0.994 0.994
## .Service_Qualty 0.414 0.004 110.943 0.000 0.887 0.887
## .Entertainment 0.097 0.005 18.282 0.000 0.132 0.132
## Accessibility 0.459 0.005 84.134 0.000 1.000 1.000
##
## R-Square:
## Estimate
## Inflght.wf.srv 0.565
## Es.f.Onln.bkng 0.907
## Seat.comfort 0.597
## Cleanliness 0.770
## On.board.servc 0.466
## Inflight.servc 0.657
## Baggage.hndlng 0.591
## Inflght.ntrtnm 0.738
## Food.and.drink 0.564
## Gate.location 0.459
## Dprtr.Arrvl.t. 0.431
## Comfort 0.006
## Service_Qualty 0.113
## Entertainment 0.868
fitMeasures(
fit_sem,
c(
"chisq",
"df",
"pvalue",
"cfi",
"tli",
"rmsea",
"srmr"
)
)
## chisq df pvalue cfi tli rmsea srmr
## 50867.369 37.000 0.000 0.898 0.848 0.115 0.070
standardizedSolution(fit_sem)
## lhs op rhs
## 1 Online_Service =~ Inflight.wifi.service
## 2 Online_Service =~ Ease.of.Online.booking
## 3 Comfort =~ Seat.comfort
## 4 Comfort =~ Cleanliness
## 5 Service_Quality =~ On.board.service
## 6 Service_Quality =~ Inflight.service
## 7 Service_Quality =~ Baggage.handling
## 8 Entertainment =~ Inflight.entertainment
## 9 Entertainment =~ Food.and.drink
## 10 Accessibility =~ Gate.location
## 11 Accessibility =~ Departure.Arrival.time.convenient
## 12 Comfort ~ Online_Service
## 13 Comfort ~ Accessibility
## 14 Service_Quality ~ Online_Service
## 15 Service_Quality ~ Accessibility
## 16 Service_Quality ~ Entertainment
## 17 Entertainment ~ Comfort
## 18 Inflight.wifi.service ~~ Inflight.wifi.service
## 19 Ease.of.Online.booking ~~ Ease.of.Online.booking
## 20 Seat.comfort ~~ Seat.comfort
## 21 Cleanliness ~~ Cleanliness
## 22 On.board.service ~~ On.board.service
## 23 Inflight.service ~~ Inflight.service
## 24 Baggage.handling ~~ Baggage.handling
## 25 Inflight.entertainment ~~ Inflight.entertainment
## 26 Food.and.drink ~~ Food.and.drink
## 27 Gate.location ~~ Gate.location
## 28 Departure.Arrival.time.convenient ~~ Departure.Arrival.time.convenient
## 29 Online_Service ~~ Online_Service
## 30 Comfort ~~ Comfort
## 31 Service_Quality ~~ Service_Quality
## 32 Entertainment ~~ Entertainment
## 33 Accessibility ~~ Accessibility
## 34 Online_Service ~~ Accessibility
## est.std se z pvalue ci.lower ci.upper
## 1 0.752 0.004 213.424 0.000 0.745 0.759
## 2 0.952 0.004 266.922 0.000 0.945 0.959
## 3 0.773 0.002 337.701 0.000 0.768 0.777
## 4 0.877 0.002 567.061 0.000 0.874 0.880
## 5 0.683 0.003 263.095 0.000 0.678 0.688
## 6 0.811 0.002 330.059 0.000 0.806 0.815
## 7 0.769 0.003 296.222 0.000 0.764 0.774
## 8 0.859 0.003 250.733 0.000 0.852 0.866
## 9 0.751 0.003 250.289 0.000 0.745 0.757
## 10 0.677 0.004 180.494 0.000 0.670 0.685
## 11 0.656 0.003 192.804 0.000 0.650 0.663
## 12 0.113 0.009 12.610 0.000 0.095 0.130
## 13 -0.075 0.008 -8.892 0.000 -0.091 -0.058
## 14 0.004 0.007 0.557 0.577 -0.010 0.018
## 15 0.061 0.008 7.621 0.000 0.045 0.077
## 16 0.329 0.007 45.340 0.000 0.315 0.343
## 17 0.932 0.003 271.232 0.000 0.925 0.939
## 18 0.435 0.005 82.091 0.000 0.424 0.445
## 19 0.093 0.007 13.738 0.000 0.080 0.107
## 20 0.403 0.004 114.040 0.000 0.396 0.410
## 21 0.230 0.003 84.759 0.000 0.225 0.235
## 22 0.534 0.004 150.483 0.000 0.527 0.541
## 23 0.343 0.004 86.122 0.000 0.335 0.351
## 24 0.409 0.004 102.393 0.000 0.401 0.417
## 25 0.262 0.006 44.543 0.000 0.251 0.274
## 26 0.436 0.005 96.593 0.000 0.427 0.444
## 27 0.541 0.005 106.390 0.000 0.531 0.551
## 28 0.569 0.004 127.446 0.000 0.561 0.578
## 29 1.000 0.000 NA NA 1.000 1.000
## 30 0.994 0.001 1002.531 0.000 0.992 0.995
## 31 0.887 0.005 186.621 0.000 0.878 0.897
## 32 0.132 0.006 20.577 0.000 0.119 0.144
## 33 1.000 0.000 NA NA 1.000 1.000
## 34 0.702 0.004 188.158 0.000 0.695 0.710
inspect(
fit_sem,
"r2"
)
## Inflight.wifi.service Ease.of.Online.booking
## 0.565 0.907
## Seat.comfort Cleanliness
## 0.597 0.770
## On.board.service Inflight.service
## 0.466 0.657
## Baggage.handling Inflight.entertainment
## 0.591 0.738
## Food.and.drink Gate.location
## 0.564 0.459
## Departure.Arrival.time.convenient Comfort
## 0.431 0.006
## Service_Quality Entertainment
## 0.113 0.868
Berdasarkan hasil Structural Equation Modeling (SEM), model menunjukkan tingkat kecocokan yang cukup baik terhadap data penelitian. Nilai SRMR telah memenuhi kriteria fit, sedangkan nilai CFI mendekati batas penerimaan sehingga model dapat dikategorikan sebagai marginal fit. Hasil analisis menunjukkan bahwa konstruk Entertainment memiliki pengaruh positif signifikan terhadap Service Quality. Selain itu, konstruk Comfort juga berpengaruh sangat kuat terhadap Entertainment. Sementara itu, pengaruh Online Service terhadap Service Quality tidak signifikan. Dengan demikian, faktor hiburan dan kenyamanan menjadi aspek yang paling berpengaruh dalam meningkatkan kualitas layanan maskapai penerbangan menurut persepsi pelanggan.
Berdasarkan hasil visualisasi SEM-CFA, sebagian besar indikator memiliki nilai factor loading di atas 0,5 sehingga mampu merepresentasikan konstruk laten dengan baik. Konstruk Online Service memiliki indikator terkuat yaitu Ease of Online booking sebesar 0,95, sedangkan konstruk Comfort paling dipengaruhi oleh Cleanliness sebesar 0,88. Pada konstruk Entertainment, indikator Inflight entertainment memiliki loading sebesar 0,86, dan pada konstruk Service Quality indikator Inflight service memiliki loading tertinggi sebesar 0,81.
Hubungan antar konstruk menunjukkan bahwa Entertainment berpengaruh positif terhadap Service Quality dengan koefisien sebesar 0,33. Sementara itu, Accessibility memiliki pengaruh negatif yang sangat lemah terhadap Comfort dengan koefisien sebesar -0,07.