Analisis Gerombol (Clustering Analysis) bertujuan untuk menemukan subkelompok yang homogen di antara pengamatan. Dua pendekatan metode penggerombolan yang paling terkenal antara lain:
Library yang akan digunakan dalam analisis gerombol ini antara lain :
library(ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggpubr)
library(FactoMineR)
Data yang akan digunakan adalah data pelanggan dari suatu mall.
Peubah yang ada antara lain Customer ID atau ID pelanggan,
Genre atau jenis kelamin pelanggan, Age atau
umur pelanggan, Annual Income atau pendapatan tahunan dalam
ribu dolar, dan Spending Score atau nilai yang diberikan
oleh mall kepada pelanggan berdasarkan perilaku pelanggan tersebut
(meliputi waktu kunjungan, jenis barang yang dibeli, dan banyaknya uang
yang dihabiskan dalam belanja) dalam rentang nilai 1-100. Semakin besar
nilai Spending Score maka semakin besar pula uang belanja yang digunakan
serta menandakan bahwa pelanggan tersebut loyal pada mall.
dataa <- read.table("C:/ICA/Semester 5/PSD/Data Mall_Customer.csv",sep=";", header = T)
tidyr::tibble(dataa)
## # A tibble: 200 x 5
## CustomerID Genre Age Annual.Income Spending.Score
## <int> <chr> <int> <int> <int>
## 1 1 Male 19 15 39
## 2 2 Male 21 15 81
## 3 3 Female 20 16 6
## 4 4 Female 23 16 77
## 5 5 Female 31 17 40
## 6 6 Female 22 17 76
## 7 7 Female 35 18 6
## 8 8 Female 23 18 94
## 9 9 Male 64 19 3
## 10 10 Female 30 19 72
## # ... with 190 more rows
Dalam analisis ini kita dapat mengabaikan peubah id pelanggan dan jenis kelamin sehingga peubah yang digunakan hanya usia, annual income, dan spending score.
data = dataa[,-1:-2]
head(data)
## Age Annual.Income Spending.Score
## 1 19 15 39
## 2 21 15 81
## 3 20 16 6
## 4 23 16 77
## 5 31 17 40
## 6 22 17 76
Perlu dilakukan scaling data karena peubah yang digunakan memiliki satuan yang berbeda-beda.
data.stdz = scale(data)
apply(data.stdz, 2, mean)
## Age Annual.Income Spending.Score
## -1.016906e-16 -8.144310e-17 -1.096708e-16
apply(data.stdz, 2, sd)
## Age Annual.Income Spending.Score
## 1 1 1
Metode ini merupakan pendekatan alternatif yang tidak mengharuskan memilih ataupun berkomitmen pada k (banyaknya gerombol) tertentu. Analisis Gerombol terdiri dari beberapa metode berdasarkan cara perhitungan tingkat kemiripan, yaitu Single Linkage, Average Linkage, Complete Linkage, dan Centroid Linkage.
Jumlah gerombol dapat ditentukan menggunakan beberapa kriteria
statistik, misalnya dengan metode Silhoutte dan
WSS (within Cluster Sum of Square). Metode Silhoutte
menghitung berdasarkan jarak antarpengamatan. Metode ini mengukur
seberapa dekat satu observasi dengan observasi lainnya dalam satu
gerombol yang sama. Sedangkan WCSS menghitung varian dalam gerombol yang
terbentuk. Varians yang lebih kecil di gerombol menunjukkan bahwa
gerombol tersebut sesuai.
sing.linkage <-fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "single", hc_metric="euclidean")+ggtitle("Single Average")
ave.linkage <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "average", hc_metric="euclidean")+ggtitle("Average Linkage")
comp.linkage <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "complete", hc_metric="euclidean")+ggtitle("Complete Average")
centr.linkage <- fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "centroid", hc_metric="euclidean")+ggtitle("Centroid Average")
ggarrange(sing.linkage,ave.linkage,comp.linkage,centr.linkage, ncol = 2, nrow = 2)
Semakin banyak gerombol yang terbentuk dengan metode Silhoutte maka
semakin menunjukkan bahwa gerombol tersebut sesuai. Dari output
di atas, dapat dilihat bahwa Average Linkage dan Complete
Linkage menghasilkan jumlah gerombol yang paling banyak
dibandingkan metode lainnya, yakni sama-sama sebanyak 5.
sing.link <- fviz_nbclust(data.stdz,FUNcluster = hcut, method = "wss", hc_method = "single")+ggtitle("Single Linkage")
ave.link <- fviz_nbclust(data.stdz,FUNcluster = hcut, method = "wss", hc_method = "average")+ggtitle("Average Linkage")
comp.link <- fviz_nbclust(data.stdz,FUNcluster = hcut, method = "wss", hc_method = "complete")+ggtitle("Complete Linkage")
centr.link <- fviz_nbclust(data.stdz,FUNcluster = hcut, method = "wss", hc_method = "centroid")+ggtitle("Centroid Linkage")
ggarrange(sing.link,ave.link,comp.link,centr.link, ncol = 2, nrow = 2)
Berdasarkan metode WSS juga jumlah gerombol dipilih berdasarkan garis
gerombol yang berbentuk siku (elbow). Pada output di
atas, terlihat bahwa varians terkecil terdapat pada metode Average
Linkage dan Complete Linkage dengan jumlah gerombol
optimum masing-masing sebanyak 5.
Untuk mencari metode terbaik dapat menggunakan nilai korelasi cophenetic dari masing-masing metode.
n <- dim(data.stdz)[1]
Data <- data.matrix(data.stdz,1:3)
rownames(Data)=c(1:nrow(Data))
apply(Data, 2, mean)
## Age Annual.Income Spending.Score
## -1.016906e-16 -8.144310e-17 -1.096708e-16
# Single Linkage
d1 = dist(Data)
hc.sing = hclust(d1, "single")
d2.sing = cophenetic(hc.sing)
cor.sing = cor(d1,d2.sing)
# Average Linkage
d1 = dist(Data)
hc.ave = hclust(d1, "average")
d2.ave = cophenetic(hc.ave)
cor.ave = cor(d1,d2.ave)
# Complete Linkage
d1 = dist(Data)
hc.comp = hclust(d1, "complete")
d2.comp = cophenetic(hc.comp)
cor.comp = cor(d1,d2.comp)
# Centroid
d1 = dist(Data)
hc.centr = hclust(d1, "centroid")
d2.centr = cophenetic(hc.centr)
cor.centr = cor(d1,d2.centr)
cor <- data.frame(cor.sing,cor.ave,cor.comp,cor.centr)
cor
## cor.sing cor.ave cor.comp cor.centr
## 1 0.5416452 0.6683198 0.5931023 0.5919521
Metode terbaik dipilih berdasarkan nilai koefisien cophenetic terbesar sehingga berdasarkan output di atas, metode terbaik yang dipilih untuk analisis gerombol adalah metode Average Linkage dengan koefisien sebesar 0.6683.
Selanjutnya, dilakukan analisis pada metode
Average Linkage dengan banyaknya gerombol sebesar 5. ###
Clustering Average Linkage
h.clust<-eclust(data.stdz,FUNcluster = "hclust",k=5,hc_method = "average",hc_metric="euclidian")
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## i The deprecated feature was likely used in the factoextra package.
## Please report the issue at <https://github.com/kassambara/factoextra/issues>.
plot(1:200,h.clust$cluster,xlab="Order",ylab="Cluster")
Terlihat bahwa data 1-200 sudah masuk ke dalam 5 gerombol. Urutan data
awal cenderung masuk ke dalam gerombol 1 atau 2.
fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "average"))
Dari ouput di atas, terlihat visual pengamatan penggerombolan
dari metode Average Linkage berupa diagram pohon atau disebut
dendogram. Dendogram di atas mengelompokan pelanggan yang terdistribusi
cukup merata.
fviz_cluster(h.clust)
Dari output di atas, terlihat bahwa nilai dari Dim1 dan Dim2
berturut-turut adalah 44.3% dan 33.3%. Artinya, plot ini mengandung
77.6% dari keseluruhan informasi yang ada pada data pelanggan mall.
Terlihat juga bahwa masing-masing cluster cenderung tidak terlalu
menumpuk sehingga gerombol sudah cukup baik dalam mengelompokkan
data.
y <- aggregate(data.stdz,by=list(h.clust$cluster),function(x)sum(scale(x,scale=FALSE)^2))
clusters <- rowSums((y[-1]))
ssw.h <- sum(clusters)
ssw.h
## [1] 176.1383
Nilai pada output di atas adalah nilai total SSW untuk masing-masing gerombol pada hierarchical clustering.
Metode ini disebut juga dengan ‘K-means’. Metode K-means adalah pendekatan yang sederhana juga elegan untuk mempartisi data pengamatan menjadi sejumlah pengelompokan yang telah ditentukan sebelumnya (sebanyak k). Tujuan partisi ini adalah agar data dikelompokkan ke dalam k gerombol yang berbeda dan tidak tumpang tindih.
fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "wss")
Berdasarkan output di atas, terlihat bahwa gerombol yang
membentuk siku berada di angka 5. Banyaknya gerombol yang dipilih untuk
analisis k-means adalah 5 berdasarkan metode WSS.
kmeans.data<-eclust(data.stdz,FUNcluster = "kmeans",k=5,graph=FALSE)
plot(1:200,kmeans.data$cluster,xlab="Order",ylab="Cluster")
Terlihat bahwa data 1-200 sudah masuk ke dalam 5 gerombol. Urutan data
awal cenderung masuk ke dalam gerombol 1 atau 3.
fviz_cluster(kmeans.data)
Dari output di atas, terlihat bahwa nilai dari Dim1 dan Dim2
berturut-turut adalah 44.3% dan 33.3%. Artinya, plot ini mengandung
77.6% dari keseluruhan informasi yang ada pada data pelanggan mall.
Terlihat juga bahwa masing-masing cluster cenderung tidak terlalu
menumpuk sehingga gerombol sudah cukup baik dalam mengelompokkan
data.
Metode penggerombolan yang baik akan menghasilkan gerombol yang sesuai, di mana : 1. Nilai WSS rendah, yang berarti jarak antarpengamatan dalam gerombol yang sama semakin kecil 2. Kesamaan Intra-kelas tinggi 3. Kesamaaan Antar-kelas rendah 4. Rasio BSS/TSS mendekati 1.
# Within Sum of Squares
ssw.k <- kmeans.data$tot.withinss
ssw.k
## [1] 167.8574
# Sum of Squares
ss.k <- kmeans.data$betweenss
ss.k
## [1] 429.1426
# Ratio BSS / TSS
ss.k/kmeans.data$totss
## [1] 0.7188318
ss.total <- sum(data.stdz^2)
ssb.h <- ss.total - ssw.h
Fh <- (ssb.h/5)/(ssw.h/194)
ssb.k <- ss.total-(kmeans.data$tot.withinss)
Fk <- (ssb.k/5)/(ssw.k/191)
metode.terbaik <- data.frame("Hierarchical"=Fh, "KMeans"=Fk)
rownames(metode.terbaik)="Nilai Kebaikan Model"
metode.terbaik
## Hierarchical KMeans
## Nilai Kebaikan Model 92.70804 97.66174
Dari output di atas, terlihat bahwa metode K-Means merupakan metode terbaik untuk menggerombolkan data pelanggan karena memiliki nilai kebaikan model yang paling tinggi, yaitu sebesar 97.6617.
Analisis gerombol dibedakan menjadi dua jenis, yaitu analisis gerombol berhierarki dan nonhierarki (disebut juga k-means). Dalam analisis gerombol berhierarki, metode terbaik ditentukan berdasarkan nilai koefisien cophenetic terbesar sedangkan dalam analisis k-means ukuran kebaikan model dilihat dari nilai within sum of squares, sum of squares, dan ratio BSS/TSS. Adapun metode terbaik di antara kedua jenis metode analisis gerombol dipilih berdasarkan nilai within sum of squares terbesar. Pemilihan banyaknya gerombol yang terbentuk dapat melalui metode Silhoutte maupun WSS.
Dari hasil analisis di atas, diperoleh metode ‘K-Means’ merupakan metode terbaik untuk menggerombolkan data pelanggan. Interpretasi masing-masing gerombol untuk metode tersebut adalah : 1. Gerombol 1 merupakan pelanggan muda dengan penghasilan besar tetapi spending score yang sedikit. 2. Gerombol 2 merupakan pelanggan tua dengan penghasilan besar tetapi spending score yang sedikit. 3. Gerombol 3 merupakan pelanggan muda dengan penghasilan kecil tetapi spending score yang tinggi. 4. Gerombol 4 merupakan pelanggan berkepala 3 dengan penghasilan sangat besar tetapi spending score yang kecil. 5. Gerombol 5 merupakan pelanggan berkepala 3 dengan penghasilan besar dan spending score yang besar pula. 6. Gerombol 6 merupakan pelanggan muda dengan penghasilan biasa saja dan spending score yang biasa pula. 7. Gerombol 7 merupakan pelanggan tua dengan penghasilan biasa saja dan spending score yang biasa pula. 8. Gerombol 8 merupakan pelanggan tua dengan penghasilan yang sangat rendah dan spending score yang rendah pula. Dengan begitu, dapat disimpulkan bahwa Gerombol 7 yang memiliki frekuensi pelanggan paling banyak perlu menjadi perhatian manajemen dalam pembuatan strategi marketing.
kmeansdata<-aggregate(data.stdz,by=list(cluster=kmeans.data$cluster),FUN=mean)
non.hir <- as.data.frame(table(kmeans.data$cluster))
cbind(kmeansdata,"Frekuensi"=non.hir$Freq)
## cluster Age Annual.Income Spending.Score Frekuensi
## 1 1 -0.8117514 -0.3980098 -0.2549218 47
## 2 2 1.1956271 -0.4598275 -0.3262196 58
## 3 3 -0.9719569 -1.3262173 1.1293439 22
## 4 4 0.2211606 1.0805138 -1.2868231 33
## 5 5 -0.4277326 0.9724070 1.2130414 40