TUGAS INDIVIDU STA1381 - PSD

Pendahuluan

Analisis gerombol merupakan analisis yang bertujuan untuk mencari pola pengelompokkan dari suatu objek pada data peubah ganda.Analisis gerombol terbagi dua yaitu berhirarki dan tak berhirarki. Analisis gerombol berhirarki mempunyai karkateristik jumlah gerombol (k) yang tidak ditentukan terlebih dahulu sebaliknya gerombol tak berhirarki jumlah k perlu ditentukan terlebih dahulu. Misalnya, pada data indikator makro sosial ekonomi belum ada informasi tentang jumlah k sehingga lebih cocok menggunakan analisis gerombol berhirarki. Kemiripan antar objek pada analisis gerombol berhirarki diukur menggunakan jarak antar objek (Johnson & Wichern 2007).

Library

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(readxl)
library(knitr)
library(tidyverse)
## ── Attaching packages
## ───────────────────────────────────────
## tidyverse 1.3.2 ──
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ✔ purrr   0.3.5      
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

Dataset yang digunakan

Data yang digunakan dalam analisis gerombol ini, yaitu Data Mall Customers dengan 5 peubah (Customer ID, Genre, Age, Annual Income, dan Spending Score). Data ini terdiri dari 200 amatan dan peubah Age, Annual Income, dan Spending Score adalah peubah yang akan digunakan dalam analisis ini. Analisis gerombol ini dilakukan dengan tujuan untuk memberikan gambaran strategi marketing yang baik dengan mengelompokkan customers berdasarkan peubah Age, Annual Income, dan Spending Score.

datacust <- read.csv2("C:/SEMESTER 5/PSD/Data Mall_Customer.csv")
tidyr::tibble(datacust)
## # A tibble: 200 × 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
str(datacust)
## 'data.frame':    200 obs. of  5 variables:
##  $ CustomerID    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Genre         : chr  "Male" "Male" "Female" "Female" ...
##  $ Age           : int  19 21 20 23 31 22 35 23 64 30 ...
##  $ Annual.Income : int  15 15 16 16 17 17 18 18 19 19 ...
##  $ Spending.Score: int  39 81 6 77 40 76 6 94 3 72 ...

Standarisasi Peubah

Standarisasi peubah dilakukan karena terdapat perbedaan satuan pengukuran pada peubah yang digunakan.

data.ok = datacust[,-c(1:2)]
head(data.ok)
##   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
# standarisasi data bisa dilakukan dengan menggunakan fungsi scale
data.stdz = scale(data.ok)

# Cek mean = 0
apply(data.stdz, 2, mean)
##            Age  Annual.Income Spending.Score 
##  -1.016906e-16  -8.144310e-17  -1.096708e-16
# Cek sd = 1
apply(data.stdz, 2, sd)
##            Age  Annual.Income Spending.Score 
##              1              1              1

Eksplorasi Data

ggplot(datacust, aes(x=reorder(Genre, +table(Genre)[Genre]), fill=Genre)) + 
 geom_bar() +
 scale_fill_manual(values=c("#F0E68C", "#F08080")) +
 labs(title = "Frekuensi Jenis Kelamin Pelanggan", 
 x = "Jenis Kelamin Pelanggan",
 y = "Frekuensi") +
 theme(plot.title = element_text(hjust = 0.5))

Berdasarkan plot di atas dapat dilihat bahwa pelanggan perempuan lebih banyak dibandingkan dengan pelanggan laki-laki.

ggplot(datacust) +
 aes(x = "", y = Age, fill = Genre) +
 geom_boxplot() +
 scale_fill_manual(values = c(Female = "#DEB887", 
 Male = "#5F9EA0")) +
 labs(x = "Jenis Kelamin Pelanggan", y = "Umur Pelanggan", 
 title = "Sebaran Umur Pelanggan",
 subtitle = "Berdasarkan Jenis Kelamin") +
theme(plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size
 = 12L, hjust = 0.5))

Berdasarkan boxplot di atas, dapat dilihat bahwa sebaran umur pelanggan cenderung menjulur ke kanan, yang berarti terdapat lebih banyak pelanggan mall yang berumur di atas 35 tahun.

ggplot(datacust) +
 aes(x = "", y = `Annual.Income`, fill = Genre) +
 geom_boxplot() +
 scale_fill_manual(values = c(Female = "#BDB76B", 
 Male = "#E9967A")) +
 labs(x = "Jenis Kelamin Pelanggan", y = "Pendapatan Tahunan Pelanggan", 
 title = "Sebaran Pendapatan Tahunan Pelanggan",
 subtitle = "Berdasarkan Jenis Kelamin") +
theme(plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size
 = 12L, hjust = 0.5))

Berdasarkan boxplot di atas, dapat dilihat bahwa sebaran pendapatan tahunan pelanggan memiliki sebaran yang hampir sama, yaitu menjulur ke kanan. Pada pelanggan laki-laki terdapat pencilan (pendapatan tahunan > 100 ribu dollar), namun secara keseluruhan dapat diamati bahwa pelanggan memiliki pendapatan tahunan yang berkisar antara 55 - 75 ribu dollar.

Analisis Data

Analisis Gerombol Berhierarki

Pemilihan Banyaknya Cluster

Koefisien Silhoutte

Silhouette Coefficient digunakan untuk melihat kualitas dan kekuatan cluster, seberapa baik atau buruknya suatu obyek ditempatkan dalam suatu cluster. Metode ini merupakan gabungan dari metode separasi dan kohesi.

#Complete Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "complete")

Pada metode Complete Linkage diperoleh nilai koefisien Silhoutte terbesar pada saat k = 5.

#Average Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "average", hc_metric="euclidean")

Pada metode Average Linkage diperoleh nilai koefisien Silhoutte terbesar pada saat k = 5.

#Centroid Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "centroid", hc_metric="euclidean")

Pada metode Centroid Linkage diperoleh nilai koefisien Silhoutte terbesar pada saat k = 2.

#Single Lingkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "single", hc_metric="euclidean")

Pada metode Single Linkage diperoleh nilai koefisien Silhoutte terbesar pada saat k = 2.

#Ward Linkage
fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "ward.D", hc_metric="euclidean")

Pada metode Ward Linkage diperoleh nilai koefisien Silhoutte terbesar pada saat k = 6.

Dendogram

Average Linkage

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "average"))

Centroid Linkage

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "centroid"))

Single Linkage

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "single"))

Ward Linkage

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "ward"))
## The "ward" method has been renamed to "ward.D"; note new "ward.D2"

Complete Linkage

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "complete"))

Berdasarkan output analisis dan dendogram yang diperoleh, dipilihlah metode Complete Linkage dengan nilai k = 5 atau jumlah klaster = 5, karena berdasarkan dendogram yang dihasilkan menunjukkan pola yang lebih seimbang dibandingkan dengan metode-metode lainnya.

Klaster dari Setiap Pengamatan pada Metode Complete Linkage

hc.data <- eclust(data.ok, stand = TRUE, FUNcluster = "hclust", k=5, hc_method = "complete",
 hc_metric = "euclidean", graph = F)
#cluster dari setiap pengamatan
hc.data$cluster
##   [1] 1 2 1 2 1 2 1 2 3 2 3 2 3 2 1 2 1 2 3 2 1 2 3 2 3 2 3 1 3 2 3 2 3 2 3 2 3
##  [38] 2 3 2 3 2 3 1 3 2 3 1 1 1 3 1 1 3 3 3 3 3 1 3 3 1 3 3 3 1 1 3 1 1 3 3 3 3
##  [75] 3 1 1 1 1 3 3 1 3 3 1 3 3 1 1 3 3 1 3 1 1 1 3 1 3 1 1 3 3 1 3 1 3 3 3 3 3
## [112] 1 1 1 1 1 3 3 3 3 1 1 1 4 1 4 5 4 5 4 5 4 1 4 5 4 5 4 5 4 5 4 1 4 5 4 5 4
## [149] 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5
## [186] 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4
aggregate(data.ok, by=list(cluster=hc.data$cluster), FUN = mean)
##   cluster      Age Annual.Income Spending.Score
## 1       1 28.35417      50.29167       45.93750
## 2       2 24.80952      25.61905       80.23810
## 3       3 55.33333      47.31579       41.08772
## 4       4 32.69231      86.53846       82.12821
## 5       5 41.68571      88.22857       17.28571
dataklaster <- data.frame("Observasi"=c(seq(1:200)),"Klaster"=hc.data$cluster)
kable(aggregate(Observasi~Klaster,dataklaster,paste,collapse=", "),align = c("c","l"))
Klaster Observasi
1 1, 3, 5, 7, 15, 17, 21, 28, 44, 48, 49, 50, 52, 53, 59, 62, 66, 67, 69, 70, 76, 77, 78, 79, 82, 85, 88, 89, 92, 94, 95, 96, 98, 100, 101, 104, 106, 112, 113, 114, 115, 116, 121, 122, 123, 125, 133, 143
2 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 30, 32, 34, 36, 38, 40, 42, 46
3 9, 11, 13, 19, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 51, 54, 55, 56, 57, 58, 60, 61, 63, 64, 65, 68, 71, 72, 73, 74, 75, 80, 81, 83, 84, 86, 87, 90, 91, 93, 97, 99, 102, 103, 105, 107, 108, 109, 110, 111, 117, 118, 119, 120
4 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200
5 127, 129, 131, 135, 137, 139, 141, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199

Berdasarkan analisis gerombol berhierarki dengan metode Complete Linkage diperoleh bahwa peubah Age, Annual Income, dan Spending Score telah dikelompokkan menjadi 5 klaster. Pada analisis tersebut, terlihat bahwa klaster 2 terdiri dari pelanggan degan usia sekitar 24 tahun dan memiliki pendapatan rendah, tetapi memiliki spending score tinggi. Pada klaster 5 terdiri dari pelanggan dengan usia sekitar 41 tahun dengan pendapatan yang tinggi, tetapi nilai spending scorenya rendah. Sehingga dapat disimpulkan bahwa pelanggan yang lebih tua cenderung jarang mengunjungi mall meskipun mereka memiliki pendapatan yang tinggi dan sebaliknya.

ggplot(datacust, 
 aes(x = datacust$`Spending.Score` , y = datacust$`Annual.Income`)) + 
 geom_point(stat = "identity", aes(color = as.factor(hc.data$cluster))) +
 scale_color_discrete(name = " ", 
 breaks=c("1", "2", "3", "4", "5"),
 labels=c("Klaster 1", "Klaster 2",
 "Klaster 3", "Klaster 4",
 "Klaster 5")) +
 ggtitle("Segmentasi Pelanggan", 
 subtitle = "dengan Menggunakan Analisis Gerombol Berhierarki")

Interpretasi:

  1. Pelanggan klaster satu dan tiga memiliki pendapatan dan spending score yang tumpang tindih. Klaster 1 didominasi pelanggan dengan usia sekitar 28 tahun dan klaster 3 didominasi pelanggan berusia 55 tahun. Selain itu, terdapat tumpang tindih pada klaster 1 dan klaster 3.
  2. Klaster 2 didominasi oleh pelanggan dengan pendapatan rendah, namun memiliki nilai spending score yang tinggi.
  3. Klaster 4 dan 5 sama-sama memiliki pedapatan yang tinggi, namun klaster 4 cenderung memiliki spending score tinggi, dan sebaliknya pada klaster 5.
fviz_cluster(hc.data)

Analisis Gerombol Tak-Berhierarki (k-means)

Pemilihan Banyaknya Cluster

#Penentuan k dengan within sum square
fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "wss")

Jumlah cluster dapat ditentukan berdasarkan garis yang membentuk elbow (hal ini bersifat subjektif) dan setiap individu dapat berbeda-beda. Berdasarka plot di atas dapat dilihat bahwa garis yang membentuk elbow berada pada saat k = 2.

#k = 2
kmeans.data <- eclust(data.ok, stand = TRUE, FUNcluster = "kmeans", k=2, graph = F)

kmeans.data$centers
##          Age Annual.Income Spending.Score
## 1 -0.7508891   0.002621995      0.7407935
## 2  0.7071480  -0.002469258     -0.6976405

Berdasarkan output di atas, muncullah centroid pada data yang masih terstandarisasi sehingga sulit untuk diinterpertasikan.

kmeans.data$cluster
##   [1] 1 1 2 1 1 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
##  [38] 1 2 1 2 1 2 1 2 1 2 1 1 1 2 1 1 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 1 1 2 2 2 2
##  [75] 2 1 2 2 1 2 2 1 2 2 1 2 2 1 1 2 2 1 2 2 1 1 2 1 2 1 1 2 2 1 2 1 2 2 2 2 2
## [112] 1 2 1 1 1 2 2 2 2 1 2 1 1 1 1 2 1 2 1 2 1 1 1 2 1 2 1 2 1 2 1 1 1 2 1 2 1
## [149] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## [186] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
aggregate(data.ok, by=list(cluster=kmeans.data$cluster), FUN = mean)
##   cluster      Age Annual.Income Spending.Score
## 1       1 28.36082      60.62887       69.32990
## 2       2 48.72816      60.49515       32.18447
datakmeans <- data.frame("Observasi"=c(seq(1:200)),"Klaster"=kmeans.data$cluster)
kable(aggregate(Observasi~Klaster,datakmeans,paste,collapse=", "),align = c("c","l"))
Klaster Observasi
1 1, 2, 4, 5, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 49, 50, 52, 53, 59, 62, 66, 69, 70, 76, 79, 82, 85, 88, 89, 92, 95, 96, 98, 100, 101, 104, 106, 112, 114, 115, 116, 121, 123, 124, 125, 126, 128, 130, 132, 133, 134, 136, 138, 140, 142, 143, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200
2 3, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 51, 54, 55, 56, 57, 58, 60, 61, 63, 64, 65, 67, 68, 71, 72, 73, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 90, 91, 93, 94, 97, 99, 102, 103, 105, 107, 108, 109, 110, 111, 113, 117, 118, 119, 120, 122, 127, 129, 131, 135, 137, 139, 141, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199

Berdasarkan analisis gerombol tak berhierarki, diperoleh bahwa Age, Annual Income, dan, Spending Score telah dikelompokkan menjadi 2 klaster. Output di atas, menunjukkan bahwa pada klaster 1 terdiri dari pelanggan berusia sekitar 28 tahun dengan pendapatan dan spending score cukup tinggi. Sedangkan pada klaster 2 terdiri dari pelanggan berusia sekitar 48 tahun dengan pendapatan tinggi namun nilai spending score nya rendah. Sehingga dapat disimpulkan bahwa pelanggan dengan usia muda (pendapatan tinggi), cenderung suka mengunjungi mall dan menghabisakan uangnya untuk membeli sesuatu di mall.

ggplot(datacust, aes(x = datacust$`Spending.Score` , y = datacust$`Annual.Income`)) + 
 geom_point(stat = "identity", aes(color = as.factor(kmeans.data$cluster))) +
 scale_color_discrete(name = " ", 
 breaks=c("1", "2"),
 labels=c("Cluster 1", "Cluster 2")) +
 ggtitle("Segmentasi Pelanggan", 
 subtitle = "dengan Menggunakan Analisis Gerombol Tak Berhierarki")

Interpretasi:

  1. Pelanggan klaster satu cenderung memiliki pendapatan tahunan dan spending score yang normal, namun ada juga yang rendah, dan sebaliknya.
  2. Pelanggan klaster dua cenderung memiliki pendapatan tahunan dan spending score yang normal, namun terdapat pelanggan yang memiliki pendapatan rendah tapi spending score tinggi, dan ada juga pelanggan dengan pendapatan dan nilai spending sore yang tinggi.
fviz_cluster(kmeans.data)

Simpulan

Berdasarkan analisis yang telah dilakukan, analisis gerombol berhierarki dengan metode Complete Linkage diperoleh bahwa ketiga peubah (Age, Annual Income, dan Spending Score) dikelompokkan ke dalam lima klaster untuk dapat menjalankan strategi marketing yang baik, sedangkan analisis gerombol tak-berhierarki (k-means) ketiga peubah dikelompokkan menjadi dua klaster untuk dapat menjalankan strategi marketing yang baik.