# Library
library(MASS)
#install.packages("corrplot")
library(corrplot)
## corrplot 0.95 loaded
#install.packages("MVN")
library(MVN)
## Registered S3 method overwritten by 'lme4':
## method from
## na.action.merMod car
#install.packages("biotools")
library(biotools)
## ---
## biotools version 4.3
library(nnet)
# Import dataset
wine <- read.csv("wine.data", header = FALSE)
# Nama kolom
colnames(wine) <- c("Class","Alcohol","Malicacid","Ash","Alcalinity_of_ash", "Magnesium","Total_phenols","Flavanoids","Nonflavanoid_phenols", "Proanthocyanins","Color_intensity","Hue","OD","Proline")
# Cek data
head(wine)
## Class Alcohol Malicacid Ash Alcalinity_of_ash Magnesium Total_phenols
## 1 1 14.23 1.71 2.43 15.6 127 2.80
## 2 1 13.20 1.78 2.14 11.2 100 2.65
## 3 1 13.16 2.36 2.67 18.6 101 2.80
## 4 1 14.37 1.95 2.50 16.8 113 3.85
## 5 1 13.24 2.59 2.87 21.0 118 2.80
## 6 1 14.20 1.76 2.45 15.2 112 3.27
## Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue OD
## 1 3.06 0.28 2.29 5.64 1.04 3.92
## 2 2.76 0.26 1.28 4.38 1.05 3.40
## 3 3.24 0.30 2.81 5.68 1.03 3.17
## 4 3.49 0.24 2.18 7.80 0.86 3.45
## 5 2.69 0.39 1.82 4.32 1.04 2.93
## 6 3.39 0.34 1.97 6.75 1.05 2.85
## Proline
## 1 1065
## 2 1050
## 3 1185
## 4 1480
## 5 735
## 6 1450
# lihat struktur data
str(wine)
## 'data.frame': 178 obs. of 14 variables:
## $ Class : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Alcohol : num 14.2 13.2 13.2 14.4 13.2 ...
## $ Malicacid : num 1.71 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 ...
## $ Ash : num 2.43 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 ...
## $ Alcalinity_of_ash : num 15.6 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 ...
## $ Magnesium : int 127 100 101 113 118 112 96 121 97 98 ...
## $ Total_phenols : num 2.8 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 ...
## $ Flavanoids : num 3.06 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 ...
## $ Nonflavanoid_phenols: num 0.28 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 ...
## $ Proanthocyanins : num 2.29 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 ...
## $ Color_intensity : num 5.64 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 ...
## $ Hue : num 1.04 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 ...
## $ OD : num 3.92 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 ...
## $ Proline : int 1065 1050 1185 1480 735 1450 1290 1295 1045 1045 ...
# cek dimensi
dim(wine)
## [1] 178 14
Dataset Wine terdiri dari 178 observasi (data sampel anggur) dengan 14 variabel. Variabel tersebut mencakup 1 variabel target (Class) yang menunjukkan jenis atau kelas wine, serta 13 variabel fitur kimia seperti kadar alkohol, asam malat, abu, magnesium, total fenol, flavonoid, intensitas warna, hingga prolin.
summary(wine)
## Class Alcohol Malicacid Ash
## Min. :1.000 Min. :11.03 Min. :0.740 Min. :1.360
## 1st Qu.:1.000 1st Qu.:12.36 1st Qu.:1.603 1st Qu.:2.210
## Median :2.000 Median :13.05 Median :1.865 Median :2.360
## Mean :1.938 Mean :13.00 Mean :2.336 Mean :2.367
## 3rd Qu.:3.000 3rd Qu.:13.68 3rd Qu.:3.083 3rd Qu.:2.558
## Max. :3.000 Max. :14.83 Max. :5.800 Max. :3.230
## Alcalinity_of_ash Magnesium Total_phenols Flavanoids
## Min. :10.60 Min. : 70.00 Min. :0.980 Min. :0.340
## 1st Qu.:17.20 1st Qu.: 88.00 1st Qu.:1.742 1st Qu.:1.205
## Median :19.50 Median : 98.00 Median :2.355 Median :2.135
## Mean :19.49 Mean : 99.74 Mean :2.295 Mean :2.029
## 3rd Qu.:21.50 3rd Qu.:107.00 3rd Qu.:2.800 3rd Qu.:2.875
## Max. :30.00 Max. :162.00 Max. :3.880 Max. :5.080
## Nonflavanoid_phenols Proanthocyanins Color_intensity Hue
## Min. :0.1300 Min. :0.410 Min. : 1.280 Min. :0.4800
## 1st Qu.:0.2700 1st Qu.:1.250 1st Qu.: 3.220 1st Qu.:0.7825
## Median :0.3400 Median :1.555 Median : 4.690 Median :0.9650
## Mean :0.3619 Mean :1.591 Mean : 5.058 Mean :0.9574
## 3rd Qu.:0.4375 3rd Qu.:1.950 3rd Qu.: 6.200 3rd Qu.:1.1200
## Max. :0.6600 Max. :3.580 Max. :13.000 Max. :1.7100
## OD Proline
## Min. :1.270 Min. : 278.0
## 1st Qu.:1.938 1st Qu.: 500.5
## Median :2.780 Median : 673.5
## Mean :2.612 Mean : 746.9
## 3rd Qu.:3.170 3rd Qu.: 985.0
## Max. :4.000 Max. :1680.0
Dataset Wine menunjukkan bahwa setiap variabel memiliki rentang nilai yang cukup beragam, terutama pada fitur seperti alcohol, malic acid, magnesium, color intensity, dan proline yang memiliki perbedaan cukup besar antara nilai minimum dan maksimum. Nilai rata-rata beberapa variabel seperti alcohol (13.00) dan total phenols (2.295) berada di tengah distribusi, sementara beberapa fitur seperti nonflavanoid phenols dan hue cenderung memiliki sebaran yang lebih sempit. Secara keseluruhan, variasi yang cukup tinggi pada sebagian besar variabel ini menunjukkan adanya perbedaan karakteristik kimia antar sampel wine, sehingga fitur-fitur tersebut potensial digunakan untuk membedakan kelas wine dalam analisis klasifikasi.
table(wine$Class)
##
## 1 2 3
## 59 71 48
Distribusi kelas relatif cukup seimbang, sehingga tidak ada bias ekstrem antar kelas. Hal ini mendukung penggunaan LDA karena model tidak terlalu terpengaruh oleh imbalance data.
barplot(table(wine$Class),
main = "Distribusi Kelas Wine",
xlab = "Class",
ylab = "Jumlah Data",
col = "lightblue")
Distribusi kelas menunjukkan bahwa kelas 2 sedikit lebih dominan dibanding kelas 1 dan 3, namun perbedaannya tidak terlalu signifikan sehingga data masih relatif seimbang. Kondisi ini membuat dataset tetap layak digunakan untuk analisis klasifikasi multinomial, termasuk metode seperti LDA, karena tidak terjadi ketimpangan kelas yang ekstrem yang dapat memengaruhi performa model.
cor_matrix <- cor(wine[, -1])
corrplot(cor_matrix, method = "color", type = "upper")
Heatmap korelasi menunjukkan hubungan antar fitur pada dataset wine yang cukup beragam, dengan beberapa pasangan variabel memiliki korelasi kuat baik positif maupun negatif. Terlihat bahwa Total_phenols memiliki korelasi positif yang kuat dengan Flavanoids, menandakan bahwa kandungan fenol total cenderung meningkat seiring dengan flavonoid. Sebaliknya, Nonflavanoid_phenols cenderung berkorelasi negatif dengan kedua variabel tersebut, menunjukkan sifat yang berlawanan. Color_intensity memiliki korelasi negatif dengan Hue, yang berarti semakin tinggi intensitas warna, nilai hue cenderung menurun. Selain itu, Proline tampak memiliki korelasi positif dengan beberapa variabel seperti OD dan Flavanoids, mengindikasikan kemungkinan keterkaitan dalam karakteristik kimia wine. Secara keseluruhan, heatmap ini membantu mengidentifikasi fitur-fitur yang saling berhubungan kuat, yang penting untuk analisis lanjutan seperti seleksi fitur atau pemodelan machine learning.
boxplot(wine[, -1],
main = "Boxplot Wine",
las = 2,
col = "lightblue")
Terlihat adanya beberapa outlier pada hampir semua variabel, terutama pada Magnesium, Color_intensity, dan Proline, yang memiliki titik-titik ekstrem cukup jauh dari distribusi utama. Variasi (sebaran) data antar fitur terlihat relatif seragam, namun beberapa fitur seperti Flavanoids dan Total_phenols memiliki rentang interkuartil yang sedikit lebih lebar, menandakan variasi data yang lebih tinggi. Namun, outlier tersebut tidak dilakukan penanganan lebih lanjut karena dianggap sebagai variasi alami dari karakteristik kimia wine, sehingga hanya dilakukan analisis deskriptif tanpa modifikasi data.
colSums(is.na(wine))
## Class Alcohol Malicacid
## 0 0 0
## Ash Alcalinity_of_ash Magnesium
## 0 0 0
## Total_phenols Flavanoids Nonflavanoid_phenols
## 0 0 0
## Proanthocyanins Color_intensity Hue
## 0 0 0
## OD Proline
## 0 0
Hasil pengecekan menunjukkan bahwa tidak terdapat missing value pada seluruh variabel. Oleh karena itu, tidak diperlukan proses imputasi atau penghapusan data.
Transformasi data dilakukan untuk mengurangi efek skewness (kemencengan distribusi) dan mendekatkan distribusi data terhadap normalitas, yang merupakan salah satu asumsi penting dalam metode Linear Discriminant Analysis (LDA). Pada tahap ini digunakan transformasi logaritmik pada seluruh variabel prediktor.
wine_log <- wine
wine_log[, -1] <- log(wine_log[, -1] + 1)
wine_scaled <- wine_log
wine_scaled[, -1] <- scale(wine_scaled[, -1])
Proses standardisasi dilakukan untuk menyamakan skala seluruh variabel numerik agar tidak ada variabel yang mendominasi dalam pembentukan fungsi diskriminan. Hal ini penting karena LDA menggunakan kovarians antar variabel yang sensitif terhadap perbedaan skala.
summary(wine_scaled)
## Class Alcohol Malicacid Ash
## Min. :1.000 Min. :-2.57591 Min. :-1.9415 Min. :-4.23501
## 1st Qu.:1.000 1st Qu.:-0.77214 1st Qu.:-0.6411 1st Qu.:-0.53235
## Median :2.000 Median : 0.08932 Median :-0.3307 Median : 0.01737
## Mean :1.938 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.:3.000 3rd Qu.: 0.83957 3rd Qu.: 0.8131 3rd Qu.: 0.70487
## Max. :3.000 Max. : 2.13753 Max. : 2.4613 Max. : 2.78899
## Alcalinity_of_ash Magnesium Total_phenols Flavanoids
## Min. :-3.33527 Min. :-2.51681 Min. :-2.5267 Min. :-2.0995
## 1st Qu.:-0.63171 1st Qu.:-0.84676 1st Qu.:-0.8499 1st Qu.:-0.7150
## Median : 0.08259 Median :-0.05974 Median : 0.1876 Median : 0.2632
## Mean : 0.00000 Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.64136 3rd Qu.: 0.58336 3rd Qu.: 0.8287 3rd Qu.: 0.8523
## Max. : 2.56494 Max. : 3.62563 Max. : 2.1162 Max. : 2.1045
## Nonflavanoid_phenols Proanthocyanins Color_intensity Hue
## Min. :-2.0240 Min. :-2.62842 Min. :-2.4326 Min. :-2.30559
## 1st Qu.:-0.7290 1st Qu.:-0.52562 1st Qu.:-0.7827 1st Qu.:-0.73334
## Median :-0.1341 Median : 0.04635 Median : 0.0183 Median : 0.09074
## Mean : 0.0000 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.6445 3rd Qu.: 0.69318 3rd Qu.: 0.6491 3rd Qu.: 0.73265
## Max. : 2.2401 Max. : 2.67248 Max. : 2.4312 Max. : 2.80844
## OD Proline
## Min. :-2.1243 Min. :-2.17305
## 1st Qu.:-0.8899 1st Qu.:-0.75827
## Median : 0.3177 Median :-0.04323
## Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.7879 3rd Qu.: 0.87284
## Max. : 1.6572 Max. : 2.15998
Setelah standardisasi, seluruh variabel memiliki mean mendekati 0 dan standar deviasi mendekati 1, menunjukkan bahwa proses scaling berhasil dilakukan dengan baik.
Memeriksa apakah data memenuhi asumsi dasar Linear Discriminant Analysis, sehingga hasil klasifikasi dapat dipercaya. ## 4.1 Normalitas Multivariat
packageVersion("MVN")
## [1] '6.3'
X <- wine_scaled[, sapply(wine_scaled, is.numeric)]
mvn_result <- mvn(data = X, mvn_test = "mardia")
mvn_result$multivariate_normality
## Test Statistic p.value Method MVN
## 1 Mardia Skewness 1242.253 <0.001 asymptotic ✗ Not normal
## 2 Mardia Kurtosis 7.910 <0.001 asymptotic ✗ Not normal
Hasil uji normalitas multivariat menggunakan Mardia’s test menunjukkan bahwa data tidak memenuhi asumsi normalitas, ditunjukkan oleh p-value < 0.001 pada skewness dan kurtosis. Namun demikian, metode Linear Discriminant Analysis tetap dapat digunakan karena cukup robust terhadap pelanggaran asumsi normalitas pada data nyata.
mvn_class1 <- mvn(wine_scaled[wine_scaled$Class == 1, -1], mvn_test = "mardia")
mvn_class2 <- mvn(wine_scaled[wine_scaled$Class == 2, -1], mvn_test = "mardia")
mvn_class3 <- mvn(wine_scaled[wine_scaled$Class == 3, -1], mvn_test = "mardia")
mvn_class1$multivariate_normality
## Test Statistic p.value Method MVN
## 1 Mardia Skewness 458.354 0.447 asymptotic ✓ Normal
## 2 Mardia Kurtosis -1.833 0.067 asymptotic ✓ Normal
mvn_class2$multivariate_normality
## Test Statistic p.value Method MVN
## 1 Mardia Skewness 562.856 <0.001 asymptotic ✗ Not normal
## 2 Mardia Kurtosis 0.803 0.422 asymptotic ✓ Normal
mvn_class3$multivariate_normality
## Test Statistic p.value Method MVN
## 1 Mardia Skewness 428.84 0.806 asymptotic ✓ Normal
## 2 Mardia Kurtosis -1.34 0.180 asymptotic ✓ Normal
Hasil uji normalitas multivariat menggunakan Mardia’s test menunjukkan bahwa Class 1 dan Class 3 memenuhi asumsi normalitas multivariat berdasarkan nilai p-value > 0.05. Namun, Class 2 menunjukkan pelanggaran pada komponen skewness dengan p-value < 0.05, meskipun kurtosis tetap memenuhi asumsi. Secara keseluruhan, data mendekati distribusi normal multivariat dengan beberapa penyimpangan minor, sehingga metode Linear Discriminant Analysis tetap dapat digunakan karena bersifat robust terhadap pelanggaran asumsi normalitas.
Kesimpulan: Uji normalitas multivariat dilakukan menggunakan Mardia’s test secara global dan per kelas. Hasil menunjukkan bahwa data tidak sepenuhnya memenuhi asumsi normalitas multivariat baik secara keseluruhan maupun pada masing-masing kelas. Namun demikian, metode Linear Discriminant Analysis tetap dapat digunakan karena cukup robust terhadap pelanggaran asumsi normalitas.
boxM(wine_scaled[, -1], wine_scaled$Class)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: wine_scaled[, -1]
## Chi-Sq (approx.) = 637.39, df = 182, p-value < 2.2e-16
Hasil uji Box’s M menunjukkan nilai p-value < 0.05, sehingga hipotesis nol ditolak. Hal ini menunjukkan bahwa matriks kovarians antar kelas tidak homogen. Meskipun demikian, metode Linear Discriminant Analysis tetap dapat digunakan karena bersifat robust terhadap pelanggaran asumsi homogenitas kovarians, terutama pada dataset dengan karakteristik multivariat seperti Wine dataset.
Split data dilakukan untuk membagi dataset menjadi data latih dan data uji. Data latih digunakan untuk membangun model Linear Discriminant Analysis, sedangkan data uji digunakan untuk mengevaluasi kemampuan model dalam melakukan klasifikasi pada data baru yang belum pernah dilihat sebelumnya. Hal ini bertujuan untuk menghindari overfitting dan mendapatkan estimasi performa model yang lebih realistis.
set.seed(123)
index <- sample(1:nrow(wine_scaled), 0.7 * nrow(wine_scaled))
train <- wine_scaled[index, ]
test <- wine_scaled[-index, ]
dim(train)
## [1] 124 14
dim(test)
## [1] 54 14
# Pastikan Class bertipe factor
train$Class <- as.factor(train$Class)
test$Class <- as.factor(test$Class)
# Membuat model LDA
model_lda <- lda(Class ~ ., data = train)
# Melihat hasil model
model_lda
## Call:
## lda(Class ~ ., data = train)
##
## Prior probabilities of groups:
## 1 2 3
## 0.3225806 0.3790323 0.2983871
##
## Group means:
## Alcohol Malicacid Ash Alcalinity_of_ash Magnesium Total_phenols
## 1 0.8793773 -0.2057702 0.4405210 -0.6670624 0.50209282 0.8123201
## 2 -0.7770210 -0.4549422 -0.4222433 0.2315990 -0.38134519 -0.1398543
## 3 0.1900133 0.9100208 0.3418691 0.6302281 -0.01992384 -0.9670346
## Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue
## 1 0.8852268 -0.52902846 0.478424212 0.3115479 0.5247595
## 2 0.1099132 0.08933662 0.009347028 -0.8855432 0.3985302
## 3 -1.3943866 0.76607744 -0.755964179 1.0233156 -1.2604012
## OD Proline
## 1 0.7621540 1.1397440
## 2 0.2515837 -0.8025878
## 3 -1.2909495 -0.1908574
##
## Coefficients of linear discriminants:
## LD1 LD2
## Alcohol -0.301343470 0.59641663
## Malicacid 0.034135290 0.43521772
## Ash 0.034700754 0.72608186
## Alcalinity_of_ash 0.587757512 -0.63321061
## Magnesium 0.009451692 -0.12810217
## Total_phenols 0.761254310 0.12851284
## Flavanoids -2.901572499 -0.51043251
## Nonflavanoid_phenols -0.314693240 -0.26540937
## Proanthocyanins 0.279149832 -0.07621260
## Color_intensity 1.141788300 0.60758835
## Hue -0.246772271 -0.04539542
## OD -0.606428166 0.20985939
## Proline -0.727996506 0.91272355
##
## Proportion of trace:
## LD1 LD2
## 0.763 0.237
Hasil pemodelan Linear Discriminant Analysis (LDA) menunjukkan bahwa proporsi data pada masing-masing kelas relatif seimbang, dengan prior probability sebesar 0,323 untuk Class 1, 0,379 untuk Class 2, dan 0,298 untuk Class 3, sehingga model tidak cenderung bias terhadap kelas tertentu. Berdasarkan nilai rata-rata (group means), setiap kelas memiliki karakteristik kimia yang berbeda. Class 1 cenderung memiliki nilai tinggi pada variabel Alcohol, Total_phenols, Flavanoids, dan Proline, yang mengindikasikan kandungan senyawa fenolik yang lebih tinggi. Class 2 memiliki nilai yang relatif lebih rendah atau mendekati rata-rata pada sebagian besar variabel, sehingga karakteristiknya tidak terlalu menonjol. Sementara itu, Class 3 ditandai dengan nilai Color_intensity dan Nonflavanoid_phenols yang tinggi, serta nilai Flavanoids dan Hue yang rendah, yang menunjukkan karakteristik warna wine yang lebih kuat.
Koefisien fungsi diskriminan menunjukkan bahwa variabel Flavanoids, Color_intensity, Total_phenols, dan Proline memiliki kontribusi paling besar dalam membedakan antar kelas, terutama pada fungsi diskriminan pertama (LD1). Nilai proportion of trace menunjukkan bahwa LD1 mampu menjelaskan sebesar 76,3% variasi antar kelas, sedangkan LD2 menjelaskan sebesar 23,7%, sehingga LD1 menjadi komponen utama dalam pemisahan kelas wine. Secara keseluruhan, model LDA mampu mengidentifikasi variabel-variabel penting yang membedakan karakteristik kimia antar jenis wine dan memberikan dasar yang kuat untuk proses klasifikasi.
# Prediksi data testing
pred_test <- predict(model_lda, test)
# Hasil klasifikasi
hasil_pred <- pred_test$class
# Tampilkan semua data
hasil_lengkap <- data.frame(Aktual = test$Class, Prediksi = hasil_pred)
hasil_lengkap
## Aktual Prediksi
## 1 1 1
## 2 1 1
## 3 1 1
## 4 1 1
## 5 1 1
## 6 1 1
## 7 1 1
## 8 1 1
## 9 1 1
## 10 1 1
## 11 1 1
## 12 1 1
## 13 1 1
## 14 1 1
## 15 1 1
## 16 1 1
## 17 1 1
## 18 1 1
## 19 1 1
## 20 2 2
## 21 2 2
## 22 2 2
## 23 2 2
## 24 2 2
## 25 2 2
## 26 2 2
## 27 2 2
## 28 2 2
## 29 2 2
## 30 2 2
## 31 2 2
## 32 2 2
## 33 2 2
## 34 2 2
## 35 2 2
## 36 2 2
## 37 2 2
## 38 2 2
## 39 2 2
## 40 2 2
## 41 2 2
## 42 2 2
## 43 2 2
## 44 3 3
## 45 3 3
## 46 3 3
## 47 3 3
## 48 3 3
## 49 3 3
## 50 3 3
## 51 3 3
## 52 3 3
## 53 3 3
## 54 3 3
table(hasil_pred)
## hasil_pred
## 1 2 3
## 19 24 11
Hasil prediksi model Linear Discriminant Analysis (LDA) menunjukkan bahwa data uji berhasil diklasifikasikan ke dalam tiga kelas, yaitu Class 1 sebanyak 19 observasi, Class 2 sebanyak 24 observasi, dan Class 3 sebanyak 11 observasi. Distribusi hasil prediksi yang mencakup seluruh kelas ini menunjukkan bahwa model tidak mengalami bias terhadap satu kelas tertentu dan mampu mengenali pola dari masing-masing kategori wine.
Jumlah prediksi yang relatif bervariasi antar kelas mengindikasikan bahwa model dapat menangkap perbedaan karakteristik kimia yang dimiliki oleh setiap jenis wine. Class 2 memiliki jumlah prediksi terbanyak, yang kemungkinan menunjukkan bahwa karakteristik kelas tersebut lebih dominan atau lebih mudah dikenali oleh model dibandingkan kelas lainnya.
Namun demikian, distribusi hasil prediksi ini belum dapat digunakan untuk menilai tingkat ketepatan model secara keseluruhan, karena belum mempertimbangkan kesesuaian antara hasil prediksi dengan data aktual. Oleh karena itu, diperlukan analisis lanjutan menggunakan confusion matrix dan perhitungan akurasi untuk mengevaluasi performa model secara lebih komprehensif.
# install.packages("caret")
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
confusionMatrix(hasil_pred, test$Class)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 19 0 0
## 2 0 24 0
## 3 0 0 11
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.934, 1)
## No Information Rate : 0.4444
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 1.0000 1.0000 1.0000
## Specificity 1.0000 1.0000 1.0000
## Pos Pred Value 1.0000 1.0000 1.0000
## Neg Pred Value 1.0000 1.0000 1.0000
## Prevalence 0.3519 0.4444 0.2037
## Detection Rate 0.3519 0.4444 0.2037
## Detection Prevalence 0.3519 0.4444 0.2037
## Balanced Accuracy 1.0000 1.0000 1.0000
Hasil evaluasi model Linear Discriminant Analysis (LDA) menggunakan confusion matrix menunjukkan bahwa seluruh data uji berhasil diklasifikasikan dengan benar ke dalam kelas masing-masing. Tidak terdapat kesalahan klasifikasi pada ketiga kelas, di mana Class 1, Class 2, dan Class 3 masing-masing memiliki nilai prediksi yang sepenuhnya sesuai dengan data aktual. Hal ini menghasilkan nilai akurasi sebesar 1 atau 100%, yang menunjukkan performa model yang sangat baik.
Interval kepercayaan 95% untuk akurasi berada pada rentang 0,934 hingga 1, yang mengindikasikan bahwa tingkat akurasi model tetap tinggi dan stabil. Nilai No Information Rate (NIR) sebesar 0,4444 menunjukkan bahwa akurasi model jauh lebih baik dibandingkan dengan tebakan acak berdasarkan kelas mayoritas. Hal ini juga diperkuat oleh nilai p-value yang sangat kecil (< 2.2e-16), sehingga dapat disimpulkan bahwa model secara signifikan lebih baik dibandingkan model tanpa informasi.
Selain itu, nilai Kappa sebesar 1 menunjukkan tingkat kesepakatan yang sempurna antara hasil prediksi dan data aktual. Pada masing-masing kelas, nilai sensitivity, specificity, precision (positive predictive value), dan balanced accuracy semuanya mencapai 1, yang menandakan bahwa model mampu mengklasifikasikan setiap kelas dengan sangat akurat tanpa kesalahan.
Namun demikian, meskipun seluruh metrik evaluasi menunjukkan hasil yang sempurna, kondisi ini perlu dianalisis secara kritis. Hasil yang sangat tinggi dapat dipengaruhi oleh karakteristik dataset yang memiliki pemisahan kelas yang sangat jelas atau jumlah data uji yang relatif terbatas. Oleh karena itu, disarankan untuk melakukan validasi tambahan, seperti cross-validation, guna memastikan bahwa performa model tetap konsisten pada data yang berbeda.
# Ambil hasil transformasi LDA
lda_values <- predict(model_lda, train)
# Buat data frame untuk plotting
lda_df <- data.frame(LD1 = lda_values$x[,1],
LD2 = lda_values$x[,2],
Class = train$Class)
# Plot
library(ggplot2)
ggplot(lda_df, aes(x = LD1, y = LD2, color = Class)) +
geom_point(size = 3) +
labs(title = "Visualisasi LDA (LD1 vs LD2)",
x = "Linear Discriminant 1",
y = "Linear Discriminant 2") +
theme_minimal()
Pada diagram ini terlihat bahwa metode LDA berhasil memproyeksikan data
karakteristik kimia wine ke dalam dua komponen diskriminan utama (LD1
dan LD2) yang mampu memisahkan ketiga kelas dengan cukup jelas. Kelas 1
(merah) terkonsentrasi di sisi kiri atas, kelas 2 (hijau) berada di
bagian bawah tengah, sedangkan kelas 3 (biru) terpisah jauh di sisi
kanan. Pemisahan yang tegas terutama terjadi pada sumbu LD1, yang
menunjukkan bahwa variabel diskriminan pertama memiliki kontribusi
terbesar dalam membedakan jenis wine. Meskipun terdapat sedikit titik
yang mendekati batas antar kelas, secara umum tidak terlihat tumpang
tindih yang signifikan, sehingga dapat disimpulkan bahwa model LDA
multinomial memiliki kemampuan klasifikasi yang baik terhadap dataset
ini.
ggplot(lda_df, aes(x = LD1, y = LD2, color = Class)) +
geom_point(size = 3) +
stat_ellipse(level = 0.95) +
labs(title = "Visualisasi LDA dengan Ellipse",
x = "LD1",
y = "LD2") +
theme_minimal()
Pada diagram ini, penambahan ellipse memperjelas sebaran dan variabilitas masing-masing kelas dalam ruang diskriminan. Setiap ellipse merepresentasikan area konsentrasi data (confidence region) dari tiap kelas, dan terlihat bahwa ketiga ellipse hampir tidak saling bertumpang tindih. Hal ini mengindikasikan bahwa masing-masing kelas memiliki distribusi yang relatif homogen dan terpisah dengan baik. Kelas 1 menunjukkan sebaran yang agak memanjang, menandakan variasi internal yang lebih tinggi pada arah tertentu, sedangkan kelas 2 dan kelas 3 cenderung lebih kompak. Minimnya overlap antar ellipse memperkuat bahwa asumsi pemisahan kelas dalam LDA cukup terpenuhi, sehingga model mampu melakukan klasifikasi wine secara akurat berdasarkan karakteristik kimianya.
model_mlr <- multinom(Class ~ ., data = train)
## # weights: 45 (28 variable)
## initial value 136.227924
## iter 10 value 0.020569
## iter 20 value 0.003406
## iter 30 value 0.000641
## iter 40 value 0.000430
## iter 50 value 0.000140
## iter 60 value 0.000103
## iter 60 value 0.000099
## iter 60 value 0.000099
## final value 0.000099
## converged
summary(model_mlr)
## Call:
## multinom(formula = Class ~ ., data = train)
##
## Coefficients:
## (Intercept) Alcohol Malicacid Ash Alcalinity_of_ash Magnesium
## 2 2.652259 -10.19108796 -2.555026 -11.173225 12.743517 -0.4978145
## 3 -6.808382 -0.06925362 2.201573 4.591996 4.226748 1.9162813
## Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity
## 2 -2.872039 -2.528174 2.462787 -2.303408 -11.943203
## 3 -3.280113 -10.427079 1.208594 -2.926577 9.570842
## Hue OD Proline
## 2 2.391575 -1.495615 -14.0074402
## 3 -8.104734 -8.928933 -0.6573403
##
## Std. Errors:
## (Intercept) Alcohol Malicacid Ash Alcalinity_of_ash Magnesium
## 2 4984.312 6225.20 3438.925 1516.628 2723.093 2098.672
## 3 12407.187 16555.65 7363.746 12212.177 9799.722 14420.676
## Total_phenols Flavanoids Nonflavanoid_phenols Proanthocyanins Color_intensity
## 2 5461.492 10510.01 2259.035 972.3335 8374.901
## 3 10085.025 25291.71 8434.126 12755.1226 14873.838
## Hue OD Proline
## 2 5174.709 4755.114 5509.664
## 3 17324.638 12449.947 10437.999
##
## Residual Deviance: 0.0001978824
## AIC: 56.0002
Model Multinomial Logistic Regression yang dibangun menunjukkan proses konvergensi yang sangat baik, ditandai dengan penurunan nilai log-likelihood hingga mencapai nilai akhir yang sangat kecil. Hal ini mengindikasikan bahwa model mampu menyesuaikan diri dengan data pelatihan secara optimal. Koefisien yang dihasilkan menunjukkan pengaruh masing-masing variabel prediktor terhadap peluang suatu observasi masuk ke kelas tertentu dibandingkan kelas referensi. Namun, nilai standar error yang relatif besar mengindikasikan adanya potensi multikolinearitas atau kompleksitas data yang tinggi. Meskipun demikian, nilai residual deviance yang sangat kecil serta AIC yang rendah menunjukkan bahwa model memiliki goodness-of-fit yang sangat baik terhadap data.
# Prediksi data testing
pred_mlr <- predict(model_mlr, test)
# Tampilkan hasil
hasil_mlr <- data.frame(Aktual = test$Class, Prediksi = pred_mlr)
hasil_mlr
## Aktual Prediksi
## 1 1 1
## 2 1 1
## 3 1 1
## 4 1 1
## 5 1 1
## 6 1 1
## 7 1 1
## 8 1 1
## 9 1 1
## 10 1 1
## 11 1 1
## 12 1 1
## 13 1 1
## 14 1 1
## 15 1 1
## 16 1 1
## 17 1 1
## 18 1 1
## 19 1 1
## 20 2 2
## 21 2 2
## 22 2 2
## 23 2 2
## 24 2 2
## 25 2 2
## 26 2 2
## 27 2 2
## 28 2 2
## 29 2 2
## 30 2 2
## 31 2 2
## 32 2 2
## 33 2 2
## 34 2 2
## 35 2 2
## 36 2 2
## 37 2 2
## 38 2 2
## 39 2 2
## 40 2 2
## 41 2 2
## 42 2 2
## 43 2 2
## 44 3 3
## 45 3 3
## 46 3 3
## 47 3 3
## 48 3 3
## 49 3 3
## 50 3 3
## 51 3 3
## 52 3 3
## 53 3 3
## 54 3 3
Hasil prediksi menunjukkan bahwa model mampu mengklasifikasikan seluruh data uji dengan sangat akurat, di mana setiap nilai prediksi sesuai dengan nilai aktualnya. Hal ini mengindikasikan bahwa pola antar kelas dalam data sangat jelas dan dapat dipelajari dengan baik oleh model. Tidak ditemukan kesalahan klasifikasi pada sampel yang ditampilkan, yang menunjukkan bahwa model memiliki kemampuan generalisasi yang sangat tinggi pada data uji yang digunakan.
confusionMatrix(pred_mlr, test$Class)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 19 0 0
## 2 0 24 0
## 3 0 0 11
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.934, 1)
## No Information Rate : 0.4444
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 1.0000 1.0000 1.0000
## Specificity 1.0000 1.0000 1.0000
## Pos Pred Value 1.0000 1.0000 1.0000
## Neg Pred Value 1.0000 1.0000 1.0000
## Prevalence 0.3519 0.4444 0.2037
## Detection Rate 0.3519 0.4444 0.2037
## Detection Prevalence 0.3519 0.4444 0.2037
## Balanced Accuracy 1.0000 1.0000 1.0000
Berdasarkan confusion matrix, model menghasilkan akurasi sebesar 100%, yang berarti seluruh data berhasil diklasifikasikan dengan benar. Nilai sensitivity, specificity, precision, dan balanced accuracy untuk setiap kelas juga mencapai 1, yang menunjukkan performa model yang sempurna dalam membedakan ketiga kelas. Selain itu, nilai Kappa sebesar 1 mengindikasikan kesepakatan yang sangat kuat antara prediksi dan data aktual. Meskipun hasil ini sangat baik, perlu diwaspadai kemungkinan overfitting, terutama jika data pelatihan dan pengujian memiliki karakteristik yang sangat mirip atau jumlah data relatif terbatas. ## 7.4 Visualisasi
# PCA untuk visualisasi
pca <- prcomp(wine_scaled[, -1], center = TRUE, scale. = TRUE)
pca_df <- data.frame(PC1 = pca$x[,1],
PC2 = pca$x[,2],
Class = wine_scaled$Class)
library(ggplot2)
ggplot(pca_df, aes(x = PC1, y = PC2, color = Class)) +
geom_point(size = 3) +
stat_ellipse(level = 0.95) +
labs(title = "Visualisasi PCA (Pendekatan untuk Multinomial Logistic Regression)",
x = "Principal Component 1",
y = "Principal Component 2") +
theme_minimal()
## Warning: The following aesthetics were dropped during statistical transformation:
## colour.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
Visualisasi menggunakan PCA menunjukkan bahwa data dapat dipisahkan dengan cukup jelas ke dalam tiga kelompok berdasarkan dua komponen utama. Setiap kelas membentuk cluster yang relatif terpisah, meskipun terdapat sedikit tumpang tindih di beberapa area. Hal ini menjelaskan mengapa model Multinomial Logistic Regression mampu mencapai akurasi yang sangat tinggi, karena batas antar kelas sudah cukup jelas secara struktural. PCA juga membantu memvalidasi bahwa variabel-variabel dalam dataset memiliki kemampuan diskriminatif yang baik dalam membedakan kelas.
# Akurasi LDA
acc_lda <- confusionMatrix(hasil_pred, test$Class)$overall['Accuracy']
# Akurasi MLR
acc_mlr <- confusionMatrix(pred_mlr, test$Class)$overall['Accuracy']
acc_lda
## Accuracy
## 1
acc_mlr
## Accuracy
## 1
Hasil pengujian menunjukkan bahwa kedua model, yaitu LDA dan Multinomial Logistic Regression, sama-sama menghasilkan nilai akurasi sebesar 1 atau 100%. Hal ini mengindikasikan bahwa seluruh data uji berhasil diklasifikasikan dengan benar oleh kedua pendekatan. Kondisi ini menunjukkan bahwa struktur data memiliki pemisahan kelas yang sangat jelas, sehingga baik metode berbasis asumsi distribusi seperti LDA maupun metode berbasis probabilitas seperti regresi logistik multinomial mampu menangkap pola dengan sangat baik. ## 8.2 Tabel Perbandingan
perbandingan <- data.frame(
Model = c("LDA", "Multinomial Logistic Regression"),
Akurasi = c(acc_lda, acc_mlr)
)
perbandingan
## Model Akurasi
## 1 LDA 1
## 2 Multinomial Logistic Regression 1
Berdasarkan tabel perbandingan, tidak terdapat perbedaan performa antara kedua model dari segi akurasi, karena keduanya mencapai nilai maksimum. Dengan demikian, secara kuantitatif tidak ada model yang lebih unggul dalam kasus ini. Namun, pemilihan model tetap dapat dipertimbangkan berdasarkan aspek lain, seperti asumsi data, interpretabilitas, dan kompleksitas model. LDA cenderung lebih sederhana dan efisien jika asumsi distribusi terpenuhi, sedangkan Multinomial Logistic Regression lebih fleksibel karena tidak bergantung pada asumsi distribusi tertentu.
ggplot(perbandingan, aes(x = Model, y = Akurasi, fill = Model)) +
geom_bar(stat = "identity") +
ylim(0,1) +
labs(title = "Perbandingan Akurasi Model",
y = "Akurasi",
x = "Model") +
theme_minimal()
Visualisasi perbandingan akurasi menunjukkan bahwa kedua model memiliki
tinggi batang yang sama, yang menegaskan bahwa performa keduanya identik
pada data yang digunakan. Grafik ini memperkuat hasil analisis
sebelumnya bahwa tidak ada selisih akurasi antara LDA dan Multinomial
Logistic Regression. Dengan demikian, keputusan pemilihan model dapat
lebih difokuskan pada kebutuhan interpretasi atau karakteristik data,
bukan semata-mata pada nilai akurasi.