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:
- Low income, low spending
- Low income, high spending
- Medium income, medium spending
- High income, low spending
- 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.