Sebagai ilustrasi, kita akan menggunakan data pemegang kartu ATM suatu bank. Fasilitas yang diperoleh pemegang kartu ATM adalah sebagai berikut:
melakukan transaksi tunai di mesin ATM
melakukan transaksi non-tunai di mesin ATM
melakukan transaksi melalui layanan internet banking
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)
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)
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)
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.
jarak1 <- dist(nasabah20[,-1])
#as.matrix(jarak1)
jarak2 <- dist(nasabah20[,-1],method="manhattan")
#as.matrix(jarak2)
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))
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"
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
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)
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.
Department of Statistics, IPB University, rahmaanisa@apps.ipb.ac.id↩︎