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:
- 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.
- Klaster 2 didominasi oleh pelanggan dengan pendapatan rendah, namun memiliki nilai spending score yang tinggi.
- 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:
- Pelanggan klaster satu cenderung memiliki pendapatan tahunan dan spending score yang normal, namun ada juga yang rendah, dan sebaliknya.
- 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.