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
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
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} \]
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_cluster9 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())
profiling11 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.
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.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.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
- 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.
- 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.
- 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.