1. Pendahuluan
Analisis gerombol merupakan metode mengelompokkan objek berdasarkan kesamaan karakteristik X. Analisi ini bertujuan untuk menemukan subkelompok yang homogen di antara pengamatan. Terdapat beberapa pendekatan metode analisis gerombol, 2 di antaranya, yaitu:
Analisis Gerombol tak berhierarki (Non-hierarchical Clustering) salah satunya, metode K-Means merupakan pendekatan yang sederhana dan elegan untuk mempartisi kumpulan data ke dalam K gerombol yang berbeda dan tidak tumpang tindih.
Analisis Gerombol berhierarki (Hierarchical Clustering) merupakan pendekatan alternatif yang tidak mengharuskan kita berkomitmen pada pilihan K tertentu dan menghasilkan representasi pengamatan berbasis dendogram. Adapun langkah-langkah dalam pembuatan dendogram sebagai berikut.
Menghitung kedekatannya atau ukuran pembeda (dissimilarity) dengan menggunakan konsep jarak Euclidean
Algoritma berjalan secara iteratif. Dimulai dari bagian bawah dendrogram, masing-masing n pengamatan diperlakukan sebagai gerombol tersendiri. Dua gerombol yang paling mirip satu sama lain kemudian digabungkan sehingga menjadi n − 1 gerombol. Selanjutnya dua gerombol yang paling mirip satu sama lain dilebur kembali, sehingga menjadi n − 2 gerombol. Algoritma berjalan dengan cara ini sampai semua pengamatan termasuk dalam satu gerombol tunggal, dan dendrogram selesai.
Konsep perbedaan (dissimilarity) antara sepasang pengamatan perlu diperluas menjadi sepasang kelompok pengamatan. Perluasan ini dicapai dengan mengembangkan gagasan keterkaitan (linkage),yang mendefinisikan perbedaan (dissimilarity) antara dua kelompok pengamatan. Umumnya, jenis linkage: complete, average, single, centroid, dan ward.
Perbedaan Antara Penggerombolan Tak Berhierarki dan Penggerombolan Berhierarki sebagai berikut.
| Non-Hierarchical Clustering | Hierarchical Clustering |
|---|---|
| Menentukan K di awal | Tidak menentukan K di awal |
| Visualisasi tidak dalam bentuk dendogram | Visualisasi dapat dalam bentuk dendogram |
| Tidak terdapat tumpang tindih | Terkadang hasilnya lebih buruk dibandingkan dengan K-Means |
| Hasilnya lebih baik | Terdapat tumpang tindih |
1.1 Library
Pada analisis gerombol, diperlukan beberapa library sebagai berikut:
library(ggplot2)
library(factoextra)
library(readxl)
library(knitr)
library(tidyverse)
1.2 Dataset
Data yang digunakan adalah Data Mall Customers dengan 5 peubah, yaitu
Customer ID (ID pelanggan bersifat unik), Genre (Jenis kelamin
pelanggan), Age (Umur pelanggan dalam tahun), Annual Income (Pendapat
tahunan pelanggan dalam satuan ribu dollar), dan Spending Score (Skor
yang diberikan oleh mall kepada pelanggan berdasarkan indikator tertentu
dalam skala 1-100). Data ini terdiri dari 200 observasi dan pada
analisis ini digunakan tiga peubah, yaitu Age,
Annual Income, dan Spending Score. Kemudian,
data ini akan dikelompokkan berdasarkan peubah Age, Annual Income, dan
Spending Score, untuk dapat memberikan gambaran strategi marketing yang
baik untuk dilakukan.
datamallcust <- read_excel("D:/Download/Data Mall_Customer.xlsx")
head(datamallcust)
## # A tibble: 6 × 5
## CustomerID Genre Age `Annual Income` `Spending Score`
## <dbl> <chr> <dbl> <dbl> <dbl>
## 1 1 Male 19 15 39
## 2 2 Male 21 15 81
## 3 3 Female 20 16 6
## 4 4 Female 23 16 77
## 5 5 Female 31 17 40
## 6 6 Female 22 17 76
str(datamallcust)
## tibble [200 × 5] (S3: tbl_df/tbl/data.frame)
## $ CustomerID : num [1:200] 1 2 3 4 5 6 7 8 9 10 ...
## $ Genre : chr [1:200] "Male" "Male" "Female" "Female" ...
## $ Age : num [1:200] 19 21 20 23 31 22 35 23 64 30 ...
## $ Annual Income : num [1:200] 15 15 16 16 17 17 18 18 19 19 ...
## $ Spending Score: num [1:200] 39 81 6 77 40 76 6 94 3 72 ...
1.3 Standarisasi Peubah
Standarisasi peubah dilakukan karena terdapat perbedaan satuan pengukuran pada peubah yang digunakan.
data.ok = datamallcust[,-c(1:2)]
head(data.ok)
## # A tibble: 6 × 3
## Age `Annual Income` `Spending Score`
## <dbl> <dbl> <dbl>
## 1 19 15 39
## 2 21 15 81
## 3 20 16 6
## 4 23 16 77
## 5 31 17 40
## 6 22 17 76
#Dalam R, standarisasi data bisa dilakukan dengan menggunakan fungsi scale.
data.stdz = scale(data.ok)
#Cek mean = 0
apply(data.stdz, 2, mean)
## Age Annual Income Spending Score
## -1.016906e-16 -8.144310e-17 -1.096708e-16
#Cek sd = 1
apply(data.stdz, 2, sd)
## Age Annual Income Spending Score
## 1 1 1
2. Eksplorasi Data
ggplot(datamallcust, aes(x=reorder(Genre, +table(Genre)[Genre]), fill=Genre)) +
geom_bar() +
scale_fill_manual(values=c("#BAFFB4", "#998CEB")) +
labs(title = "Frekuensi Jenis Kelamin Pelanggan",
x = "Jenis Kelamin Pelanggan",
y = "Frekuensi") +
theme(plot.title = element_text(hjust = 0.5))
Berdasarkan Barplot di atas, terlihat bahwa pelanggan yang berjenis kelamin perempuan cenderung lebih banyak dibandingkan dengan pelanggan yang berjenis kelamin laki-laki.
ggplot(datamallcust) +
aes(x = "", y = Age, fill = Genre) +
geom_boxplot() +
scale_fill_manual(values = c(Female = "#BAFFB4",
Male = "#998CEB")) +
labs(x = "Jenis Kelamin Pelanggan", y = "Umur Pelanggan",
title = "Sebaran Umur Pelanggan",
subtitle = "Berdasarkan Jenis Kelamin") +
theme(plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size = 12L, hjust = 0.5))
Berdasarkan Boxplot di atas, terlihat bahwa sebaran umur pelanggan berdasarkan jenis kelamin memiliki sebaran yang cenderung menjulur ke kanan. Artinya,cenderung lebih banyak pelanggan mall yang memiliki umur >35 tahun.
ggplot(datamallcust) +
aes(x = "", y = `Annual Income`, fill = Genre) +
geom_boxplot() +
scale_fill_manual(values = c(Female = "#BAFFB4",
Male = "#998CEB")) +
labs(x = "Jenis Kelamin Pelanggan", y = "Pendapatan Tahunan Pelanggan",
title = "Sebaran Pendapatan Tahunan Pelanggan",
subtitle = "Berdasarkan Jenis Kelamin") +
theme(plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size = 12L, hjust = 0.5))
Berdasarkan Boxplot di atas, terlihat bahwa sebaran pendapatan tahunan pelanggan berdasarkan jenis kelamin memiliki sebaran yang relatif mirip, yaitu menjulur ke kanan. Artinya, pelanggan cenderung memiliki pendapatan tahunan pada kisar 55 - 75 ribu dollar. Namun, pada pelanggan laki-laki terdapat satu pencilan yang memiliki pendapatan tahunan di atas dari 100 ribu dollar.
3. Analisis Data
3.1 Analisis Gerombol Berhierarki
3.1.1 Pemilihan Banyaknya Klaster
Koefisien Silhoutte
Koefisien Silhoutte digunakan untuk melihat kualitas dan kekuatan klaster, seberapa baik atau buruknya suatu obyek ditempatkan dalam suatu klaster. Semakin besar koefisien Silhoutte, maka struktur yang terbentuk sangat baik atau klaster yang terbentuk sudah sesuai.
| Nilai Koefisien Silhoutte | Kriteria |
|---|---|
| 0.71 - 1.00 | Struktur sangat baik |
| 0.51-0.70 | Struktur baik |
| 0.26-0.50 | Struktur lemah |
| kurang dari 0.25 | Struktur buruk |
#Complete Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "complete")
Pada Complete Linkage diperoleh bahwa nilai koefisien
Silhoutte terbesar saat jumlah klaster=5 atau k=5
#Average Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "average", hc_metric="euclidean")
Pada Average Linkage diperoleh bahwa nilai koefisien
Silhoutte terbesar saat jumlah klaster=5 atau k=5
#Centroid Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "centroid", hc_metric="euclidean")
Pada Centroid Linkage diperoleh bahwa nilai koefisien
Silhoutte terbesar saat jumlah klaster=2 atau k=2
#Single Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "single", hc_metric="euclidean")
Pada Single Linkage diperoleh bahwa nilai koefisien
Silhoutte terbesar saat jumlah klaster=2 atau k=2
#Ward Linkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "ward.D", hc_metric="euclidean")
Pada Ward Linkage diperoleh bahwa nilai koefisien Silhoutte
terbesar saat jumlah klaster=6 atau k=6
3.1.2 Dendogram
Average Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "average"))
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
## Please report the issue at <]8;;https://github.com/kassambara/factoextra/issueshttps://github.com/kassambara/factoextra/issues]8;;>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Centroid Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "centroid"))
Single Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "single"))
Ward Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "ward"))
## The "ward" method has been renamed to "ward.D"; note new "ward.D2"
Complete Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "complete"))
Berdasarkan hasil yang diperoleh, dipilih metode
complete linkage dengan jumlah klaster=5 atau k=5 karena
terlihat pada dendogram yang dihasilkan menunjukkan baik dan seimbang
dibandingkan dengan metode lainnya.
Klaster dari Setiap Pengamatan pada Metode Complete Linkage
hc.data <- eclust(data.ok, stand = TRUE, FUNcluster = "hclust", k=5, hc_method = "complete", hc_metric = "euclidean", graph = F)
#cluster dari setiap pengamatan
hc.data$cluster
## [1] 1 2 1 2 1 2 1 2 3 2 3 2 3 2 1 2 1 2 3 2 1 2 3 2 3 2 3 1 3 2 3 2 3 2 3 2 3
## [38] 2 3 2 3 2 3 1 3 2 3 1 1 1 3 1 1 3 3 3 3 3 1 3 3 1 3 3 3 1 1 3 1 1 3 3 3 3
## [75] 3 1 1 1 1 3 3 1 3 3 1 3 3 1 1 3 3 1 3 1 1 1 3 1 3 1 1 3 3 1 3 1 3 3 3 3 3
## [112] 1 1 1 1 1 3 3 3 3 1 1 1 4 1 4 5 4 5 4 5 4 1 4 5 4 5 4 5 4 5 4 1 4 5 4 5 4
## [149] 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5
## [186] 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4
aggregate(data.ok, by=list(cluster=hc.data$cluster), FUN = mean)
## cluster Age Annual Income Spending Score
## 1 1 28.35417 50.29167 45.93750
## 2 2 24.80952 25.61905 80.23810
## 3 3 55.33333 47.31579 41.08772
## 4 4 32.69231 86.53846 82.12821
## 5 5 41.68571 88.22857 17.28571
dataklaster <- data.frame("Observasi"=c(seq(1:200)),"Klaster"=hc.data$cluster)
kable(aggregate(Observasi~Klaster,dataklaster,paste,collapse=", "),align = c("c","l"))
| Klaster | Observasi |
|---|---|
| 1 | 1, 3, 5, 7, 15, 17, 21, 28, 44, 48, 49, 50, 52, 53, 59, 62, 66, 67, 69, 70, 76, 77, 78, 79, 82, 85, 88, 89, 92, 94, 95, 96, 98, 100, 101, 104, 106, 112, 113, 114, 115, 116, 121, 122, 123, 125, 133, 143 |
| 2 | 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 30, 32, 34, 36, 38, 40, 42, 46 |
| 3 | 9, 11, 13, 19, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 51, 54, 55, 56, 57, 58, 60, 61, 63, 64, 65, 68, 71, 72, 73, 74, 75, 80, 81, 83, 84, 86, 87, 90, 91, 93, 97, 99, 102, 103, 105, 107, 108, 109, 110, 111, 117, 118, 119, 120 |
| 4 | 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200 |
| 5 | 127, 129, 131, 135, 137, 139, 141, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199 |
Berdasarkan analisis gerombol berhierarki dengan metode complete linkage yang telah dilakukan diperoleh bahwa peubah Age, peubah Annual Income, dan peubah Spending Score yang dikelompokkan menjadi lima klaster. Selain itu, terlihat bahwa pada klaster dua terdiri dari pelanggan yang kisaran umurnya 24 tahun memiliki pendapatan tahunan yang rendah, tetapi memiliki spending score yang tinggi. Sedangkan, pada klaster lima terdiri dari pelanggan yang kisaran umurnya 41 tahun memiliki pendapatan tahunan yang tinggi, tetapi spending score yang rendah. Oleh karena itu, dapat disimpulkan bahwa pelanggan yang lebih tua cenderung jarang mengunjungi mall dan menghabiskan uangnya di mall meskipun memiliki pendapatan tahunan yang tinggi. Sebaliknya, pelanggan yang lebih muda cenderung sering mengunjungi mall dan menghabiskan uangnya di mall dengan pendapatan tahunan yang rendah.
ggplot(datamallcust,
aes(x = datamallcust$`Spending Score` , y = datamallcust$`Annual Income`)) +
geom_point(stat = "identity", aes(color = as.factor(hc.data$cluster))) +
scale_color_discrete(name = " ",
breaks=c("1", "2", "3", "4", "5"),
labels=c("Klaster 1", "Klaster 2",
"Klaster 3", "Klaster 4",
"Klaster 5")) +
ggtitle("Segmentasi Pelanggan",
subtitle = "dengan Menggunakan Analisis Gerombol Berhierarki")
## Warning: Use of `` datamallcust$`Spending Score` `` is discouraged.
## ℹ Use `Spending Score` instead.
## Warning: Use of `` datamallcust$`Annual Income` `` is discouraged.
## ℹ Use `Annual Income` instead.
Interpretasi :
Pelanggan pada klaster satu dan tiga yang memiliki pendapatan tahunan dan spending score sedang terjadi tumpang tindih. Pada klaster satu cenderung terdiri dari pelanggan yang berusia muda kisaran 28 tahun. Sedangkan, pada klaster tiga terdiri dari pelanggan yang berusia lebih dewasa kisaran 55 tahun. Terdapat tumpang tindih pada klaster satu dan klaster tiga.
Pelanggan pada klaster dua terdiri dari pelanggan yang pendapatan tahunannya rendah, namun spending score nya tinggi.
Terdapat kesamaan pelanggan pada klaster empat dan lima, yaitu sama-sama memiliki pendapatan tahunan yang tinggi. Namun, pada klaster empat cenderung memiliki spending score yang tinggi. Sebaliknya, pada klaster lima cenderung memiliki spending score yang rendah.
fviz_cluster(hc.data)
3.2 Analisis Gerombol Tak Berhierarki : K-Means
3.2.1 Pemilihan Banyaknya Klaster
#Penentuan k dengan within sum square
fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "wss")
Untuk menentukan banyaknya klaster berdasarkan garis yang membentuk siku
(elbow) dan hal ini bersifat subjektif yang berarti setiap individu
dapat berbeda. Berdasarkan gambar di atas, dipilih bahwa yang membentuk
siku (elbow) pada k=4 sehingga ditetapkan bahwa k=4.
#Ditetapkan k=4
kmeans.data <- eclust(data.ok, stand = TRUE, FUNcluster = "kmeans", k=4, graph = F)
kmeans.data$centers
## Age Annual Income Spending Score
## 1 0.03711223 0.9876366 -1.1857814
## 2 1.08344244 -0.4893373 -0.3961802
## 3 -0.96008279 -0.7827991 0.3910484
## 4 -0.42773261 0.9724070 1.2130414
Berdasarkan hasil di atas, memunculkan centroid pada data yang masih terstandarisasi sehingga sulit untuk diinterpretasikan.
kmeans.data$cluster
## [1] 3 3 3 3 3 3 2 3 2 3 2 3 2 3 2 3 3 3 2 3 3 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2
## [38] 3 2 3 2 3 2 3 2 3 2 3 3 3 2 3 3 2 2 2 2 2 3 2 2 3 2 2 2 3 2 2 3 3 2 2 2 2
## [75] 2 3 2 2 3 2 2 3 2 2 3 2 2 3 3 2 2 3 2 2 3 3 2 3 2 3 3 2 2 3 2 3 2 2 2 2 2
## [112] 3 1 3 3 3 2 2 2 2 3 1 4 4 1 4 1 4 2 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4
## [149] 1 4 1 4 1 4 1 4 1 4 1 4 2 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1
## [186] 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4
aggregate(data.ok, by=list(cluster=kmeans.data$cluster), FUN = mean)
## cluster Age Annual Income Spending Score
## 1 1 39.36842 86.50000 19.57895
## 2 2 53.98462 47.70769 39.96923
## 3 3 25.43860 40.00000 60.29825
## 4 4 32.87500 86.10000 81.52500
datakmeans <- data.frame("Observasi"=c(seq(1:200)),"Klaster"=kmeans.data$cluster)
kable(aggregate(Observasi~Klaster,datakmeans,paste,collapse=", "),align = c("c","l"))
| Klaster | Observasi |
|---|---|
| 1 | 113, 122, 125, 127, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199 |
| 2 | 7, 9, 11, 13, 15, 19, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 51, 54, 55, 56, 57, 58, 60, 61, 63, 64, 65, 67, 68, 71, 72, 73, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 90, 91, 93, 94, 97, 99, 102, 103, 105, 107, 108, 109, 110, 111, 117, 118, 119, 120, 129, 161 |
| 3 | 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 17, 18, 20, 21, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 49, 50, 52, 53, 59, 62, 66, 69, 70, 76, 79, 82, 85, 88, 89, 92, 95, 96, 98, 100, 101, 104, 106, 112, 114, 115, 116, 121 |
| 4 | 123, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200 |
ggplot(datamallcust, aes(x = datamallcust$`Spending Score` , y = datamallcust$`Annual Income`)) +
geom_point(stat = "identity", aes(color = as.factor(kmeans.data$cluster))) +
scale_color_discrete(name = " ",
breaks=c("1", "2", "3", "4"),
labels=c("Cluster 1",
"Cluster 2",
"Cluster 3",
"Cluster 4")) +
ggtitle("Segmentasi Pelanggan",
subtitle = "dengan Menggunakan Analisis Gerombol Tak Berhierarki")
## Warning: Use of `` datamallcust$`Spending Score` `` is discouraged.
## ℹ Use `Spending Score` instead.
## Warning: Use of `` datamallcust$`Annual Income` `` is discouraged.
## ℹ Use `Annual Income` instead.
Interpretasi:
Berdasarkan analisis gerombol tak berhierarki yang telah dilakukan diperoleh bahwa peubah Age, peubah Annual Income, dan peubah Spending Score yang dikelompokkan menjadi empat klaster.
Gerombol 1 : gerombol ini merupakan customer-customer yang cukup muda (peubah age bernilai kecil) dan berpenghasilan besar (peubah Income bernilai besar) namun sedikit sekali menghabiskan uangnya untuk berbelanja (peubah spending score bernilai kecil bahkan negatif).
Gerombol 2 : gerombol ini merupakan customer-customer yang sudah tua (peubah age bernilai besar) dan berpenghasilan kecil (peubah Income bernilai kecil) dan sedikit sekali menghabiskan uangnya untuk berbelanja (peubah spending score bernilai kecil). Gerombol ini mungkin murupakan customer yang sudah pensiun dan hanya memiliki pemasukan dari tunjangan pensiun.
Gerombol 3 : gerombol ini merupakan customer-customer yang masih sangat muda (peubah age bernilai kecil) dan berpenghasilan kecil (peubah Income bernilai kecil) namun menghabiskan uangnya untuk berbelanja cukup besar (peubah spending score bernilai besar). Gerombol ini mungkin murupakan customer yang aneh, karena memiliki penghasilan yang kecil namun belanjanya banyak.
Gerombol 4 : gerombol ini merupakan customer-customer yang masih cukup muda (peubah age bernilai kecil) dan berpenghasilan besar (peubah Income bernilai besar) namun menghabiskan uangnya untuk berbelanja cukup besar (peubah spending score bernilai besar). Gerombol ini mungkin murupakan customer yang paling menarik untuk menjadi target marketing selanjutnya.
fviz_cluster(kmeans.data)
4. Kesimpulan
Analisis gerombol berhierarki dan tak berhierarki dilakukan pada data
Mall Customer dengan tiga peubah, yaitu Age,
Annual Income, dan Spending Score. Pada
analisis gerombol berhierarki dengan metode complete linkage yang telah
dilakukan diperoleh bahwa peubah Age, peubah Annual
Income, dan peubah Spending Score yang dikelompokkan
menjadi lima klaster. Sedangkan, pada analisis gerombol tak berhierarki
(K-Means) yang telah dilakukan diperoleh bahwa peubah Age,
peubah Annual Income, dan peubah Spending Score yang
dikelompokkan menjadi empat klaster.