library(MASS)
library(mvtnorm)
library(ggplot2)
library(caret)
library(dplyr)
Seberapa Penting Asumsi dalam Analisis Diskriminan?
Analisis diskriminan (LDA) sering digunakan untuk mengelompokkan data ke dalam dua atau lebih kelas. Tapi, apakah kita selalu yakin bahwa data kita memenuhi syarat untuk digunakan dalam LDA? Dalam tulisan ini, saya ingin membandingkan bagaimana performa LDA ketika dua asumsi pentingnya normalitas dan homogenitas kovarian dipenuhi atau dilanggar.
Kedua asumsi ini sangat penting karena fungsi diskriminan yang dibentuk LDA berasal dari rumus probabilitas distribusi normal multivariat dengan kovarian yang seragam. Jika tidak terpenuhi, maka fungsi pemisah bisa jadi tidak representatif terhadap data sebenarnya.
Sejumlah referensi akademik yang dapat menguatkan hal ini:
Hair et al. (2010) menyatakan bahwa “LDA requires the assumption that the independent variables are multivariate normally distributed within each group and that the variance-covariance matrices of each group are equal.” – Multivariate Data Analysis, 7th ed., Pearson.
James et al. (2021) dalam buku ISLR menjelaskan bahwa “LDA assumes that the predictors X are normally distributed within each of the classes, and that they share a common covariance matrix.” – An Introduction to Statistical Learning, 2nd ed., Springer.
Rencher (2002) juga menekankan bahwa “It is assumed that the data within each population follow a multivariate normal distribution and have equal covariance matrices.” – Methods of Multivariate Analysis, Wiley.
Jadi, meskipun LDA tergolong metode sederhana dan interpretatif, penggunaannya tetap membutuhkan kehati-hatian dalam memeriksa asumsi.
Karena dalam praktik kita jarang tahu apakah data betul-betul memenuhi asumsi normalitas dan homogenitas kovarian, saya mencoba menyimulasikan beberapa skenario berbeda. Tujuannya adalah untuk menguji bagaimana performa LDA berubah ketika salah satu atau kedua asumsi tersebut dilanggar.
Kasus | Asumsi Normalitas | Varians-Kovarian sama? | Catatan |
---|---|---|---|
1 | Ya | Ya | kondisi ideal |
2 | Tidak | Ya | Data tidak normal |
3 | Ya | Tidak | Varians antar kelas berbeda |
4 | Tidak | Tidak | Semua asumsi dilanggar |
Teknis Simulasi
Kasus 1 & 3: Saya menggunakan distribusi normal multivariat (
mvtnorm::rmvnorm()
).Kasus 2 & 4: saya gunakan distribusi
uniform()
untuk menyalahi asumsi normalitasUntuk melanggar asumsi homogenitas varians (kasus 3 & 4), saya buat matrik kovarian yang berbeda antar kelompok
Alur simulasi ini dijabarkan pada diagraam alir di bawah
Setelah menentukan alur simulasi, maka selanjutnya menjalankan simulasi pada kode R.
<- function(case) {
generate_data <- 100
n
if (case == 1) {
<- matrix(c(1, 0.5, 0.5, 1), 2)
sigma <- rmvnorm(n, mean=c(2, 2), sigma=sigma)
group1 <- rmvnorm(n, mean=c(0, 0), sigma=sigma)
group2
else if (case == 2) {
} <- cbind(runif(n, 1, 5), runif(n, 1, 5))
group1 <- cbind(runif(n, -1, 3), runif(n, -1, 3))
group2
else if (case == 3) {
} <- matrix(c(1, 0.3, 0.3, 1), 2)
sigma1 <- matrix(c(2, 0.5, 0.5, 2), 2)
sigma2 <- rmvnorm(n, mean=c(2, 2), sigma=sigma1)
group1 <- rmvnorm(n, mean=c(0, 0), sigma=sigma2)
group2
else if (case == 4) {
} <- cbind(runif(n, 1, 5), runif(n, 1, 5))
group1 <- cbind(rexp(n, 1/2), rexp(n, 1/2))
group2
}
<- rbind(group1, group2)
data <- factor(c(rep("A", n), rep("B", n)))
group <- data.frame(X1 = data[,1], X2 = data[,2], Group = group)
df return(df)
}
contoh tampilan dari data yang telah dibangkitkan
head(generate_data(1))
X1 X2 Group
1 3.4257446 2.693945 A
2 0.9698819 1.030588 A
3 2.4748207 1.554914 A
4 2.2736308 2.306999 A
5 1.6433755 1.189025 A
6 2.5279350 2.641366 A
summary(generate_data(1))
X1 X2 Group
Min. :-2.33671 Min. :-2.8157 A:100
1st Qu.:-0.07469 1st Qu.:-0.2272 B:100
Median : 0.73787 Median : 0.9343
Mean : 0.87550 Mean : 0.9251
3rd Qu.: 1.86338 3rd Qu.: 2.0111
Max. : 4.47949 Max. : 4.7543
Sebaran data bangkitan dengan berbagai kasus dapat dilihat di bawah ini
ggplot(generate_data(1), aes(x = X1, y = X2, color = Group)) +
geom_point(alpha = 0.7) +
labs(title = "Visualisasi Sebaran Data (Kasus 1)") +
theme_minimal()
ggplot(generate_data(2), aes(x = X1, y = X2, color = Group)) +
geom_point(alpha = 0.7) +
labs(title = "Visualisasi Sebaran Data (Kasus 2)") +
theme_minimal()
ggplot(generate_data(3), aes(x = X1, y = X2, color = Group)) +
geom_point(alpha = 0.7) +
labs(title = "Visualisasi Sebaran Data (Kasus 3)") +
theme_minimal()
ggplot(generate_data(4), aes(x = X1, y = X2, color = Group)) +
geom_point(alpha = 0.7) +
labs(title = "Visualisasi Sebaran Data (Kasus 4)") +
theme_minimal()
membuat fungsi evaluasi LDA
<- function(df) {
evaluate_lda set.seed(2025)
<- createDataPartition(df$Group, p = 0.7, list = FALSE)
trainIndex <- df[trainIndex, ]
train <- df[-trainIndex, ]
test
<- lda(Group ~ X1 + X2, data = train)
lda_model <- predict(lda_model, test)$class
pred <- mean(pred == test$Group)
acc return(acc)
}
Menjalankan simulasi ke semua kasus
<- data.frame(Kasus = character(), Normalitas = character(), Varians_Homogen = character(), Akurasi = numeric())
results
for (i in 1:4) {
<- generate_data(i)
data_sim <- evaluate_lda(data_sim)
acc
<- ifelse(i %in% c(1,3), "Ya", "Tidak")
normal <- ifelse(i %in% c(1,2), "Ya", "Tidak")
homogen
<- rbind(results, data.frame(
results Kasus = paste("Kasus", i),
Normalitas = normal,
Varians_Homogen = homogen,
Akurasi = round(acc * 100, 2)
))
}
print(results)
Kasus Normalitas Varians_Homogen Akurasi
1 Kasus 1 Ya Ya 88.33
2 Kasus 2 Tidak Ya 83.33
3 Kasus 3 Ya Tidak 78.33
4 Kasus 4 Tidak Tidak 65.00
Dari hasil simulasi, terlihat bahwa akurasi tertinggi muncul ketika dua asumsi terpenuhi. Saat asumsi dilanggar, apalagi keduanya, akurasi turun drastis. Ini bukti pentingnya memeriksa asumsi sebelum menggunakan LDA.
LDA memang teknik yang powerful, tapi tidak cocok untuk semua data. Jika datamu tidak normal atau varians antar grup berbeda jauh, LDA bisa memberi hasil yang menyesatkan.
Alternatifnya? Coba QDA, SVM, atau Random Forest. Tapi yang paling penting: pahami dulu karakteristik datamu sebelum memilih metode.
Referensi
“Hair et al. (2010) - Multivariate Data Analysis”
“James et al. (2021) - ISLR with R”
“Rencher (2002) - Multivariate Analysis”