1 Introduction

1.1 Business Problem

Perusahaan X ingin memahami pola perilaku customer dalam pembelian produk liquid berdasarkan data transaksi kuartal pertama sehingga diharapkan dapat mendorong peningkatan revenue perusahaan di kuartal berikutnya.

1.2 Objective

Proyek ini bertujuan untuk melakukan segmentasi customer menggunakan algoritma clustering K-Medoids (PAM). Dengan membagi customer ke dalam beberapa segmen yang memiliki karakteristik serupa, perusahaan dapat menyusun strategi berbeda yang lebih tepat sasaran untuk setiap segmen customer.

2 Dataset Overview

Dataset yang digunakan merupakan data dummy perilaku 200 customer yang melakukan pembelian produk liquid di Perusahaan X selama kuartal pertama tahun 2025 (Q1 2025).

Key Variables
1. Total Revenue: Total revenue from a customer
2. Total Quantity: Total quantity of items purchased
3. Order Frequency: Number of orders placed
4. Average Order Value (AOV): Average Revenue per Order

3 Load Libraries and Import Data

3.1 Load Libraries

library(readxl)  
library(NbClust)  
library(factoextra)  
library(cluster)  
library(dplyr) 
library(prettydoc)
library(DT)

3.2 Import Data

cust_liquid<- read_excel("D:/Dita/Project/Clustering/dummy_customer_cluster_data.xlsx")
cust_liquid <- data.frame(cust_liquid) 
datatable(cust_liquid)

4 Data Standardization

4.1 Z-Score

Oleh karena satuan dari tiap variabel tidak sama maka perlu dilakukan standardisasi data agar semua variabel memiliki bobot yang seimbang. Hal ini dilakukan agar tidak terdapat variabel yang mendominasi klaster tertentu karena nilainya yang besar.
Salah satu metode yang bisa dilakukan untuk standardisasi data yaitu Z-Score dengan formula sebagai berikut.
\[ Z = \frac{X - \mu}{\sigma} \] Keterangan:
- \(Z\) : Z-score
- \(X\) : Nilai asli
- \(\mu\) : Mean variabel
- \(\sigma\) : Standard deviation variabel

#Standardize Numerical Variables
cust_liquid_std = scale(cust_liquid[,3:6])
head((round(cust_liquid_std,2)))
##      Total_Revenue Total_Qty Order_Frequency Average_Order_Value
## [1,]          1.17      1.09            0.52               -0.24
## [2,]          0.93      0.59            0.70               -0.37
## [3,]          1.23      1.28            1.41               -0.49
## [4,]          1.58      0.52            1.06               -0.33
## [5,]          0.89      1.33            1.41               -0.56
## [6,]          0.89      1.19            0.17               -0.15

4.2 Data After Standardize

cust_liquid_std2 = data.frame(cust_liquid[,1:2],  round(cust_liquid_std,2))
datatable(cust_liquid_std2, caption = "Data After Standardization")

5 Outlier Detection

Outlier pada data multivariat dapat dideteksi dengan memperhatikan jarak mahalanobis. Apabila jarak mahalonobis lebih dari \(\chi_{4;0,05}^2\) yaitu 11,14 maka data tersebut dikatakan sebagai outlier.

#Mahalanobis Dist to Detect Outliers
mahal = mahalanobis(cust_liquid_std, colMeans(cust_liquid_std), cov(cust_liquid_std))
threshold <- qchisq(0.975, df = ncol(cust_liquid_std))
threshold
## [1] 11.14329
outlier <- mahal > threshold

#mahalanobis distance per object
cust_liquid_mahal <- as.data.frame(cust_liquid) %>%
  mutate(mahal_dist = mahal)
datatable(cust_liquid_mahal[outlier, ],caption = "Outlier Objects")

Berdasarkan tabel di atas diketahui bahwa terdapat 6 dari 200 data yang merupakan outlier. Oleh karena terdapat outlier, maka algoritma K-Medoid dapat digunakan untuk analisis klaster.

6 Determine Optimal Number of Clusters

Sebelum melakukan analisis klaster, banyak klaster optimal yang terbentuk harus ditentukan. Salah satu metode untuk menentukan banyak klaster optimal yang terbentuk adalah dengan menggunakan Koefisien Silhouette

\[ S_i = \frac{b_i - a_i}{\max(a_i, b_i)} \] Keterangan
- \(a_i\) = rata-rata jarak ke semua titik dalam klaster yang sama
- \(b_i\) = nilai minimum dari rata-rata jarak dari objek i dengan semua objek pada klaster lain.

Koefisien silhouette digunakan untuk mengukur seberapa baik suatu objek dikelompokkan. Koefisien silhouette dapat digunakan untuk menentukan banyaknya klaster optimal yang terbentuk. Untuk memperoleh banyak klaster, perlu dicari k optimal yang bisa memaksimalkan nilai average silhouette (\(s_k\)).

\[ s_k = \frac{\sum_{i=1}^n S_i}{n} \]

#Number of Cluster: Silhouette Algorithm
fviz_nbclust(cust_liquid_std, pam, method = "silhouette")

Berdasarkan grafik Silhouette di atas, banyaknya klaster yang terbentuk adalah 3 klaster.

7 Apply K-Medoids Clustering

K-Medoids merupakan salah satu algoritma klaster nonhierarki untuk mengelompokkan objek menjadi k klaster dengan meminimalkan jarak antara objek dengan medoid sebagai pusat atau representasi dari objek. K-Medoids memiliki kelebihan dibandingkan K-Means yaitu tidak sensitif terhadap outlier karena algoritma K-Medoids didasarkan pada lokasi atau titik tengah dari objek di suatu klaster.

#K-Medoid Clustering
kmedoid <- pam(x = cust_liquid_std, k = 3, metric = "euclidean", stand = FALSE)
kmedoid
## Medoids:
##       ID Total_Revenue  Total_Qty Order_Frequency Average_Order_Value
## [1,]  67     0.9512131  0.8187252       0.8780821          -0.4189162
## [2,] 128    -0.8382944 -0.9997694      -0.7249075          -0.2861023
## [3,] 163    -1.0400103 -1.0937138      -1.4373474           2.4698238
## Clustering vector:
##   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 2 2 2 2 2 3 2
## [112] 2 2 2 2 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 3 2 3
## [149] 2 2 2 3 2 2 3 2 3 2 2 2 3 2 3 2 3 2 2 3 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2
## [186] 3 2 3 2 2 3 2 3 2 2 2 2 2 3 3
## Objective function:
##     build      swap 
## 0.8534606 0.7137527 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

8 Assign Clusters

#Cluster Membership
cluster_assignments = kmedoid$clustering

customer_id <- cust_liquid_std2$Customer_ID

# Create Data Frame
membership_df <- data.frame(
  Customer_ID = customer_id,
  Cluster = cluster_assignments
)

summary_cluster <- datatable(membership_df %>%
  group_by(Cluster) %>%
  summarise(
    Count_of_Member = n(),
    Members = paste(Customer_ID, collapse = ", ")
  ))
summary_cluster

9 Cluster Visualization

fviz_cluster(kmedoid, data = cust_liquid_std,
             palette = c("#00AFBB", "#FC4E07", "#E7B800"),
             geom = "point", ellipse.type = "convex",
             ggtheme = theme_minimal())

10 Cluster Profiling

#Stat Desc for Cluster Profiling
cust_liquid$cluster <- cluster_assignments

profiling <- datatable(cust_liquid %>%
                         group_by(cluster) %>%
                         summarise(
                           mean_revenue = round(mean(Total_Revenue),2),
                           mean_qty     = round(mean(Total_Qty),2),
                           mean_freq    = round(mean(Order_Frequency),2),
                           mean_aov     = round(mean(Average_Order_Value),2),
                         ) %>%
                         as.data.frame())

profiling

11 Conclusion

11.1 Customer Segmentation Interpretation

Berdasarkan hasil K-Medoid clustering, terbentuk 3 klaster dengan karakteristik perilaku customer yang berbeda. Segmentasi ini bertujuan untuk mendukung pengambilan keputusan operasional, khususnya dalam hal pengelolaan stok, perencanaan distribusi, dan pelayanan pelanggan. Berikut merupakan interpretasi masing-masing klaster.

  1. Cluster 1: High Value Customers
    Customer pada cluster 1 ini menunjukkan pola pembelian yang konsisten dan dalam jumlah besar sehingga memberikan kontribusi yang signifikan terhadap revenue perusahaan. Customer pada cluster ini merupakan pelanggan tetap.

  2. Cluster 2: Potential Grow Customers
    Customer pada cluster 2 merupakan customer yang berpotensi menjadi high value customer apabila dikelola dan dilayani dengan baik oleh perusahaan. Customer pada cluster ini berbelanja dengan skala kecil tetapi cukup rutin.

  3. Cluster 3: Infrequent Big Buyers
    Customer pada cluster 3 merupakan customer yang melakukan pembelian dengan volume besar namun sangat jarang, rata-rata hanya satu kali pembelian. Kemungkinan customer pada cluster ini merupakan customer project-based atau musiman, dengan kebutuhan spesifik dalam skala besar.

11.2 Operational Recommendation

  1. Cluster 1: High Value Customers
  • Menetapkan SLA (Service Level Agreement) yang lebih ketat untuk customer untuk memastikan kepuasan customer
  • Memprioritaskan urutan pengiriman dan menyiapkan armada khusus untuk memastikan bahwa pengiriman liquid dilakukan tepat waktu sesuai kebutuhan customer.
  • Melakukan forecasting kebutuhan setiap customer menggunakan data historis untuk menjaga ketersediaan stok dan mencegah keterlambatan pengiriman.
  1. Cluster 2: Potential Grow Customers
  • Memantau SLA secara berkala agar tidak terjadi keterlambatan yang berpotensi menghambat potensi customer menjadi high value customer.
  • Mengelola consolidated shipping dengan customer terdekat di area yang sama untuk mengefisiensi biaya distribusi.
  1. Cluster 3: Infrequent Big Buyers
  • Mengidentifikasi lebih lanjut alasan pembelian jumlah besar tetapi hanya sekali. Sebagai contoh apabila alasannya karena kebutuhan musiman, maka bisa dengan membuat jadwal pengingat berkala menjelang musim yang mirip pembelian sebelumnya.
  • Melakukan follow-up pasca pembelian untuk mengestimasi waktu kebutuhan selanjutnya.