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.
# 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
## Baris: 1599 Kolom: 12
## [1] "fixed.acidity" "volatile.acidity" "citric.acid"
## [4] "residual.sugar" "chlorides" "free.sulfur.dioxide"
## [7] "total.sulfur.dioxide" "density" "pH"
## [10] "sulphates" "alcohol" "quality"
## 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
## Jumlah missing per kolom:
## 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
##
## Total missing value: 0
Hasil analisis menunjukkan bahwa seluruh variabel memiliki jumlah missing value sebesar 0, baik pada variabel fisikokimia maupun variabel kualitas (quality)
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
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
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
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()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
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).
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.
## Matriks Korelasi:
## 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
##
## Korelasi tiap variabel terhadap 'quality':
## 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)
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
## Nilai VIF:
## 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
##
## Keterangan: VIF < 5 = aman, 5-10 = perhatian, > 10 = bermasalah
##
## 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)
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
Variabel Prediktor Berstatus “Normal” (VIF < 5)
Sembilan variabel prediktor lainnya berada di zona aman dengan nilai VIF di bawah 5
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
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:
## 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)
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
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).
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).
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.
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.
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
##
## 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
##
## 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
## df AIC
## forward_model 11 3156.971
## stepwise_model 11 3156.971
## quality ~ alcohol + acidity.ratio + sulphates + chlorides + so2.ratio +
## total.sulfur.dioxide + density + sugar.to.alcohol.ratio +
## residual.sugar
## 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.
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
## %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
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.
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.
# 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
## 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.
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
## 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
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
Interpretasi Scree Plot:
Berdasarkan scree plot di atas, dapat diamati bahwa:
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
Interpretasi Biplot:
Dari biplot PC1 vs PC2 dapat dibaca beberapa pola penting:
acidity.ratio,
volatile.acidity, dan pH memiliki
vektor yang mengarah ke kanan (positif terhadap PC1), menandakan
kontribusi kuat pada dimensi keasaman wine.fixed.acidity dan
citric.acid mengarah ke kiri (negatif terhadap
PC1), berlawanan dengan kelompok keasaman volatil, mencerminkan hubungan
yang saling bertolak.density dan
total.sulfur.dioxide mengarah ke atas (positif
terhadap PC2), berkontribusi dominan pada dimensi kedua.alcohol dan
so2.ratio mengarah ke bawah, berlawanan dengan
density, konsisten dengan temuan bahwa wine beralkohol
tinggi cenderung memiliki densitas lebih rendah.alcohol dan
sulphates tinggi serta volatile.acidity rendah
— karakteristik wine berkualitas baik.## === 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
##
## → PC yang dipilih (>= 80%): 5 komponen
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 |
PCA berhasil mereduksi 10 variabel hasil seleksi fitur menjadi 5 komponen utama yang mampu menjelaskan 84,92% total variansi data. Hal ini berarti:
Dari keseluruhan analisis PCA pada dataset Wine Quality, diperoleh beberapa insight utama:
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.
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.
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.
Penggunaan SO₂ bervariasi signifikan. PC3 menangkap variasi dalam manajemen sulfur dioksida, mencerminkan perbedaan praktik pengawetan antar produsen wine dalam dataset.
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.
Cortez, P., Cerdeira, A., Almeida, F., Matos, T., & Reis, J. (2009). Wine Quality [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C56S3T