Cluster Analysis: Karakteristik Pelanggan Mall

Library

library(tidyr)
library(ggplot2)
library(factoextra)
library(knitr)
library(cowplot)

Data

Dataset yang digunakan merupakan data pelanggan sebuah mall yang terdiri atas lima peubah dan 200 amatan, di mana setiap amatan merepresentasikan satu individu atau pelanggan. Dua tabel di bawah merupakan head dari data serta penjelasan peubah yang digunakan.

Customer ID Genre Age Annual Income Spending Score
1 Male 19 15 39
2 Male 21 15 81
3 Female 20 16 6
4 Female 23 16 77
5 Female 31 17 40
Peubah Keterangan
Customer ID ID pelanggan yang bersifat unik
Genre Jenis kelamin pelanggan
Age Usia pelanggan (tahun)
Annual Income Pendapatan tahunan pelanggan (k$)
Spending Score Skor yang diberikan oleh mall kepada pelanggan berdasarkan indikator tertentu (1-100)

Pada analisis gerombol ini, digunakan tiga peubah yang terdiri atas age, annual income, dan spending score.

Eksplorasi Data

ggplot(df.mall) +
 aes(x = "", y = Age, fill = Genre) +
 geom_boxplot() +
 scale_fill_manual(values = c(Female = "maroon", 
Male = "steelblue")) +
 labs(x = "Genre", y = "Age", title = "Sebaran Usia Berdasarkan Jenis Kelamin") +
 theme_grey() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

Boxplot di atas menggambarkan sebaran usia pelanggan mall berdasarkan jenis kelamin. Sebaran data cenderung menjulur ke kanan, yang berarti pelanggan mall tersebut lebih banyak yang berusia dewasa (40 tahun ke atas).

ggplot(df.mall) +
 aes(x = "", y = Annual.Income, fill = Genre) +
 geom_boxplot() +
 scale_fill_manual(values = c(Female = "maroon", 
Male = "steelblue")) +
 labs(x = "Genre", y = "Annual Income", title = "Sebaran Pendapatan Tahunan Berdasarkan Jenis Kelamin") +
 theme_grey() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

Boxplot di atas menggambarkan sebaran pendapatan tahunan pelanggan mall berdasarkan jenis kelamin. Sebagian besar pelanggan laki-laki dan perempuan di mall tersebut memiliki pendapatan tahunan yang berada di rentang 50 ribu dollar sampai dengan 75 ribu dollar. Sebaran keduanya cenderung mirip, tetapi terdapat seorang pelanggan laki-laki yang menjadi pencilan atau pendapatan tahunannya sangat besar (lebih dari 125 ribu dollar).

ggplot(df.mall) +
 aes(x = "", y = Spending.Score, fill = Genre) +
 geom_boxplot() +
 scale_fill_manual(values = c(Female = "maroon", 
Male = "steelblue")) +
 labs(x = "Genre", y = "Spending Score", title = "Sebaran Spending Score Berdasarkan Jenis Kelamin") +
 theme_grey() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

Boxplot di atas menggambarkan sebaran spending score pelanggan mall berdasarkan jenis kelamin. Terlihat bahwa pelanggan perempuan cenderung memiliki spending score yang tinggi. Artinya, perempuan lebih banyak menghabiskan uang dan waktunya untuk berbelanja atau mengunjungi mall dibandingkan dengan laki-laki.

ggplot(df.mall) +
 aes(x = Annual.Income, y = Spending.Score) +
 geom_point(shape = "circle", size = 1.5, 
 colour = "maroon") +
 labs(x = "Annual Income", y = "Spending Score", title = "Scatterplot Annual Income vs Spending Score") +
 theme_gray() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

Scatterplot di atas menggambarkan hubungan peubah pendapatan tahunan dan spending score. Terlihat bahwa titik-titik tersebut terbagi menjadi lima kelompok:

  1. Low income, low spending
  2. Low income, high spending
  3. Medium income, medium spending
  4. High income, low spending
  5. High income, high spending
plot1 <- ggplot(df.mall) +
 aes(x = Age, y = Spending.Score) +
 geom_point(shape = "circle", size = 1.5, colour = "maroon") +
 labs(x = "Age", y = "Spending Score", title = "Scatterplot Age vs Spending Score") +
 theme_gray() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

plot2 <- ggplot(df.mall) +
 aes(x = Age, y = Annual.Income) +
 geom_point(shape = "circle", size = 1.5, colour = "maroon") +
 labs(x = "Age", y = "Annual Income", title = "Scatterplot Age vs Annual Income") +
 theme_gray() +
 theme(plot.title = element_text(size = 14L, face = "bold", hjust = 0.5))

plot_grid(plot1, plot2)

Pada scatterplot age vs spending score, terlihat bahwa pelanggan dengan usia 40 tahun ke atas cenderung memiliki spending score yang tidak terlalu tinggi, yaitu di bawah 60. Sementara itu, terdapat cukup banyak pelanggan dengan usia muda (dibawah 40 tahun) yang memiliki spending score tinggi, bahkan mencapai 100. Pada scatterplot age vs spending score, terlihat bahwa pelanggan dengan pendapatan tahunan tinggi berada di usia 30 - 50 tahun. Untuk usia lainnya terlihat menyebar secara acak.

Standardisasi Peubah

Standardisasi peubah merupakan proses transformasi peubah sehingga peubah tersebut memiliki rata-rata nol dan simpangan baku satu. Proses standardisasi dilakukan jika terdapat perbedaan satuan pengukuran antara peubah-peubah yang digunakan. Standardisasi dilakukan karena metode yang digunakan menggunakan konsep jarak antara objek atau amatan, di mana jarak tersebut sensitif terhadap satuan pengukuran.

Pada analisis ini, dilakukan standardisasi peubah karena peubah yang digunakan memiliki satuan pengukuran yang berbeda. Misalnya peubah usia memiliki satuan tahun dan peubah pendapatan tahunan memiliki satuan ribu dollar (k$).

data.ok = df.mall[,-1:-2]
# fungsi standardisasi
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

Pada output di atas, rata-rata ketiga peubah yang sudah terstandardisasi bernilai sangat kecil atau mendekati nol.

# cek sd = 1
apply(data.stdz, 2, sd)
##            Age  Annual.Income Spending.Score 
##              1              1              1

Pada output di atas, simpangan baku ketiga peubah yang sudah terstandardisasi bernilai satu.

Hierarchical Clustering

Pemilihan Banyaknya Cluster

Penentuan cluster pada metode hirarki dapat menggunakan dendogram, lalu diperkuat dengan koefisien silhouette atau WSS. Tujuan melihat banyaknya cluster menggunakan dendogram adalah agar data dapat dipisahkan atau dikelompokkan berdasarkan karakteristik yang jelas.

Dendogram

# Complete Linkage
clink <- fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "complete"))

# Average Linkage
avlink <- fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "average"))

plot_grid(clink, avlink)

# Centroid Linkage
ctlink <- fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "centroid"))

# Single Linkage
slink <- fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "single"))

plot_grid(ctlink, slink)

# Ward Linkage
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "ward.D"))

Apabila metode yang digunakan berbeda, ternyata hasil dendogram juga berbeda. Plot di atas dikelompokkan berdasarkan kemiripan dendogram. Perbedaan yang tidak terlalu jauh terdapat pada dendogram dengan metode complete linkage dan average linkage, serta dendogram dengan metode centroid linkage dan single linkage. Hal ini dapat diperkuat dengan melihat jumlah cluster yang terbentuk berdasarkan koefisien silhouette yang akan dicobakan selanjutnya.

Koefisien Sihouette

# Complete Linkage
plota <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "complete", hc_metric="euclidean")

# Average Linkage
plotb <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "average", hc_metric="euclidean")

plot_grid(plota, plotb)

Dengan menggunakan complete linkage dan average linkage, koefisien silhouette tertinggi terjadi saat jumlah cluster sama dengan lima (k = 5).

# Centroid Linkage
plotc <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "centroid", hc_metric="euclidean")

# Single Linkage
plotd <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "single", hc_metric="euclidean")

plot_grid(plotc, plotd)

Dengan menggunakan centroid linkage dan single linkage, koefisien silhouette tertinggi terjadi saat jumlah cluster sama dengan dua (k = 2).

# Ward Linkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "ward.D", hc_metric="euclidean")

Dengan menggunakan ward linkage, koefisien silhouette tertinggi terjadi saat jumlah cluster sama dengan enam (k = 6).

Ringkasan dari penentuan jumlah cluster dengan menggunakan koefisien silhouette pada beberapa metode penggerombolan dapat dilihat pada tabel di bawah.

Metode Jumlah Cluster (k)
Complete 5
Average 5
Centroid 2
Single 2
Ward 6

Hierarchical Clustering dengan Metode Complete Linkage

Diterapkan hierarchical clustering dengan menggunakan metode complete linkage dengan banyak cluster adalah lima (k = 5). Metode ini dipilih karena hasil dendogram terlihat baik atau seimbang dibandingkan metode lain.

hc.mall <- eclust(data.ok, stand = TRUE, FUNcluster = "hclust", k = 5, hc_method = "complete", hc_metric = "euclidean", graph = F)

aggregate(data.ok, by=list(cluster=hc.mall$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
ggplot(df.mall, aes(x = Spending.Score , y = Annual.Income)) + 
  geom_point(stat = "identity", aes(color = as.factor(hc.mall$cluster))) +
  scale_color_discrete(name = " ", 
                       breaks=c("1", "2", "3", "4", "5"),
                       labels=c("Cluster 1", "Cluster 2", "Cluster 3", 
                                "Cluster 4", "Cluster 5")) +
  ggtitle("Segments of Mall Customers", 
          subtitle = "Using Hierarchical Clustering")

Output di atas menghasilkan data usia, pendapatan tahunan, dan spending score yang dikelompokkan menjadi lima cluster. Interpretasi mengenai output di atas dijelaskan pada poin berikut:

1. Cluster 1 dan cluster 3 mengalami overlap, yaitu berisi pelanggan atau objek dengan medium income dan medium spending. Kemungkinan yang menyebabkan kedua segmen ini ditempatkan pada cluster yang berbeda adalah peubah usia. Usia pada cluster 1 dan cluster 3 terpaut cukup jauh, yaitu sekitar 28 tahun dan 55 tahun.

2. Cluster 2 terdiri atas objek dengan low income dan high spending.

3. Cluster 4 dan cluster 5 sama-sama terdiri atas objek yang memiliki high income. Akan tetapi, objek pada cluster 4 memiliki high spending, sedangkan objek pada cluster 5 memiliki low spending.

4. Dengan melihat cluster 2 dan cluster 5, dapat dilihat sebuah perbedaan. Pelanggan berusia muda (sekitar 24 tahun) cenderung memiliki pendapatan tahunan yang rendah, tetapi spending score yang tinggi. Sebaliknya, pelanggan dengan usia berada di sekitar 40 tahun memiliki pendapatan tahunan yang tinggi, tetapi spending score yang rendah. Spending score merupakan penilaian yang diberikan oleh mall terhadap pelanggan berdasarkan perilaku pelanggan tersebut, misalnya frekuensi kunjungan, jumlah uang yang dihabiskan dalam berbelanja, dan lain-lain. Skor akan semakin besar seiring bertambah loyalnya pelanggan pada mall tersebut. Dari definisi tersebut, dapat disimpulan bahwa pelanggan berusia muda cenderung sering mengunjungi mall atau banyak menghabiskan uangnya untuk berbelanja walaupun pendapatan yang dihasilkan masih rendah. Hal sebaliknya terjadi pada pelanggan yang lebih dewasa.

fviz_cluster(hc.mall)

Dengan melihat cluster plot di atas, kedua komponen utama dapat menjelaskan sekitar 77.6% keragaman pada data. Interpretasi dua komponen utama dapat dilihat dengan akar ciri.

pca_mall <- prcomp(data.stdz)
pca_mall$rotation
##                        PC1         PC2         PC3
## Age             0.70638235 -0.03014116 0.707188441
## Annual.Income  -0.04802398 -0.99883160 0.005397916
## Spending.Score -0.70619946  0.03777499 0.707004506

Non-Hierarchical Clustering (K-Means)

Metode K-Means adalah pendekatan sederhana untuk mempartisi kumpulan data ke dalam k buah gerombol yang berbeda dan tidak tumpang tindih. Untuk melakukan penggerombolan K-Means, harus ditentukan jumlah gerombol yang diinginkan.

Pemilihan Banyaknya Cluster

Banyaknya cluster ditentukan dengan menggunakan kriteria statistik, yaitu koefisien silhouette dan Within Sum of Square (WSS).

Koefisien Silhouette

Koefisien ini mengukur seberapa dekat suatu amatan dengan amatan lain yang berada di cluster yang sama (dikenal sebagai ukuran cohesion) dibandingkan jarak terhadap amatan lain yang berada di cluster berbeda (dikenal sebagai ukuran separation). Koefisien yang nilainya semakin besar menunjukkan bahwa cluster yang terbentuk sudah sesuai.

fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "silhouette")

Dengan menggunakan koefisien silhouette, jumlah cluster optimum yang didapatkan adalah delapan (k = 8).

Within Sum of Square (WSS)

Kriteria WSS merupakan kriteria yang menghitung keragaman dalam cluster yang terbentuk. Semakin kecil keragaman dalam cluster yang terbentuk menunjukkan bahwa cluster yang terbentuk sudah sesuai.

fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "wss")

Ketika menggunakan WSS, banyaknya cluster yang dipilih didasarkan pada di mana garis berbentuk seperti siku (elbow) sehingga bersifat subjektif atau setiap individu dapat melihat pola siku pada cluster yang berbeda. Pada gambar di atas, garis membentuk siku saat berada di cluster keempat.

Dipilih k = 4 untuk penggerombolan dengan metode K-Means. Hal ini disebabkan oleh kesulitan interpretasi apabila menggunakan jumlah cluster yang lebih banyak.

K-Means

kmeans.mall <- eclust(data.ok, stand = TRUE, FUNcluster = "kmeans", k=4, graph = F)
kmeans.mall$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

Output di atas menghasilkan centroid untuk data yang masih terstandardisasi sehingga sulit diinterpretasikan.

aggregate(data.ok, by=list(cluster=kmeans.mall$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
ggplot(df.mall, aes(x = Spending.Score , y = Annual.Income)) + 
  geom_point(stat = "identity", aes(color = as.factor(kmeans.mall$cluster))) +
  scale_color_discrete(name = " ", 
                       breaks=c("1", "2", "3", "4"),
                       labels=c("Cluster 1", "Cluster 2", "Cluster 3", 
                                "Cluster 4")) +
  ggtitle("Segments of Mall Customers", 
          subtitle = "Using K-Means Clustering")

Output di atas menghasilkan data usia, pendapatan tahunan, dan spending score yang dikelompokkan menjadi empat cluster. Interpretasi mengenai output di atas dijelaskan pada poin berikut:

1. Cluster 1

Cluster 1 terdiri atas pelanggan dewasa dan berpenghasilan besar, tetapi memiliki spending score yang rendah sehingga bisa dikatakan hanya menghabiskan sedikit uang dan waktunya untuk berbelanja/mengunjungi mall.

2. Cluster 2

Cluster 2 terdiri atas pelanggan yang terbilang tua dan berpenghasilan kecil. Pelanggan yang berada pada cluster ini terbilang hanya menghabiskan sedikit uang dan waktunya untuk berbelanja/mengunjungi mall.

3. Cluster 3

Cluster 3 terdiri atas pelanggan yang masih muda dan berpenghasilan kecil, tetapi memiliki spending score yang tinggi atau bisa dikatakan menghabiskan banyak uang dan waktunya untuk berbelanja/mengunjungi mall.

4. Cluster 4

Cluster 4 terdiri atas pelanggan yang masih cukup muda dan berpenghasilan besar. Pelanggan yang berada pada cluster ini menghabiskan banyak uang dan waktunya untuk berbelanja/mengunjungi mall. Objek-objek pada cluster ini kemungkinan besar menjadi pelanggan yang cocok untuk menjadi target market selanjutnya.

fviz_cluster(kmeans.mall)

Kesimpulan

Berdasarkan hasil clustering dengan menggunakan metode hierarchical clustering dan non-hierarchical clustering, didapatkan perbandingan sebagai berikut:

Dengan menggunakan kedua metode, yaitu hierarchical clustering dengan lima cluster dan K-Means clustering dengan empat cluster, tidak terjadi perbedaan yang signifikan terhadap hasil penggerombolan. Pada kedua metode, tetap terjadi overlap atau tumpang tindih antara individu pada satu cluster dengan cluster lainnya. Pelanggan yang cocok untuk menjadi target market selanjutnya adalah individu pada cluster 4. Hal ini disebabkan individu pada cluster tersebut memiliki pendapatan tahunan yang tinggi dan spending score tinggi, dalam kata lain cenderung menghabiskan banyak uang dan waktunya untuk berbelanja atau mengunjungi mall.