Laporan ini disusun untuk memenuhi tugas mata kuliah Statistical Machine Learning (SML). Pada tugas ini digunakan salah satu dataset dari UCI Machine Learning Repository untuk penerapan metode clustering dengan output berupa HTML atau PDF.
Dataset yang digunakan adalah Wholesale Customers Dataset yang diperoleh dari UCI Machine Learning Repository. Analisis dilakukan menggunakan metode K-Means Clustering dengan tahapan preprocessing berupa scaling data. Penentuan jumlah cluster optimal dilakukan menggunakan Elbow Method, kemudian hasilnya dievaluasi menggunakan Silhouette Analysis.
Dataset yang digunakan pada project ini adalah Wholesale Customers Dataset yang bersumber dari UCI Machine Learning Repository. Dataset tersebut dapat diakses secara publik melalui tautan berikut:
https://archive.ics.uci.edu/dataset/292/wholesale+customers
Dataset ini berisi data pengeluaran tahunan pelanggan distributor grosir pada beberapa kategori produk, sehingga sesuai untuk diterapkan metode clustering dalam mengelompokkan pelanggan berdasarkan pola pembeliannya.
| Atribut | Keterangan |
|---|---|
| Nama Dataset | Wholesale Customers Dataset |
| Sumber | UCI Machine Learning Repository |
| Jumlah Observasi | 440 baris |
| Jumlah Variabel | 8 kolom |
Variabel ini tidak digunakan dalam proses clustering karena metode K-Means hanya bekerja pada data numerik.
Variabel-variabel tersebut menunjukkan pengeluaran tahunan pelanggan pada masing-masing kategori produk.
# Import dataset Wholesale Customers dari file lokal
data <- read_excel("D:/downloads/tugas sml per 13 (projeck)/Wholesale Customers Dataset.xlsx")
# Menampilkan data awal
head(data)## # A tibble: 6 × 8
## Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 3 12669 9656 7561 214 2674 1338
## 2 2 3 7057 9810 9568 1762 3293 1776
## 3 2 3 6353 8808 7684 2405 3516 7844
## 4 1 3 13265 1196 4221 6404 507 1788
## 5 2 3 22615 5410 7198 3915 1777 5185
## 6 2 3 9413 8259 5126 666 1795 1451
## tibble [440 × 8] (S3: tbl_df/tbl/data.frame)
## $ Channel : num [1:440] 2 2 2 1 2 2 2 2 1 2 ...
## $ Region : num [1:440] 3 3 3 3 3 3 3 3 3 3 ...
## $ Fresh : num [1:440] 12669 7057 6353 13265 22615 ...
## $ Milk : num [1:440] 9656 9810 8808 1196 5410 ...
## $ Grocery : num [1:440] 7561 9568 7684 4221 7198 ...
## $ Frozen : num [1:440] 214 1762 2405 6404 3915 ...
## $ Detergents_Paper: num [1:440] 2674 3293 3516 507 1777 ...
## $ Delicassen : num [1:440] 1338 1776 7844 1788 5185 ...
## Channel Region Fresh Milk
## 0 0 0 0
## Grocery Frozen Detergents_Paper Delicassen
## 0 0 0 0
Hasil pengecekan menunjukkan bahwa dataset terdiri dari 440 observasi dan tidak ditemukan nilai hilang (missing value), sehingga data dapat langsung digunakan untuk proses clustering.
# Mengambil variabel numerik untuk clustering
# Kolom 3–8 berisi variabel belanja pelanggan
data_cluster <- data[, 3:8]
head(data_cluster)## # A tibble: 6 × 6
## Fresh Milk Grocery Frozen Detergents_Paper Delicassen
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 12669 9656 7561 214 2674 1338
## 2 7057 9810 9568 1762 3293 1776
## 3 6353 8808 7684 2405 3516 7844
## 4 13265 1196 4221 6404 507 1788
## 5 22615 5410 7198 3915 1777 5185
## 6 9413 8259 5126 666 1795 1451
Variabel yang digunakan hanya variabel numerik yang menggambarkan pengeluaran pelanggan pada berbagai kategori produk.
# Standardisasi data menggunakan Z-Score
data_scaled <- scale(data_cluster)
# Menampilkan beberapa data hasil scaling
head(data_scaled)## Fresh Milk Grocery Frozen Detergents_Paper
## [1,] 0.05287300 0.52297247 -0.04106815 -0.5886970 -0.04351919
## [2,] -0.39085706 0.54383861 0.17012470 -0.2698290 0.08630859
## [3,] -0.44652098 0.40807319 -0.02812509 -0.1373793 0.13308016
## [4,] 0.09999758 -0.62331041 -0.39253008 0.6863630 -0.49802132
## [5,] 0.83928412 -0.05233688 -0.07926595 0.1736612 -0.23165413
## [6,] -0.20457266 0.33368675 -0.29729863 -0.4955909 -0.22787885
## Delicassen
## [1,] -0.06626363
## [2,] 0.08904969
## [3,] 2.24074190
## [4,] 0.09330484
## [5,] 1.29786952
## [6,] -0.02619421
## Fresh Milk Grocery Frozen
## Min. :-0.9486 Min. :-0.7779 Min. :-0.8364 Min. :-0.62763
## 1st Qu.:-0.7015 1st Qu.:-0.5776 1st Qu.:-0.6101 1st Qu.:-0.47988
## Median :-0.2764 Median :-0.2939 Median :-0.3363 Median :-0.31844
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.3901 3rd Qu.: 0.1889 3rd Qu.: 0.2846 3rd Qu.: 0.09935
## Max. : 7.9187 Max. : 9.1732 Max. : 8.9264 Max. :11.90545
## Detergents_Paper Delicassen
## Min. :-0.6037 Min. :-0.5396
## 1st Qu.:-0.5505 1st Qu.:-0.3960
## Median :-0.4331 Median :-0.1984
## Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.2182 3rd Qu.: 0.1047
## Max. : 7.9586 Max. :16.4597
Scaling dilakukan menggunakan metode Z-Score Standardization agar seluruh variabel memiliki skala yang sama. Tahap ini penting karena rentang nilai antar variabel sangat berbeda sehingga dapat memengaruhi hasil pengelompokan K-Means.
# Elbow Method (WSS)
plot_elbow <- fviz_nbclust(x = data_scaled, FUNcluster = kmeans, method = "wss")
plot_elbow# Silhouette Method
plot_silhouette <- fviz_nbclust(x = data_scaled, FUNcluster = kmeans, method = "silhouette")
plot_silhouetteInterpretasi Grafik Penentuan Cluster
Penentuan jumlah cluster optimal dilakukan menggunakan Elbow Method dan Silhouette Method. Berdasarkan grafik Elbow, nilai Within Cluster Sum of Squares (WSS) mengalami penurunan cukup tajam pada awal penambahan cluster, kemudian mulai melandai pada jumlah cluster yang lebih besar. Hal ini menunjukkan bahwa penambahan cluster setelah titik tertentu tidak memberikan peningkatan yang signifikan.
Sementara itu, pada grafik Silhouette, nilai rata-rata silhouette width tertinggi diperoleh pada k = 2, yang menunjukkan bahwa pembentukan dua cluster memberikan pemisahan yang paling baik antar kelompok data.
Berdasarkan kedua metode tersebut, jumlah cluster yang digunakan dalam penelitian ini adalah 2 cluster.
# Menjalankan algoritma K-Means dengan jumlah cluster optimal (k = 2)
set.seed(123)
km <- kmeans(x = data_scaled, centers = 2, nstart = 25)
# Menampilkan hasil clustering
km## K-means clustering with 2 clusters of sizes 41, 399
##
## Cluster means:
## Fresh Milk Grocery Frozen Detergents_Paper Delicassen
## 1 0.05283636 2.0659269 2.2407190 0.32219794 2.2585338 0.8039597
## 2 -0.00542930 -0.2122882 -0.2302493 -0.03310806 -0.2320799 -0.0826124
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2
## [38] 2 2 2 2 2 2 1 2 1 1 1 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2
## [75] 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [112] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2
## [149] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 2
## [186] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2
## [223] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2
## [260] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [297] 2 2 2 2 2 1 2 2 1 2 1 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2
## [334] 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [371] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [408] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2
##
## Within cluster sum of squares by cluster:
## [1] 966.3860 982.9619
## (between_SS / total_SS = 26.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
##
## 1 2
## 41 399
Interpretasi Hasil K-Means Clustering
Berdasarkan hasil K-Means Clustering dengan k = 2, sebanyak 440 pelanggan berhasil dikelompokkan ke dalam dua cluster.
Hasil pengelompokan menunjukkan bahwa:
Terlihat bahwa sebagian besar pelanggan berada pada Cluster 2, sedangkan Cluster 1 hanya mencakup sebagian kecil data.
Berdasarkan nilai rata-rata tiap variabel (cluster means), Cluster 1 memiliki tingkat pengeluaran yang relatif lebih tinggi, terutama pada kategori Milk, Grocery, dan Detergents_Paper. Hal ini menunjukkan bahwa pelanggan pada cluster ini cenderung memiliki aktivitas pembelian yang lebih besar.
Sebaliknya, Cluster 2 memiliki nilai rata-rata yang lebih rendah pada hampir semua kategori. Dengan jumlah anggota yang jauh lebih banyak, cluster ini menggambarkan kelompok pelanggan umum dengan pola pembelian yang lebih rendah dan relatif seragam.
Nilai between_SS / total_SS sebesar 26% menunjukkan bahwa model mampu menjelaskan sekitar 26% variasi data berdasarkan pemisahan antar cluster.
Secara keseluruhan, K-Means Clustering berhasil membentuk dua segmen pelanggan yang cukup jelas, yaitu pelanggan dengan pengeluaran tinggi dan pelanggan dengan pengeluaran lebih rendah.
# Grafik Cluster Plot Convex Hull
fviz_cluster(km, data = data_scaled, geom = "point",
ellipse.type = "convex", show.clust.cent = TRUE, repel = TRUE)Interpretasi Visualisasi Cluster Plot
Berdasarkan Cluster Plot, data pelanggan terbagi menjadi dua cluster yang cukup jelas. Visualisasi ini menggunakan dua dimensi utama, yaitu Dim1 (44,1%) dan Dim2 (28,4%), yang jika digabungkan menjelaskan sekitar 72,5% variasi data, sehingga sudah cukup mewakili struktur data asli.
Secara keseluruhan, K-Means sudah cukup baik dalam memisahkan pelanggan berdasarkan pola pengeluarannya.
# Menghitung nilai silhouette dan menampilkan grafik
sil <- silhouette(km$cluster, dist(data_scaled))
fviz_silhouette(sil, print.summary = FALSE) + ggtitle("Silhouette Plot")## [1] 0.5914656
Interpretasi Evaluasi Silhouette
Berdasarkan hasil Silhouette Evaluation diperoleh nilai rata-rata silhouette sebesar 0,591. Nilai tersebut menunjukkan bahwa hasil clustering memiliki kualitas yang cukup baik karena berada di atas 0,5 sehingga struktur cluster yang terbentuk sudah cukup jelas.
Dari grafik silhouette, dapat diamati bahwa:
Cluster 2 memiliki jumlah anggota yang jauh lebih banyak dibandingkan Cluster 1. Sebagian besar observasi pada cluster ini memiliki nilai silhouette positif dan berada di atas garis rata-rata, sehingga menunjukkan bahwa anggota cluster cukup homogen dan terpisah dengan baik dari cluster lainnya.
Cluster 1 memiliki jumlah anggota yang relatif sedikit. Pada cluster ini masih terdapat beberapa observasi dengan nilai silhouette yang mendekati nol bahkan bernilai negatif. Hal ini menunjukkan bahwa sebagian anggota cluster memiliki karakteristik yang masih mirip dengan cluster lain sehingga pemisahannya belum sepenuhnya optimal.
Secara keseluruhan, mayoritas observasi memiliki nilai silhouette positif. Hal ini menunjukkan bahwa hasil pengelompokan sudah cukup baik dalam membedakan pelanggan ke dalam dua kelompok yang berbeda.
# Membentuk matriks jarak Euclidean
dist_matrix <- dist(data_scaled, method = "euclidean")
# Hierarchical Clustering (Metode Ward)
hc <- hclust(dist_matrix, method = "ward.D2")
# Menampilkan Dendrogram
plot(hc, labels = FALSE, hang = -1,
main = "Dendrogram Hierarchical Clustering",
xlab = "Observasi (Pelanggan)", ylab = "Jarak Euclidean")
rect.hclust(hc, k = 2, border = "red")Interpretasi Dendrogram Hierarchical Clustering
Berdasarkan dendrogram yang dihasilkan menggunakan metode Hierarchical Clustering Ward.D2 dengan jarak Euclidean, terlihat bahwa data pelanggan membentuk beberapa kelompok yang berbeda.
Garis kotak merah menunjukkan pemotongan dendrogram pada k = 2, sehingga seluruh observasi dikelompokkan menjadi dua cluster utama. Pemilihan dua cluster ini didasarkan pada adanya jarak penggabungan yang relatif besar pada tingkat hierarki yang lebih tinggi, sehingga pemisahan menjadi dua kelompok dianggap mampu menggambarkan struktur data dengan cukup baik.
Selain itu, terlihat bahwa sebagian besar observasi berada dalam kelompok yang besar, sedangkan sebagian observasi lainnya membentuk kelompok yang lebih kecil. Hal ini menunjukkan adanya perbedaan pola pengeluaran pelanggan yang cukup jelas antar kelompok.
Secara keseluruhan, dendrogram mendukung penggunaan 2 cluster sebagai jumlah cluster yang digunakan pada proses K-Means Clustering. Hasil ini juga sejalan dengan evaluasi silhouette yang menunjukkan bahwa pengelompokan menjadi dua cluster menghasilkan kualitas clustering yang cukup baik.
# Menambahkan label cluster ke data asli
hasil_cluster <- cbind(data_cluster, Cluster = km$cluster)
# Melihat karakteristik tiap cluster
aggregate(. ~ Cluster, data = hasil_cluster, mean)## Cluster Fresh Milk Grocery Frozen Detergents_Paper Delicassen
## 1 1 12668.54 21043.585 29245.20 4636.098 13649.85 3792.122
## 2 2 11931.63 4229.499 5763.18 2911.203 1774.97 1291.895
Interpretasi Karakteristik Cluster
Berdasarkan rata-rata pengeluaran pada masing-masing variabel, karakteristik kedua cluster dapat dijelaskan sebagai berikut:
Cluster 1 memiliki rata-rata pengeluaran yang lebih tinggi pada hampir seluruh kategori produk dibandingkan Cluster 2. Pengeluaran terbesar terdapat pada kategori Grocery (29.245,20), Milk (21.043,58), dan Detergents_Paper (13.649,85). Hal ini menunjukkan bahwa pelanggan pada cluster ini cenderung memiliki tingkat konsumsi yang lebih tinggi dan melakukan pembelian dalam jumlah yang lebih besar.
Cluster 2 memiliki rata-rata pengeluaran yang lebih rendah pada sebagian besar kategori produk. Meskipun demikian, kategori Fresh (11.931,63) masih menjadi komponen pengeluaran terbesar pada cluster ini. Hal ini mengindikasikan bahwa pelanggan pada cluster ini memiliki pola pembelian yang lebih rendah dan cenderung lebih homogen dibandingkan Cluster 1.
Perbedaan rata-rata pengeluaran yang cukup signifikan antara kedua cluster menunjukkan bahwa metode K-Means berhasil membedakan pelanggan berdasarkan tingkat dan pola pengeluarannya pada berbagai kategori produk.
# Mengubah data ke bentuk long format
cluster_mean <- aggregate(. ~ Cluster, data = hasil_cluster, mean)
cluster_long <- pivot_longer(cluster_mean, cols = -Cluster,
names_to = "Variabel",
values_to = "Rata_rata")
# Visualisasi perbandingan cluster
ggplot(cluster_long, aes(x = Variabel, y = Rata_rata, fill = factor(Cluster))) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Rata-rata Pengeluaran Tiap Cluster",
x = "Kategori Produk",
y = "Rata-rata Pengeluaran",
fill = "Cluster") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretasi Karakteristik Cluster
Berdasarkan grafik rata-rata pengeluaran tiap cluster, terlihat adanya perbedaan pola pengeluaran antara Cluster 1 dan Cluster 2.
Cluster 1 menunjukkan nilai rata-rata pengeluaran yang lebih tinggi hampir pada seluruh kategori produk, terutama Grocery, Milk, dan Detergents_Paper. Hal ini menunjukkan bahwa pelanggan pada cluster ini cenderung memiliki intensitas pembelian yang lebih tinggi dibandingkan kelompok lainnya.
Cluster 2 memiliki rata-rata pengeluaran yang lebih rendah pada sebagian besar kategori produk. Namun, pada kategori Fresh, perbedaan antara kedua cluster tidak terlalu signifikan, yang menunjukkan bahwa produk tersebut relatif merata dikonsumsi oleh kedua kelompok pelanggan.
Secara keseluruhan, hasil visualisasi ini memperkuat temuan sebelumnya bahwa Cluster 1 merepresentasikan kelompok pelanggan dengan tingkat pengeluaran lebih tinggi, sedangkan Cluster 2 merepresentasikan kelompok pelanggan dengan tingkat pengeluaran yang lebih rendah.
# Set seed agar hasil dapat direplikasi
set.seed(123)
# Melakukan bootstrap clustering
# B = jumlah pengulangan resampling
# k = jumlah cluster (mengikuti hasil terbaik dari Elbow & Silhouette)
boot_stability <- clusterboot(
data_scaled,
B = 100,
bootmethod = "boot",
clustermethod = kmeansCBI,
k = 2,
seed = 123
)## boot 1
## boot 2
## boot 3
## boot 4
## boot 5
## boot 6
## boot 7
## boot 8
## boot 9
## boot 10
## boot 11
## boot 12
## boot 13
## boot 14
## boot 15
## boot 16
## boot 17
## boot 18
## boot 19
## boot 20
## boot 21
## boot 22
## boot 23
## boot 24
## boot 25
## boot 26
## boot 27
## boot 28
## boot 29
## boot 30
## boot 31
## boot 32
## boot 33
## boot 34
## boot 35
## boot 36
## boot 37
## boot 38
## boot 39
## boot 40
## boot 41
## boot 42
## boot 43
## boot 44
## boot 45
## boot 46
## boot 47
## boot 48
## boot 49
## boot 50
## boot 51
## boot 52
## boot 53
## boot 54
## boot 55
## boot 56
## boot 57
## boot 58
## boot 59
## boot 60
## boot 61
## boot 62
## boot 63
## boot 64
## boot 65
## boot 66
## boot 67
## boot 68
## boot 69
## boot 70
## boot 71
## boot 72
## boot 73
## boot 74
## boot 75
## boot 76
## boot 77
## boot 78
## boot 79
## boot 80
## boot 81
## boot 82
## boot 83
## boot 84
## boot 85
## boot 86
## boot 87
## boot 88
## boot 89
## boot 90
## boot 91
## boot 92
## boot 93
## boot 94
## boot 95
## boot 96
## boot 97
## boot 98
## boot 99
## boot 100
## [1] 0.9453606 0.6417636
## [1] 0 28
Interpretasi Bootstrap Stability
Bootstrap Stability Analysis digunakan untuk menguji konsistensi struktur cluster melalui pendekatan resampling sebanyak 100 kali. Metode ini menunjukkan seberapa stabil hasil clustering terhadap perubahan sampel data.
Berdasarkan hasil yang diperoleh, nilai bootmean untuk cluster pertama sebesar 0,945, sedangkan cluster kedua sebesar 0,642. Hal ini menunjukkan bahwa cluster pertama memiliki kestabilan yang sangat tinggi, sementara cluster kedua masih cukup stabil meskipun lebih rendah.
Selain itu, nilai bootbrd menunjukkan bahwa cluster pertama tidak memiliki observasi yang tidak stabil, sedangkan cluster kedua memiliki sedikit observasi yang kurang stabil.
Secara keseluruhan, hasil Bootstrap Stability menunjukkan bahwa struktur cluster yang terbentuk sudah cukup stabil dan dapat digunakan untuk analisis lebih lanjut.
Berdasarkan seluruh tahapan analisis yang telah dilakukan pada dataset Wholesale Customers menggunakan metode K-Means Clustering, diperoleh kesimpulan sebagai berikut.
Jumlah cluster optimal yang diperoleh berdasarkan metode Elbow dan Silhouette adalah k = 2, dengan nilai silhouette sebesar 0.59 yang menunjukkan bahwa struktur pengelompokan berada pada kategori cukup baik.
Hasil clustering membagi pelanggan menjadi dua kelompok, yaitu Cluster 1 sebanyak 41 pelanggan dengan tingkat pengeluaran yang lebih tinggi, serta Cluster 2 sebanyak 399 pelanggan dengan tingkat pengeluaran yang lebih rendah dan lebih homogen.
Nilai between_SS / total_SS sebesar 26% menunjukkan bahwa pemisahan cluster memiliki kemampuan penjelasan yang moderat terhadap variasi data.
Evaluasi menggunakan Silhouette Analysis menunjukkan bahwa sebagian besar data telah terkelompok dengan cukup baik, meskipun masih terdapat beberapa observasi yang memiliki kedekatan antar cluster.
Hasil Bootstrap Stability menunjukkan bahwa struktur cluster secara umum cukup stabil, sehingga hasil pengelompokan dapat digunakan untuk analisis lebih lanjut.
Secara keseluruhan, metode K-Means Clustering dengan k = 2 berhasil menghasilkan segmentasi pelanggan yang cukup representatif berdasarkan pola pengeluaran.