Di tengah meningkatnya persaingan global, analisis terhadap perilaku konsumen menjadi aspek utama bagi suatu perusahaan dalam menyusun kebijakan pemasaran yang kompetitif. Perilaku konsumen terbentuk dari interaksi kompleks antara faktor psikologis, sosial, budaya, dan individu, termasuk karakteristik sosial demografis, seperti tingkat pendidikan, status pernikahan, pendapatan, dan kelompok umur [1]. Analisis terhadap faktor-faktor ini mampu memberikan wawasan yang bernilai dalam proses segmentasi pasar, penentuan posisi produk, dan strategi komunikasi pemasaran yang lebih efektif [1]. Namun, menganalisis perilaku konsumen tidak cukup dilakukan dengan satu variabel dependen secara terpisah. Pada praktiknya, berbagai aspek pengeluaran konsumen saling berkaitan dan dipengaruhi oleh faktor yang sama secara bersamaan. Oleh karena itu, pendekatan statistik multivariat seperti Multivariate Analysis of Variance (MANOVA) dan Multivariate Analysis of Covariance (MANCOVA) menjadi solusi yang relevan dalam menangani kompleksitas tersebut [2]. MANOVA memungkinkan evaluasi terhadap perbedaan gabungan beberapa variabel dependen berdasarkan variabel bebas kategorikal, sementara MANCOVA menambahkan kontrol terhadap variabel kovariat yang memengaruhi hasil analisis, sehingga menghasilkan pemahaman yang lebih menyeluruh [3].
Penelitian ini menggunakan dataset Customer Personality Analysis yang diperoleh dari situs Kaggle yang memuat informasi sosial demografis dan data pengeluaran konsumen pada enam kategori produk, seperti anggur, buah-buahan, ikan, makanan manis, emas, dan daging. Variabel independen yang dianalisis mencakup tingkat pendidikan pelanggan (Education), kelompok umur (Age Group), dan status pernikahan pelanggan (Marital_Status), sedangkan variabel dependen berupa total pengeluaran pada masing-masing kategori produk tersebut. Untuk meningkatkan akurasi hasil analisis, juga digunakan variabel kovariat yang terdiri dari pendapatan tahunan pelanggan (Income), jumlah anak kecil dalam rumah tangga (Kidhome), jumlah remaja dalam rumah tangga (Teenhome), jumlah hari sejak pembelian terakhir (Recency). Dengan menerapkan pendekatan MANOVA dan MANCOVA, penelitian ini bertujuan untuk mengevaluasi secara komprehensif pengaruh karakteristik sosial demografis terhadap perilaku konsumsi dan memberikan rekomendasi berbasis data untuk mendukung strategi pemasaran yang lebih adaptif.
Berdasarkan latar belakang tersebut, rumusan masalah dalam penelitian ini adalah sebagai berikut:
Tujuan dari penelitian ini adalah sebagai berikut:
Data yang digunakan dalam analisis ini bersumber dari Kaggle dengan tautan berikut: https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis. Dataset ini dirancang untuk memahami karakteristik pelanggan dan perilaku konsumsi mereka, serta digunakan untuk menganalisis hubungan antara faktor sosial demografis dengan kebiasaan pembelian produk dan respons terhadap promosi.
Untuk keperluan analisis MANOVA dan MANCOVA, Variabel yang digunakan dalam analisis ini dibagi menjadi tiga kelompok utama, yaitu variabel bebas, variabel terikat, dan variabel kovariat.
Variabel Bebas (Independen / Faktor):
Variabel Terikat (Dependen):
Variabel Kovariat:
Load dataset dan pengecekan struktur data
data <- read.table("marketing_campaign.csv", sep = "\t", header = TRUE, stringsAsFactors = FALSE)
str(data)
## 'data.frame': 2240 obs. of 29 variables:
## $ ID : int 5524 2174 4141 6182 5324 7446 965 6177 4855 5899 ...
## $ Year_Birth : int 1957 1954 1965 1984 1981 1967 1971 1985 1974 1950 ...
## $ Education : chr "Graduation" "Graduation" "Graduation" "Graduation" ...
## $ Marital_Status : chr "Single" "Single" "Together" "Together" ...
## $ Income : int 58138 46344 71613 26646 58293 62513 55635 33454 30351 5648 ...
## $ Kidhome : int 0 1 0 1 1 0 0 1 1 1 ...
## $ Teenhome : int 0 1 0 0 0 1 1 0 0 1 ...
## $ Dt_Customer : chr "04-09-2012" "08-03-2014" "21-08-2013" "10-02-2014" ...
## $ Recency : int 58 38 26 26 94 16 34 32 19 68 ...
## $ MntWines : int 635 11 426 11 173 520 235 76 14 28 ...
## $ MntFruits : int 88 1 49 4 43 42 65 10 0 0 ...
## $ MntMeatProducts : int 546 6 127 20 118 98 164 56 24 6 ...
## $ MntFishProducts : int 172 2 111 10 46 0 50 3 3 1 ...
## $ MntSweetProducts : int 88 1 21 3 27 42 49 1 3 1 ...
## $ MntGoldProds : int 88 6 42 5 15 14 27 23 2 13 ...
## $ NumDealsPurchases : int 3 2 1 2 5 2 4 2 1 1 ...
## $ NumWebPurchases : int 8 1 8 2 5 6 7 4 3 1 ...
## $ NumCatalogPurchases: int 10 1 2 0 3 4 3 0 0 0 ...
## $ NumStorePurchases : int 4 2 10 4 6 10 7 4 2 0 ...
## $ NumWebVisitsMonth : int 7 5 4 6 5 6 6 8 9 20 ...
## $ AcceptedCmp3 : int 0 0 0 0 0 0 0 0 0 1 ...
## $ AcceptedCmp4 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp5 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp1 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp2 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Complain : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Z_CostContact : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Z_Revenue : int 11 11 11 11 11 11 11 11 11 11 ...
## $ Response : int 1 0 0 0 0 0 0 0 1 0 ...
Cek jumlah missing values per kolom
colSums(is.na(data))
## ID Year_Birth Education Marital_Status
## 0 0 0 0
## Income Kidhome Teenhome Dt_Customer
## 24 0 0 0
## Recency MntWines MntFruits MntMeatProducts
## 0 0 0 0
## MntFishProducts MntSweetProducts MntGoldProds NumDealsPurchases
## 0 0 0 0
## NumWebPurchases NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## 0 0 0 0
## AcceptedCmp3 AcceptedCmp4 AcceptedCmp5 AcceptedCmp1
## 0 0 0 0
## AcceptedCmp2 Complain Z_CostContact Z_Revenue
## 0 0 0 0
## Response
## 0
Handling missing value imputasi dengan nilai median
data$Income[is.na(data$Income)] <- median(data$Income, na.rm = TRUE)
Cek kolom bertipe karakter (diasumsikan kategorikal)
cat_cols <- names(data)[sapply(data, is.character)]
Konversi ke faktor (label encoding)
for (col in cat_cols) {
data[[col]] <- as.factor(data[[col]])
}
Ubah kolom tanggal ke tipe Date dengan format yang sesuai (dd-mm-yyyy)
data$Dt_Customer <- as.Date(data$Dt_Customer, format = "%d-%m-%Y")
Buat kolom umur dari Year_Birth
data$Age <- 2025 - data$Year_Birth
Buat kategori umur AgeGroup
data$AgeGroup <- cut(data$Age,
breaks = c(0, 20, 40, 60, 150),
labels = c("<20", "20-39", "40-59", "60+"),
right = FALSE)
data$AgeGroup <- as.factor(data$AgeGroup)
Masukkan AgeGroup ke dataframe df
data <- data.frame(
Education = data$Education,
Marital_Status = data$Marital_Status,
MntWines = data$MntWines,
MntFruits = data$MntFruits,
MntMeatProducts = data$MntMeatProducts,
MntFishProducts = data$MntFishProducts,
MntSweetProducts = data$MntSweetProducts,
MntGoldProds = data$MntGoldProds,
Income = data$Income,
Kidhome = data$Kidhome,
Teenhome = data$Teenhome,
AgeGroup = data$AgeGroup
)
str(data)
## 'data.frame': 2240 obs. of 12 variables:
## $ Education : Factor w/ 5 levels "2n Cycle","Basic",..: 3 3 3 3 5 4 3 5 5 5 ...
## $ Marital_Status : Factor w/ 8 levels "Absurd","Alone",..: 5 5 6 6 4 6 3 4 6 6 ...
## $ MntWines : int 635 11 426 11 173 520 235 76 14 28 ...
## $ MntFruits : int 88 1 49 4 43 42 65 10 0 0 ...
## $ MntMeatProducts : int 546 6 127 20 118 98 164 56 24 6 ...
## $ MntFishProducts : int 172 2 111 10 46 0 50 3 3 1 ...
## $ MntSweetProducts: int 88 1 21 3 27 42 49 1 3 1 ...
## $ MntGoldProds : int 88 6 42 5 15 14 27 23 2 13 ...
## $ Income : num 58138 46344 71613 26646 58293 ...
## $ Kidhome : int 0 1 0 1 1 0 0 1 1 1 ...
## $ Teenhome : int 0 1 0 0 0 1 1 0 0 1 ...
## $ AgeGroup : Factor w/ 4 levels "<20","20-39",..: 4 4 4 3 3 3 3 3 3 4 ...
summary(data)
## Education Marital_Status MntWines MntFruits
## 2n Cycle : 203 Married :864 Min. : 0.00 Min. : 0.0
## Basic : 54 Together:580 1st Qu.: 23.75 1st Qu.: 1.0
## Graduation:1127 Single :480 Median : 173.50 Median : 8.0
## Master : 370 Divorced:232 Mean : 303.94 Mean : 26.3
## PhD : 486 Widow : 77 3rd Qu.: 504.25 3rd Qu.: 33.0
## Alone : 3 Max. :1493.00 Max. :199.0
## (Other) : 4
## MntMeatProducts MntFishProducts MntSweetProducts MntGoldProds
## Min. : 0.0 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 16.0 1st Qu.: 3.00 1st Qu.: 1.00 1st Qu.: 9.00
## Median : 67.0 Median : 12.00 Median : 8.00 Median : 24.00
## Mean : 166.9 Mean : 37.53 Mean : 27.06 Mean : 44.02
## 3rd Qu.: 232.0 3rd Qu.: 50.00 3rd Qu.: 33.00 3rd Qu.: 56.00
## Max. :1725.0 Max. :259.00 Max. :263.00 Max. :362.00
##
## Income Kidhome Teenhome AgeGroup
## Min. : 1730 Min. :0.0000 Min. :0.0000 <20 : 0
## 1st Qu.: 35539 1st Qu.:0.0000 1st Qu.:0.0000 20-39: 189
## Median : 51382 Median :0.0000 Median :0.0000 40-59:1191
## Mean : 52238 Mean :0.4442 Mean :0.5062 60+ : 860
## 3rd Qu.: 68290 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :666666 Max. :2.0000 Max. :2.0000
##
library(psych)
describe(data[, c("Income", "Kidhome", "Teenhome",
"MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")])
## vars n mean sd median trimmed mad min
## Income 1 2240 52237.98 25037.96 51381.5 51758.12 24327.98 1730
## Kidhome 2 2240 0.44 0.54 0.0 0.40 0.00 0
## Teenhome 3 2240 0.51 0.54 0.0 0.48 0.00 0
## MntWines 4 2240 303.94 336.60 173.5 248.99 243.89 0
## MntFruits 5 2240 26.30 39.77 8.0 16.98 11.86 0
## MntMeatProducts 6 2240 166.95 225.72 67.0 119.33 87.47 0
## MntFishProducts 7 2240 37.53 54.63 12.0 25.08 17.79 0
## MntSweetProducts 8 2240 27.06 41.28 8.0 17.35 11.86 0
## MntGoldProds 9 2240 44.02 52.17 24.0 33.41 26.69 0
## max range skew kurtosis se
## Income 666666 664936 6.79 160.89 529.02
## Kidhome 2 2 0.63 -0.78 0.01
## Teenhome 2 2 0.41 -0.99 0.01
## MntWines 1493 1493 1.17 0.59 7.11
## MntFruits 199 199 2.10 4.03 0.84
## MntMeatProducts 1725 1725 2.08 5.49 4.77
## MntFishProducts 259 259 1.92 3.08 1.15
## MntSweetProducts 263 263 2.13 4.36 0.87
## MntGoldProds 362 362 1.88 3.54 1.10
Histogram untuk kolom numerik
par(mfrow = c(2, 4)) # Tampilkan 6 histogram dalam grid 2x3
hist(data$MntWines, main = "Histogram of MntWines", xlab = "MntWines", col = "skyblue", border = "white")
hist(data$MntMeatProducts, main = "Histogram of MntMeatProducts", xlab = "MntMeatProducts", col = "orange", border = "white")
hist(data$MntSweetProducts, main = "Histogram of MntSweetProducts", xlab = "MntSweetProducts", col = "red", border = "white")
hist(data$MntGoldProds, main = "Histogram of MntGoldProds", xlab = "MntGoldProds", col = "cyan", border = "white")
hist(data$MntFruits, main = "Histogram of MntFruits", xlab = "MntFruits", col = "green", border = "white")
hist(data$MntFishProducts, main = "Histogram of MntFishProducts", xlab = "MntFishProducts", col = "purple", border = "white")
hist(data$Income, main = "Histogram of Income", xlab = "Income", col = "pink", border = "white")
Boxplot untuk kolom numerik
library(ggplot2)
library(reshape2)
# install.packages("reshape2")
# install.packages("ggplot2")
library(reshape2)
library(ggplot2)
# Ambil hanya kolom numerik
numerik_cols <- data[, c("Income", "Kidhome", "Teenhome",
"MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")]
melted <- melt(numerik_cols)
ggplot(melted, aes(x = variable, y = value, fill = variable)) +
geom_boxplot() +
scale_y_log10() +
labs(title = "Boxplot of Numerical Features (Log Scale)",
x = "Variable", y = "Log(Value)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Pilih fitur numerik yang relevan untuk deteksi outlier
numeric_cols <- c("Income", "Kidhome", "Teenhome",
"MntWines", "MntFruits", "MntMeatProducts", "MntFishProducts",
"MntSweetProducts", "MntGoldProds")
Fungsi deteksi outlier berbasis IQR
detect_outliers <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower <- Q1 - 1.5 * IQR
upper <- Q3 + 1.5 * IQR
which(x < lower | x > upper)
}
Deteksi outlier untuk setiap kolom numerik
outlier_indices <- lapply(data[numeric_cols], detect_outliers)
Hitung jumlah outlier per fitur
outlier_count <- sapply(outlier_indices, length)
print(outlier_count)
## Income Kidhome Teenhome MntWines
## 8 0 0 35
## MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## 227 175 223 248
## MntGoldProds
## 207
Fungsi log transform dengan penyesuaian nilai ≤ 0
log_transform_safe <- function(x) {
min_val <- min(x, na.rm = TRUE)
if (min_val <= 0) {
# Tambahkan nilai absolut minimum + 1 supaya semua nilai > 0
x <- x + abs(min_val) + 1
}
log(x)
}
data_log_transformed <- data
for (col in numeric_cols) {
data_log_transformed[[col]] <- log_transform_safe(data[[col]])
}
Cek distribusi atau outlier setelah log transform
outlier_indices_log <- lapply(data_log_transformed[numeric_cols], detect_outliers)
outlier_count_log <- sapply(outlier_indices_log, length)
print("Jumlah outlier setelah log transform:")
## [1] "Jumlah outlier setelah log transform:"
print(outlier_count_log)
## Income Kidhome Teenhome MntWines
## 40 0 0 0
## MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## 0 0 0 0
## MntGoldProds
## 0
Definisikan num_vars terlebih dahulu
num_vars <- c("Income", "Kidhome", "Teenhome",
"MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")
Lakukan uji normalitas
normality_results_log <- sapply(data_log_transformed[num_vars], function(x) {
if (length(x) >= 3 && length(unique(x)) > 2) {
if (length(x) > 5000) {
x <- sample(x, 5000)
}
return(shapiro.test(x)$p.value)
} else {
return(NA)
}
})
print(normality_results_log)
## Income Kidhome Teenhome MntWines
## 2.015689e-32 1.231115e-54 7.382212e-54 5.377087e-31
## MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## 2.196041e-28 2.731461e-21 4.420650e-28 5.110524e-29
## MntGoldProds
## 1.175310e-16
Uji normalitas dilakukan terhadap seluruh variabel dependen dalam analisis MANOVA dan MANCOVA. Karena sebagian besar data bersifat skewed, transformasi logaritmik diterapkan terlebih dahulu. Namun, hasil uji menunjukkan bahwa semua variabel tetap memiliki nilai p jauh di bawah 0,05, menandakan data tidak terdistribusi normal secara statistik. Oleh karena itu, interpretasi hasil dilakukan dengan kehati-hatian, serta mempertimbangkan pendekatan alternatif yang lebih robust bila diperlukan.
# install.packages("biotools")
library(biotools)
dependent_vars <- c("MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")
Pastikan variabel grouping adalah faktor
data_log_transformed$Education <- as.factor(data_log_transformed$Education)
Buat matriks dependen
dependent_matrix <- data_log_transformed[, dependent_vars]
Jalankan Box’s M Test
boxM_result <- boxM(dependent_matrix, data_log_transformed$Education)
print(boxM_result)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: dependent_matrix
## Chi-Sq (approx.) = 339.72, df = 84, p-value < 2.2e-16
Box’s M Test dilakukan untuk menguji kesamaan matriks kovarians antar kelompok. Hasil uji menunjukkan nilai Chi-Square = 339,72, df = 84, dan p-value < 2.2e-16. Nilai p yang sangat kecil ini mengindikasikan bahwa asumsi homogenitas tidak terpenuhi.
# install.packages("corrplot")
library(corrplot)
Ambil variabel dependen perilaku konsumsi
dv_vars <- c("MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")
Gunakan data hasil log transform untuk konsistensi
dv_data <- data_log_transformed[, dv_vars]
Hitung korelasi Pearson
cor_matrix <- cor(dv_data)
Tampilkan matriks korelasi
print(cor_matrix)
## MntWines MntFruits MntMeatProducts MntFishProducts
## MntWines 1.0000000 0.5027674 0.8264097 0.4956897
## MntFruits 0.5027674 1.0000000 0.7045287 0.6936561
## MntMeatProducts 0.8264097 0.7045287 1.0000000 0.7049351
## MntFishProducts 0.4956897 0.6936561 0.7049351 1.0000000
## MntSweetProducts 0.4902359 0.6866388 0.6856924 0.6897318
## MntGoldProds 0.5567173 0.5515802 0.6080135 0.5412240
## MntSweetProducts MntGoldProds
## MntWines 0.4902359 0.5567173
## MntFruits 0.6866388 0.5515802
## MntMeatProducts 0.6856924 0.6080135
## MntFishProducts 0.6897318 0.5412240
## MntSweetProducts 1.0000000 0.5240729
## MntGoldProds 0.5240729 1.0000000
Visualisasi korelasi
corrplot(cor_matrix, method = "color", type = "upper",
tl.cex = 0.8, number.cex = 0.7, addCoef.col = "black",
diag = FALSE)
Analisis korelasi menunjukkan bahwa seluruh variabel dependen berkorelasi positif satu sama lain, dengan koefisien antara 0,49 hingga 0,83. Korelasi tertinggi ditemukan antara MntWines dan MntMeatProducts (r = 0,83), sedangkan terendah antara MntWines dan MntSweetProducts (r = 0,49). Hasil ini memenuhi asumsi MANOVA/MANCOVA bahwa variabel dependen harus memiliki korelasi sedang hingga tinggi.
Kovariat
covariates <- c("Income", "Kidhome", "Teenhome")
Variabel dependen
dv_vars <- c("MntWines", "MntFruits", "MntMeatProducts",
"MntFishProducts", "MntSweetProducts", "MntGoldProds")
Data yang digunakan
cor_data <- data_log_transformed[, c(covariates, dv_vars)]
Korelasi Pearson
cor_matrix_cov_dv <- cor(cor_data)
Ambil bagian kovariat vs dependen
cor_matrix_cov_dv[covariates, dv_vars]
## MntWines MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## Income 0.7827610 0.4730737 0.7170735 0.4572887 0.4593276
## Kidhome -0.5640790 -0.4455195 -0.5434948 -0.4393250 -0.4359372
## Teenhome 0.1649012 -0.2032533 -0.1222880 -0.2326663 -0.1985208
## MntGoldProds
## Income 0.4073237
## Kidhome -0.4072604
## Teenhome -0.0223326
Uji linearitas bertujuan memastikan adanya hubungan linier antara kovariat (Income, Kidhome, Teenhome) dan variabel dependen. Hasil korelasi menunjukkan bahwa sebagian besar kovariat memiliki korelasi signifikan, terutama Income yang berkorelasi positif sedang hingga tinggi terhadap seluruh variabel dependen. Hal ini menunjukkan terpenuhinya asumsi linearitas untuk analisis MANCOVA.
# install.packages("car")
library(car)
Ambil bagian kovariat vs dependen
cor_matrix_cov_dv[covariates, dv_vars]
## MntWines MntFruits MntMeatProducts MntFishProducts MntSweetProducts
## Income 0.7827610 0.4730737 0.7170735 0.4572887 0.4593276
## Kidhome -0.5640790 -0.4455195 -0.5434948 -0.4393250 -0.4359372
## Teenhome 0.1649012 -0.2032533 -0.1222880 -0.2326663 -0.1985208
## MntGoldProds
## Income 0.4073237
## Kidhome -0.4072604
## Teenhome -0.0223326
vif_model <- lm(Income ~ Kidhome + Teenhome, data = data_log_transformed)
vif(vif_model)
## Kidhome Teenhome
## 1.001905 1.001905
Multikolinearitas diuji dengan menghitung Variance Inflation Factor (VIF) untuk kovariat. Nilai VIF untuk Kidhome dan Teenhome masing-masing adalah 1.002 dan 1.002, yang menunjukkan tidak adanya multikolinearitas. Oleh karena itu, ketiga kovariat dapat digunakan bersama-sama dalam MANCOVA.
# install.packages("car")
library(car)
Variabel dependen
dv_vars <- c("MntWines", "MntFruits", "MntMeatProducts", "MntFishProducts", "MntSweetProducts", "MntGoldProds")
Model MANOVA
manova_model <- manova(cbind(MntWines, MntFruits, MntMeatProducts,
MntFishProducts, MntSweetProducts, MntGoldProds) ~
Education + Marital_Status + AgeGroup,
data = data_log_transformed)
Uji multivariat dengan Pillai’s Trace
summary(manova_model, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Education 4 0.34574 35.070 24 8896 < 2e-16 ***
## Marital_Status 7 0.02630 1.400 42 13356 0.04457 *
## AgeGroup 2 0.07185 13.801 12 4444 < 2e-16 ***
## Residuals 2226
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi hasil
Model MANCOVA
mancova_model <- manova(cbind(MntWines, MntFruits, MntMeatProducts,
MntFishProducts, MntSweetProducts, MntGoldProds) ~
Education + Marital_Status + AgeGroup +
Income + Kidhome + Teenhome,
data = data_log_transformed)
Ringkasan hasil MANCOVA dengan uji Pillai’s Trace
summary(mancova_model, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Education 4 0.46444 48.63 24 8884 < 2.2e-16 ***
## Marital_Status 7 0.03398 1.81 42 13338 0.001058 **
## AgeGroup 2 0.13195 26.12 12 4438 < 2.2e-16 ***
## Income 1 0.63704 648.81 6 2218 < 2.2e-16 ***
## Kidhome 1 0.19248 88.12 6 2218 < 2.2e-16 ***
## Teenhome 1 0.21435 100.86 6 2218 < 2.2e-16 ***
## Residuals 2223
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi hasil
library(candisc)
# Education
cda_edu <- candisc(manova_model, term = "Education")
# Marital Status
cda_mstat <- candisc(manova_model, term = "Marital_Status")
# Age Group
cda_AgeGroup <- candisc(manova_model, term = "AgeGroup")
Visualisasi CDA: Education
plot(cda_edu,
main = "Canonical Discriminant Analysis - Education",
col = c("red", "blue", "green", "purple", "orange"),
pch = 19)
## Vector scale factor set to 2.298
Visualisasi ini menggambarkan hasil Canonical Discriminant Analysis (CDA) berdasarkan tingkat pendidikan dan paling informatif karena komponen kanonik pertama (Can1) sebesar 91,2% terhadap total variasi tertinggi dibandingkan dengan plot lainnya. Pemisahan antar kelompok pendidikan, seperti PhD, Master, dan 2nCycle cukup jelas yang menandakan bahwa tingkat pendidikan memiliki daya diskriminasi yang kuat terhadap pola konsumsi produk. Arah vektor produk, seperti MintMeatProducts, MintSweetProducts, dan MintWines menunjukkan adanya keterkaitan dengan kelompok pendidikan tertentu yang mengindikasikan bahwa individu dengan latar belakang pendidikan yang berbeda cenderung memiliki preferensi konsumsi yang berbeda.
Visualisasi CDA: Marital Status
plot(cda_mstat,
main = "Canonical Discriminant Analysis - Marital Status",
col = c("red", "blue", "green"),
pch = 19)
## Vector scale factor set to 12.068
Plot ini merepresentasikan hasil Canonical Discriminant Analysis (CDA) berdasarkan status pernikahan, komponen kanonik pertama (Can1) berkontribusi sebesar 54,8% terhadap total variasi, sementara kanonik kedua (Can2) sebesar 20%, sehingga dua komponen ini memberikan gambaran yang cukup signifikan terhadap struktur data antar kelompok. Namun, distribusi kelompok, seperti Married, Together, dan Alone menunjukkan adanya tumpang tindih yang besar yang mengindikasikan bahwa status pernikahan bukan faktor yang kuat dalam membedakan pola konsumsi antar kelompok. Beberapa vektor produk, seperti MintWines dan MintGoldProds masih menunjukkan arah kontribusi tertentu yang dapat diinterpretasikan bahwa terdapat kecenderungan preferensi terhadap produk-produk tersebut pada kelompok tertentu, meskipun pengaruhnya tidak sebesar tingkat pendidikan.
Visualisasi CDA: Age Group
plot(cda_AgeGroup,
main = "Canonical Discriminant Analysis - Age Group",
col = c("red", "blue", "green", "purple"),
pch = 19)
## Vector scale factor set to 2.899
Plot ini menunjukkan hasil pemetaan konsumen berdasarkan kategori kelompok umur menggunakan Canonical Discriminant Analysis (CDA). Komponen kanonik pertama (Can1) mempresentasikan 84,3% variasi, sedangkan komponen kedua (Can2) 15,7%. Dengan demikian, dua komponen ini secara kumulatif mempresentasikan hampir seluruh informasi utama yang relevan dalam data. Meskipun demikian, penyebaran individu berdasarkan kelompok umur saling tumpang tindih, mengindikasikan bahwa usia bukan faktor diskriminatif yang kuat dalam membedakan pola konsumsi antar kelompok. Namun, terdapat kecenderungan preferensi terhadap produk-produk tertentu, seperti MintWines, MintGoldProds, dan MintSweetProducts yang menunjukkan kontribusi arah yang kuat pada sisi negatif Can1. Hal ini menunjukkan bahwa kelompok umur tertentu lebih menyukai jenis produk tersebut.
summary.aov(manova_model)
## Response MntWines :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 909.3 227.330 83.033 <2e-16 ***
## Marital_Status 7 24.3 3.477 1.270 0.2612
## AgeGroup 2 259.7 129.825 47.419 <2e-16 ***
## Residuals 2226 6094.4 2.738
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntFruits :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 167.1 41.776 17.5807 3.243e-14 ***
## Marital_Status 7 19.9 2.848 1.1985 0.3
## AgeGroup 2 45.4 22.675 9.5425 7.472e-05 ***
## Residuals 2226 5289.5 2.376
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntMeatProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 250.3 62.566 27.2306 < 2.2e-16 ***
## Marital_Status 7 16.0 2.283 0.9937 0.4338
## AgeGroup 2 76.3 38.129 16.5951 7.015e-08 ***
## Residuals 2226 5114.5 2.298
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntFishProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 214.1 53.532 20.3845 < 2.2e-16 ***
## Marital_Status 7 34.1 4.877 1.8571 0.07268 .
## AgeGroup 2 56.0 27.982 10.6554 2.48e-05 ***
## Residuals 2226 5845.7 2.626
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntSweetProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 190.8 47.707 19.5386 8.098e-16 ***
## Marital_Status 7 5.1 0.728 0.2983 0.9547
## AgeGroup 2 59.0 29.495 12.0797 6.055e-06 ***
## Residuals 2226 5435.2 2.442
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntGoldProds :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 119.5 29.8826 18.8433 3.002e-15 ***
## Marital_Status 7 30.6 4.3708 2.7561 0.007493 **
## AgeGroup 2 35.4 17.7159 11.1713 1.488e-05 ***
## Residuals 2226 3530.1 1.5858
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil Analisis ANOVA Univariat terhadap Variabel Dependen pada MANOVA
Setelah diperoleh hasil MANOVA yang signifikan secara simultan, dilakukan analisis lebih lanjut menggunakan ANOVA univariat untuk mengevaluasi pengaruh masing-masing variabel independen terhadap tiap variabel dependen secara terpisah.
summary.aov(mancova_model)
## Response MntWines :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 909.3 227.3 223.3548 < 2.2e-16 ***
## Marital_Status 7 24.3 3.5 3.4164 0.001229 **
## AgeGroup 2 259.7 129.8 127.5553 < 2.2e-16 ***
## Income 1 3434.9 3434.9 3374.8694 < 2.2e-16 ***
## Kidhome 1 374.0 374.0 367.4190 < 2.2e-16 ***
## Teenhome 1 23.0 23.0 22.5689 2.157e-06 ***
## Residuals 2223 2262.6 1.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntFruits :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 167.1 41.78 28.179 < 2.2e-16 ***
## Marital_Status 7 19.9 2.85 1.921 0.06249 .
## AgeGroup 2 45.4 22.68 15.295 2.528e-07 ***
## Income 1 1404.6 1404.60 947.435 < 2.2e-16 ***
## Kidhome 1 338.7 338.67 228.443 < 2.2e-16 ***
## Teenhome 1 250.6 250.61 169.042 < 2.2e-16 ***
## Residuals 2223 3295.7 1.48
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntMeatProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 250.26 62.57 67.0908 < 2e-16 ***
## Marital_Status 7 15.98 2.28 2.4484 0.01681 *
## AgeGroup 2 76.26 38.13 40.8872 < 2e-16 ***
## Income 1 2536.32 2536.32 2719.7675 < 2e-16 ***
## Kidhome 1 323.52 323.52 346.9153 < 2e-16 ***
## Teenhome 1 181.61 181.61 194.7454 < 2e-16 ***
## Residuals 2223 2073.06 0.93
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntFishProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 214.1 53.53 32.6148 < 2.2e-16 ***
## Marital_Status 7 34.1 4.88 2.9713 0.004198 **
## AgeGroup 2 56.0 27.98 17.0485 4.489e-08 ***
## Income 1 1461.9 1461.86 890.6573 < 2.2e-16 ***
## Kidhome 1 375.1 375.08 228.5236 < 2.2e-16 ***
## Teenhome 1 360.1 360.07 219.3748 < 2.2e-16 ***
## Residuals 2223 3648.7 1.64
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntSweetProducts :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 190.8 47.71 30.5233 < 2.2e-16 ***
## Marital_Status 7 5.1 0.73 0.4659 0.8597
## AgeGroup 2 59.0 29.49 18.8709 7.469e-09 ***
## Income 1 1391.8 1391.80 890.4826 < 2.2e-16 ***
## Kidhome 1 346.2 346.16 221.4726 < 2.2e-16 ***
## Teenhome 1 222.7 222.74 142.5079 < 2.2e-16 ***
## Residuals 2223 3474.5 1.56
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response MntGoldProds :
## Df Sum Sq Mean Sq F value Pr(>F)
## Education 4 119.53 29.88 25.0147 < 2.2e-16 ***
## Marital_Status 7 30.60 4.37 3.6588 0.0006201 ***
## AgeGroup 2 35.43 17.72 14.8300 4e-07 ***
## Income 1 667.65 667.65 558.8900 < 2.2e-16 ***
## Kidhome 1 203.43 203.43 170.2872 < 2.2e-16 ***
## Teenhome 1 3.42 3.42 2.8646 0.0906882 .
## Residuals 2223 2655.60 1.19
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil Analisis ANOVA Univariat terhadap Variabel Dependen pada MANCOVA
Berdasarkan hasil MANCOVA dan analisis ANOVA univariat terhadap enam variabel dependen pengeluaran produk serta enam variabel independen (Education, Marital_Status, AgeGroup, Income, Kidhome, Teenhome, diperoleh beberapa temuan penting.
# install.packages("effectsize")
library(effectsize)
eta_squared_results <- eta_squared(mancova_model, partial = TRUE)
print(eta_squared_results)
## # Effect Size for ANOVA (Type I)
##
## Parameter | Eta2 (partial) | 95% CI
## ----------------------------------------------
## Education | 0.12 | [0.10, 1.00]
## Marital_Status | 5.66e-03 | [0.00, 1.00]
## AgeGroup | 0.07 | [0.05, 1.00]
## Income | 0.64 | [0.62, 1.00]
## Kidhome | 0.19 | [0.17, 1.00]
## Teenhome | 0.21 | [0.19, 1.00]
##
## - One-sided CIs: upper bound fixed at [1.00].
Hasil Perhitungan Ukuran Efek
Analisis MANCOVA yang dilanjutkan dengan perhitungan ukuran efek menggunakan partial eta squared menunjukkan bahwa variabel Income (Pendapatan) memberikan kontribusi paling besar terhadap variasi pengeluaran konsumen pada enam kategori produk (MntWines, MntFruits, MntMeatProducts, MntFishProducts, MntSweetProducts, dan MntGoldProds), dengan nilai η² = 0,64. Hal ini mengindikasikan bahwa setelah dikendalikan oleh variabel lain dalam model, pendapatan menjelaskan sekitar 64% dari variabilitas total pada variabel dependen, yang termasuk dalam kategori efek besar. Selain itu, variabel Teenhome (jumlah remaja di rumah) dan Kidhome (jumlah anak di rumah) juga menunjukkan efek yang cukup berarti dengan nilai η² masing-masing sebesar 0,21 dan 0,19, yang termasuk dalam kategori efek sedang. Hasil ini mengindikasikan bahwa keberadaan anak dan remaja di rumah berpengaruh terhadap pola konsumsi rumah tangga. Variabel Education (pendidikan) juga menunjukkan efek sedang (η² = 0,12), sementara AgeGroup memberikan efek kecil hingga sedang (η² = 0,07). Sebaliknya, variabel Marital_Status (status pernikahan) menunjukkan kontribusi yang sangat kecil dengan η² = 0,0057, yang mengindikasikan bahwa status pernikahan tidak memiliki pengaruh yang berarti terhadap perilaku pengeluaran konsumen dalam model ini. Secara keseluruhan, hasil ini menegaskan bahwa karakteristik sosial-demografis tertentu, khususnya pendapatan dan komposisi anggota keluarga, memiliki peran penting dalam memengaruhi perilaku konsumsi konsumen, sementara faktor lainnya memiliki pengaruh yang lebih terbatas.
Penelitian ini menganalisis pengaruh karakteristik sosial demografis terhadap perilaku konsumsi konsumen dengan pendekatan statistik multivariat menggunakan MANOVA dan MANCOVA. Hasil penelitian menunjukkan bahwa:
[1] MUSNAINI, “Pengaruh Personal Dan Interpersonal Motivations–Terhadap Niat Konsumen Non-Deceptive Pada Produk Merek Mewah Palsu Di Surabaya.” Accessed: May 08, 2025. [Online]. Available: https://repository.unja.ac.id/48438/3/100 Laporan kemajuan HIBAH DOKTORAL .pdf
[2] C. J. Huberty and J. D. Morris, “Multivariate Analysis Versus Multiple Univariate Analyses,” Psychol Bull, vol. 105, no. 2, pp. 302–308, 1989, doi: 10.1037/0033-2909.105.2.302.
[3] S. Sutrisno and D. Wulandari, “Multivariate Analysis of Variance (MANOVA) untuk Memperkaya Hasil Penelitian Pendidikan,” AKSIOMA J. Mat. dan Pendidik. Mat., vol. 9, no. 1, p. 37, Jul. 2018, doi: 10.26877/AKS.V9I1.2472