1. IMPORT DATA

# 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

2. KARAKTERISTIK DATA

2.1 Struktur Data

# 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.

2.2 Statistik Deskriptif

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.

2.3 Distribusi Kelas

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.

2.4 Visualisasi Distribusi Kelas

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.

2.5 Korelasi Antar Variabel

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.

2.6 Boxplot (Outlier Check)

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.

3. Pre Processing

3.1 Cek dan Penanganan Missing Value

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.

3.2 Transformasi 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)

3.3 Standardisasi Data

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.

4. UJI ASUMSI LDA

Memeriksa apakah data memenuhi asumsi dasar Linear Discriminant Analysis, sehingga hasil klasifikasi dapat dipercaya. ## 4.1 Normalitas Multivariat

packageVersion("MVN")
## [1] '6.3'

Global normality

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.

Normalitas per Kelas

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.

4.2 UJI HOMOGENITAS KOVARIANS (Box’s M Test)

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.

5. SPLIT DATA

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

6. LINEAR DISCRIMINANT ANALYSIS (LDA)

6.1 Model LDA

# 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.

6.2 Prediksi

# 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.

6.3 Evaluasi Model LDA

# 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.

6.5 Visualisasi LDA

6.5.1 Visualisasi Hasil LDA

# 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.

6.5.2 Scatter Plot LD1 vs LD2 + Ellipse

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.

7. MULTINOMIAL LOGISTIC REGRESSION

7.1 Model Multinomial Logistic Regression

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.

7.2 Prediksi

# 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.

7.3 Evaluasi Model

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.

8. PERBANDINGAN LDA vs MULTINOMIAL

8.1 Akurasi

# 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.

8.3 Visualisasi Perbandingan

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.