Tugas Individu - Cluster Analysis

Faadiyah Ramadhani (G1401201009)

28 June, 2023

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:

  1. 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.

  2. 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.