Kelompok 3

  • Kelas 4B Statistika
  • Anggota:
    • Jacky Alinson (3338240008)
    • Alya Nur Azizah (3338240040)
    • Rahayu Puspita Sari (3338240049)

1. Deskripsi Data

Sumber Dataset Dataset yang digunakan adalah Wine Quality Dataset (Red Wine) yang diperoleh dari UCI Machine Learning Repository. Dataset dapat diakses melalui tautan berikut: Link: https://archive.ics.uci.edu/dataset/186/wine+quality

Jumlah Observasi Dataset terdiri atas 1.599 observasi yang merepresentasikan sampel red wine. Untuk keperluan analisis

Jumlah Variabel Dataset memiliki 11 variabel numerik yang menggambarkan karakteristik fisikokimia wine, yaitu:

1. Fixed Acidity

2. Volatile Acidity

3. Citric Acid

4. Residual Sugar

5. Chlorides

6. Free Sulfur Dioxide

7. Total Sulfur Dioxide

8. Density

9. pH

10. Sulphates

11. Alcohol

Selain itu terdapat 1 variabel target, yaitu Quality, yang menunjukkan kualitas wine berdasarkan penilaian sensorik.

Tujuan Analisis
Analisis dilakukan untuk mengidentifikasi variabel-variabel fisikokimia yang paling penting dalam menggambarkan karakteristik kualitas wine. Selain itu, dilakukan reduksi dimensi menggunakan Principal Component Analysis (PCA) guna memperoleh sejumlah komponen utama yang mampu menjelaskan sebagian besar variasi data dengan jumlah variabel yang lebih sedikit sehingga data menjadi lebih mudah diinterpretasikan dan dianalisis.

2. EDA

# load data
df <- read.csv("C:/Users/HP141024/Documents/Kuliah Semester 4/Eksplorasi dan Visualisasi Data/winequality-red.csv", sep = ";", header = TRUE)
head(df)
##   fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
## 1           7.4             0.70        0.00            1.9     0.076
## 2           7.8             0.88        0.00            2.6     0.098
## 3           7.8             0.76        0.04            2.3     0.092
## 4          11.2             0.28        0.56            1.9     0.075
## 5           7.4             0.70        0.00            1.9     0.076
## 6           7.4             0.66        0.00            1.8     0.075
##   free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol
## 1                  11                   34  0.9978 3.51      0.56     9.4
## 2                  25                   67  0.9968 3.20      0.68     9.8
## 3                  15                   54  0.9970 3.26      0.65     9.8
## 4                  17                   60  0.9980 3.16      0.58     9.8
## 5                  11                   34  0.9978 3.51      0.56     9.4
## 6                  13                   40  0.9978 3.51      0.56     9.4
##   quality
## 1       5
## 2       5
## 3       5
## 4       6
## 5       5
## 6       5
cat("Baris:", nrow(df), "Kolom:", ncol(df), "\n\n")
## Baris: 1599 Kolom: 12
print(names(df))
##  [1] "fixed.acidity"        "volatile.acidity"     "citric.acid"         
##  [4] "residual.sugar"       "chlorides"            "free.sulfur.dioxide" 
##  [7] "total.sulfur.dioxide" "density"              "pH"                  
## [10] "sulphates"            "alcohol"              "quality"

Statistik Deskriptif

print(summary(df))
##  fixed.acidity   volatile.acidity  citric.acid    residual.sugar  
##  Min.   : 4.60   Min.   :0.1200   Min.   :0.000   Min.   : 0.900  
##  1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090   1st Qu.: 1.900  
##  Median : 7.90   Median :0.5200   Median :0.260   Median : 2.200  
##  Mean   : 8.32   Mean   :0.5278   Mean   :0.271   Mean   : 2.539  
##  3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420   3rd Qu.: 2.600  
##  Max.   :15.90   Max.   :1.5800   Max.   :1.000   Max.   :15.500  
##    chlorides       free.sulfur.dioxide total.sulfur.dioxide    density      
##  Min.   :0.01200   Min.   : 1.00       Min.   :  6.00       Min.   :0.9901  
##  1st Qu.:0.07000   1st Qu.: 7.00       1st Qu.: 22.00       1st Qu.:0.9956  
##  Median :0.07900   Median :14.00       Median : 38.00       Median :0.9968  
##  Mean   :0.08747   Mean   :15.87       Mean   : 46.47       Mean   :0.9967  
##  3rd Qu.:0.09000   3rd Qu.:21.00       3rd Qu.: 62.00       3rd Qu.:0.9978  
##  Max.   :0.61100   Max.   :72.00       Max.   :289.00       Max.   :1.0037  
##        pH          sulphates         alcohol         quality     
##  Min.   :2.740   Min.   :0.3300   Min.   : 8.40   Min.   :3.000  
##  1st Qu.:3.210   1st Qu.:0.5500   1st Qu.: 9.50   1st Qu.:5.000  
##  Median :3.310   Median :0.6200   Median :10.20   Median :6.000  
##  Mean   :3.311   Mean   :0.6581   Mean   :10.42   Mean   :5.636  
##  3rd Qu.:3.400   3rd Qu.:0.7300   3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :4.010   Max.   :2.0000   Max.   :14.90   Max.   :8.000
  • Nilai fixed acidity berkisar antara 4,6 hingga 15,9 dengan rata-rata 8,32 dan median 7,90. Nilai rata-rata yang sedikit lebih besar daripada median menunjukkan distribusi yang cenderung miring ke kanan akibat adanya beberapa sampel dengan tingkat keasaman yang tinggi.

  • Variabel volatile acidity memiliki rata-rata 0,528 dan median 0,520, dengan rentang nilai 0,12–1,58

  • Kandungan citric acid memiliki rata-rata 0,271 dan median 0,260, dengan rentang 0–1,00. Sebagian besar sampel memiliki kandungan asam sitrat yang relatif rendah hingga sedang

  • Kadar gula sisa (residual sugar) memiliki rata-rata 2,54 dan median 2,20. Nilai maksimum mencapai 15,5

  • Variabel chlorides memiliki rata-rata 0,087 dan median 0,079. Rentang nilai yang cukup lebar (0,012–0,611) menunjukkan variasi kandungan garam yang cukup besar antar sampel.

  • Jumlah free sulfur dioxide berkisar antara 1 hingga 72 dengan rata-rata 15,87. Sebagian besar sampel memiliki nilai antara 7 hingga 21

  • Nilai total sulfur dioxide memiliki rata-rata 46,47 dan median 38. Nilai maksimum sebesar 289

  • Variabel density memiliki rata-rata 0,9967 dan median 0,9968. Kedekatan nilai rata-rata dan median menunjukkan distribusi yang relatif simetris dan stabil.

  • Nilai pH berkisar antara 2,74 hingga 4,01 dengan rata-rata 3,31. Sebagian besar wine memiliki tingkat keasaman yang relatif seragam

  • Variabel sulphates memiliki rata-rata 0,658 dan median 0,620. Nilai maksimum mencapai 2,00, yang mengindikasikan adanya beberapa sampel dengan kandungan sulfat yang jauh lebih tinggi dibandingkan mayoritas wine.

  • Kadar alkohol berkisar antara 8,4% hingga 14,9% dengan rata-rata 10,42% dan median 10,20%

  • Variabel quality memiliki rentang nilai 3 hingga 8 dengan rata-rata 5,64 dan median 6. Hal ini menunjukkan bahwa sebagian besar wine dalam dataset memiliki kualitas pada kategori sedang, dengan mayoritas nilai kualitas berada pada rentang 5–6

# 2. Missing Values 

mv <- colSums(is.na(df))
cat("Jumlah missing per kolom:\n")
## Jumlah missing per kolom:
print(mv)
##        fixed.acidity     volatile.acidity          citric.acid 
##                    0                    0                    0 
##       residual.sugar            chlorides  free.sulfur.dioxide 
##                    0                    0                    0 
## total.sulfur.dioxide              density                   pH 
##                    0                    0                    0 
##            sulphates              alcohol              quality 
##                    0                    0                    0
cat("\nTotal missing value:", sum(mv), "\n")
## 
## Total missing value: 0

Hasil analisis menunjukkan bahwa seluruh variabel memiliki jumlah missing value sebesar 0, baik pada variabel fisikokimia maupun variabel kualitas (quality)

Visualisasi

Histogram semua variabel

df_long <- melt(df)

ggplot(df_long, aes(x = value)) +
  geom_histogram(fill = "steelblue", color = "white", bins = 30) +
  facet_wrap(~variable, scales = "free") +
  labs(title = "Distribusi Setiap Variabel", x = "Nilai", y = "Frekuensi") +
  theme_minimal()

Histogram digunakan untuk melihat pola distribusi dan penyebaran data pada masing-masing variabel dalam dataset Red Wine Quality.

  • Distribusi fixed acidity menunjukkan pola yang relatif terpusat pada rentang 6–9 dengan frekuensi tertinggi berada di sekitar nilai 7–8. Sebagian besar sampel memiliki tingkat keasaman tetap pada rentang tersebut.

  • Variabel volatile acidity memiliki distribusi yang terkonsentrasi pada rentang 0,3–0,7. Frekuensi data cenderung menurun seiring meningkatnya nilai volatile acidity, menunjukkan bahwa sebagian besar wine memiliki tingkat keasaman volatil yang relatif rendah hingga sedang

  • Distribusi citric acid menunjukkan penyebaran nilai dari 0 hingga sekitar 0,8. Sebagian besar observasi berada pada rentang rendah hingga menengah, menunjukkan kandungan asam sitrat yang umumnya tidak terlalu tinggi

  • Variabel residual sugar memiliki konsentrasi data yang sangat tinggi pada nilai rendah, terutama sekitar 1–3. Hal ini menunjukkan bahwa mayoritas wine dalam dataset memiliki kandungan gula sisa yang relatif rendah

  • Distribusi chlorides memperlihatkan sebagian besar data berada pada rentang yang sempit dan bernilai rendah. Artinya, kadar klorida pada sebagian besar wine relatif seragam

  • Variabel free sulfur dioxide memiliki frekuensi tertinggi pada nilai yang rendah hingga sedang. Jumlah observasi semakin berkurang pada nilai yang lebih tinggi.

  • Distribusi total sulfur dioxide menunjukkan pola yang mirip dengan free sulfur dioxide, di mana sebagian besar wine memiliki kandungan sulfur dioksida total pada rentang rendah hingga menengah

  • Variabel density memiliki distribusi yang cukup simetris dan terpusat di sekitar nilai 0,996–0,997. Hal ini menunjukkan bahwa kepadatan wine relatif homogen antar sampel

  • Distribusi pH tampak mendekati bentuk lonceng (bell-shaped distribution) dengan pusat distribusi berada di sekitar nilai 3,3. Sebagian besar wine memiliki tingkat pH yang tidak jauh berbeda satu sama lain

  • Sebagian besar nilai sulphates berada pada rentang 0,5–0,8. Frekuensi observasi menurun pada nilai yang lebih tinggi, menunjukkan bahwa kadar sulfat tinggi relatif jarang ditemukan

  • Distribusi alcohol menunjukkan bahwa mayoritas wine memiliki kadar alkohol antara 9% hingga 11%. Jumlah wine dengan kadar alkohol lebih tinggi cenderung lebih sedikit

  • Variabel quality memiliki distribusi diskrit karena berupa skor kualitas. Nilai kualitas paling banyak berada pada skor 5 dan 6, sedangkan skor 3, 4, 7, dan 8 memiliki frekuensi yang lebih rendah. Hal ini menunjukkan bahwa sebagian besar wine dalam dataset termasuk dalam kategori kualitas sedang

Boxplot semua variabel

ggplot(df_long, aes(x = variable, y = value)) +
  geom_boxplot(fill = "tomato", alpha = 0.7) +
  facet_wrap(~variable, scales = "free") +
  labs(title = "Boxplot Setiap Variabel", x = "", y = "Nilai") +
  theme_minimal() +
  theme(axis.text.x = element_blank())

Boxplot digunakan untuk melihat ukuran pemusatan data (median), penyebaran data (IQR/interquartile range), serta mendeteksi adanya observasi yang berada di luar rentang normal distribusi data

  • Variabel fixed acidity memiliki median sekitar 7,9, dengan sebagian besar data berada pada rentang 7,1–9,2. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel volatile acidity memiliki median sekitar 0,52, dengan sebagian besar data berada pada rentang 0,39–0,64. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel citric acid memiliki median sekitar 0,26, dengan sebagian besar data berada pada rentang 0,09–0,42. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel residual sugar memiliki median sekitar 2,2, dengan sebagian besar data berada pada rentang 1,9–2,6. Terdapat beberapa observasi dengan nilai yang jauh lebih tinggi dibandingkan mayoritas data

  • Variabel chlorides memiliki median sekitar 0,079, dengan sebagian besar data berada pada rentang 0,070–0,090. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel free sulfur dioxide memiliki median sekitar 14, dengan sebagian besar data berada pada rentang 7–21. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel total sulfur dioxide memiliki median sekitar 38, dengan sebagian besar data berada pada rentang 22–62. Terdapat beberapa observasi dengan nilai yang jauh lebih tinggi dibandingkan mayoritas data

  • Variabel density memiliki median sekitar 0,9968, dengan sebagian besar data berada pada rentang 0,9956–0,9978. Penyebaran data relatif sempit sehingga nilai density antar sampel cenderung seragam

  • Variabel pH memiliki median sekitar 3,31, dengan sebagian besar data berada pada rentang 3,21–3,40. Penyebaran data relatif sempit sehingga tingkat keasaman wine cenderung homogen

  • Variabel sulphates memiliki median sekitar 0,62, dengan sebagian besar data berada pada rentang 0,55–0,73. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel alcohol memiliki median sekitar 10,2, dengan sebagian besar data berada pada rentang 9,5–11,1. Terdapat beberapa observasi dengan nilai yang lebih tinggi dibandingkan mayoritas data

  • Variabel quality memiliki median sebesar 6, dengan sebagian besar data berada pada rentang 5–6. Hal ini menunjukkan bahwa mayoritas wine dalam dataset memiliki kualitas pada kategori sedang

Distribusi variabel target

ggplot(df, aes(x = factor(quality))) +
  geom_bar(fill = "steelblue", color = "white") +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
  labs(title = "Distribusi Kualitas Anggur Merah", x = "Quality Score", y = "Jumlah") +
  theme_minimal()

Grafik batang menunjukkan distribusi variabel quality yang merupakan skor kualitas anggur merah dengan rentang nilai 3 hingga 8

  • Nilai kualitas 5 memiliki frekuensi tertinggi, yaitu sebanyak 681 observasi (42,59% dari total data).

  • nilai kualitas 6 memiliki frekuensi sebanyak 638 observasi (39,90%). Hal ini menunjukkan bahwa sebagian besar sampel anggur merah dalam dataset memiliki kualitas pada kategori sedang

  • Nilai kualitas 7 tercatat sebanyak 199 observasi (12,45%), sedangkan nilai kualitas 4 hanya sebanyak 53 observasi (3,31%), 10 observasi untuk kualitas 3 (0,63%) dan 18 observasi untuk kualitas 8 (1,13%).

Secara keseluruhan, distribusi kualitas tidak merata dan terkonsentrasi pada skor 5 dan 6. Kondisi ini menunjukkan bahwa mayoritas anggur merah dalam dataset memiliki kualitas menengah, sedangkan anggur dengan kualitas sangat rendah maupun sangat tinggi jumlahnya relatif sedikit. Dengan demikian, distribusi variabel quality cenderung membentuk pola yang terpusat pada kategori kualitas sedang dan tidak seimbang antar kategori kualitas

Scatter: alcohol vs quality

ggplot(df, aes(x = alcohol, y = quality)) +
  geom_jitter(alpha = 0.4, color = "steelblue") +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "Hubungan Alcohol vs Quality", x = "Alcohol (%)", y = "Quality") +
  theme_minimal()

  1. Hubungan

    Garis tren berwarna merah menunjukkan kemiringan (slope) yang bergerak naik dari kiri bawah ke kanan atas. Ini menandakan adanya hubungan linear positif

    semakin tinggi persentase kandungan alkohol (Alcohol (%)), maka cenderung semakin tinggi pula nilai kualitas (Quality) produk tersebut

  2. Kepadatan dan Dsitribusi data

    Kandungan Alkohol (titik-titik biru): Sebagian besar data terpusat pada rentang alkohol antara 9% hingga 13%. Data dengan kandungan alkohol di atas 14% atau di bawah 9% jumlahnya jauh lebih sedikit

    Nilai Kualitas: Mayoritas produk memiliki nilai kualitas yang berkisar di angka 5, 6, dan 7. Terlihat polanya menumpuk secara horizontal pada angka-angka bulat tersebut, yang mengindikasikan bahwa penilaian kualitas kemungkinan besar berupa data diskrit (skala bulat/skor).

Pairplot Semua Variabel

ggpairs(
  df[, c("fixed.acidity", "volatile.acidity", "citric.acid",
         "residual.sugar", "chlorides", "free.sulfur.dioxide",
         "total.sulfur.dioxide", "density", "pH",
         "sulphates", "alcohol", "quality")],
  title = "Pairplot Seluruh Variabel"
)

Pola Hubungan Terhadap Quality

  • Pengaruh Positif Terkuat (alcohol): Hubungan antara alcohol dan quality menunjukkan tren linear naik yang paling terlihat jelas di antara variabel lainnya. Semakin tinggi kadar alkohol, kualitas wine cenderung semakin meningkat.

  • Pengaruh Negatif Terkuat (volatile.acidity): Variabel ini memiliki hubungan berbanding terbalik yang nyata dengan quality. Peningkatan asam volatil (zat yang memicu rasa asam busuk/cuka) berkorelasi dengan penurunan kualitas produk.

  • Pengaruh Lemah/Tidak Signifikan: Variabel seperti residual.sugar (kadar gula sisa), chlorides (garam), free.sulfur.dioxide, dan total.sulfur.dioxide menunjukkan pola sebaran titik yang membentuk kotak padat tanpa arah khusus. Garis trennya cenderung datar, menandakan variabel-variabel tersebut memiliki korelasi yang sangat kecil atau hampir mendekati nol terhadap nilai kualitas.

Analisis Korelasi

cor_matrix <- cor(df)
cat("Matriks Korelasi:\n")
## Matriks Korelasi:
print(round(cor_matrix, 3))
##                      fixed.acidity volatile.acidity citric.acid residual.sugar
## fixed.acidity                1.000           -0.256       0.672          0.115
## volatile.acidity            -0.256            1.000      -0.552          0.002
## citric.acid                  0.672           -0.552       1.000          0.144
## residual.sugar               0.115            0.002       0.144          1.000
## chlorides                    0.094            0.061       0.204          0.056
## free.sulfur.dioxide         -0.154           -0.011      -0.061          0.187
## total.sulfur.dioxide        -0.113            0.076       0.036          0.203
## density                      0.668            0.022       0.365          0.355
## pH                          -0.683            0.235      -0.542         -0.086
## sulphates                    0.183           -0.261       0.313          0.006
## alcohol                     -0.062           -0.202       0.110          0.042
## quality                      0.124           -0.391       0.226          0.014
##                      chlorides free.sulfur.dioxide total.sulfur.dioxide density
## fixed.acidity            0.094              -0.154               -0.113   0.668
## volatile.acidity         0.061              -0.011                0.076   0.022
## citric.acid              0.204              -0.061                0.036   0.365
## residual.sugar           0.056               0.187                0.203   0.355
## chlorides                1.000               0.006                0.047   0.201
## free.sulfur.dioxide      0.006               1.000                0.668  -0.022
## total.sulfur.dioxide     0.047               0.668                1.000   0.071
## density                  0.201              -0.022                0.071   1.000
## pH                      -0.265               0.070               -0.066  -0.342
## sulphates                0.371               0.052                0.043   0.149
## alcohol                 -0.221              -0.069               -0.206  -0.496
## quality                 -0.129              -0.051               -0.185  -0.175
##                          pH sulphates alcohol quality
## fixed.acidity        -0.683     0.183  -0.062   0.124
## volatile.acidity      0.235    -0.261  -0.202  -0.391
## citric.acid          -0.542     0.313   0.110   0.226
## residual.sugar       -0.086     0.006   0.042   0.014
## chlorides            -0.265     0.371  -0.221  -0.129
## free.sulfur.dioxide   0.070     0.052  -0.069  -0.051
## total.sulfur.dioxide -0.066     0.043  -0.206  -0.185
## density              -0.342     0.149  -0.496  -0.175
## pH                    1.000    -0.197   0.206  -0.058
## sulphates            -0.197     1.000   0.094   0.251
## alcohol               0.206     0.094   1.000   0.476
## quality              -0.058     0.251   0.476   1.000
cat("\nKorelasi tiap variabel terhadap 'quality':\n")
## 
## Korelasi tiap variabel terhadap 'quality':
cor_quality <- sort(cor_matrix["quality", ], decreasing = TRUE)
print(round(cor_quality, 4))
##              quality              alcohol            sulphates 
##               1.0000               0.4762               0.2514 
##          citric.acid        fixed.acidity       residual.sugar 
##               0.2264               0.1241               0.0137 
##  free.sulfur.dioxide                   pH            chlorides 
##              -0.0507              -0.0577              -0.1289 
##              density total.sulfur.dioxide     volatile.acidity 
##              -0.1749              -0.1851              -0.3906
# heatmap korelasi
corrplot(cor_matrix,
         method = "color",
         type = "upper",
         tl.cex = 0.8,
         addCoef.col = "black",
         number.cex = 0.6,
         title = "Heatmap Korelasi Antar Variabel",
         mar = c(0, 0, 1, 0))

gradasi warna dari biru tua (korelasi positif kuat, mendekati 1) hingga merah tua (korelasi negatif kuat, mendekati -1)

  1. Hubungan Variabel terhadap Quality
  • Biru terang (alcohol = 0,48): Menandakan hubungan positif yang paling dominan di antara karakteristik lainnya. Semakin tinggi alkohol, warna kotak semakin biru (kualitas meningkat)

  • Oranye (volatile.acidity = -0.39): korelasi negatif yang kuat terhadap skor kualitas.

  • Putih: residual.sugar = 0.01, free.sulfur.dioxide = -0.05, pH = -0.06): Warna yang mendekati putih netral ini secara visual menunjukkan bahwa variabel-variabel tersebut tidak memiliki hubungan linear yang berarti terhadap kualitas

Multikolinearitas (VIF)

model_vif <- lm(quality ~ ., data = df)
vif_values <- vif(model_vif)

cat("Nilai VIF:\n")
## Nilai VIF:
print(round(vif_values, 4))
##        fixed.acidity     volatile.acidity          citric.acid 
##               7.7675               1.7894               3.1280 
##       residual.sugar            chlorides  free.sulfur.dioxide 
##               1.7026               1.4819               1.9630 
## total.sulfur.dioxide              density                   pH 
##               2.1868               6.3438               3.3297 
##            sulphates              alcohol 
##               1.4294               3.0312
cat("\nKeterangan: VIF < 5 = aman, 5-10 = perhatian, > 10 = bermasalah\n")
## 
## Keterangan: VIF < 5 = aman, 5-10 = perhatian, > 10 = bermasalah
cat("\nVariabel dengan VIF >= 5:\n")
## 
## Variabel dengan VIF >= 5:
masalah <- vif_values[vif_values >= 5]
if (length(masalah) == 0) {
  cat("Tidak ada.\n")
} else {
  print(round(masalah, 4))
}
## fixed.acidity       density 
##        7.7675        6.3438
# visualisasi VIF
vif_df <- data.frame(Variabel = names(vif_values), VIF = vif_values)

ggplot(vif_df, aes(x = reorder(Variabel, VIF), y = VIF, fill = VIF > 5)) +
  geom_bar(stat = "identity") +
  geom_hline(yintercept = 5, linetype = "dashed", color = "red", linewidth = 1) +
  geom_hline(yintercept = 10, linetype = "dashed", color = "darkred", linewidth = 1) +
  scale_fill_manual(values = c("steelblue", "tomato"),
                    labels = c("Normal", "Perlu Perhatian"),
                    name = "Status VIF") +
  coord_flip() +
  labs(title = "Nilai VIF Setiap Prediktor", x = "Variabel", y = "VIF") +
  theme_minimal()

Analisis Multikolinieritas Menggunakan Nilai VIF (Variance Inflation Factor)

  1. Variabel Prediktor Berstatus “Perlu Perhatian” (5 ≤ VIF ≤ 10)
  • fixed.acidity (VIF = 7.7675): Memiliki nilai VIF tertinggi di dalam model. Tingginya nilai VIF ini disebabkan karena keasaman tetap memiliki hubungan linear yang kuat dengan variabel pH, citric.acid, dan density pada pengujian korelasi sebelumnya.

  • density (VIF = 6.3438): Menunjukkan adanya indikasi tumpang tindih informasi yang cukup besar karena massa jenis cairan ini memiliki keterikatan kuat dengan kadar fixed.acidity dan alcohol

  1. Variabel Prediktor Berstatus “Normal” (VIF < 5)

    Sembilan variabel prediktor lainnya berada di zona aman dengan nilai VIF di bawah 5

  2. Kesimpulan

    Secara umum, model regresi ini tidak mengalami multikolinieritas parah karena tidak ada variabel dengan nilai VIF > 10. Namun, adanya dua variabel di zona “Perlu Perhatian” (fixed.acidity dan density) menunjukkan perlunya pertimbangan lebih lanjut

Deteksi Outlier (IQR)

cek_outlier <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  iqr <- Q3 - Q1
  sum(x < (Q1 - 1.5 * iqr) | x > (Q3 + 1.5 * iqr), na.rm = TRUE)
}

outlier_count <- sapply(df, cek_outlier)
outlier_df <- data.frame(
  Variabel = names(outlier_count),
  Jumlah_Outlier = outlier_count,
  Persen = round(outlier_count / nrow(df) * 100, 2)
)

cat("Jumlah Outlier per Variabel:\n")
## Jumlah Outlier per Variabel:
print(outlier_df)
##                                  Variabel Jumlah_Outlier Persen
## fixed.acidity               fixed.acidity             49   3.06
## volatile.acidity         volatile.acidity             19   1.19
## citric.acid                   citric.acid              1   0.06
## residual.sugar             residual.sugar            155   9.69
## chlorides                       chlorides            112   7.00
## free.sulfur.dioxide   free.sulfur.dioxide             30   1.88
## total.sulfur.dioxide total.sulfur.dioxide             55   3.44
## density                           density             45   2.81
## pH                                     pH             35   2.19
## sulphates                       sulphates             59   3.69
## alcohol                           alcohol             13   0.81
## quality                           quality             28   1.75
# boxplot outlier
ggplot(df_long, aes(x = variable, y = value)) +
  geom_boxplot(fill = "orange", outlier.color = "red",
               outlier.shape = 16, outlier.size = 1.5, alpha = 0.7) +
  facet_wrap(~variable, scales = "free") +
  labs(title = "Deteksi Outlier per Variabel",
       subtitle = "Titik merah = outlier",
       x = "", y = "Nilai") +
  theme_minimal() +
  theme(axis.text.x = element_blank())

Analisis Deteksi Pencilan (Outlier)

  1. residual.sugar: Memiliki pola pencilan paling ekstrem. Mayoritas data menumpuk sangat rendah di bagian bawah, namun terdapat deretan panjang outlier ke arah atas hingga mencapai nilai 16
  2. chlorides: Distribusi data sangat rapat di sekitar nilai rendah, tetapi memiliki ekor pencilan atas yang sangat panjang dan padat
  3. fixed.acidity, volatile.acidity, free.sulfur.dioxide, dan total.sulfur.dioxide: Keempat variabel ini juga menunjukkan pola serupa, yaitu memiliki banyak data pencilan yang menumpuk di atas batas maksimum (whisker atas).
  4. density dan pH: Kedua variabel ini memiliki karakteristik unik karena data pencilannya muncul di kedua sisi, baik di atas whisker maksimum maupun di bawah whisker minimum
  5. citric.acid, alcohol, dan quality: Ketiga variabel ini memiliki jumlah pencilan yang sangat sedikit (bersifat sporadis/terpisah). Pada citric.acid dan alcohol, hanya ada sedikit sampel yang dinilai sangat tinggi, sementara pada variabel target quality, pencilan hanya ditemukan pada nilai ekstrem atas (skor 8) dan ekstrem bawah (skor 3).

3. Feature Engineering

Feature Engineering adalah proses mengubah dan menyiapkan data mentah agar lebih relevan dan mudah dipahami oleh model Machine Learning (ML)atau Artificial Intelligence (AI). Tujuan utamanya adalah meningkatkan akurasi prediksi model dan efisiensi komputasi, serta mencegah terjadinya overfitting.

# Pembuatan fitur baru

total_asam <- as.numeric(df$fixed.acidity + df$volatile.acidity)

df_new <- df %>%
  mutate(
    so2.ratio = free.sulfur.dioxide / total.sulfur.dioxide,
    acidity.ratio = volatile.acidity / fixed.acidity,
    sugar.to.alcohol.ratio = residual.sugar / alcohol
  )

# Preview
head(df_new[, c("so2.ratio", "acidity.ratio", "sugar.to.alcohol.ratio")])
##   so2.ratio acidity.ratio sugar.to.alcohol.ratio
## 1 0.3235294    0.09459459              0.2021277
## 2 0.3731343    0.11282051              0.2653061
## 3 0.2777778    0.09743590              0.2346939
## 4 0.2833333    0.02500000              0.1938776
## 5 0.3235294    0.09459459              0.2021277
## 6 0.3250000    0.08918919              0.1914894

Interpretasi Fitur

  1. Fitur 1: so2.ratio (Rasio Sulfur Dioksida Aktif)

    Alasan: Sulfur dioksida (SO2) ditambahkan ke anggur untuk mencegah oksidasi dan bakteri. Namun, tidak semua SO2 berfungsi; hanya Free SO2 yang bekerja. Membuat rasio ini menunjukkan seberapa efisien perlindungan pada anggur tersebut.

    Interpretasi: Nilai rasio yang lebih tinggi menunjukkan proporsi SO2 aktif yang lebih besar. Anggur dengan proporsi SO2 bebas yang cukup cenderung lebih awet dan terjaga rasanya, sementara jika terlalu rendah anggur mudah rusak (spoil).

  2. Fitur 2: acidity.ratio (Rasio Kebusukan Asam)

    Alasan: Fixed acidity adalah asam alami bawaan anggur (asam tartarat) yang memberikan rasa segar, sedangkan Volatile acidity adalah asam asetat (seperti cuka) yang sering kali merupakan tanda kebusukan jika jumlahnya berlebih.

    Interpretasi: Fitur ini bertindak sebagai “Indikator Cacat Rasa” (Fault Indicator). Jika rasio ini tinggi, berarti anggur tersebut terlalu banyak mengandung asam cuka dibandingkan asam segarnya. Fitur ini hampir pasti akan memiliki korelasi negatif yang kuat dengan quality (semakin tinggi rasionya, kualitasnya semakin buruk).

  3. Fitur 3: sugar.to.alcohol.ratio (Rasio Sisa Fermentasi)

    Alasan: Alkohol pada anggur didapat dari fermentasi gula (residual.sugar). Rasio antara gula yang tersisa dan alkohol yang terbentuk menunjukkan profil body (kekentalan/tekstur) dari anggur tersebut dan tingkat kelengkapan proses fermentasi.

    Interpretasi: Jika rasio tinggi, anggur lebih manis namun alkoholnya rendah (kemungkinan fermentasi dihentikan lebih awal). Sedangkan jika rasio rendah anggur dry(kering/tidak manis) dengan alkohol tinggi (fermentasi tuntas). Keseimbangan dari rasio ini sangat menentukan penilaian quality.

4. Feature Selection

Feature selection adalah proses memilih subset variabel (fitur) yang paling relevan dari data mentah untuk melatih model machine learning. Tujuannya adalah mengurangi kompleksitas model, meningkatkan akurasi, mencegah overfitting, dan mempercepat waktu komputasi dengan membuang fitur yang tidak berguna atau berlebihan.

4.1 Wrapper Method

Wrapper method adalah teknik pemilihan fitur yang mengevaluasi subset fitur dengan melatih model pembelajaran mesin dan mengukur kinerja prediktifnya. Yang akan digunakan pada dataset ini yaitu forward selection dan stepwise selection.

# model lengkap dan model null 
full_model <- lm(quality ~ ., data = df_new) # model lengkap  
null_model <- lm(quality ~ 1, data = df_new) # model null

# forward selection 
forward_model <- step(null_model, scope = list(lower = null_model,upper = full_model), direction = "forward") 
## Start:  AIC=-682.5
## quality ~ 1
## 
##                          Df Sum of Sq     RSS      AIC
## + alcohol                 1   236.295  805.87 -1091.65
## + volatile.acidity        1   158.967  883.20  -945.14
## + acidity.ratio           1   123.257  918.91  -881.76
## + sulphates               1    65.865  976.30  -784.89
## + citric.acid             1    53.405  988.76  -764.61
## + so2.ratio               1    39.269 1002.90  -741.91
## + total.sulfur.dioxide    1    35.707 1006.46  -736.24
## + density                 1    31.887 1010.28  -730.19
## + chlorides               1    17.318 1024.85  -707.29
## + fixed.acidity           1    16.038 1026.13  -705.29
## + sugar.to.alcohol.ratio  1     4.454 1037.71  -687.35
## + pH                      1     3.473 1038.69  -685.84
## + free.sulfur.dioxide     1     2.674 1039.49  -684.61
## <none>                                1042.17  -682.50
## + residual.sugar          1     0.197 1041.97  -680.80
## 
## Step:  AIC=-1091.65
## quality ~ alcohol
## 
##                          Df Sum of Sq    RSS     AIC
## + acidity.ratio           1    95.854 710.02 -1292.1
## + volatile.acidity        1    94.074 711.80 -1288.1
## + sulphates               1    44.977 760.89 -1181.5
## + citric.acid             1    31.953 773.92 -1154.3
## + pH                      1    26.362 779.51 -1142.8
## + fixed.acidity           1    24.623 781.25 -1139.3
## + total.sulfur.dioxide    1     8.270 797.60 -1106.2
## + so2.ratio               1     6.552 799.32 -1102.7
## + density                 1     5.203 800.67 -1100.0
## <none>                                805.87 -1091.7
## + chlorides               1     0.611 805.26 -1090.9
## + free.sulfur.dioxide     1     0.325 805.55 -1090.3
## + residual.sugar          1     0.041 805.83 -1089.7
## + sugar.to.alcohol.ratio  1     0.006 805.86 -1089.7
## 
## Step:  AIC=-1292.14
## quality ~ alcohol + acidity.ratio
## 
##                          Df Sum of Sq    RSS     AIC
## + sulphates               1   17.8905 692.13 -1331.0
## + so2.ratio               1    8.7406 701.28 -1310.0
## + total.sulfur.dioxide    1    5.2348 704.78 -1302.0
## + volatile.acidity        1    4.0897 705.93 -1299.4
## + citric.acid             1    3.5595 706.46 -1298.2
## + density                 1    2.1862 707.83 -1295.1
## + fixed.acidity           1    1.9239 708.09 -1294.5
## + chlorides               1    1.1730 708.84 -1292.8
## <none>                                710.02 -1292.1
## + residual.sugar          1    0.4291 709.59 -1291.1
## + sugar.to.alcohol.ratio  1    0.2212 709.80 -1290.6
## + pH                      1    0.0566 709.96 -1290.3
## + free.sulfur.dioxide     1    0.0564 709.96 -1290.3
## 
## Step:  AIC=-1330.95
## quality ~ alcohol + acidity.ratio + sulphates
## 
##                          Df Sum of Sq    RSS     AIC
## + chlorides               1    9.5682 682.56 -1351.2
## + so2.ratio               1    9.3783 682.75 -1350.8
## + total.sulfur.dioxide    1    7.0200 685.11 -1345.2
## + citric.acid             1    6.9617 685.16 -1345.1
## + density                 1    4.3759 687.75 -1339.1
## + volatile.acidity        1    3.8501 688.28 -1337.9
## + fixed.acidity           1    2.3118 689.81 -1334.3
## <none>                                692.13 -1331.0
## + pH                      1    0.4019 691.72 -1329.9
## + residual.sugar          1    0.3693 691.76 -1329.8
## + free.sulfur.dioxide     1    0.2876 691.84 -1329.6
## + sugar.to.alcohol.ratio  1    0.1890 691.94 -1329.4
## 
## Step:  AIC=-1351.21
## quality ~ alcohol + acidity.ratio + sulphates + chlorides
## 
##                          Df Sum of Sq    RSS     AIC
## + so2.ratio               1    8.5388 674.02 -1369.3
## + total.sulfur.dioxide    1    7.5864 674.97 -1367.1
## + density                 1    3.7529 678.81 -1358.0
## + citric.acid             1    3.5931 678.97 -1357.7
## + volatile.acidity        1    2.5638 679.99 -1355.2
## + fixed.acidity           1    1.6758 680.88 -1353.1
## <none>                                682.56 -1351.2
## + free.sulfur.dioxide     1    0.4432 682.11 -1350.2
## + residual.sugar          1    0.1381 682.42 -1349.5
## + sugar.to.alcohol.ratio  1    0.0395 682.52 -1349.3
## + pH                      1    0.0113 682.55 -1349.2
## 
## Step:  AIC=-1369.34
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio
## 
##                          Df Sum of Sq    RSS     AIC
## + total.sulfur.dioxide    1    3.4801 670.54 -1375.6
## + free.sulfur.dioxide     1    3.3437 670.68 -1375.3
## + density                 1    2.1922 671.83 -1372.5
## + citric.acid             1    1.4982 672.52 -1370.9
## + volatile.acidity        1    1.4818 672.54 -1370.9
## + fixed.acidity           1    0.9212 673.10 -1369.5
## <none>                                674.02 -1369.3
## + pH                      1    0.2523 673.77 -1367.9
## + residual.sugar          1    0.0199 674.00 -1367.4
## + sugar.to.alcohol.ratio  1    0.0000 674.02 -1367.3
## 
## Step:  AIC=-1375.61
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide
## 
##                          Df Sum of Sq    RSS     AIC
## + density                 1   2.72260 667.82 -1380.1
## + volatile.acidity        1   1.93221 668.61 -1378.2
## + fixed.acidity           1   1.67348 668.87 -1377.6
## + citric.acid             1   1.19144 669.35 -1376.5
## <none>                                670.54 -1375.6
## + pH                      1   0.30848 670.23 -1374.3
## + sugar.to.alcohol.ratio  1   0.16407 670.38 -1374.0
## + free.sulfur.dioxide     1   0.11989 670.42 -1373.9
## + residual.sugar          1   0.06701 670.47 -1373.8
## 
## Step:  AIC=-1380.12
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density
## 
##                          Df Sum of Sq    RSS     AIC
## + sugar.to.alcohol.ratio  1   1.77479 666.04 -1382.4
## + residual.sugar          1   1.42897 666.39 -1381.5
## <none>                                667.82 -1380.1
## + pH                      1   0.43436 667.38 -1379.2
## + citric.acid             1   0.38708 667.43 -1379.0
## + volatile.acidity        1   0.24621 667.57 -1378.7
## + fixed.acidity           1   0.04871 667.77 -1378.2
## + free.sulfur.dioxide     1   0.00628 667.81 -1378.1
## 
## Step:  AIC=-1382.37
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio
## 
##                       Df Sum of Sq    RSS     AIC
## + residual.sugar       1   1.00748 665.03 -1382.8
## <none>                             666.04 -1382.4
## + pH                   1   0.39819 665.64 -1381.3
## + citric.acid          1   0.31620 665.73 -1381.1
## + volatile.acidity     1   0.03473 666.01 -1380.5
## + free.sulfur.dioxide  1   0.03285 666.01 -1380.5
## + fixed.acidity        1   0.03160 666.01 -1380.5
## 
## Step:  AIC=-1382.79
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio + 
##     residual.sugar
## 
##                       Df Sum of Sq    RSS     AIC
## <none>                             665.03 -1382.8
## + pH                   1   0.49708 664.54 -1382.0
## + citric.acid          1   0.23901 664.80 -1381.4
## + free.sulfur.dioxide  1   0.14187 664.89 -1381.1
## + volatile.acidity     1   0.03122 665.00 -1380.9
## + fixed.acidity        1   0.02417 665.01 -1380.8
summary(forward_model) 
## 
## Call:
## lm(formula = quality ~ alcohol + acidity.ratio + sulphates + 
##     chlorides + so2.ratio + total.sulfur.dioxide + density + 
##     sugar.to.alcohol.ratio + residual.sugar, data = df_new)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7845 -0.3696 -0.0547  0.4427  2.1282 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             3.955e+01  1.263e+01   3.132 0.001769 ** 
## alcohol                 2.978e-01  3.301e-02   9.022  < 2e-16 ***
## acidity.ratio          -7.943e+00  6.373e-01 -12.462  < 2e-16 ***
## sulphates               9.511e-01  1.115e-01   8.531  < 2e-16 ***
## chlorides              -1.851e+00  3.893e-01  -4.754 2.17e-06 ***
## so2.ratio               2.769e-01  1.182e-01   2.342 0.019323 *  
## total.sulfur.dioxide   -1.994e-03  5.633e-04  -3.539 0.000413 ***
## density                -3.713e+01  1.252e+01  -2.966 0.003065 ** 
## sugar.to.alcohol.ratio  1.910e+00  1.062e+00   1.798 0.072335 .  
## residual.sugar         -1.664e-01  1.072e-01  -1.552 0.120975    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6469 on 1589 degrees of freedom
## Multiple R-squared:  0.3619, Adjusted R-squared:  0.3583 
## F-statistic: 100.1 on 9 and 1589 DF,  p-value: < 2.2e-16
# stepwise (bidirectional) 
stepwise_model <- step(null_model, scope = list(lower = null_model, upper = full_model), direction = "both") 
## Start:  AIC=-682.5
## quality ~ 1
## 
##                          Df Sum of Sq     RSS      AIC
## + alcohol                 1   236.295  805.87 -1091.65
## + volatile.acidity        1   158.967  883.20  -945.14
## + acidity.ratio           1   123.257  918.91  -881.76
## + sulphates               1    65.865  976.30  -784.89
## + citric.acid             1    53.405  988.76  -764.61
## + so2.ratio               1    39.269 1002.90  -741.91
## + total.sulfur.dioxide    1    35.707 1006.46  -736.24
## + density                 1    31.887 1010.28  -730.19
## + chlorides               1    17.318 1024.85  -707.29
## + fixed.acidity           1    16.038 1026.13  -705.29
## + sugar.to.alcohol.ratio  1     4.454 1037.71  -687.35
## + pH                      1     3.473 1038.69  -685.84
## + free.sulfur.dioxide     1     2.674 1039.49  -684.61
## <none>                                1042.17  -682.50
## + residual.sugar          1     0.197 1041.97  -680.80
## 
## Step:  AIC=-1091.65
## quality ~ alcohol
## 
##                          Df Sum of Sq     RSS     AIC
## + acidity.ratio           1    95.854  710.02 -1292.1
## + volatile.acidity        1    94.074  711.80 -1288.1
## + sulphates               1    44.977  760.89 -1181.5
## + citric.acid             1    31.953  773.92 -1154.3
## + pH                      1    26.362  779.51 -1142.8
## + fixed.acidity           1    24.623  781.25 -1139.3
## + total.sulfur.dioxide    1     8.270  797.60 -1106.2
## + so2.ratio               1     6.552  799.32 -1102.7
## + density                 1     5.203  800.67 -1100.0
## <none>                                 805.87 -1091.7
## + chlorides               1     0.611  805.26 -1090.9
## + free.sulfur.dioxide     1     0.325  805.55 -1090.3
## + residual.sugar          1     0.041  805.83 -1089.7
## + sugar.to.alcohol.ratio  1     0.006  805.86 -1089.7
## - alcohol                 1   236.295 1042.17  -682.5
## 
## Step:  AIC=-1292.14
## quality ~ alcohol + acidity.ratio
## 
##                          Df Sum of Sq    RSS      AIC
## + sulphates               1    17.890 692.13 -1330.95
## + so2.ratio               1     8.741 701.28 -1309.95
## + total.sulfur.dioxide    1     5.235 704.78 -1301.97
## + volatile.acidity        1     4.090 705.93 -1299.38
## + citric.acid             1     3.559 706.46 -1298.18
## + density                 1     2.186 707.83 -1295.07
## + fixed.acidity           1     1.924 708.09 -1294.48
## + chlorides               1     1.173 708.84 -1292.78
## <none>                                710.02 -1292.14
## + residual.sugar          1     0.429 709.59 -1291.11
## + sugar.to.alcohol.ratio  1     0.221 709.80 -1290.64
## + pH                      1     0.057 709.96 -1290.27
## + free.sulfur.dioxide     1     0.056 709.96 -1290.27
## - acidity.ratio           1    95.854 805.87 -1091.65
## - alcohol                 1   208.891 918.91  -881.76
## 
## Step:  AIC=-1330.95
## quality ~ alcohol + acidity.ratio + sulphates
## 
##                          Df Sum of Sq    RSS      AIC
## + chlorides               1     9.568 682.56 -1351.21
## + so2.ratio               1     9.378 682.75 -1350.76
## + total.sulfur.dioxide    1     7.020 685.11 -1345.25
## + citric.acid             1     6.962 685.16 -1345.11
## + density                 1     4.376 687.75 -1339.09
## + volatile.acidity        1     3.850 688.28 -1337.87
## + fixed.acidity           1     2.312 689.81 -1334.30
## <none>                                692.13 -1330.95
## + pH                      1     0.402 691.72 -1329.88
## + residual.sugar          1     0.369 691.76 -1329.80
## + free.sulfur.dioxide     1     0.288 691.84 -1329.61
## + sugar.to.alcohol.ratio  1     0.189 691.94 -1329.38
## - sulphates               1    17.890 710.02 -1292.14
## - acidity.ratio           1    68.768 760.89 -1181.48
## - alcohol                 1   199.042 891.17  -928.78
## 
## Step:  AIC=-1351.21
## quality ~ alcohol + acidity.ratio + sulphates + chlorides
## 
##                          Df Sum of Sq    RSS     AIC
## + so2.ratio               1     8.539 674.02 -1369.3
## + total.sulfur.dioxide    1     7.586 674.97 -1367.1
## + density                 1     3.753 678.81 -1358.0
## + citric.acid             1     3.593 678.97 -1357.7
## + volatile.acidity        1     2.564 679.99 -1355.2
## + fixed.acidity           1     1.676 680.88 -1353.1
## <none>                                682.56 -1351.2
## + free.sulfur.dioxide     1     0.443 682.11 -1350.2
## + residual.sugar          1     0.138 682.42 -1349.5
## + sugar.to.alcohol.ratio  1     0.039 682.52 -1349.3
## + pH                      1     0.011 682.55 -1349.2
## - chlorides               1     9.568 692.13 -1331.0
## - sulphates               1    26.286 708.84 -1292.8
## - acidity.ratio           1    63.795 746.35 -1210.3
## - alcohol                 1   162.151 844.71 -1012.4
## 
## Step:  AIC=-1369.34
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio
## 
##                          Df Sum of Sq    RSS     AIC
## + total.sulfur.dioxide    1     3.480 670.54 -1375.6
## + free.sulfur.dioxide     1     3.344 670.68 -1375.3
## + density                 1     2.192 671.83 -1372.5
## + citric.acid             1     1.498 672.52 -1370.9
## + volatile.acidity        1     1.482 672.54 -1370.9
## + fixed.acidity           1     0.921 673.10 -1369.5
## <none>                                674.02 -1369.3
## + pH                      1     0.252 673.77 -1367.9
## + residual.sugar          1     0.020 674.00 -1367.4
## + sugar.to.alcohol.ratio  1     0.000 674.02 -1367.3
## - so2.ratio               1     8.539 682.56 -1351.2
## - chlorides               1     8.729 682.75 -1350.8
## - sulphates               1    26.393 700.41 -1309.9
## - acidity.ratio           1    65.409 739.43 -1223.2
## - alcohol                 1   137.415 811.43 -1074.7
## 
## Step:  AIC=-1375.61
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide
## 
##                          Df Sum of Sq    RSS     AIC
## + density                 1     2.723 667.82 -1380.1
## + volatile.acidity        1     1.932 668.61 -1378.2
## + fixed.acidity           1     1.673 668.87 -1377.6
## + citric.acid             1     1.191 669.35 -1376.5
## <none>                                670.54 -1375.6
## + pH                      1     0.308 670.23 -1374.3
## + sugar.to.alcohol.ratio  1     0.164 670.38 -1374.0
## + free.sulfur.dioxide     1     0.120 670.42 -1373.9
## + residual.sugar          1     0.067 670.47 -1373.8
## - total.sulfur.dioxide    1     3.480 674.02 -1369.3
## - so2.ratio               1     4.432 674.97 -1367.1
## - chlorides               1     9.291 679.83 -1355.6
## - sulphates               1    27.986 698.52 -1312.2
## - acidity.ratio           1    61.716 732.26 -1236.8
## - alcohol                 1   129.165 799.70 -1095.9
## 
## Step:  AIC=-1380.12
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density
## 
##                          Df Sum of Sq    RSS     AIC
## + sugar.to.alcohol.ratio  1     1.775 666.04 -1382.4
## + residual.sugar          1     1.429 666.39 -1381.5
## <none>                                667.82 -1380.1
## + pH                      1     0.434 667.38 -1379.2
## + citric.acid             1     0.387 667.43 -1379.0
## + volatile.acidity        1     0.246 667.57 -1378.7
## + fixed.acidity           1     0.049 667.77 -1378.2
## + free.sulfur.dioxide     1     0.006 667.81 -1378.1
## - density                 1     2.723 670.54 -1375.6
## - so2.ratio               1     3.127 670.94 -1374.7
## - total.sulfur.dioxide    1     4.011 671.83 -1372.5
## - chlorides               1     8.886 676.70 -1361.0
## - sulphates               1    29.663 697.48 -1312.6
## - acidity.ratio           1    63.421 731.24 -1237.0
## - alcohol                 1    80.278 748.10 -1200.6
## 
## Step:  AIC=-1382.37
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio
## 
##                          Df Sum of Sq    RSS     AIC
## + residual.sugar          1     1.007 665.03 -1382.8
## <none>                                666.04 -1382.4
## + pH                      1     0.398 665.64 -1381.3
## + citric.acid             1     0.316 665.73 -1381.1
## + volatile.acidity        1     0.035 666.01 -1380.5
## + free.sulfur.dioxide     1     0.033 666.01 -1380.5
## + fixed.acidity           1     0.032 666.01 -1380.5
## - sugar.to.alcohol.ratio  1     1.775 667.82 -1380.1
## - so2.ratio               1     2.599 668.64 -1378.2
## - density                 1     4.333 670.38 -1374.0
## - total.sulfur.dioxide    1     5.278 671.32 -1371.8
## - chlorides               1     9.455 675.50 -1361.8
## - sulphates               1    31.057 697.10 -1311.5
## - acidity.ratio           1    64.911 730.95 -1235.7
## - alcohol                 1    72.350 738.39 -1219.5
## 
## Step:  AIC=-1382.79
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio + 
##     residual.sugar
## 
##                          Df Sum of Sq    RSS     AIC
## <none>                                665.03 -1382.8
## - residual.sugar          1     1.007 666.04 -1382.4
## + pH                      1     0.497 664.54 -1382.0
## - sugar.to.alcohol.ratio  1     1.353 666.39 -1381.5
## + citric.acid             1     0.239 664.80 -1381.4
## + free.sulfur.dioxide     1     0.142 664.89 -1381.1
## + volatile.acidity        1     0.031 665.00 -1380.9
## + fixed.acidity           1     0.024 665.01 -1380.8
## - so2.ratio               1     2.295 667.33 -1379.3
## - density                 1     3.681 668.72 -1376.0
## - total.sulfur.dioxide    1     5.242 670.28 -1372.2
## - chlorides               1     9.459 674.49 -1362.2
## - sulphates               1    30.456 695.49 -1313.2
## - alcohol                 1    34.064 699.10 -1304.9
## - acidity.ratio           1    65.001 730.04 -1235.7
summary(stepwise_model) 
## 
## Call:
## lm(formula = quality ~ alcohol + acidity.ratio + sulphates + 
##     chlorides + so2.ratio + total.sulfur.dioxide + density + 
##     sugar.to.alcohol.ratio + residual.sugar, data = df_new)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7845 -0.3696 -0.0547  0.4427  2.1282 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             3.955e+01  1.263e+01   3.132 0.001769 ** 
## alcohol                 2.978e-01  3.301e-02   9.022  < 2e-16 ***
## acidity.ratio          -7.943e+00  6.373e-01 -12.462  < 2e-16 ***
## sulphates               9.511e-01  1.115e-01   8.531  < 2e-16 ***
## chlorides              -1.851e+00  3.893e-01  -4.754 2.17e-06 ***
## so2.ratio               2.769e-01  1.182e-01   2.342 0.019323 *  
## total.sulfur.dioxide   -1.994e-03  5.633e-04  -3.539 0.000413 ***
## density                -3.713e+01  1.252e+01  -2.966 0.003065 ** 
## sugar.to.alcohol.ratio  1.910e+00  1.062e+00   1.798 0.072335 .  
## residual.sugar         -1.664e-01  1.072e-01  -1.552 0.120975    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6469 on 1589 degrees of freedom
## Multiple R-squared:  0.3619, Adjusted R-squared:  0.3583 
## F-statistic: 100.1 on 9 and 1589 DF,  p-value: < 2.2e-16
# AIC 
AIC(forward_model, stepwise_model) # semakin kecil lebih baik 
##                df      AIC
## forward_model  11 3156.971
## stepwise_model 11 3156.971
# melihat variabel terpilih 
formula(forward_model) 
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio + 
##     residual.sugar
formula(stepwise_model)
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio + 
##     total.sulfur.dioxide + density + sugar.to.alcohol.ratio + 
##     residual.sugar

Interpretasi Hasil Wrapper Method:

Metode Forward Selection dan Stepwise Selection (Both-directions) ternyata menghasilkan model yang persis sama. Keduanya konvergen (bermuara) pada kombinasi variabel yang sama untuk memprediksi kualitas anggur (quality).

AIC (Akaike Information Criterion) digunakan untuk mengukur kebaikan suatu model statistika. Semakin kecil nilainya, semakin baik model tersebut karena ia berhasil menyeimbangkan antara akurasi prediksi dan kesederhanaan model (tidak terlalu banyak variabel). Pada output dihasilkan forward_model dan stepwise_model sama-sama memiliki nilai AIC = 3156.971 dengan degrees of freedom (df = 11). Karena nilainya identik, maka tidak ada mdoel yang lebih superior di antara keduanya.

Dari formula yang dihasilkan, algoritma telah membuang beberapa variabel yang dianggap kurang penting dan memilih 9 prediktor utama yang paling berpengaruh secara signifikan terhadap quality, yaitu:

  • alcohol

  • acidity.ratio

  • sulphates

  • chlorides

  • so2.ratio

  • total.sulfur.dioxide

  • density

  • sugar.to.alcohol.ratio

  • residual.sugar

Variabel yang terpilih tersebut adalah kumpulan variabel yang paling kuat pengaruhnya terhadap rasa dan kualitas anggur merah dan membawa informasi yang unik (tidak saling tumpang tindih satu sama lain). Sedangkan variabel yang dieliminasi adalah variabel yang informasinya sudah diwakili oleh variabel lain, atau perannya terlalu lemah sehingga hanya akan menjadi “beban” bagi persamaan matematika model.

4.2 Embedded Method

Embedded Method dalam pemilihan fitur mengacu pada teknik di mana pemilihan fitur terjadi secara dinamis selama proses pelatihan model.

data <- df_new
x <- model.matrix(quality ~ ., data)[,-1] 
y <- data$quality 

# Random Forest 
# Membentuk Model 
set.seed(123) 
rf_model <- randomForest(quality ~ ., data = df_new, importance = TRUE) 
rf_model 
## 
## Call:
##  randomForest(formula = quality ~ ., data = df_new, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 4
## 
##           Mean of squared residuals: 0.3161762
##                     % Var explained: 51.49
# melihat feature importance 
importance(rf_model) 
##                         %IncMSE IncNodePurity
## fixed.acidity          25.75630      44.67193
## volatile.acidity       32.09775      91.75115
## citric.acid            25.99518      52.61431
## residual.sugar         18.36905      36.17733
## chlorides              24.70435      52.80013
## free.sulfur.dioxide    23.93209      39.02887
## total.sulfur.dioxide   35.92609      61.63271
## density                29.13335      68.48178
## pH                     25.75764      43.79030
## sulphates              51.97090     116.79967
## alcohol                60.84786     187.56661
## so2.ratio              31.18294      57.81719
## acidity.ratio          30.69346      97.00638
## sugar.to.alcohol.ratio 21.76535      46.26481
# visualisasi feature importance 
varImpPlot(rf_model)

Interpretasi Hasil Embedded Method:

Berdasarkan hasil variable importance, variabel yang terpilih sebagai hasil akhir feature selection adalah alcohol, sulphates, total.sulfur.dioxide, volatile.acidity, acidity.ratio, density, so2.ratio,citric.acid, pH, dan fixed.acidity. Variabel ini dipilih berdasarkan nilai %IncMSE di atas 25 yang menjadi threshold, mengingat %IncMSE merupakan metrik yang lebih andal dibandingkan IncNodePurity karena tidak bias terhadap variabel kontinu.

Sedangkan chlorides, free.sulfur.dioxide, sugar.to.alcohol.ratio, dan residual.sugar dieliminasi karena nilai %IncMSE-nya berada di bawah 25 dan kontribusinya dinilai tidak signifikan terhadap akurasi model.

5. Principal Component Analysis (PCA)

PCA (Principal Component Analysis) merupakan teknik reduksi dimensi yang bertujuan mengubah variabel-variabel yang saling berkorelasi menjadi sekumpulan komponen baru yang saling ortogonal (tidak berkorelasi). Teknik ini sangat relevan pada dataset Wine Quality karena terdapat multikolinearitas tinggi antar variabel fisikokimia, sehingga PCA dapat meringkas informasi tanpa kehilangan variansi yang signifikan.

Variabel yang digunakan sebagai input PCA merupakan hasil seleksi fitur Random Forest dari Anggota 2, yaitu 10 variabel: alcohol, sulphates, total.sulfur.dioxide, volatile.acidity, acidity.ratio, density, so2.ratio, citric.acid, pH, dan fixed.acidity.


5.1 Persiapan Data

library(ggplot2)
library(ggfortify)
# Feature Engineering
df$so2.ratio             <- as.numeric(df$free.sulfur.dioxide / df$total.sulfur.dioxide)
df$acidity.ratio         <- as.numeric(df$volatile.acidity / df$fixed.acidity)
df$sugar.to.alcohol.ratio <- as.numeric(df$residual.sugar / df$alcohol)
# Variabel terpilih dari Random Forest
selected_vars <- c("alcohol", "sulphates", "total.sulfur.dioxide",
                   "volatile.acidity", "acidity.ratio", "density",
                   "so2.ratio", "citric.acid", "pH", "fixed.acidity")

# Subset dan hapus missing value
df_pca <- df[, selected_vars]
df_pca <- na.omit(df_pca)

cat("Dimensi data untuk PCA:", dim(df_pca), "\n")
## Dimensi data untuk PCA: 1599 10
cat("Jumlah missing value  :", sum(is.na(df_pca)), "\n")
## Jumlah missing value  : 0

Data yang digunakan terdiri dari 1599 observasi dan 10 variabel hasil seleksi fitur. Tidak terdapat missing value sehingga data siap digunakan untuk PCA.


5.2 Pelaksanaan PCA

PCA dilakukan dengan opsi center = TRUE dan scale. = TRUE agar setiap variabel distandarisasi terlebih dahulu. Hal ini penting karena variabel-variabel fisikokimia memiliki satuan dan skala yang berbeda-beda.

# PCA dengan standardisasi
pca_result <- prcomp(df_pca, center = TRUE, scale. = TRUE)

# Ringkasan proporsi variansi
summary(pca_result)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6     PC7
## Standard deviation     1.9167 1.4164 1.0911 0.93172 0.86819 0.78251 0.72403
## Proportion of Variance 0.3674 0.2006 0.1191 0.08681 0.07537 0.06123 0.05242
## Cumulative Proportion  0.3674 0.5680 0.6870 0.77382 0.84920 0.91043 0.96285
##                            PC8    PC9    PC10
## Standard deviation     0.51214 0.3000 0.13857
## Proportion of Variance 0.02623 0.0090 0.00192
## Cumulative Proportion  0.98908 0.9981 1.00000
# Matriks loading
print(round(pca_result$rotation, 4))
##                          PC1     PC2     PC3     PC4     PC5     PC6     PC7
## alcohol               0.0380 -0.5316 -0.1499  0.0394  0.6578 -0.0662 -0.2759
## sulphates            -0.2055 -0.1091 -0.2504  0.9104 -0.0909 -0.0435  0.1878
## total.sulfur.dioxide -0.0026  0.3284 -0.6763 -0.0467 -0.0693  0.4210 -0.4794
## volatile.acidity      0.3332  0.3890  0.2447  0.2388  0.4271  0.1590 -0.0615
## acidity.ratio         0.4563  0.2353  0.0784  0.2117  0.2531  0.0703 -0.0058
## density              -0.2935  0.4201  0.2962  0.1702 -0.1270 -0.3071 -0.4251
## so2.ratio             0.1036 -0.4142  0.4349  0.1765 -0.3400  0.5535 -0.4079
## citric.acid          -0.4479 -0.0816 -0.1032 -0.0420  0.2058 -0.0389 -0.1941
## pH                    0.3827 -0.1514 -0.0850  0.0617 -0.2061 -0.6183 -0.4817
## fixed.acidity        -0.4394  0.1154  0.3110  0.0034  0.3020  0.0424 -0.1953
##                          PC8     PC9    PC10
## alcohol               0.2947  0.3032  0.0035
## sulphates             0.0376 -0.0854 -0.0168
## total.sulfur.dioxide  0.1260 -0.0689  0.0089
## volatile.acidity     -0.1353 -0.0789 -0.6203
## acidity.ratio        -0.2440  0.0561  0.7441
## density               0.1824  0.5414  0.0555
## so2.ratio            -0.0909  0.0288 -0.0003
## citric.acid          -0.8343  0.0472 -0.0217
## pH                   -0.1126 -0.3793 -0.0789
## fixed.acidity         0.2603 -0.6683  0.2267

5.3 Scree Plot

Scree plot digunakan untuk menentukan jumlah komponen utama (PC) yang optimal, yaitu dengan mencari titik “siku” (elbow) pada grafik atau titik di mana variansi kumulatif mencapai threshold yang ditentukan (≥ 80%).

# Hitung proporsi variansi
var_explained <- pca_result$sdev^2 / sum(pca_result$sdev^2)
cum_var       <- cumsum(var_explained)

scree_df <- data.frame(
  PC         = factor(paste0("PC", 1:length(var_explained)),
                      levels = paste0("PC", 1:length(var_explained))),
  Variance   = var_explained,
  Cumulative = cum_var
)

ggplot(scree_df, aes(x = PC, y = Variance)) +
  geom_col(fill = "#7F77DD", alpha = 0.85, width = 0.6) +
  geom_line(aes(group = 1, y = Cumulative), color = "#D85A30", linewidth = 1.1) +
  geom_point(aes(y = Cumulative), color = "#D85A30", size = 3) +
  geom_hline(yintercept = 0.80, linetype = "dashed", color = "gray50", linewidth = 0.8) +
  annotate("text", x = 9.5, y = 0.82, label = "80% threshold",
           size = 3, color = "gray40") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(
    title   = "Scree Plot dengan Cumulative Variance",
    x       = "Principal Component",
    y       = "Proporsi Variansi",
    caption = "Batang biru = variansi per PC | Garis merah = kumulatif | Garis putus-putus = threshold 80%"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.caption = element_text(size = 9, color = "gray50"))
Gambar 1. Scree Plot dengan Cumulative Variance

Gambar 1. Scree Plot dengan Cumulative Variance

Interpretasi Scree Plot:

Berdasarkan scree plot di atas, dapat diamati bahwa:

  • PC1 menjelaskan variansi terbesar yaitu 36,74%, menunjukkan bahwa komponen pertama merupakan dimensi paling informatif dalam data.
  • PC2 menambahkan 20,06%, sehingga dua komponen pertama bersama-sama mencakup 56,80% variansi total.
  • Penurunan proporsi variansi mulai melandai (elbow) setelah PC3, mengindikasikan bahwa komponen setelah PC5 memberikan kontribusi yang relatif kecil.
  • Garis kumulatif melewati threshold 80% pada PC5 (84,92%), sehingga 5 komponen utama dipilih sebagai hasil reduksi dimensi yang optimal.

5.4 Biplot PCA

Biplot menampilkan dua informasi secara bersamaan: posisi setiap observasi (titik) dan arah kontribusi setiap variabel asal (panah/vektor). Panjang panah merepresentasikan kekuatan kontribusi variabel, sedangkan sudut antar panah menunjukkan korelasi antar variabel.

# Siapkan kolom quality untuk pewarnaan
df_plot          <- df_pca
df_plot$quality  <- as.factor(df$quality[as.numeric(rownames(df_pca))])

autoplot(pca_result,
         data            = df_plot,
         colour          = "quality",
         loadings        = TRUE,
         loadings.label  = TRUE,
         loadings.label.size   = 3.5,
         loadings.colour       = "#D85A30",
         loadings.label.colour = "#993C1D",
         alpha = 0.45) +
  scale_color_brewer(palette = "RdYlGn") +
  labs(
    title  = "Biplot PCA - Wine Quality",
    color  = "Quality Score",
    x      = paste0("PC1 (", round(var_explained[1]*100, 2), "%)"),
    y      = paste0("PC2 (", round(var_explained[2]*100, 2), "%)")
  ) +
  theme_minimal(base_size = 12)
Gambar 2. Biplot PCA berdasarkan Quality Score

Gambar 2. Biplot PCA berdasarkan Quality Score

Interpretasi Biplot:

Dari biplot PC1 vs PC2 dapat dibaca beberapa pola penting:

  • Variabel acidity.ratio, volatile.acidity, dan pH memiliki vektor yang mengarah ke kanan (positif terhadap PC1), menandakan kontribusi kuat pada dimensi keasaman wine.
  • Variabel fixed.acidity dan citric.acid mengarah ke kiri (negatif terhadap PC1), berlawanan dengan kelompok keasaman volatil, mencerminkan hubungan yang saling bertolak.
  • Variabel density dan total.sulfur.dioxide mengarah ke atas (positif terhadap PC2), berkontribusi dominan pada dimensi kedua.
  • Variabel alcohol dan so2.ratio mengarah ke bawah, berlawanan dengan density, konsisten dengan temuan bahwa wine beralkohol tinggi cenderung memiliki densitas lebih rendah.
  • Titik-titik hijau tua (quality 7–8) cenderung mengelompok ke arah bawah-kiri, yaitu kawasan alcohol dan sulphates tinggi serta volatile.acidity rendah — karakteristik wine berkualitas baik.

5.5 Penentuan Jumlah PC Optimal

cat("=== RINGKASAN KEPUTUSAN PC ===\n\n")
## === RINGKASAN KEPUTUSAN PC ===
for (i in 1:length(cum_var)) {
  cat(sprintf("PC1 s/d PC%d : %.1f%% variansi tercakup\n", i, cum_var[i] * 100))
}
## PC1 s/d PC1 : 36.7% variansi tercakup
## PC1 s/d PC2 : 56.8% variansi tercakup
## PC1 s/d PC3 : 68.7% variansi tercakup
## PC1 s/d PC4 : 77.4% variansi tercakup
## PC1 s/d PC5 : 84.9% variansi tercakup
## PC1 s/d PC6 : 91.0% variansi tercakup
## PC1 s/d PC7 : 96.3% variansi tercakup
## PC1 s/d PC8 : 98.9% variansi tercakup
## PC1 s/d PC9 : 99.8% variansi tercakup
## PC1 s/d PC10 : 100.0% variansi tercakup
cat("\n→ PC yang dipilih (>= 80%):", which(cum_var >= 0.80)[1], "komponen\n")
## 
## → PC yang dipilih (>= 80%): 5 komponen

6. Kesimpulan

6.1 Makna Setiap Komponen Utama

Berdasarkan matriks loading, setiap PC dapat diinterpretasikan sebagai berikut:

Komponen Variansi Variabel Dominan Interpretasi
PC1 36,74% acidity.ratio (+0,456), pH (+0,383), fixed.acidity (−0,439), citric.acid (−0,448) Profil Keasaman Wine — mencerminkan keseimbangan antara keasaman volatil dan keasaman tetap
PC2 20,06% density (+0,420), volatile.acidity (+0,389), alcohol (−0,532), so2.ratio (−0,414) Kandungan Alkohol & Densitas — wine beralkohol tinggi cenderung ber-densitas rendah
PC3 11,91% total.sulfur.dioxide (−0,676), so2.ratio (+0,435), density (+0,296) Manajemen Sulfur Dioksida — variasi penggunaan SO₂ sebagai pengawet wine
PC4 8,68% sulphates (+0,910) Konsentrasi Sulphates — mencerminkan penambahan sulfat sebagai antioksidan
PC5 7,54% alcohol (+0,658), volatile.acidity (+0,427) Fermentasi & Volatilitas — derajat fermentasi dan pembentukan asam asetat

6.2 Keberhasilan Reduksi Dimensi

PCA berhasil mereduksi 10 variabel hasil seleksi fitur menjadi 5 komponen utama yang mampu menjelaskan 84,92% total variansi data. Hal ini berarti:

  • Terjadi pengurangan dimensi sebesar 50% (dari 10 menjadi 5 dimensi).
  • Informasi yang hilang hanya sekitar 15,08%, yang masih dalam batas toleransi analisis multivariat.
  • Reduksi ini juga sekaligus mengatasi masalah multikolinearitas yang teridentifikasi pada tahap EDA, karena komponen-komponen PCA bersifat ortogonal (tidak berkorelasi satu sama lain).

6.3 Insight Data

Dari keseluruhan analisis PCA pada dataset Wine Quality, diperoleh beberapa insight utama:

  1. Keasaman mendominasi variasi data. PC1 yang menjelaskan variansi terbesar (36,74%) sepenuhnya berkaitan dengan profil keasaman wine — baik keasaman tetap, volatil, maupun rasionya terhadap pH. Ini mengindikasikan bahwa keasaman merupakan dimensi paling membedakan karakteristik antar wine.

  2. Alkohol dan densitas saling berlawanan. PC2 menangkap hubungan invers antara kandungan alkohol dan densitas, konsisten dengan proses fermentasi di mana gula diubah menjadi alkohol sehingga menurunkan densitas larutan.

  3. Wine berkualitas tinggi memiliki profil yang khas. Dari biplot, wine dengan skor kualitas 7–8 cenderung memiliki kandungan alcohol dan sulphates yang lebih tinggi serta volatile.acidity yang lebih rendah — pola yang konsisten dengan literatur enologi.

  4. Penggunaan SO₂ bervariasi signifikan. PC3 menangkap variasi dalam manajemen sulfur dioksida, mencerminkan perbedaan praktik pengawetan antar produsen wine dalam dataset.

  5. Reduksi dimensi berhasil dan informatif. Dengan hanya 5 komponen, struktur utama data dapat dipertahankan secara efisien, menjadikan PCA sebagai langkah pra-pemrosesan yang tepat sebelum pemodelan lebih lanjut.


Referensi

Cortez, P., Cerdeira, A., Almeida, F., Matos, T., & Reis, J. (2009). Wine Quality [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C56S3T