Pendahuluan

Istilah segmentasi pelanggan tentu tidak asing lagi bagi pelaku bisnis. Mengingat segmentasi pelanggan ini bermanfaat untuk menyusun strategi pemasaran yang efektif dengan mengelompokkan konsumen berdasarkan katagori tertentu.

Segmentasi pelanggan adalah aktivitas mengelompokkan pelanggan berdasarkan katagori tertentu seperti perilaku, minat, demografi geografi, loyalitas, transaksi atau lainnya. Tujuan pengelompokkan ini untuk mempermudah bisnis menyusun strategi pemasaran yang lebih efektif.

> Maksud dan Tujuan

Penelitian ini bertujuan untuk membuat klaster dari customer-customer berdasarkan karakteristik total_transaksi, total_quantity, dan total_amount. Pada penelitian ini customer akan dikelompokon menggunakan metode K-Means dan K-Medoids.

> Benefit

Hasil peng-klasteran dapat dijadikan sebagai rekomendasi untuk pimpinan dalam menyusun strategi yang lebih efektif.

> Batasan

Pada penelitian ini masih terdapat permasalahan outlier, sedangkan algoritma K-Means sensitive terhadap noise dan outlier, sehingga dikhawatirkan ada masalah yang disebabkan objek dengan nilai besar yang menyimpang dari distribusi data.

Data Wrangling dan Eksplorasi Data

1. Import Library

# Import library untuk data wrangling
library(tidyverse)
library(dplyr)

# Import library untuk visualisasi
library(factoextra) # Visualisasi hasil clustering
library(gridExtra) # Visualisasi karakteristik cluster
library(GGally) # Correlation matrix
library(ggiraphExtra)
library(sf) # Read data map
library(plotly) # Interactive Plotting
library(Rtsne)


# Machine Learning - Clustering 
library(cluster)
library(factoextra)
library(mvnTest)

2. Read Data

Data pada penelitian ini berisikan informasi mengenai Usia, Gender, Status, Income, dan Riwayat Transaksi, Quantity, serta Amount pada tahun 2022.

data_cluster <- read.csv("Data/dataset-clustering.csv", sep = ";") %>%
  janitor::clean_names()

# Cek struktur data
glimpse(data_cluster)
## Rows: 447
## Columns: 8
## $ customerid      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
## $ age             <int> 55, 60, 32, 31, 58, 23, 31, 37, 33, 34, 42, 2, 23, 58,…
## $ gender          <int> 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, …
## $ marital_status  <chr> "Married", "Married", "Married", "Married", "Married",…
## $ income          <dbl> 5.12, 6.23, 9.17, 4.87, 3.57, 2.33, 4.57, 5.49, 9.92, …
## $ total_transaksi <int> 17, 13, 15, 10, 7, 10, 17, 14, 10, 14, 7, 16, 19, 12, …
## $ total_quantity  <int> 60, 57, 56, 46, 27, 44, 57, 47, 44, 50, 28, 61, 68, 35…
## $ total_amount    <int> 623300, 392300, 446200, 302500, 268600, 459100, 498800…

Definisi Variabel:

  • customerid: No Unik Customer
  • age: Usia Customer
  • gender: 0 Wanita, 1 Pria
  • marital_status: Married, Single (Blm menikah/Pernah menikah)
  • income: Pendapatan per bulan dalam jutaan rupiah
  • total_transaksi: Jumlah Transaksi yang dilakukan pada 2022
  • total_quantity: Jumlah Quantity Produk yang dibeli selama transaksi
  • total_amount: Jumlah Uang yang dibelanjakan selama transaksi

3. Data Cleansing

Dibagian ini variabel data akan disesuaikan tipe datanya.

> Mengubah tipe variabel

data_cluster <- data_cluster %>% 
  # Ubah type data yang belum sesuai
  mutate(gender = as.factor(gender),
         marital_status = as.factor(marital_status),
         total_amount = as.numeric(total_amount)
         )

glimpse(data_cluster)
## Rows: 447
## Columns: 8
## $ customerid      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
## $ age             <int> 55, 60, 32, 31, 58, 23, 31, 37, 33, 34, 42, 2, 23, 58,…
## $ gender          <fct> 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, …
## $ marital_status  <fct> Married, Married, Married, Married, Married, Married, …
## $ income          <dbl> 5.12, 6.23, 9.17, 4.87, 3.57, 2.33, 4.57, 5.49, 9.92, …
## $ total_transaksi <int> 17, 13, 15, 10, 7, 10, 17, 14, 10, 14, 7, 16, 19, 12, …
## $ total_quantity  <int> 60, 57, 56, 46, 27, 44, 57, 47, 44, 50, 28, 61, 68, 35…
## $ total_amount    <dbl> 623300, 392300, 446200, 302500, 268600, 459100, 498800…

> Meng-assign nilai dari kolom customerid menjadi rownames

rownames(data_cluster) <- data_cluster$customerid

head(data_cluster)

4. Eksplorasi Data

Ekplorasi data dilakukan agar kita menjadi lebih paham dengan gambaran awal dari data yang akan digunakan.

> Cek Missing Value

data_cluster %>% 
  is.na() %>% 
  colSums()
##      customerid             age          gender  marital_status          income 
##               0               0               0               0               0 
## total_transaksi  total_quantity    total_amount 
##               0               0               0

Insight :

  • Tidak terdapat missing value, sehingga dapat dilanjutkan ke proses analisis.

> Melakukan pengecekan Summary Data

summary(data_cluster)
##    customerid         age        gender  marital_status     income      
##  Min.   :  1.0   Min.   : 0.00   0:242   Married:341    Min.   : 0.000  
##  1st Qu.:112.5   1st Qu.:30.00   1:205   Single :106    1st Qu.: 4.175  
##  Median :224.0   Median :39.00                          Median : 7.520  
##  Mean   :224.0   Mean   :39.78                          Mean   : 8.592  
##  3rd Qu.:335.5   3rd Qu.:50.50                          3rd Qu.:10.810  
##  Max.   :447.0   Max.   :72.00                          Max.   :71.300  
##  total_transaksi total_quantity   total_amount   
##  Min.   : 3.00   Min.   :10.00   Min.   : 92100  
##  1st Qu.: 9.00   1st Qu.:32.00   1st Qu.:271750  
##  Median :11.00   Median :40.00   Median :354200  
##  Mean   :11.23   Mean   :40.93   Mean   :362512  
##  3rd Qu.:14.00   3rd Qu.:50.00   3rd Qu.:441200  
##  Max.   :21.00   Max.   :79.00   Max.   :846700

Insight :

  • Terdapat perbedaan range dari variabel-variabel yang digunakan, hal ini mungkin dikarena oleh perbedaan satuan dari masing-masing variabel. Misalnya age(tahun) akan berbeda range nya dengan total_amount(rupiah).

  • Terdapat 242 customer bergender wanita dan 205 customer bergender pria, serta 341 customer sudah menikah dan 106 masih single.

  • Pada variabel age nilai minimumnya adalah 0, artinya ada customer dengan age 0, ini tidak wajar karena tidak mungkin bayi/anak usia 0 melakukan transaksi.

Cek data dengan usia dibawah 19 tahun (Pada Pasal 7 ayat 1 dituliskan bahwa perkawinan hanya diizinkan apabila pria dan wanita sudah mencapai umur 19 tahun)

data_cluster %>% 
  filter(age < 19)

Insight :

  • Semua data dengan age sama dengan 18 dan marital_status-nya Single, data ini akan dipertahankan. Sedangkan data dengan age 0, 2, 3 memiliki marital_status Married data abnormal, tidak boleh seseorang berusia dibawah 19 untuk menikah di Indonesia, maka data akan di hapus karena dikhawatirkan akan mempengaruhi hasil analisis.
data_cluster <- data_cluster %>% 
  filter(age >= 18)

> Cek hubungan antara variabel

# Cek korelasi
ggcorr(data_cluster[,2:8], label = TRUE)

Insight :

  • Terdapat korelasi yang tinggi dan bersifat positif antara total_transaksi, total_quantity, dan total_amount yaitu sebesar 0.9, artinya jika seorang customer memiliki jumlah transaksi yang tinggi maka total quantity nya akan cenderung memiliki jumlah yang tinggi juga, begitu pula sebaliknya.

  • Terdapat korelasi yang sedang dan bersifat positif antara age dengan income.

  • Terdapat korelasi yang lemah dan bersifat positif antara age dengan total_transaksi.

  • Terdapat beberapa varibel yang tidak memiliki korelasi, nilai korelasi 0, yaitu antara income dengan total_transaksi, total_quantity, dan total_amount artinya tidak ada pengaruh/hubungan antara income seorang customer dengan banyaknya melakukan transaksi. Dan antara age dengan total_quantity dan total_amount artinya tidak ada pengaruh/hubungan antara umur seorang customer dengan banyaknya melakukan transaksi.

    Variabel-variabel yang memiliki hubungan perlu diteliti apakah terdapat permasalahan multikolinearitas, multikolinearitas ini berarti terdapat hubungan antara variabel independennya.

Pemeriksaan Masalah Data

Pemeriksaan masalah data yang akan dilakukan pada analasis ini adalah pemeriksaan multikolinearitas dan deteksi outlier.

1. Pemeriksaan Multikolinearitas

Pengujian multikolinearitas ini untuk melihat apakah ada variabel yang memberikan informasi yang sama dengan variabel lain atau biasa disebut redundan. Untuk menguji multikolinearitas akan dilihat dari nilai Variance Inflation Factor (VIF). Model dikatakan memiliki multikolinearitas jika nilai VIF > 10 yang mengindikasikan bahwa hasil estimasi yang kurang baik[1]. Berikut adalah rumus untuk menghitung nilai VIF: \[ VIF_k = (1-R_k^2)^{-1} \] Dimana: \(R_k^2\): Koefisien determinasi \(X_k\) dengan variabel lainnya yang ada pada model \(k\): 1, 2,…,p; p adalah jumlah variabel

Adapun selain itu, nilai VIF dapat diperolah dengan mencari nilai diagonal pada matrix korelasi data yang sudah di invers-kan. Berikut adalah perhitungan dengan menggunakan function dari R:

CekVIF <- function(data) {
  corr = as.matrix(cor(data))
  VIF = diag(solve(corr))
  
  return(VIF)
}

CekVIF(data_cluster[c(2,5,6,7,8)])
##             age          income total_transaksi  total_quantity    total_amount 
##        1.321106        1.319299        4.774838        6.752583        5.865136

Insight :

  • Dari hasil perhitungan diatas dapat diketahui bahwa untuk tiap variabel nilai VIF < 10, artinya tidak terjadi masalah miltikolinearitas meskipun sebelumnya kita ketahui bahwa terdapat beberapa variabel dengan korelasi yang tinggi, seperti total_transaksi, total_quantity, dan total_amount.

2. Pendeteksian Outliers

Outlier adalah pengamatan yang sangat menyimpang dari pengamatan lain sehingga, menimbulkan kecurigaan yang dihasilkan oleh mekanisme yang berbeda[2].Pengecekan outlier akan dilihat melalui visualisasi dari Box-Plot.

# membagi jendela grafik menajdi 2 baris dan 3 kolom
par(mfrow=c(2,3))

# Looping Box-Plot
type <- c("age", "income", "total_transaksi", "total_quantity", "total_amount")
for (i in type){
  boxplot(data_cluster[,i],
       main = paste("Variabel", i))
}

Insight :

  • Untuk variabel age dan total_transaksi tidak terdapat data outlier.

  • Untuk variabel income, total_quantity dan total_amount terdapat outlier.

    Dalam beberapa penelitian outlier diperlakukan dengan cara dibuang. Tapi memperlakukan outlier sebagai noise dapat mengakibatkan hilangnya informasi penting yang tersembunyi[3]. Di banyak bidang, outlier lebih penting daripada data normal, karena dapat menunjukkan perilaku menyimpang atau awal dari pola baru.

    Namun demikian pada variabel income terdapat 2 outlier yang sangat besar yang dapat mengakibatkan range dari variabel income menjadi sangat besar. Maka dari itu outlier tersebut akan dikeluarkan..

> Box-Plot Income setelah dikeluarkan 2 data terbesar

data_cluster %>% 
  select(income) %>% 
  filter(income < 50) %>% 
  boxplot(main = "Variabel income")

Insight :

  • Dari boxplot diatas dapat terlihat bahwa masih terdapat outlier pada variabel income namun outlier akan tetap dipertahankan dalam analisis.

> Save data baru

data_clean <- data_cluster %>% 
  filter(income < 50) 
rownames(data_clean) <- data_clean$customerid

Selanjutnya akan dilanjutkan kedalam analis clustering dengan pendekatan K-Means Clustering.

Penerapan metode K-Means untuk Segmentasi Customer

Metode K-Means digunakan sebagai alternatif metode klaster untuk data dengan ukuran yang lebih besar. Hal ini dikarenakan metode ini memiliki kecepatan yang lebih tinggi jika dibandingkan dengan metode hirarki. Metode K-Means dapat digunakan untuk menjelaskan algoritma dalam penentuan suatu objek kedalam klaster tertentu berdasarkan rataan terdekat[4]. Dalam prosedur pembentukan K-Means Cluster terdapat langkah-langkah yang dapat dilakukan, antara lain:

  1. Tentukan banyaknya klaster (k) yang akan dibentuk.

  2. Random initialization: meletakkan \(k\) centroid secara random

  3. Cluster assignment: assign masing-masing observasi ke cluster terdekat, berdasarkan perhitungan jarak

  4. Centroid update: menggeser centroid ke rata-rata (means) dari cluster yang terbentuk

  5. Ulangi langkah 3 dan 4 sampai tidak ada observasi yang clusternya berubah lagi

Pada analisis menggunakan metode k-means clustering data yang bisa digunakan hanya data yang bertipe numerical. Maka perlu dipilih terlebih dahulu data yang tipenya numerical.

data_kmeans <- data_clean %>% 
  select(age, income, total_transaksi, total_quantity, total_amount)

1. Standardisasi Data

Bertujuan untuk menyamakan skala data atau menghilangkan kontras antar variabel yang memiliki satuan berbeda.

scale_data_kmeans <- scale(data_kmeans)

2. Penentuan Jumlah Klaster (K optimum)

Menentukan jumlah klaster paling optimum untuk membagi customer. Pada dasarnya nilai k optimum dapat ditentukan sendiri oleh peneliti, selain itu nilai k dapat ditentukan juga menggunakan bantuan grafik Elbow berikut. Dimana k minimum akan didapat ketika grafik sudah tidak bergerak menurun dengan tajam.

set.seed(1000)

fviz_nbclust(x = scale_data_kmeans, 
             FUNcluster = kmeans,
             method = 'wss',
             k.max = 10)

  • Dari hasil diatas didapatkan nilai K optimum adalah 5.

3. Hasil pembagian klaster

RNGkind(sample.kind = "Rounding")
set.seed(1000)

customer_kmeans <- kmeans(x = scale_data_kmeans, centers = 5)

Visualisasi hasil pembagian klaster:

fviz_cluster(object = customer_kmeans, data = scale_data_kmeans)

Insight :

  • Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah tertentu yang terpisah dari klaster lain.

  • Terlihat bahwa klaster 3 dan 5 saling tumpang tindih, namun itu bukan karena wilayah klaster nya sama melainkan keterbatasan dari visualisasi yang ditampilkan, karena hanya dapat menampilkan secara 2 Dimensi.

Hasil clustering menggunakan metode K-Means:

table(customer_kmeans$cluster)
## 
##   1   2   3   4   5 
##  71 129  95  69  78

Insight :

  • Klaster 1 berjumlah 71.

  • Klaster 2 berjumlah 129.

  • Klaster 3 berjumlah 95.

  • Klaster 4 berjumlah 69.

  • Klaster 5 berjumlah 78.

4. Interpretasi dan Profiling

Dengan menggunakan visualisasi data, dapat memudahkan dalam melakukan profiling.

data_kmeans$Cluster <- customer_kmeans$cluster

ggRadar(
  data = data_kmeans,
  mapping = aes(colours = Cluster),
  interactive = T
)

Insight :

Berdasarkan hasil diatas dapat diketahui bahwa karakteristik dari masing-masing klaster adalah sebagai berikut:

  • Klaster 1: Memiliki nilai total_transaksi, total_quantity dan total_amount relatif tinggi, sedangkan income dan age yang cukup rendah.

  • Klaster 2: Memiliki nilai total_transaksi, total_quantity dan total_amount sedang, sedangkan income dan age yang rendah.

  • Klaster 3: Memiliki nilai total_transaksi, total_quantity dan total_amount yang relatif rendah, serta nilai income dan age yang tinggi.

  • Klaster 4 : Memiliki nilai relatif rendah di semua aspek variabel.

  • Klaster 5 : Memiliki nilai relatif tinggi di semua aspek variabel.

Selain dengan visualisasi, berikut adalah nilai rata-rata dari masing-masing variabel di tiap cluster:

Melakukan profiling dengan summarise data

profil_kmeans <- data_kmeans %>%
  group_by(Cluster) %>% 
  summarise_all(mean)

round(profil_kmeans, 2)

Insight :

Hasil yang didapat tidak berbeda dengan menggunakan visualisasi sebelumnya, dengan menggunakan summarise data karakteristik dari masing-masing klaster dapat dilihat melalui angka sehingga dapat diketahui nilai tertinggi dan terendah secara detail.

Kesimpulan K-means Cluster

kmeans_clustering <- data_clean
kmeans_clustering$Cluster <- customer_kmeans$cluster

Dari hasil analisis dan pembahasan yang telah diuraikan sebelumnya, maka diperoleh kesimpulan sebagai berikut :

  1. Berdasarkan nilai wss diperoleh jumlah klaster untuk kasus ini adalah sebanyak 5. Hal ini diketahui karena penurunan inersia setelah k = 5 tidak lagi signifikan (perubahan nilai nya kecil).

  2. Berdasarkan jumlah k = 5, maka dibuat 5 klaster. Rincian dari ke 5 klaster adalah pada berikut :

  • Klaster 1 berjumlah 71 Customer. Dengan karakteristik: Memiliki nilai total_transaksi, total_quantity dan total_amount relatif tinggi, sedangkan income dan age yang cukup rendah.

ID Customer yang ada di Klaster 1:

kmeans_cluster1 <- kmeans_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 1)

kmeans_cluster1[,"customerid"]
##  [1]   1   3   7   8  10  13  19  34  44  46  47  67  72  76  88  89 102 106 108
## [20] 112 115 120 121 127 137 156 157 158 166 167 171 184 189 210 217 218 219 233
## [39] 235 240 245 260 263 276 281 283 299 303 310 319 321 326 329 347 348 365 370
## [58] 374 384 392 393 401 404 416 417 422 423 434 438 443 445
  • Klaster 2 berjumlah 129. Dengan karakteristik: Memiliki nilai total_transaksi, total_quantity dan total_amount sedang, sedangkan income dan age yang rendah.

ID Customer yang ada di Klaster 2:

kmeans_cluster2 <- kmeans_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 2)

kmeans_cluster2[,"customerid"]
##   [1]   4   6   9  15  17  22  24  30  31  32  36  40  48  51  53  55  57  58
##  [19]  66  69  70  75  77  83  87  90  93 103 107 109 114 118 119 122 123 124
##  [37] 129 131 135 138 139 142 154 155 163 164 168 169 177 181 183 186 190 191
##  [55] 195 196 199 202 207 209 211 213 215 216 221 224 226 229 236 237 239 241
##  [73] 243 244 247 248 250 251 252 264 267 268 269 271 273 278 285 287 288 289
##  [91] 295 296 298 300 304 305 307 315 332 335 338 339 341 345 350 353 355 358
## [109] 361 362 363 364 366 369 372 380 386 391 395 398 403 408 413 414 424 429
## [127] 431 435 440
  • Klaster 3 berjumlah 95. Dengan karakteristik: Memiliki nilai total_transaksi, total_quantity dan total_amount yang relatif rendah, serta nilai income dan age yang tinggi.

ID Customer yang ada di Klaster 3:

kmeans_cluster3 <- kmeans_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 3)

kmeans_cluster3[,"customerid"]
##  [1]   5  11  21  26  27  28  33  35  38  41  49  64  68  71  78  80  81  82  91
## [20]  94  98  99 100 111 116 117 125 126 130 134 140 145 148 151 159 161 162 173
## [39] 175 176 182 188 193 197 214 220 223 225 228 249 254 257 258 265 266 274 275
## [58] 279 286 291 294 302 308 312 313 316 317 322 323 328 330 331 333 334 346 351
## [77] 354 359 360 368 373 375 382 388 394 399 402 407 410 418 425 428 433 436 442
  • Klaster 4 berjumlah 69. Dengan karakteristik: Memiliki nilai relatif rendah di semua aspek variabel.

ID Customer yang ada di Klaster 4:

kmeans_cluster4 <- kmeans_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 4)

kmeans_cluster4[,"customerid"]
##  [1]  25  50  52  56  59  61  65  79 104 110 136 143 144 146 153 170 179 180 185
## [20] 192 194 200 205 208 212 227 230 238 242 253 255 259 261 262 290 292 309 314
## [39] 318 320 324 325 337 343 344 349 367 371 381 383 385 387 389 390 396 397 400
## [58] 405 406 411 412 419 420 421 426 432 437 439 441
  • Klaster 5 berjumlah 78. Dengan karakteristik: Memiliki nilai relatif tinggi di semua aspek variabel.

ID Customer yang ada di Klaster 5:

kmeans_cluster5 <- kmeans_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 5)

kmeans_cluster5[,"customerid"]
##  [1]   2  14  16  18  20  23  29  37  39  42  43  45  54  60  62  63  73  84  85
## [20]  86  92  95  96  97 105 132 133 141 147 149 150 152 160 165 172 174 178 187
## [39] 198 201 203 204 206 222 231 232 234 246 256 270 272 277 280 282 284 293 297
## [58] 301 306 311 327 336 340 342 352 356 357 376 377 378 379 409 415 427 430 444
## [77] 446 447

Penerapan metode K-Medoids untuk Segmentasi Customer

K-Medoids clustering atau Partitioning Around Medoids (PAM) adalah algoritma clustering yang mirip dengan K-Means. Algoritma yang digunakan dalam program PAM didasarkan pada pencarian objek perwakilan k di antara objek kumpulan data. Pada algoritma K-Medoids, objek perwakilan (centroid) disebut juga medoid dari kelompok (Kaufman dan Rousseeuw, 1987). K-Medoids memiliki kelebihan untuk mengatasi kelemahan pada pada algoritma K-Means yang sensitive terhadap noise dan outlier, yaitu dapat mengatasi objek dengan nilai yang sangat besar yang memungkinkan menyimpang pada dari distribusi data.

Dalam prosedur pembentukan K-Medoid Cluster terdapat langkah-langkah yang dapat dilakukan, antara lain:

  1. Inisialisasikan pusat cluster sebanyak jumlah cluster (k).

  2. Setiap data atau objek dialokasikan ke cluster terdekat menggunakan persamaan ukuran jarak Euclidian Distance.

  3. Random initialization: meletakkan \(k\) medoid baru secara random.

  4. Cluster assignment: Hitung jarak setiap objek yang terdapat pada masing-masing cluster dengan calon medoid baru, Assign masing-masing observasi ke cluster terdekat.

  5. Centroid update: Hitung total simpangan (S) dengan menghitung nilai total jarak baru – total jarak lama. Jika didapatkan S < 0, tukarlah objek dengan data cluster untuk membuat sekumpulan k objek baru sebagai medoid.

  6. . Ulangi langkah 3 sampai dengan 5 hingga tidak terjadi perubahan medoid.

data_kmedoids <- data_clean %>% 
  select(age, income, total_transaksi, total_quantity, total_amount)

1. Standardisasi Data

Bertujuan untuk menyamakan skala data atau menghilangkan kontras antar variabel yang memiliki satuan berbeda.

scale_data_kmedoid <- scale(data_kmeans)

2. Penentuan Jumlah Klaster (K optimum)

Menentukan jumlah klaster paling optimum untuk membagi customer. Pada dasarnya nilai k optimum dapat ditentukan sendiri oleh peneliti, selain itu nilai k dapat ditentukan juga menggunakan bantuan grafik Elbow berikut. Dimana k minimum akan didapat ketika grafik sudah tidak bergerak menurun dengan tajam.

set.seed(1000)

fviz_nbclust(x = scale_data_kmedoid, 
             FUNcluster = pam,
             method = 'wss',
             k.max = 10)

  • Dari hasil diatas didapatkan nilai K optimum adalah 4.

3. Hasil pembagian klaster

RNGkind(sample.kind = "Rounding")
set.seed(1000)

customer_kmedoid <- pam(x = scale_data_kmedoid, k = 5, metric = "euclidean", stand = FALSE)

Visualisasi hasil pembagian klaster:

fviz_cluster(object = customer_kmedoid, data = scale_data_kmedoid)

Insight :

  • Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah tertentu yang terpisah dari klaster lain.

  • Terlihat bahwa klaster 2, 4 dan 5 saling tumpang tindih, namun itu bukan karena wilayah klaster nya sama melainkan keterbatasan dari visualisasi yang ditampilkan, karena hanya dapat menampilkan secara 2 Dimensi.

Hasil clustering menggunakan metode K-Medoids:

table(customer_kmedoid$clustering)
## 
##   1   2   3   4   5 
##  79  78 121  96  68

Insight :

  • Klaster 1 berjumlah 79.

  • Klaster 2 berjumlah 78.

  • Klaster 3 berjumlah 121.

  • Klaster 4 berjumlah 96.

  • Klaster 5 berjumlah 68.

kmedoid_clustering <- data_clean
kmedoid_clustering$Cluster <- customer_kmedoid$clustering

kmedoid_clustering[customer_kmedoid$id.med,c(9,2,5,6,7,8)]

Insight :

  • Medoid/centroid Klaster 1 adalah Customer dengan ID 112.

  • Medoid/centroid Klaster 2 adalah Customer dengan ID 62.

  • Medoid/centroid Klaster 3 adalah Customer dengan ID 307.

  • Medoid/centroid Klaster 4 adalah Customer dengan ID 258.

  • Medoid/centroid Klaster 4 adalah Customer dengan ID 50.

Medoid ini bisa menjadi gambaran/perwakilan dari Klaster tersebut, namun agar lebih detail akan dibuatkan visualisasi.

4. Interpretasi dan Profiling

Dengan menggunakan visualisasi data, dapat memudahkan dalam melakukan profiling.

ggRadar(
  data = kmedoid_clustering[,2:9],
  mapping = aes(colours = Cluster),
  interactive = T
)

Insight :

Berdasarkan hasil diatas dapat diketahui bahwa karakteristik dari masing-masing klaster adalah sebagai berikut:

  • Klaster 1: Memiliki nilai total_transaksi, total_quantity dan total_amount tinggi, sedangkan income dan age yang cukup rendah.

  • Klaster 2: Memiliki nilai relatif tinggi di semua aspek variabel.

  • Klaster 3: Memiliki nilai total_transaksi, total_quantity dan total_amount sedang, sedangkan income dan age yang rendah.

  • Klaster 4 : Memiliki nilai total_transaksi, total_quantity dan total_amount yang relatif rendah, serta nilai income dan age yang tinggi.

  • Klaster 5 : Memiliki nilai relatif rendah di semua aspek variabel.

Kesimpulan K-medoids Cluster

Dari hasil analisis dan pembahasan yang telah diuraikan sebelumnya, maka diperoleh kesimpulan sebagai berikut :

  1. Berdasarkan nilai wss diperoleh jumlah klaster untuk kasus ini adalah sebanyak 5. Hal ini diketahui karena penurunan inersia setelah k = 5 tidak lagi signifikan (perubahan nilai nya kecil).

  2. Berdasarkan jumlah k = 5, maka dibuat 5 klaster. Rincian dari ke 5 klaster adalah pada berikut :

  • Klaster 1 berjumlah 79 Customer, dengan medoid/centroid Klaster 1 adalah Customer dengan ID 112. karakteristik Klaster 1: Memiliki nilai total_transaksi, total_quantity dan total_amount tinggi, sedangkan income dan age yang cukup rendah.

ID Customer yang ada di Klaster 1:

kmedoid_cluster1 <- kmedoid_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 1)

kmedoid_cluster1[,"customerid"]
##  [1]   1   3   7   8  10  13  19  34  44  46  47  67  72  76  88  89 102 106 108
## [20] 112 114 115 118 120 121 124 127 131 137 156 157 158 166 167 171 184 189 210
## [39] 217 218 219 229 233 235 240 245 247 260 263 264 273 276 281 283 299 303 310
## [58] 319 321 326 329 347 348 365 370 374 384 392 393 401 404 416 417 422 423 434
## [77] 438 443 445
  • Klaster 2 berjumlah 78 Customer, dengan medoid/centroid Klaster 2 adalah Customer dengan ID 62. karakteristik Klaster 2: Memiliki nilai relatif tinggi di semua aspek variabel.

ID Customer yang ada di Klaster 2:

kmedoid_cluster2 <- kmedoid_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 2)

kmedoid_cluster2[,"customerid"]
##  [1]   2  14  16  18  20  23  29  37  39  42  43  45  54  60  62  63  73  84  85
## [20]  86  92  95  96  97 105 132 133 141 147 149 150 152 160 165 172 174 178 187
## [39] 198 201 203 204 206 222 231 232 234 246 256 270 272 277 280 282 284 293 297
## [58] 301 306 311 327 336 340 342 352 356 357 376 377 378 379 409 415 427 430 444
## [77] 446 447
  • Klaster 3 berjumlah 121 Customer, dengan medoid/centroid Klaster 3 adalah Customer dengan ID 307. karakteristik Klaster 3: Memiliki nilai total_transaksi, total_quantity dan total_amount sedang, sedangkan income dan age yang rendah.

ID Customer yang ada di Klaster 3:

kmedoid_cluster3 <- kmedoid_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 3)

kmedoid_cluster3[,"customerid"]
##   [1]   4   6   9  15  17  22  24  30  31  32  36  40  48  51  53  55  57  58
##  [19]  66  69  70  75  77  83  87  90  93 103 107 109 119 122 123 129 135 138
##  [37] 139 142 154 155 163 164 168 169 177 181 183 186 190 191 195 196 199 202
##  [55] 207 209 211 213 215 216 221 224 226 236 237 239 241 243 244 248 250 251
##  [73] 252 267 268 269 271 278 285 287 288 289 295 296 298 300 304 305 307 315
##  [91] 332 335 338 339 341 345 350 353 355 358 361 362 363 364 366 369 372 380
## [109] 386 391 395 398 403 408 413 414 424 429 431 435 440
  • Klaster 4 berjumlah 96 Customer, dengan medoid/centroid Klaster 4 adalah Customer dengan ID 258. karakteristik Klaster 4: Memiliki nilai total_transaksi, total_quantity dan total_amount yang relatif rendah, serta nilai income dan age yang tinggi.

ID Customer yang ada di Klaster 4:

kmedoid_cluster4 <- kmedoid_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 4)

kmedoid_cluster4[,"customerid"]
##  [1]   5  11  21  26  27  28  33  35  38  41  49  61  64  68  71  78  80  81  82
## [20]  91  94  98  99 100 111 116 117 125 126 130 134 140 145 148 151 159 161 162
## [39] 173 175 176 182 188 193 197 214 220 223 225 228 249 254 257 258 265 266 274
## [58] 275 279 286 291 294 302 308 312 313 316 317 322 323 328 330 331 333 334 346
## [77] 351 354 359 360 368 373 375 382 388 394 399 402 407 410 418 425 428 433 436
## [96] 442
  • Klaster 5 berjumlah 68 Customer, dengan medoid/centroid Klaster 5 adalah Customer dengan ID 50. karakteristik Klaster 5: Memiliki nilai relatif rendah di semua aspek variabel.

ID Customer yang ada di Klaster 4:

kmedoid_cluster5 <- kmedoid_clustering %>% 
  arrange(Cluster) %>% 
  filter(Cluster == 5)

kmedoid_cluster5[,"customerid"]
##  [1]  25  50  52  56  59  65  79 104 110 136 143 144 146 153 170 179 180 185 192
## [20] 194 200 205 208 212 227 230 238 242 253 255 259 261 262 290 292 309 314 318
## [39] 320 324 325 337 343 344 349 367 371 381 383 385 387 389 390 396 397 400 405
## [58] 406 411 412 419 420 421 426 432 437 439 441

Kesimpulan

Dari hasil analisis dan pembahasan yang telah diuraikan sebelumnya, Analisis menggunakan metode K-Means dan K-Medoids memberikan hasil yang berbeda.

  1. Klaster yang terbentuk dengan menggunakan metode K-Means dan metode K-Medoids sama, yaitu 5 Klaster.

  2. Baik metode K-Means Klaster dan metode K-Medoids Klaster mampu dengan jelas membedakan klaster dari variabel age, income, total_transaksi, total_quantity, dan total_amount.

  3. Terdapat perbedaan customer di klaster pada kedua metode, dengan:

  • metode K-Means: Klaster 1 berjumlah 71 customer, Klaster 2 berjumlah 129 customer, Klaster 3 berjumlah 95 customer, Klaster 4 berjumlah 69 customer, dan Klaster 5 berjumlah 78 customer. Sedangkan,

  • metode K-Medoids: Klaster 1 berjumlah 79 customer, Klaster 2 berjumlah 78 customer, Klaster 3 berjumlah 121 customer, Klaster 4 berjumlah 96 customer, dan Klaster 5 berjumlah 68 customer.

Rekomendasi

Secara keseluruhan hasil clustering dengan menggunakan metode K-Means dan metode K-Medoids cukup mirip, namun dikarenakan data yang dimiliki terdapat outlier maka direkomendasikan untuk menggunakan metode K-Medoids. Medode K-Medoids memiliki kelebihan untuk mengatasi kelemahan pada algoritma K-Means yang sensitive terhadap noise dan outlier.

Rekomendasi dalam Keputusan Bisnis

Akan memudahkan, apabila kita melihat kembali visualisasi karakteristik dari hasil clustering dengan menggunakan metode K-Medoids

ggRadar(
  data = kmedoid_clustering[,2:9],
  mapping = aes(colours = Cluster),
  interactive = T
)

Insight :

  • Klaster 1: Merupakan kelompok customer yang paling banyak belanja ini bagus untuk keuntungan bisnis, namun perlu diperhatikan bahwa customer klaster 1 ini memiliki income yang masih kecil dan usia relatif masih muda. Klaster 1 ini masih perlu dikembangkan dengan treatment yang bisa menguntungkan bisnis dan customer, misalnya dengan mengadakan program kemitraan/affiliate. Dengan begitu customer bisa memiliki income lebih tinggi namun tetap bisa loyal berbelanja, dan karena customer pada klaster ini masih muda biasanya akan lebih semangat.

  • Klaster 2: Merupakan kelompok customer yang memiliki frekuensi belanja tinggi, income tinggi dan usia dewasa. Customer pada klaster ini sangat ideal untuk keberlangsungan bisnis. Maka dari itu, sebaiknya customer di klaster ini perlu dimaintain dengan baik agar tetap loyal dan belanja lebih banyak lagi.

  • Klaster 3: Customer di kelompok ini mirip dengan customer klaster 1, bedanya frekuensi belanja lebih sedikit. Strategi yang bisa digunakan di klaster 1 mungkin bisa berhasil di klaster 3 ini juga, namun demikian jika diurutkan prioritas nya masih lebih baik fokus di klaster 1.

  • Klaster 4 : Merupakan kelompok customer yang memiliki frekuensi belanja relatif rendah, namun memiliki income tinggi dan usia dewasa. Klaster 4 ini masih memiliki potensi untuk meningkatkan belanja, secara customer di klaster ini memiliki income yang tinggi. Maka diperlukan stategi untuk menarik minat customer klaster ini untuk berbelanja, misalnya dengan memberikan voucher atau diskon yang menarik.

  • Klaster 5 : Customer di klaster ini memiliki daya beli rendah dan income rendah, sehingga tidak terlalu berpengaruh terhadap bisnis. Klaster ini bisa menjadi prioritas terakhir apabila ingin dikembangkan.

Reference

  • [1] Jhonson, R.A. and Wichern, D.W. Applied Multivariate Statistical Analysis 6th Edition. New Jersey: Prentice Hill. Inc, 2005.

  • [2] Montgomery, D. C., Peck, E. A., & Vining, G. G. Introduction to Linear Regression Analysis, 2012.

  • [3] Hawkins, Douglas M. Identification of outliers. Vol. 11. London: Chapman and Hall, 1980.

  • [4] Jiang, S. Y., & An, Q. B. Clustering-based outlier detection method, 2008.