1 Introduction

Cluster analysis is a multivariate method which aims to classify a sample of subjects (or objects) on the basis of a set of measured variables into a number of different groups such that similar subjects are placed in the same group.

2 Approaches to cluster analysis

There are a number of different methods that can be used to carry out a cluster analysis; these methods can be classified as follows:

  1. Hierarchical methods
  2. Non-hierarchical methods (often known as k-means clustering methods)

3 Example k-means clustering methods

Prosedur penerapan K-means

  1. Pre-processing data

  2. Memilih banyaknya gerombol

  3. Menerapkan K-means

  4. Interprestasi Gerombol yang terbentuk

Package yang dibutuhkan

Ada beberapa package yang dibutuhkan.

  1. ggplot

  2. dplyr

  3. cluster

  4. factoextra

JIka belum diinstall, silahkan diinstall terlebih dahulu.

Kali ini saya akan memeriksa apakah package sudah terinstall atau belum, jika belum maka di install. Codenya adalah:

  if (!require("nama_package")) install.packages("nama_package")

Penjelasan:

  if (!require("nama_package"))
  

Bagian ini memeriksa apakah package tidak berhasil dimuat (nilai FALSE dari require). Tanda seru ! berarti “tidak”, sehingga kode akan dieksekusi hanya jika package belum terinstal.

  install.packages("nama_package")

Jika package tidak ada, maka kode ini akan menginstalnya secara otomatis.

Kemudian memanggil package dengan

library("nama_package")

Berikut adalah codenya:

if (!require("ggplot2")) install.packages("ggplot2") #Install and load required packages
## Loading required package: ggplot2
if (!require("dplyr")) install.packages("dplyr") #Install and load required packages
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
if (!require("cluster")) install.packages("cluster") #Install and load required packages
## Loading required package: cluster
if (!require("factoextra")) install.packages("factoextra") #Install and load required packages
## Loading required package: factoextra
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggplot2)
library(dplyr)
library(cluster)
library(factoextra)

Data

Seorang pemilik Mall ingin mengelompokan customer di Mall yang ia miliki, sehingga tim marketing bisa mengembangkan strategi yang tepat untuk customer yang tepat pula. Data yang dimiliki oleh Mall tersebut adalah Customer ID, umur pelanggan (age), pendapatan tahunan dalam ribu dollar (annual income kemudian kita sebut income) dan spending score. Spending score merupakan nilai yang diberikan oleh Mall kepada customer berbasarkan perilaku customer (waktu kunjungan,jenis barang yang dibeli, dan banyaknya uang yang dihabiskan dalam belanja) yang memiliki rentang nilai 1-100. Semakin besar nilai Spending Score berarti customer semakin loyal pada Mall tersebut dan semakin besar pula uang belanja yang digunakan.

Data belum ada sehingga pada kesempatan ini kita akan mensimulasikan data:

  1. Usia (18-70) tahun

  2. Income (20.000-100.000) ribu dollar

  3. Spending score (1-100)

akan dibangkitkan 100 data.

Code:

# Simulate customer data (replace this with your dataset)
set.seed(123)  # For reproducibility
customers <- data.frame(
  CustomerID = 1:100,
  Age = sample(18:70, 100, replace = TRUE),
  Income = sample(20000:100000, 100, replace = TRUE),
  SpendingScore = sample(1:100, 100, replace = TRUE)
)

head(customers) # View the first few rows of the customers data
##   CustomerID Age Income SpendingScore
## 1          1  48  67224            93
## 2          2  32  44214            43
## 3          3  68  95641            39
## 4          4  31  29300            37
## 5          5  20  60583            33
## 6          6  59  64105            83

Preprosessing Data

Peubah yang digunakan untuk menerapkan k-means adalah 3 (tiga) peubah yaitu Age, Income dan Spending Score. Oleh karena itu peubah CustomerID yang tidak kita gunakan akan kita sisihkan tersebih dahulu. dengan code:

customer_features <- customers %>% select(Age, Income, SpendingScore) #remove customberId
head(customer_features) # View the first few rows of the customer_features data
##   Age Income SpendingScore
## 1  48  67224            93
## 2  32  44214            43
## 3  68  95641            39
## 4  31  29300            37
## 5  20  60583            33
## 6  59  64105            83

Pada dataframe yang baru, hanya tersisa tiga peubah itu saja.

Sebelum saya melakukan penggerombolan, saya ingin melihat terlebih dahulu kondisi data:

age =table(customer_features$Age)
hist(customer_features$Age, main=" Age distribution",
        ylab = "Frequency",
        xlab ="Ages groups",
        labels= FALSE)

Income =table(customer_features$Income)
hist(customer_features$Income, main=" Income distribution",
        ylab = "Frequency",
        xlab ="Income groups",
        labels= FALSE)

SpendingScore =table(customer_features$SpendingScore)
hist(customer_features$SpendingScore, main=" SpendingScore distribution",
        ylab = "Frequency",
        xlab ="SpendingScore groups",
        labels= FALSE)

boxplot(customer_features$Age, col="purple",
        main="Boxplot for Age")

boxplot(customer_features$Income, col="blue",
        main="Boxplot for Income")

boxplot(customer_features$SpendingScore, col="yellow",
        main="Boxplot for SpendingScore")

Standarisasi peubah

Standarisasi peubah merupakan proses transformasi peubah menjadi peubah yang memiliki rata-rata nol dan simpangan baku satu. Process standarisasi ini dilakukan jika kita melihat perbedanan satuan pengukuran peubah-peubah yang digunakan contoh(umur dan pendapatan). Standarisasi dilakukan karena metode k-means menggunakan konsep jarak antara objek/amatan, yang mana sensitif terhadap satuan pengukuran.

Dalam R, standarisasi data bisa dilakukan dengan menggunakan fungsi scale.

customer_features_standardize <- scale(customer_features) # mean 0 and standar deviation 1
head(customer_features_standardize)# View the first few rows of the customer_features_standardize data # Check the scaled data
##             Age      Income SpendingScore
## [1,]  0.2022679  0.36488704     1.4657044
## [2,] -0.8873907 -0.65633901    -0.2186261
## [3,]  1.5643410  1.62608567    -0.3533725
## [4,] -0.9554943 -1.31824971    -0.4207458
## [5,] -1.7046345  0.07014727    -0.5554922
## [6,]  0.9514081  0.22646009     1.1288383
apply(customer_features_standardize,2,mean)
##           Age        Income SpendingScore 
## -7.823278e-17  3.382711e-17 -6.753875e-17
apply(customer_features_standardize,2,sd)
##           Age        Income SpendingScore 
##             1             1             1

Jika kita perhatikan rata-rata dan simpangan baku peubah setelah distandarisasi mendekati nol dan satu.

Catatan: Dalam tahapan pre-processing data, kita menyiapkan data agar metode kmeans bisa diterapkan secara maksimal. Terdapat dua hal yang umumnya dilakukan pada tahap ini adalah memilih peubah yang digunakan dan melakukan standarisasi peubah.

Memilih banyaknya gerombol

Dalam metode k-means, sebelum mebentuk gerombol dilakukan terlebih dahulu penentuan banyaknya gerombol. Banyaknya gerombol dapat ditentukan dengan menggunakan beberapa kriteria statistik, seperti koefisien silhouette dan Within Sum of Square (WSS) yang dikenal dengan sebutan elbow.

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

Kriteria WSS merupakan kriteria yangmenghitung keragamaan dalam gerombol yang terbentuk. Semakin kecil keragaman dalam gerombol yang terbentuk menunjukkan bahwa gerombol yang terbentuk sudah sesuai.

Dengan menggunakan kriteria tersebut, kita bisa membandingkan banyaknya gerombol yang paling sesuai pada data yang kita sedang analisis.

Dalam R, fungsi fviz_nbclust dari package factoextra dapat digunakan untuk memilih banyaknya gerombol.

# Silhouette method to determine optimal k
fviz_nbclust(customer_features_standardize, kmeans, method = "silhouette") +
  labs(title = "silhouette Method for Choosing Optimal k")

# Elbow method to determine optimal k
fviz_nbclust(customer_features_standardize, kmeans, method = "wss") +
  labs(title = "Elbow Method for Choosing Optimal k")

Untuk kriteria koefisien silhoutte, banyaknya gerombol dengan nilai koefisien tertinggi yang kita pilih. Sedangkan pada WSS, banyaknya gerombol yang kita pilih didasarkan pada banyaknya gerombol yang mana garisnya berbentuk seperti siku (elbow). Pada gambar diatas garis membentuk siku saat berada di gerombol keempat. Karena penentuan ini berdasarkan visual,jadi setiap orang mungkin berbeda melihat pola sikunya.

Berdasarkan kedua kriteria tersebut, banyaknya gerombol terbaik yang dipilih sama yaitu 4.

Kadangkala kedua metode memberikan penilaian yang berbeda. Jika terjadi demikian, banyaknya gerombol bisa ditentukan berdasarkan kemudahan interpretasi gerombol yang terbentuk.

Note: secara default banyaknya gerombol yang dicobakan pada fungsi fviz_nbclust adalah 10, jika ingin merubah hal tersebut bisa dilakukan dengan menggunakan argumen kmax dalam fungsi,misal kmax=20.

Menerapkan K-means

Setelah kita mendapatkan banyaknya gerombol terbaik, maka selajutnya kita akan menerapkan metode kmenas untuk mendapatkan label gerombol pada setiap amatan.

# Perform k-means clustering with k = 4
set.seed(123)
kmeans_result <- kmeans(customer_features_standardize, centers = 4, nstart = 25)
kmeans_result
## K-means clustering with 4 clusters of sizes 27, 20, 28, 25
## 
## Cluster means:
##          Age     Income SpendingScore
## 1  0.8883491 -0.8782285     0.1556696
## 2  0.4576566  1.2324587    -0.6919230
## 3 -0.4130973  0.5803133     1.0807146
## 4 -0.8628733 -0.6874311    -0.8249851
## 
## Clustering vector:
##   [1] 3 4 2 4 4 3 1 3 2 1 3 3 4 4 3 1 1 3 3 3 3 4 2 4 1 4 2 2 4 3 1 3 1 4 2 3 1
##  [38] 2 3 4 1 4 3 4 1 4 2 1 1 2 1 2 2 4 3 2 3 4 1 4 3 1 3 2 1 2 1 2 4 1 4 3 1 4
##  [75] 3 3 1 2 2 4 1 1 1 3 3 4 2 2 2 4 4 1 1 3 4 3 1 1 3 3
## 
## Within cluster sum of squares by cluster:
## [1] 39.12732 25.74157 31.51643 19.33222
##  (between_SS / total_SS =  61.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Label gerombol untuk setiap amatan/objek, bisa diperoleh dengan menggunakan $cluster. Kemudian,interpretasi setiap gerombol yang terbentuk dapat dilakukan dengan menggunakan bantuan nilai rata-rata dari masing-masing peubah dihitung berdasarkan gerombol. Karena kita melakukan standarisasi peubah, maka nilai rata-rata yang diperoleh juga dalam skala standarisasi.

Interprestasi Hasil Gerombol

kmeans_result$centers
##          Age     Income SpendingScore
## 1  0.8883491 -0.8782285     0.1556696
## 2  0.4576566  1.2324587    -0.6919230
## 3 -0.4130973  0.5803133     1.0807146
## 4 -0.8628733 -0.6874311    -0.8249851

Jika sulit membaca hasil dalam bentuk skala standarisasi maka kita bisa menggunakan fungsi aggregate untuk melihat rata-ratanya dalam skala aslinya. Fungsi ini dapat menghitung rata-rata setiap peubah berdasarkan gerombol yang terbentuk.

aggregate(customer_features,by =list(gerombol=kmeans_result$cluster),
            FUN = mean)
##   gerombol      Age   Income SpendingScore
## 1        1 58.07407 39214.44      54.11111
## 2        2 51.75000 86771.90      28.95000
## 3        3 38.96429 72077.93      81.57143
## 4        4 32.36000 43513.44      25.00000

Berdasarkan nilai rata-rata dari hasil tersebut, berikut adalah interpretasinya

Gerombol 1 : gerombol ini merupakan customer-customer yang sudah tua (peubah age bernilai besar) dan berpenghasilan kecil (peubah Income bernilai kecil) namun cukup besar menghabiskan uangnya untuk berbelanja (peubah spending score bernilai ketiga terbesar).

Gerombol 2 : gerombol ini merupakan customer-customer yang cukup tua (peubah age cukup besar) dan berpenghasilan besar (peubah Income bernilai terbesar) dan sedikit menghabiskan uangnya untuk berbelanja (peubah spending score bernilai kedua terkecil).

Gerombol 3 : gerombol ini merupakan customer-customer yang masih cukup muda (peubah age kedua terkecil) dan berpenghasilan cukup besar (peubah Income bernilai cukup besar) namun menghabiskan uangnya untuk berbelanja cukup besar (peubah spending score bernilai besar).

Gerombol 4 : gerombol ini merupakan customer-customer yang masih cukup sangat muda (peubah age bernilai kecil) dan berpenghasilan cukup (peubah Income bernilai sedang) namun menghabiskan uangnya untuk berbelanja kecil (peubah spending score bernilai terkecil).

# Alternative 2D plot
ggplot(customers, aes(x = Income, y = SpendingScore, color = factor(kmeans_result$cluster))) +
  geom_point(size = 3) +
  labs(title = "Customer Segments", x = "Annual Income", y = "Spending Score") +
  theme_minimal()

# Alternative 2D plot
ggplot(customers, aes(x = Age, y = SpendingScore, color = factor(kmeans_result$cluster))) +
  geom_point(size = 3) +
  labs(title = "Customer Segments", x = "Age", y = "Spending Score") +
  theme_minimal()

# Visualize clusters
fviz_cluster(kmeans_result, data = customer_features_standardize, 
             geom = "point", ellipse.type = "norm", 
             main = "Customer Segments")

Jika dataset memiliki lebih dari dua dimensi, data akan direduksi menjadi dua dimensi.