Supervised learning mempelajari hubungan prediktor (X) dengan target (Y) yang sudah diketahui. Jika Y numerik, masalahnya disebut regresi; jika Y berupa kategori, disebut klasifikasi. Data training dipakai untuk membangun model, sedangkan data testing untuk menilai prediksi pada observasi yang tidak dipakai melatih model.
Unsupervised learning mencari pola tanpa menggunakan target Y. Salah satu contohnya adalah clustering, yaitu mengelompokkan objek yang memiliki karakteristik mirip.
| Penerapan | Target Y | Contoh metode | Hasil utama |
|---|---|---|---|
| Regresi | Numerik | Regresi linear | Prediksi nilai |
| Klasifikasi | Kategori | Pohon klasifikasi | Prediksi kelas |
| Clustering | Tidak digunakan | K-Means | Kelompok objek |
Tiga metode tersebut menjadi fondasi. Setelah itu, modul dilanjutkan dengan KNN, hierarki, PCA, dan asosiasi sebagai praktik pengayaan. Prediksi yang baik tidak otomatis membuktikan hubungan sebab-akibat.
Satu observasi adalah satu objek, misalnya satu bunga. Fitur (X) adalah karakteristik objek yang digunakan sebagai masukan. Target (Y) adalah hasil yang ingin diprediksi. Pada klasifikasi, Y berupa kategori; pada regresi, Y berupa numerik. Dataset yang sama dapat digunakan untuk supervised atau unsupervised learning, tergantung tujuan dan informasi yang dipakai.
| Pertanyaan | Pendekatan | Hasil |
|---|---|---|
| Berapa mpg mobil berdasarkan bobotnya? | Regresi | Prediksi angka |
| Bunga ini termasuk spesies apa? | Klasifikasi | Prediksi kategori |
| Bunga mana yang memiliki ukuran mirip? | Clustering | Kelompok |
| Bagaimana meringkas empat ukuran menjadi dua sumbu? | PCA | Komponen utama |
| Barang apa yang sering dibeli bersamaan? | Asosiasi | Aturan keterkaitan |
Data training digunakan untuk mempelajari model. Data validation digunakan untuk memilih pengaturan, misalnya kedalaman pohon atau jumlah tetangga. Data testing digunakan untuk mengevaluasi model setelah pemilihan selesai. Dalam contoh dasar, kita memakai training–testing dan menetapkan pengaturan sejak awal.
Holdout berarti satu kali pembagian data. Cross-validation membagi data latih menjadi beberapa lipatan, lalu bergantian memakai satu lipatan untuk validasi. Pada data deret waktu, pembagian harus memperhatikan urutan waktu, sehingga tidak cukup meniru pemisahan acak di modul ini.
Kebocoran data terjadi ketika informasi yang seharusnya belum tersedia ikut masuk ke proses pelatihan. Misalnya, standardisasi supervised learning dihitung dari gabungan data latih dan uji. Pada KNN nanti, rata-rata dan simpangan baku hanya dihitung dari data latih.
Underfitting terjadi ketika model terlalu sederhana untuk menangkap pola penting: kesalahan pada data latih dan data baru dapat sama-sama besar. Overfitting terjadi ketika model terlalu mengikuti kekhususan data latih: kesalahan latih kecil, tetapi kesalahan pada data baru lebih besar.
Pohon sangat dalam dapat menghasilkan aturan yang terlalu rinci. KNN dengan tetangga sangat sedikit dapat terlalu dipengaruhi beberapa observasi. Ini adalah kecenderungan, bukan jaminan bahwa suatu pengaturan selalu buruk. Kinerja perlu diperiksa melalui validasi.
| Metode | Gagasan utama |
|---|---|
| Naive Bayes | Membandingkan peluang kelas dengan asumsi kebebasan fitur bersyarat pada kelas |
| Regresi logistik | Memodelkan peluang kelas sebelum menetapkan keputusan kelas |
| Bagging | Menggabungkan model yang dibangun dari sampel bootstrap |
| Random Forest | Menggabungkan banyak pohon dengan variasi sampel dan fitur |
| Boosting | Membangun model secara bertahap untuk memperbaiki hasil sebelumnya |
| DBSCAN | Mencari kelompok berdasarkan kepadatan dan dapat menandai noise |
| Apriori | Mencari kombinasi item yang sering muncul untuk membentuk aturan asosiasi |
Metode-metode ini dikenali tujuannya terlebih dahulu. Praktik tambahan di bawah berfokus pada KNN, hierarki, PCA, dan ukuran asosiasi agar cakupan lebih luas tanpa terlalu banyak instalasi paket.
Regresi linear sederhana memodelkan hubungan satu X dengan Y numerik
menggunakan garis lurus. Kita memprediksi efisiensi bahan bakar mobil
(mpg, mil per galon) berdasarkan bobot mobil
(wt, dalam 1.000 pon) pada data mtcars.
Nilai mpg lebih besar berarti mobil menempuh jarak lebih jauh per
galon.
## mpg wt
## Mazda RX4 21.0 2.620
## Mazda RX4 Wag 21.0 2.875
## Datsun 710 22.8 2.320
## Hornet 4 Drive 21.4 3.215
## Hornet Sportabout 18.7 3.440
## Valiant 18.1 3.460
# Angka acak dibuat tetap agar hasil dapat diulang
set.seed(123)
id_latih <- sample(seq_len(nrow(mtcars)), size = 24)
latih_reg <- mtcars[id_latih, ]
uji_reg <- mtcars[-id_latih, ]
c(latih = nrow(latih_reg), uji = nrow(uji_reg))## latih uji
## 24 8
Cara membaca: terdapat 24 mobil untuk pelatihan dan 8 mobil untuk pengujian. Setiap baris merupakan satu mobil. Pemisahan acak ini digunakan untuk contoh data nonderet waktu.
## (Intercept) wt
## 38.294 -5.644
plot(latih_reg$wt, latih_reg$mpg, pch = 19, col = "#2878A0",
xlab = "Bobot mobil (1.000 pon)", ylab = "Efisiensi (mpg)",
main = "Hubungan bobot dan efisiensi bahan bakar")
abline(model_reg, col = "#D95F02", lwd = 2)Pengertian sintaks: mpg ~ wt berarti
mpg dijelaskan oleh wt. Fungsi lm() membentuk model pada
data latih; coef() menampilkan intersep dan koefisien
bobot.
Interpretasi hasil: koefisien wt adalah -5.64. Setiap kenaikan bobot 1.000 pon berkaitan dengan perubahan prediksi mpg sebesar nilai tersebut. Tanda negatif berarti prediksi mpg menurun ketika bobot meningkat. Intersep adalah prediksi pada bobot nol; karena bobot nol tidak realistis untuk mobil, intersep tidak perlu diberi makna praktis.
pred_reg <- predict(model_reg, newdata = uji_reg)
head(data.frame(Aktual = uji_reg$mpg, Prediksi = pred_reg))## Aktual Prediksi
## Mazda RX4 Wag 21.0 22.069
## Valiant 18.1 18.767
## Merc 450SE 16.4 15.324
## Merc 450SL 17.3 17.243
## Lincoln Continental 10.4 7.683
## Toyota Corona 21.5 24.383
mae <- mean(abs(uji_reg$mpg - pred_reg))
rmse <- sqrt(mean((uji_reg$mpg - pred_reg)^2))
data.frame(MAE = mae, RMSE = rmse)## MAE RMSE
## 1 1.8 2.129
Interpretasi hasil: MAE sebesar 1.8 mpg berarti rata-rata besar kesalahan prediksi pada data uji adalah sekitar nilai tersebut. RMSE sebesar 2.13 mpg memberi penalti lebih besar pada kesalahan yang besar. Keduanya semakin kecil semakin baik jika dibandingkan pada target dan data uji yang sama. Nilai ini hanya berasal dari satu pembagian data kecil, sehingga bukan jaminan kinerja pada semua mobil.
Pohon klasifikasi memprediksi kategori melalui serangkaian aturan,
misalnya “apakah panjang mahkota kurang dari suatu batas?”. Gunakan data
iris: 150 bunga dengan empat ukuran dalam cm dan tiga
spesies. Target Y adalah Species; prediktornya adalah
panjang dan lebar kelopak (sepal) serta mahkota
(petal).
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
##
## setosa versicolor virginica
## 50 50 50
# Ambil 35 bunga dari setiap spesies untuk data latih
set.seed(123)
id_latih_iris <- unlist(lapply(
split(seq_len(nrow(iris)), iris$Species),
function(i) sample(i, size = 35)
))
latih_iris <- iris[id_latih_iris, ]
uji_iris <- iris[-id_latih_iris, ]
table(latih_iris$Species)##
## setosa versicolor virginica
## 35 35 35
##
## setosa versicolor virginica
## 15 15 15
Cara membaca: setiap spesies memiliki 35 bunga latih dan 15 bunga uji. Pembagian per kelas menjaga agar semua spesies terwakili.
model_pohon <- rpart(
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
data = latih_iris,
method = "class",
control = rpart.control(maxdepth = 3, cp = 0.01)
)
plot(model_pohon, uniform = TRUE, margin = 0.15)
text(model_pohon, use.n = TRUE, all = TRUE, cex = 0.8)Pengertian sintaks: method = "class"
membentuk pohon klasifikasi; maxdepth = 3 membatasi
kedalaman agar aturan mudah dibaca. Implementasi rpart
secara default menggunakan indeks Gini untuk pemisahan klasifikasi; ini
merupakan alternatif kriteria pemisahan yang dikenalkan dalam materi
dosen.
Cara interpretasi: mulai dari simpul paling atas. Jika kondisi pemisah terpenuhi, ikuti cabang kiri; jika tidak, ikuti cabang kanan. Lanjutkan sampai daun terakhir. Nama spesies pada daun adalah prediksi kelas. Variabel yang muncul pada pohon digunakan untuk membuat aturan pada model ini; variabel yang tidak muncul belum tentu tidak berguna dalam semua kondisi.
pred_kelas <- predict(model_pohon, newdata = uji_iris, type = "class")
cm <- table(Aktual = uji_iris$Species, Prediksi = pred_kelas)
cm## Prediksi
## Aktual setosa versicolor virginica
## setosa 15 0 0
## versicolor 0 14 1
## virginica 0 2 13
akurasi <- mean(pred_kelas == uji_iris$Species)
benar <- sum(diag(cm))
recall <- diag(cm) / rowSums(cm)
data.frame(Spesies = names(recall), Recall = as.numeric(recall))## Spesies Recall
## 1 setosa 1.0000
## 2 versicolor 0.9333
## 3 virginica 0.8667
## Akurasi: 93.33 %
Interpretasi hasil: baris menunjukkan kelas aktual dan kolom menunjukkan kelas prediksi. Angka diagonal adalah prediksi benar; angka di luar diagonal adalah kesalahan. Model mengklasifikasikan 42 dari 45 bunga dengan benar, sehingga akurasinya 93.33%.
Recall per spesies menunjukkan proporsi bunga dari spesies tersebut yang berhasil dikenali. Misalnya, recall 0,80 berarti 80% bunga aktual dari spesies itu terklasifikasi dengan benar. Akurasi saja dapat menyesatkan jika jumlah anggota kelas sangat tidak seimbang. Data uji digunakan untuk evaluasi akhir, bukan untuk memilih model berulang kali.
K-Means membagi data menjadi K kelompok berdasarkan kedekatan terhadap pusat kelompok (centroid). Kita memakai empat ukuran bunga iris, tanpa memasukkan Species. Tujuannya mencari kelompok bunga dengan ukuran mirip, bukan melatih prediksi spesies.
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] -0.8977 1.01560 -1.336 -1.311
## [2,] -1.1392 -0.13154 -1.336 -1.311
## [3,] -1.3807 0.32732 -1.392 -1.311
## [4,] -1.5015 0.09789 -1.279 -1.311
## [5,] -1.0184 1.24503 -1.336 -1.311
## [6,] -0.5354 1.93331 -1.166 -1.049
Pengertian sintaks: scale() mengubah
setiap variabel menjadi skor standar dengan rata-rata sekitar nol dan
simpangan baku satu. Walaupun satuannya sama, variasi ukuran bunga
berbeda; standardisasi membantu agar variabel dengan variasi besar tidak
otomatis mendominasi jarak.
## Cluster
## 1 2 3
## 50 53 47
# Profil kelompok ditampilkan kembali dalam satuan asli (cm)
profil <- aggregate(x, by = list(Cluster = km$cluster), FUN = mean)
round(profil, 2)## Cluster Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 1 5.01 3.43 1.46 0.25
## 2 2 5.80 2.67 4.37 1.41
## 3 3 6.78 3.10 5.51 1.97
warna <- c("#2878A0", "#D95F02", "#4D9221")
plot(x$Petal.Length, x$Petal.Width,
col = warna[km$cluster], pch = 19,
xlab = "Panjang mahkota (cm)", ylab = "Lebar mahkota (cm)",
main = "Kelompok hasil K-Means")
legend("topleft", legend = paste("Cluster", 1:3),
col = warna, pch = 19, bty = "n")Pengertian sintaks: centers = 3
menetapkan tiga kelompok untuk demonstrasi, bukan membuktikan bahwa tiga
adalah jumlah terbaik. nstart = 25 mencoba 25 inisialisasi
dan memilih hasil dengan jumlah kuadrat jarak dalam kelompok terkecil di
antara percobaan tersebut.
Interpretasi hasil: tabel frekuensi menunjukkan jumlah bunga pada setiap kelompok. Tabel profil menunjukkan rata-rata ukuran dalam cm. Cluster 3 memiliki rata-rata mahkota terpanjang, sedangkan cluster 1 memiliki rata-rata mahkota terpendek.
Nomor cluster hanyalah penanda, bukan urutan kualitas atau nama spesies. Grafik menampilkan dua dari empat variabel, sehingga titik yang berdekatan di grafik belum tentu sangat dekat dalam seluruh variabel. Berbeda dari contoh klasifikasi, warna di sini berasal dari kelompok yang ditemukan algoritma. Kita tidak menghitung akurasi langsung dari kesamaan nomor cluster dengan label spesies.
summary() menampilkan koefisien dan kecocokan pada data
latih. Perhatikan bahwa kecocokan data latih berbeda dari kemampuan
memprediksi data baru.
##
## Call:
## lm(formula = mpg ~ wt, data = latih_reg)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.604 -2.613 -0.198 1.372 6.571
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 38.294 2.292 16.71 5.5e-14 ***
## wt -5.644 0.717 -7.87 7.7e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.34 on 22 degrees of freedom
## Multiple R-squared: 0.738, Adjusted R-squared: 0.726
## F-statistic: 61.9 on 1 and 22 DF, p-value: 7.73e-08
| Keluaran | Cara membaca |
|---|---|
| Estimate | Intersep dan koefisien prediktor |
| Std. Error | Ketidakpastian estimasi koefisien dalam kerangka model |
| Pr(> | t |
| Multiple R-squared | Proporsi keragaman Y latih yang dijelaskan model |
| Residual standard error | Penyebaran residual data latih |
Interpretasi: R² latih sebesar 0.738 menunjukkan proporsi keragaman mpg latih yang dijelaskan hubungan linear dengan wt. R² bukan persentase prediksi benar. Nilai p kecil juga tidak otomatis berarti prediksi data baru akurat atau hubungannya kausal.
Inferensi regresi memerlukan perhatian terhadap bentuk hubungan, independensi, dan keragaman galat. Normalitas galat mendukung pengujian dan interval pada sampel kecil; bukan berarti semua X harus normal.
plot(uji_reg$mpg, pred_reg, pch = 19, col = '#2878A0',
xlab = 'mpg aktual', ylab = 'mpg prediksi',
main = 'Prediksi pada data uji')
abline(a = 0, b = 1, lty = 2, col = '#D95F02')Interpretasi: garis putus-putus menunjukkan prediksi sama dengan aktual. Titik di atas garis berarti prediksi terlalu tinggi; di bawah garis berarti terlalu rendah. Semakin dekat ke garis, semakin kecil kesalahannya.
## fit lwr upr
## 1 21.36 14.3 28.42
Interpretasi: wt = 3 berarti bobot 3.000 pon. Kolom
fit adalah prediksi mpg; lwr dan
upr membatasi interval prediksi 95% default untuk satu
mobil baru, dengan asumsi model. Interval prediksi berbeda dari interval
kepercayaan rata-rata respons. Hindari mengekstrapolasi jauh di luar
rentang bobot data latih.
KNN memprediksi kelas berdasarkan kelas mayoritas K tetangga terdekat pada data latih. Untuk K = 5, ukuran bunga baru dibandingkan dengan lima bunga latih terdekat. KNN menyimpan data latih dan membuat keputusan ketika diminta memprediksi.
Kita menggunakan kembali pembagian iris sebelumnya. Paket
class biasanya tersedia bersama R; jika belum, instal
melalui Console.
x_latih <- latih_iris[, 1:4]
x_uji <- uji_iris[, 1:4]
rata_latih <- sapply(x_latih, mean)
sd_latih <- sapply(x_latih, sd)
x_latih_z <- scale(x_latih, center = rata_latih, scale = sd_latih)
x_uji_z <- scale(x_uji, center = rata_latih, scale = sd_latih)
round(head(x_latih_z), 2)## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 31 -1.24 0.14 -1.23 -1.30
## 15 -0.07 2.34 -1.45 -1.30
## 14 -1.83 -0.10 -1.51 -1.42
## 3 -1.36 0.39 -1.39 -1.30
## 42 -1.60 -1.82 -1.39 -1.17
## 43 -1.71 0.39 -1.39 -1.30
Penjelasan: sapply() menghitung
ringkasan setiap kolom. Data uji ditransformasikan dengan rata-rata dan
simpangan baku dari data latih. Nilai standar −1 berarti satu simpangan
baku di bawah rata-rata latih, bukan ukuran bunga negatif dalam cm.
Standardisasi membantu mencegah variabel dengan variasi besar
mendominasi jarak.
set.seed(123)
pred_knn <- class::knn(train = x_latih_z, test = x_uji_z,
cl = latih_iris$Species, k = 5)
table(Aktual = uji_iris$Species, Prediksi = pred_knn)## Prediksi
## Aktual setosa versicolor virginica
## setosa 15 0 0
## versicolor 0 14 1
## virginica 0 2 13
akurasi_knn <- mean(pred_knn == uji_iris$Species)
data.frame(Model = c('Pohon klasifikasi', 'KNN (k = 5)'),
Akurasi_persen = 100 * c(akurasi, akurasi_knn))## Model Akurasi_persen
## 1 Pohon klasifikasi 93.33
## 2 KNN (k = 5) 93.33
Pengertian sintaks: train adalah X
latih, test adalah X uji, cl adalah kelas
latih, dan k jumlah tetangga.
Interpretasi: akurasi KNN adalah 93.33%. Baca angka di luar diagonal untuk mengetahui spesies yang tertukar. Perbandingan dengan pohon berlaku pada pembagian data ini; tidak membuktikan satu metode selalu unggul. Pengaturan K = 5 ditetapkan untuk contoh, bukan dipilih dengan melihat hasil testing.
Agar data uji tidak dipakai untuk memilih K, buat satu pembagian validasi di dalam data latih. Contoh berikut memperlihatkan alurnya; hasil satu holdout dapat berubah jika pembagiannya berubah.
set.seed(456)
id_sub <- unlist(lapply(split(seq_len(nrow(latih_iris)), latih_iris$Species),
function(i) sample(i, 25)))
sub_latih <- latih_iris[id_sub, ]
validasi <- latih_iris[-id_sub, ]
pusat <- sapply(sub_latih[, 1:4], mean)
skala <- sapply(sub_latih[, 1:4], sd)
a <- scale(sub_latih[, 1:4], center = pusat, scale = skala)
b <- scale(validasi[, 1:4], center = pusat, scale = skala)
k_calon_knn <- c(3, 5, 7, 9)
set.seed(456)
akurasi_validasi <- sapply(k_calon_knn, function(k) {
p <- class::knn(a, b, cl = sub_latih$Species, k = k)
mean(p == validasi$Species)
})
data.frame(K = k_calon_knn, Akurasi_validasi = akurasi_validasi)## K Akurasi_validasi
## 1 3 0.9667
## 2 5 0.9667
## 3 7 0.9667
## 4 9 0.9667
## [1] 3
Interpretasi: K yang dipilih adalah 3, berdasarkan akurasi validasi terbesar. Jika seri, kode memilih kandidat pertama. Setelah pemilihan, model final menggunakan seluruh data latih dengan transformasi latih, lalu diuji sekali. Dalam praktik penelitian, validasi silang dapat memberikan gambaran lebih stabil. Jangan mengubah kandidat berulang kali hanya untuk mengejar hasil testing.
Tentukan kelas positif terlebih dahulu. Contoh dari slide menggunakan positif = cancer yes; di sini digunakan hanya sebagai latihan perhitungan ukuran evaluasi.
| Istilah | Makna |
|---|---|
| TP | Aktual positif, diprediksi positif |
| TN | Aktual negatif, diprediksi negatif |
| FP | Aktual negatif, diprediksi positif |
| FN | Aktual positif, diprediksi negatif |
TP <- 90; FN <- 210; FP <- 140; TN <- 9560
matrix(c(TP, FN, FP, TN), nrow = 2, byrow = TRUE,
dimnames = list(Aktual = c('Yes', 'No'), Prediksi = c('Yes', 'No')))## Prediksi
## Aktual Yes No
## Yes 90 210
## No 140 9560
accuracy <- (TP + TN) / (TP + TN + FP + FN)
recall_biner <- TP / (TP + FN)
specificity <- TN / (TN + FP)
precision <- TP / (TP + FP)
f1 <- 2 * precision * recall_biner / (precision + recall_biner)
round(100 * c(Accuracy = accuracy, Error_rate = 1 - accuracy,
Recall = recall_biner, Specificity = specificity,
Precision = precision, F1 = f1), 2)## Accuracy Error_rate Recall Specificity Precision F1
## 96.50 3.50 30.00 98.56 39.13 33.96
Interpretasi: accuracy 96,50% berarti sebagian besar observasi diprediksi benar. Namun recall hanya 30%: 70% kasus positif aktual terlewat. Specificity 98,56% menunjukkan kasus negatif banyak dikenali dengan benar. Precision 39,13% berarti dari semua prediksi positif, hanya sekitar 39,13% benar-benar positif. F1 sekitar 33,96% merangkum precision dan recall melalui rata-rata harmonik.
Jika semua observasi diprediksi negatif, akurasi justru 97%, tetapi recall positif nol. Ini menunjukkan mengapa akurasi tinggi dapat menyesatkan pada kelas tidak seimbang.
Diskusi: ketika tujuan utama menemukan kasus positif, recall perlu diperhatikan, sambil tetap mempertimbangkan konsekuensi FP dan precision. Pada klasifikasi tiga spesies, ukuran biner dapat dihitung untuk setiap spesies dengan menganggap spesies lain sebagai bukan kelas tersebut.
Elbow melihat perubahan within-cluster sum of squares (WSS), yaitu jumlah kuadrat jarak objek terhadap pusat kelompoknya. WSS menurun ketika kelompok bertambah, tetapi penurunan yang semakin kecil menunjukkan tambahan kelompok mulai memberi manfaat lebih kecil.
set.seed(123)
k_calon <- 1:6
wss <- sapply(k_calon, function(k) {
kmeans(x_standar, centers = k, nstart = 25)$tot.withinss
})
plot(k_calon, wss, type = 'b', pch = 19, col = '#2878A0',
xlab = 'Jumlah cluster (K)', ylab = 'WSS', main = 'Metode elbow')Interpretasi: cari perubahan dari penurunan tajam menjadi landai. Bagian tersebut menjadi kandidat K. Jangan memilih K terbesar hanya karena WSS paling kecil. Siku bisa tidak jelas; pemilihan perlu mempertimbangkan profil dan tujuan pengelompokan.
Silhouette membandingkan kedekatan objek dengan kelompoknya sendiri dan kelompok lain. Nilainya berkisar −1 sampai 1.
sil <- cluster::silhouette(km$cluster, dist(x_standar))
plot(sil, col = warna, border = NA, main = 'Silhouette K-Means')## [1] 0.4599
Interpretasi: rata-rata silhouette 0.46 merangkum pemisahan kelompok. Nilai mendekati 1 menunjukkan objek lebih dekat dengan kelompok sendiri; sekitar 0 menunjukkan posisi dekat batas; nilai negatif menunjukkan kedekatan rata-rata yang lebih besar dengan kelompok lain. Jangan langsung memberi label baik/buruk berdasarkan satu ambang tanpa melihat struktur data.
Hierarchical clustering membentuk struktur kelompok bertingkat. Pendekatan agglomerative dimulai dari setiap objek sebagai satu kelompok, lalu menggabungkan kelompok secara bertahap. Hasilnya divisualisasikan sebagai dendrogram. Kita dapat melihat susunan penggabungan sebelum menentukan potongan jumlah kelompok.
jarak <- dist(x_standar, method = 'euclidean')
hc <- hclust(jarak, method = 'ward.D2')
plot(hc, labels = FALSE, hang = -1,
main = 'Dendrogram bunga iris', xlab = 'Objek bunga', sub = '')
rect.hclust(hc, k = 3, border = c('#2878A0', '#D95F02', '#4D9221'))## Cluster
## 1 2 3
## 49 30 71
## Cluster Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 1 5.02 3.45 1.47 0.24
## 2 2 5.53 2.57 3.93 1.21
## 3 3 6.55 2.99 5.27 1.85
Pengertian sintaks: dist() menghitung
jarak, hclust() membentuk hierarki, ward.D2
menggunakan kriteria Ward dengan jarak Euclidean, dan
cutree() memotong hierarki menjadi tiga kelompok.
Interpretasi: objek yang bergabung pada ketinggian lebih rendah lebih mirip menurut proses penggabungan. Sumbu vertikal adalah tinggi penggabungan sesuai metode, bukan akurasi. Kotak menunjukkan tiga kelompok hasil pemotongan. Jelaskan karakteristik kelompok melalui tabel rata-rata ukuran. Posisi kiri–kanan daun bukan peringkat objek.
## Hierarki
## KMeans 1 2 3
## 1 49 1 0
## 2 0 29 24
## 3 0 0 47
Interpretasi: tabel silang menunjukkan jumlah bunga pada kombinasi kelompok dua metode. Nomor cluster bersifat arbitrer; cluster 1 pada K-Means tidak harus sama dengan cluster 1 pada hierarki. Ini bukan confusion matrix terhadap label kebenaran.
PCA merangkum variabel numerik menjadi komponen utama, yaitu kombinasi linear variabel awal. PC1 menangkap keragaman terbesar. PC2 menangkap keragaman terbesar berikutnya dengan arah ortogonal terhadap PC1. Komponen yang dihasilkan saling tidak berkorelasi pada data analisis.
Tujuan contoh ini adalah merangkum empat ukuran bunga menjadi dua sumbu untuk visualisasi. PCA tidak secara otomatis menghasilkan cluster atau memprediksi spesies.
pca <- prcomp(x, center = TRUE, scale. = TRUE)
proporsi <- pca$sdev^2 / sum(pca$sdev^2)
tabel_pca <- data.frame(
Komponen = paste0('PC', seq_along(proporsi)),
Persen_keragaman = 100 * proporsi,
Kumulatif_persen = 100 * cumsum(proporsi))
knitr::kable(tabel_pca, digits = 2)| Komponen | Persen_keragaman | Kumulatif_persen |
|---|---|---|
| PC1 | 72.96 | 72.96 |
| PC2 | 22.85 | 95.81 |
| PC3 | 3.67 | 99.48 |
| PC4 | 0.52 | 100.00 |
barplot(100 * proporsi, names.arg = tabel_pca$Komponen,
col = '#2878A0', xlab = 'Komponen', ylab = 'Keragaman (%)',
main = 'Keragaman setiap komponen')Penjelasan: center = TRUE memusatkan
data; scale. = TRUE menstandardisasi variabel. Kuadrat
sdev adalah keragaman komponen.
Interpretasi: PC1 menjelaskan 72.96% keragaman data standar. PC1 dan PC2 bersama menjelaskan 95.81%. Ini adalah persentase keragaman yang dipertahankan, bukan akurasi klasifikasi. Sebagian informasi tetap ada pada komponen berikutnya.
## PC1 PC2
## Sepal.Length 0.521 -0.377
## Sepal.Width -0.269 -0.923
## Petal.Length 0.580 -0.024
## Petal.Width 0.565 -0.067
## PC1 PC2
## [1,] -2.257 -0.478
## [2,] -2.074 0.672
## [3,] -2.356 0.341
## [4,] -2.292 0.595
## [5,] -2.382 -0.645
## [6,] -2.069 -1.484
plot(pca$x[, 1], pca$x[, 2], pch = 19, col = '#2878A0',
xlab = paste0('PC1 (', round(100 * proporsi[1], 1), '%)'),
ylab = paste0('PC2 (', round(100 * proporsi[2], 1), '%)'),
main = 'Peta skor PCA')
abline(h = 0, v = 0, lty = 3, col = 'grey70')Interpretasi: rotation berisi
koefisien/loading komponen. Pada komponen yang sama, nilai absolut lebih
besar menunjukkan bobot lebih besar dalam kombinasi variabel standar.
Tanda menunjukkan arah terhadap sumbu; seluruh tanda satu komponen dapat
berbalik tanpa mengubah makna geometrisnya.
pca$x adalah skor setiap bunga pada sumbu baru. Titik
berdekatan memiliki representasi mirip pada dua komponen tersebut,
tetapi tidak harus identik pada semua dimensi. Sumbu PC tidak bersatuan
cm. PCA digunakan untuk merangkum keragaman, bukan membuktikan jumlah
kelompok.
Aturan asosiasi mencari item yang sering muncul bersama. Roti → Susu dibaca: transaksi berisi roti cenderung juga memuat susu. Panah bukan urutan waktu atau bukti sebab-akibat.
Kita menghitung satu aturan langsung pada 10 transaksi simulasi. Ini bukan implementasi Apriori lengkap. Apriori dipakai ketika ingin menambang banyak kandidat aturan secara efisien.
transaksi <- data.frame(
ID = 1:10,
Roti = c(1,1,1,1,1,1,0,0,0,0),
Susu = c(1,1,1,1,0,0,1,0,0,0),
Telur = c(0,1,0,1,1,0,1,1,0,1))
transaksi## ID Roti Susu Telur
## 1 1 1 1 0
## 2 2 1 1 1
## 3 3 1 1 0
## 4 4 1 1 1
## 5 5 1 0 1
## 6 6 1 0 0
## 7 7 0 1 1
## 8 8 0 0 1
## 9 9 0 0 0
## 10 10 0 0 1
p_roti <- mean(transaksi$Roti == 1)
p_susu <- mean(transaksi$Susu == 1)
support <- mean(transaksi$Roti == 1 & transaksi$Susu == 1)
confidence <- support / p_roti
lift <- confidence / p_susu
data.frame(Aturan = 'Roti -> Susu', Support = support,
Confidence = confidence, Lift = lift)## Aturan Support Confidence Lift
## 1 Roti -> Susu 0.4 0.6667 1.333
Penjelasan: 1 berarti item ada, 0 berarti tidak ada.
& memeriksa dua kondisi sekaligus. Rata-rata kondisi
logis memberikan proporsi transaksi yang memenuhi kondisi.
| Ukuran | Rumus | Makna |
|---|---|---|
| Support | P(Roti dan Susu) | Proporsi seluruh transaksi yang memuat keduanya |
| Confidence | P(Susu diberikan Roti) | Proporsi transaksi berisi roti yang juga memuat susu |
| Lift | Confidence / P(Susu) | Keterkaitan dibandingkan kondisi independen |
Interpretasi: support 0,40 berarti 4 dari 10 transaksi memuat kedua item. Confidence sekitar 0,667 berarti 4 dari 6 transaksi roti juga memuat susu. Lift sekitar 1,333 berarti peluang susu pada transaksi roti adalah 1,333 kali peluang susu secara keseluruhan.
Lift > 1 menunjukkan asosiasi positif pada data ini; lift = 1 sesuai independensi; lift < 1 menunjukkan kemunculan bersama lebih rendah daripada yang diharapkan jika independen. Data kecil yang disusun untuk belajar ini bukan bukti pola belanja populasi. Confidence Roti → Susu tidak harus sama dengan Susu → Roti.
## [1] 2
| Metode | Menggunakan Y? | Keluaran | Fokus interpretasi |
|---|---|---|---|
| Regresi linear | Ya, numerik | Prediksi angka | Arah hubungan dan galat prediksi |
| Pohon klasifikasi | Ya, kategori | Aturan dan kelas | Jalur pohon, confusion matrix, recall |
| KNN | Ya, kategori pada contoh | Kelas dari tetangga | Skala fitur, K, kinerja data baru |
| K-Means | Tidak | Kelompok dan pusat | Profil, WSS, silhouette |
| Hierarki | Tidak | Dendrogram | Tinggi penggabungan dan potongan kelompok |
| PCA | Tidak | Skor dan loading | Keragaman yang dipertahankan |
| Asosiasi | Tidak memakai target prediksi | Aturan item | Support, confidence, lift |
Ketepatan interpretasi lebih penting daripada banyaknya fungsi yang dijalankan. Selalu sebutkan data yang dinilai, arti ukuran yang digunakan, dan batas kesimpulannya.
Sumber materi: K10 — Supervised &
Unsupervised Learning, STA1381 Pengantar Sains Data, Anang Kurnia,
Cici Suhaeni, dan Septian Rahardiantoro (2026). Contoh praktik
disederhanakan dari cakupan materi kuliah. Dokumentasi fungsi dapat
dibuka melalui ?lm, ?rpart,
?kmeans, ?mtcars, dan ?iris.