Ilustrasi: Data Pemegang Kartu ATM

Sebagai ilustrasi, kita akan menggunakan data pemegang kartu ATM suatu bank. Fasilitas yang diperoleh pemegang kartu ATM adalah sebagai berikut:

  1. melakukan transaksi tunai di mesin ATM

  2. melakukan transaksi non-tunai di mesin ATM

  3. melakukan transaksi melalui layanan internet banking

  4. melakukan debit untuk keperluan belanja di berbagai merchant

Data tersebut merupakan data contoh yang terdiri dari 8000 nasabah yang menyimpan informasi berikut:

  • frekuensi empat jenis transaksi yang telah disebutkan sebelumnya, selama satu bulan terakhir

  • beberapa informasi dasar mengenai nasabah, yaitu usia, jenis kelamin, dan rata-rata saldo harian.

nasabah<-read.csv("https://raw.githubusercontent.com/raoy/data/master/transaksi.csv")
dim(nasabah)
## [1] 8000   10
names(nasabah)
##  [1] "nasabah"      "tunaiATM"     "nontunaiATM"  "internet"     "debitbelanja"
##  [6] "usia17_25"    "usia26_55"    "usia56"       "saldoharian"  "jeniskelamin"
head(nasabah)

1-Variable Clustering

Sebagai ilustrasi awal, misalnya kita hanya mengamati 20 amatan pertama.

nasabah20 <- nasabah [1:20,]
stripchart(nasabah20$saldoharian,"stack",pch=19,cex=0.5, main="Saldo Harian")

Perhatikan bahwa seandainya penggorombolan nasabah akan dilakukan berdasarkan satu peubah, misanya Saldo Harian, maka hal tersebut dapat dilakukan secara visual, maupun dengan pendekatan lain, seperti kuantil, equal interval, natural breaks (jenks), dsb.

library(classInt)
partisi1 <- classIntervals(nasabah20$saldoharian)
partisi2 <- classIntervals(nasabah20$saldoharian,n=4,style="jenks")
nasabah20$cl1<-findCols(partisi1)
nasabah20$cl2<-findCols(partisi2)

Visualization

Secara sederhana, penggerombolan berdasarkan dua peubah, dapat diidentifikasi secara visual, seperti pada contoh berikut ini.

plot(nasabah20$saldoharian,nasabah20$tunaiATM,pch=19,cex=0.5,ylab="ATM",xlab="Saldo",col="blue")

plot(nasabah20$saldoharian,nasabah20$tunaiATM,type="n",ylab="ATM",xlab="Saldo")
text(nasabah20$saldoharian,nasabah20$tunaiATM,nasabah20$nasabah,cex=0.7)

Clustering based on k variables

Penggerombolan berdasarkan lebih dari 2 peubah tidak mudah dilakukan secara visual, oleh karenanya pendekatan yang digunakan adalah ukuran kuantatif (jarak) yang menyatakan kemiripan antar pengamatan.

Calculating Distance

jarak1 <- dist(nasabah20[,-1])
#as.matrix(jarak1)
jarak2 <- dist(nasabah20[,-1],method="manhattan")
#as.matrix(jarak2)

Hierarchical Clustering

Penggerombolan berhirarki dilakukan ketika banyaknya gerombol belum diketahui, serta penentuan gerombolnya dilakukan berdasarkan dendogram.

clustsingle <- hclust(jarak1, method="single")
plot(clustsingle)

clustcomp <- hclust(jarak1, method="complete")
plot(clustcomp)

library(cluster)
pltree(diana(jarak1))

Non-hierarchical Clustering

Penggerombolan non-hirarki dilakukan ketika kita sudah mengetahui banyaknya gerombol yang ingin dibentuk. Beberapa contoh penggerombolan non-hirarki: k-means dan k-medoid.

kmeans(jarak1,3)
## K-means clustering with 3 clusters of sizes 4, 13, 3
## 
## Cluster means:
##           1         2         3         4         5         6         7
## 1 10.364242  7.658838 10.525402  9.383075  9.066435  9.928734  8.030254
## 2  3.652358  3.986857  3.368826  3.321472  2.974554  3.364498  3.708673
## 3 15.632133 13.298558 14.678145 13.012041 13.171478 14.334612 11.783000
##          8         9        10        11        12        13        14
## 1 3.236560  8.498594  4.756260  3.631967  8.266874  9.001421  9.820733
## 2 8.444416  4.306530 12.338048  8.552437 13.470472  4.159215  3.324490
## 3 8.613695 14.541451  9.968876 10.220350  2.517422 12.885689 13.823874
##          15        16        17       18        19       20
## 1  9.786065 10.431613  9.702327 3.284222  9.171068 10.03269
## 2 13.880768  3.426738 14.389541 8.176822  3.458975  3.84955
## 3  2.854983 15.255002  2.183819 8.204100 12.749159 15.71158
## 
## Clustering vector:
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
##  2  2  2  2  2  2  2  1  2  1  1  3  2  2  3  2  3  1  2  2 
## 
## Within cluster sum of squares by cluster:
## [1] 269.54971 420.90939  44.48674
##  (between_SS / total_SS =  88.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
kmeans(jarak2,3)
## K-means clustering with 3 clusters of sizes 3, 4, 13
## 
## Cluster means:
##           1         2         3         4         5         6         7
## 1 34.771616 31.215737 34.013100 30.138650 30.081565 32.283840 26.295644
## 2 20.560188 15.645570 20.776266 18.577039 17.548496 17.482967 14.488869
## 3  7.599201  9.696506  7.139192  7.294101  6.677923  7.736049  8.650953
##           8         9       10        11        12        13        14
## 1 18.210409 34.985721 20.70624 22.822429  5.395959 28.578107 30.990443
## 2  6.526425 19.248888 10.44518  8.085595 17.340875 16.463434 16.502935
## 3 17.136803  9.197782 24.28200 15.144204 30.105100  9.538336  7.558883
##          15        16        17        18        19        20
## 1  6.307021 35.422908  4.789882 19.874924 29.079995 37.656429
## 2 22.710521 18.352741 21.159105  7.445176 17.547711 20.752928
## 3 33.090130  7.819286 32.692560 15.421006  7.832132  8.123035
## 
## Clustering vector:
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
##  3  3  3  3  3  3  3  2  3  2  2  1  3  3  1  3  1  2  3  3 
## 
## Within cluster sum of squares by cluster:
## [1]  313.2616 1411.8528 2647.1539
##  (between_SS / total_SS =  86.1 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Penentuan Banyaknya Cluster

Banyaknya cluster dapat ditetapkan karena mempertimbangkan batasan tertentu, atau dapat pula ditentukan berdasarkan karakateristik data. Secara visual, penentuan banyak gerombol berdasarkan dendogram dilakukan berdasarkan loncatan jarak penggabungan yang paling besar. Secara statistik, banyaknya gerombol dapat ditentukan berdasarkan within sum of squares, Silhouette coefficient, ataupun Pseudo F.

Sebagai ilustrasi, kita akan kembali menggunakan data transaksi.

transaksi<-read.csv("https://raw.githubusercontent.com/raoy/data/master/transaksi.csv")
freq.transaksi <- transaksi[,c(2, 3, 4, 5)] #hanya menggunakan data frekuensi transaksi
head(freq.transaksi) 

Selanjutnya misalkan kita akan melakukan clustering dengan metode k-means pada data tersebut.

cluster <- kmeans(freq.transaksi, centers=5)
cluster$centers 
##   tunaiATM nontunaiATM  internet debitbelanja
## 1 1.083012   3.9382239 4.7760618     3.119691
## 2 8.962963   0.9816454 1.0016388     1.061291
## 3 3.003367   5.6610550 0.9921437    10.154882
## 4 9.139109   1.0499792 1.0079134     9.156185
## 5 3.036874   2.4108867 1.0254609    10.758560
table(cluster$cluster) 
## 
##    1    2    3    4    5 
##  518 3051  891 2401 1139

Menghitung Within Sum of Squares (SS)

total.wss <- (nrow(freq.transaksi)-1) *     sum(apply(freq.transaksi,2,var)) 
for (i in 2:15) {
total.wss[i] <- kmeans(freq.transaksi, centers=i)$tot.withinss 
}
plot(1:15, total.wss, type="b", xlab="Number of Clusters",
     ylab="total Within groups sum of squares",
     main="Assessing the Optimal Number of Clusters with the Elbow Method",
    pch=20, cex=2)

Silhouette Coefficient

sil.coef <- NULL
jarak <- dist(freq.transaksi)^2
for (i in 2:15) {
cluster <- kmeans(freq.transaksi, centers=i)
sil.coef [i-1] <- mean(silhouette(cluster$cluster, jarak)[,3])
}
plot(2:15, sil.coef, type="b", 
     cex=2, pch=20, xlab="banyak cluster",
     ylab = "silhouette coef")

Ilustrasi lainnya dapat dilihat pada tautan ini.


  1. Department of Statistics, IPB University, ↩︎