Tugas Individu Unsupervised Machine Learning - STA1381 engantar Sains Data

2023-11-29

Pendahuluan

Unsupervised Machine Learning adalah metode yang didasarkan kepada kumpulan contoh dati populasi berlabel untuk mengidentifikasi karakteristik sebaran subjek dalam oembentukan model perilaku dari data (Amei et al. 2011). Metode ini juga seringkali disebut dengan cluster karena data yang digunakan tidak harus merupakan data yang berlabel (Thupai et al. 2018).

Packagaes Isntallation

Berikut library yang digunakan dalam unsupervied machine learning kali ini.

library(ggplot2)
library(factoextra)
library(knitr)
library(dplyr)
library(ggcorrplot)
library(corrplot)

Data

Data yang digunakan adalah dataset Mall_Customer.csv tentang customer mall dengan format csv. Data ini memiliki beberapa peubah yaitu:

  1. Customer ID

  2. Age

  3. Genre

  4. Annual Income

  5. Spending Score

Import Data

data_2<- read.csv("D:/KULIAH/TAHUN Ke-3/Semester 5/Pengantar Sains Data/13/Data Mall_Customer.csv", sep=";")
head(data_2)
##   CustomerID  Genre Age Annual.Income Spending.Score
## 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
str(data_2)
## '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 ...
data_3 <- data_2[,-c(2)]

Dilakukan eliminasi beberapa peubah yang tidak digunakan yaitu peubah Gender dan Customer ID karena tidak digunakan.

Standardisasi Data

Antar peubah ang digunakan memiliki satuan yang berbeda sehingga dilakukan standardisasi. Proses ini dilakukan dengan transformasi peubah menjadi peubah yang memiliki rata-rata nol dan simpangan baku satu.

# Standardisasi Skala, krn skala satuan berbeda (krn disini menggunakan konsep Jarak)
data <- data_2[,-c(1:2)]
data.stdz = scale(data)
data.stdz %>% head(200) %>% kable(caption = "Hasil Standarisasi Data Mall Customer")
Hasil Standarisasi Data Mall Customer
Age Annual.Income Spending.Score
-1.4210029 -1.7346462 -0.4337131
-1.2778288 -1.7346462 1.1927111
-1.3494159 -1.6965724 -1.7116178
-1.1346547 -1.6965724 1.0378135
-0.5619583 -1.6584985 -0.3949887
-1.2062418 -1.6584985 0.9990891
-0.2756101 -1.6204246 -1.7116178
-1.1346547 -1.6204246 1.6961281
1.8004143 -1.5823507 -1.8277910
-0.6335454 -1.5823507 0.8441916
2.0151754 -1.5823507 -1.4018227
-0.2756101 -1.5823507 1.8897500
1.3708920 -1.5442768 -1.3630984
-1.0630677 -1.5442768 1.0378135
-0.1324360 -1.5442768 -1.4405471
-1.2062418 -1.5442768 1.1152623
-0.2756101 -1.5062029 -0.5886107
-1.3494159 -1.5062029 0.6118453
0.9413697 -1.4300552 -0.8209570
-0.2756101 -1.4300552 1.8510256
-0.2756101 -1.3919813 -0.5886107
-0.9914806 -1.3919813 0.8829160
0.5118474 -1.3539074 -1.7503422
-0.5619583 -1.3539074 0.8829160
1.0845438 -1.2396857 -1.4018227
-0.7051324 -1.2396857 1.2314354
0.4402603 -1.2396857 -0.7047838
-0.2756101 -1.2396857 0.4182234
0.0823251 -1.2016118 -0.7435082
-1.1346547 -1.2016118 1.4250574
1.5140661 -1.1635380 -1.7890666
-1.2778288 -1.1635380 0.8829160
1.0129567 -1.0493163 -1.7890666
-1.4925900 -1.0493163 1.6186793
0.7266085 -1.0493163 -1.4018227
-1.2778288 -1.0493163 1.1927111
0.2254992 -1.0112424 -1.2856496
-0.6335454 -1.0112424 0.8829160
-0.2040231 -0.8970208 -0.9371301
-1.3494159 -0.8970208 0.9603648
1.8720013 -0.8589469 -0.5886107
-1.0630677 -0.8589469 1.6186793
0.6550215 -0.8208730 -0.5498863
-0.5619583 -0.8208730 0.4182234
0.7266085 -0.8208730 -0.8596814
-1.0630677 -0.8208730 0.5731209
0.7981956 -0.7827991 0.1858770
-0.8483065 -0.7827991 -0.1239180
-0.7051324 -0.7827991 -0.3175400
-0.5619583 -0.7827991 -0.3175400
0.7266085 -0.7066513 0.0697039
-0.4187842 -0.7066513 0.3794990
-0.5619583 -0.6685774 0.1471527
1.4424790 -0.6685774 0.3794990
0.7981956 -0.6685774 -0.2013668
0.5834344 -0.6685774 -0.3562643
0.8697826 -0.6305036 -0.0077449
2.1583495 -0.6305036 -0.1626424
-0.8483065 -0.5543558 0.0309795
1.0129567 -0.5543558 -0.1626424
2.2299365 -0.5543558 0.2246014
-1.4210029 -0.5543558 0.1858770
2.0151754 -0.5162819 0.0697039
1.0845438 -0.5162819 0.3407746
1.7288272 -0.4782080 0.0309795
-1.4925900 -0.4782080 0.3407746
0.2970862 -0.4782080 -0.0077449
2.0867625 -0.4782080 -0.0851936
-1.4210029 -0.4782080 0.3407746
-0.4903713 -0.4782080 -0.1239180
2.2299365 -0.4401341 0.1858770
0.5834344 -0.4401341 -0.3175400
1.5140661 -0.4020602 -0.0464693
1.5140661 -0.4020602 0.2246014
1.4424790 -0.2497647 -0.1239180
-0.9198936 -0.2497647 0.1471527
0.4402603 -0.2497647 0.1084283
0.0823251 -0.2497647 -0.0851936
-1.1346547 -0.2497647 0.0697039
0.7266085 -0.2497647 -0.3175400
1.2993049 -0.2497647 0.0309795
-0.0608490 -0.2497647 0.1858770
2.0151754 -0.2497647 -0.3562643
0.5118474 -0.2497647 -0.2400912
-1.2778288 -0.2497647 0.2633258
0.6550215 -0.2497647 -0.1626424
1.1561308 -0.1355430 0.3020502
-1.2062418 -0.1355430 0.1858770
-0.3471972 -0.0974691 0.3794990
0.7981956 -0.0974691 -0.1626424
2.0867625 -0.0593953 0.1858770
-1.4925900 -0.0593953 -0.3562643
0.6550215 -0.0213214 -0.0464693
0.0823251 -0.0213214 -0.3949887
-0.4903713 -0.0213214 -0.3175400
-1.0630677 -0.0213214 0.0697039
0.5834344 -0.0213214 -0.1239180
-0.8483065 -0.0213214 -0.0077449
0.6550215 0.0167525 -0.3175400
-1.3494159 0.0167525 -0.0464693
-1.1346547 0.0548264 -0.3562643
0.7266085 0.0548264 -0.0851936
2.0151754 0.0548264 0.3407746
-0.9198936 0.0548264 0.1858770
0.7266085 0.0548264 0.2246014
-1.2778288 0.0548264 -0.3175400
1.9435884 0.0929003 -0.0077449
1.0845438 0.0929003 -0.1626424
2.0867625 0.0929003 -0.2788156
1.9435884 0.0929003 -0.0851936
1.8720013 0.0929003 0.0697039
-1.4210029 0.0929003 0.1471527
-0.0608490 0.1309742 -0.3175400
-1.4210029 0.1309742 -0.1626424
-1.4925900 0.1690481 -0.0851936
-1.4210029 0.1690481 -0.0077449
1.7288272 0.1690481 -0.2788156
0.7266085 0.1690481 0.3407746
0.8697826 0.2451958 -0.2788156
0.7981956 0.2451958 0.2633258
-0.8483065 0.2451958 0.2246014
-0.0608490 0.2451958 -0.3949887
0.0823251 0.3213436 0.3020502
0.0107381 0.3213436 1.5799549
-1.1346547 0.3594175 -0.8209570
-0.5619583 0.3594175 1.0378135
0.2970862 0.3974914 -0.5886107
0.0823251 0.3974914 1.7348525
1.4424790 0.3974914 -1.5179959
-0.0608490 0.3974914 0.9603648
0.5834344 0.3974914 -1.5954447
0.0107381 0.3974914 0.9603648
-0.9914806 0.4355653 -0.6273350
-0.5619583 0.4355653 0.8054672
-1.3494159 0.4736391 -1.7503422
-0.7051324 0.4736391 1.4637818
0.3686733 0.4736391 -1.6728934
-0.4903713 0.4736391 0.8829160
-1.4210029 0.5117130 -1.5567203
-0.2756101 0.5117130 0.8441916
1.2993049 0.5497869 -1.7503422
-0.4903713 0.5497869 1.6574037
-0.7767195 0.5878608 -0.3949887
-0.4903713 0.5878608 1.4250574
-0.9914806 0.6259347 -1.4792715
-0.7767195 0.6259347 1.8123012
0.6550215 0.6259347 -0.5498863
-0.4903713 0.6259347 0.9216404
-0.3471972 0.6640086 -1.0920277
-0.3471972 0.6640086 1.5412305
0.2970862 0.6640086 -1.2856496
0.0107381 0.6640086 1.4637818
0.3686733 0.6640086 -1.1694764
-0.0608490 0.6640086 0.9990891
0.5834344 0.6640086 -1.3243740
-0.8483065 0.6640086 1.5025061
-0.1324360 0.6640086 -1.9052398
-0.6335454 0.6640086 1.0765379
-0.3471972 0.6640086 -1.9052398
-0.6335454 0.6640086 0.8829160
1.2277179 0.7020825 -0.5886107
-0.7051324 0.7020825 1.2701598
-1.4210029 0.7782302 -1.7503422
-0.5619583 0.7782302 1.6574037
0.7981956 0.9305258 -0.9371301
-0.2040231 0.9305258 0.9603648
0.2254992 0.9685997 -1.1694764
-0.4187842 0.9685997 1.7348525
-0.2040231 1.0066735 -0.8984057
-0.4903713 1.0066735 0.4956721
0.0823251 1.0066735 -1.4405471
-0.7767195 1.0066735 0.9603648
-0.2040231 1.0066735 -1.5567203
-0.2040231 1.0066735 1.6186793
0.9413697 1.0447474 -1.4405471
-0.6335454 1.0447474 1.3863330
1.3708920 1.0447474 -1.3630984
-0.8483065 1.0447474 0.7280184
1.4424790 1.2351169 -1.4018227
-0.2756101 1.2351169 1.5412305
-0.1324360 1.3874124 -0.7047838
-0.4903713 1.3874124 1.3863330
0.5118474 1.4254863 -1.3630984
-0.7051324 1.4254863 1.4637818
0.1539122 1.4635602 -0.4337131
-0.6335454 1.4635602 1.8123012
1.0845438 1.5397080 -1.0145789
-0.7767195 1.5397080 0.6892941
0.1539122 1.6158557 -1.2856496
-0.2040231 1.6158557 1.3476086
-0.3471972 1.6158557 -1.0533033
-0.4903713 1.6158557 0.7280184
-0.4187842 1.9965946 -1.6341691
-0.0608490 1.9965946 1.5799549
0.5834344 2.2631118 -1.3243740
-0.2756101 2.2631118 1.1152623
0.4402603 2.4915551 -0.8596814
-0.4903713 2.4915551 0.9216404
-0.4903713 2.9103678 -1.2469252
-0.6335454 2.9103678 1.2701598
apply(data.stdz, 2, mean) #cek mean = 0
##            Age  Annual.Income Spending.Score 
##  -1.016906e-16  -8.144310e-17  -1.096708e-16
apply(data.stdz, 2, sd) # cek 
##            Age  Annual.Income Spending.Score 
##              1              1              1

Eksplorasi Data

Korelasi

korelasi<-cor(data)
korelasi
##                        Age Annual.Income Spending.Score
## Age             1.00000000  -0.012398043   -0.327226846
## Annual.Income  -0.01239804   1.000000000    0.009902848
## Spending.Score -0.32722685   0.009902848    1.000000000
corrplot(corr=cor(korelasi), method = "number", type = "upper")

ggcorrplot(korelasi,type="lower",lab = TRUE)

Berdasarkan hasil plot korelasi tersebut, didapatkan bahwa hubungan antara peubah Spending Score dengan Age merupakan yang terbesar dibanding hubungan peubah yang lain.

Analisis Gerombol Berhierarkhi

Analisis gerombol berhierarkhi merupakan metode clustering digunakan untuk menggerombolkan objek secara terstruktur berdasarkan keindentikan dan cluster yang belum diketahui jumlahnya dan diinginkan (Sundari et al. 2021).

Terdapat beberapa metode penggerombolan dalam analisisi ini, yaitu:

  1. Single Linkage

    Jarak antara dua gerombol diukur dengan menentukan jarak terdekat antara sebuah objek dalam masing-masing gerombol.

  2. Centroid Linkage

    Jarak antara dua gerombol diukur sebagai jarak Euclidian antara masing-masing gerombol.

  3. Average Linkage

    Jarak antara due gerombol diukur menggunakan jarak rata-rata antara sebuah objek dalam masing-masing gerombol

  4. Complete Linkage

    Jarak antara dua gerombol diukur dengan menentukan jarak terjauh antara sebuah objek dalam masing-masing gerombol.

Pemilihan Banyak Kluster (Metode Silhouette)

Single Linkage Jarak Euclidean Metode Silhouette

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

Didapatkan bahwa jumlah gerombol yang optimal adalah 2. Angak tersebut didapatkan berdasarkan nilai koefisien terbesar yang menunjukkan bahwa gerombol yang terbentuk telah sesuai dan optimal.

Centroid Linkage Jarak Euclidean Metode Silhouette

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

Didapatkan bahwa jumlah gerombol yang optimal adalah 2. Angak tersebut didapatkan berdasarkan nilai koefisien terbesar yang menunjukkan bahwa gerombol yang terbentuk telah sesuai dan optimal.

Average Linkage Jarak Euclidean Metode Silhouette

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

Didapatkan bahwa jumlah gerombol yang optimal adalah 5. Angak tersebut didapatkan berdasarkan nilai koefisien terbesar yang menunjukkan bahwa gerombol yang terbentuk telah sesuai dan optimal.

Complete Linkage Jarak Euclidean Metode Silhouette

fviz_nbclust(data.stdz, FUNcluster = hcut, method = "silhouette", hc_method = "complete", hc_metric="euclidean")

Didapatkan bahwa jumlah gerombol yang optimal adalah 5. Angak tersebut didapatkan berdasarkan nilai koefisien terbesar yang menunjukkan bahwa gerombol yang terbentuk telah sesuai dan optimal.

Proses Clustering dan Karakteristik tiap cluster

Single Linkage Jarak Euclidean

fviz_dend(hclust(dist(data.stdz, method = "euclidean"), method = "single"))
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <]8;;https://github.com/kassambara/factoextra/issueshttps://github.com/kassambara/factoextra/issues]8;;>.

Terlihat bahwa metode single linkage tidak terdistribusi secara normal/rata. Metode ini menghasilkan 2 gerombol yang sangat tidak seimbang sebagai berikut.

#Interpretasi, utk melihat anggota dari setiap gerombol
hc.data.sing <- eclust(data, stand = TRUE, FUNcluster = "hclust", k=2, hc_method = "single", hc_metric = "euclidean", graph = F)

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

Sesuai dengan dendogram diatas, dimana dengan metode ini data dibagi menjadi 2 gerombol.

fviz_cluster(hc.data.sing)

aggregate(data, by=list(cluster=hc.data.sing$cluster), FUN = mean)
##   cluster      Age Annual.Income Spending.Score
## 1       1 38.94472      60.78392       50.42211
## 2       2 20.00000      16.00000        6.00000

Gerombol 1 merupakan gerombol dengan umur yang lebih tua serta penghasilan dan spending score lebih tinggi daripada cluster 2.

Centroid Linkage Jarak Euclidean

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

Terlihat bahwa metode centroid linkage tidak terdistribusi secara normal/rata. Metode ini menghasilkan 2 gerombol yang sangat tidak seimbang sebagai berikut.

#Interpretasi, utk melihat anggota dari setiap gerombol
hc.data.centro <- eclust(data, stand = TRUE, FUNcluster = "hclust", k=2, hc_method = "centroid", hc_metric = "euclidean", graph = F)

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

Sesuai dengan dendogram diatas, dimana dengan metode ini data dibagi menjadi 2 gerombol.

fviz_cluster(hc.data.centro)

aggregate(data, by=list(cluster=hc.data.centro$cluster), FUN = mean)
##   cluster      Age Annual.Income Spending.Score
## 1       1 38.94924      59.53807       49.76650
## 2       2 32.33333     127.66667       78.66667

Gerombol 2 merupakan gerombol dengan umur yang lebih muda serta penghasilan dan spending score lebih tinggi daripada cluster 2.

Average Linkage Jarak Euclidean

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

Terlihat bahwa metode average linkage terdistribusi secara normal/rata. Metode ini menghasilkan 5 gerombol yang sangat tidak seimbang sebagai berikut.

#Interpretasi, utk melihat anggota dari setiap gerombol
hc.data.ave <- eclust(data, stand = TRUE, FUNcluster = "hclust", k=5, hc_method = "average", hc_metric = "euclidean", graph = F)

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

Sesuai dengan dendogram diatas, dimana dengan metode ini data dibagi menjadi 5 gerombol.

fviz_cluster(hc.data.ave)

aggregate(data, by=list(cluster=hc.data.ave$cluster), FUN = mean)
##   cluster      Age Annual.Income Spending.Score
## 1       1 43.90000      24.45000       19.10000
## 2       2 24.65385      42.94231       62.07692
## 3       3 53.25926      54.20370       48.55556
## 4       4 32.69231      86.53846       82.12821
## 5       5 41.68571      88.22857       17.28571

Gerombol 4 merupakan gerombol dengan spending score terbanyak namun dengan penghasilan tahunan yang termasuk tertinggi. Jika ditinjau lagi, gerombol ke-2 dapat menjadi potensi market paling bagus karena dengan penghasilan yang tergolong rendah diabndingkan cluster lainnya,

Complete Linkage Jarak Euclidean

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

Terlihat bahwa metode complete linkage terdistribusi secara normal/rata. Metode ini menghasilkan 5 gerombol yang sangat tidak seimbang sebagai berikut.

#Interpretasi, utk melihat anggota dari setiap gerombol
hc.data.com <- eclust(data, stand = TRUE, FUNcluster = "hclust", k=5, hc_method = "complete", hc_metric = "euclidean", graph = F)

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

Sesuai dengan dendogram diatas, dimana dengan metode ini data dibagi menjadi 2 gerombol.

fviz_cluster(hc.data.com)

aggregate(data, by=list(cluster=hc.data.com$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

Gerombol 2 merupakan gerombol dengan spending score terbanyak namun dengan penghasilan tahunan yang paling sedikit.

Hasil clustering yang baik jika ditinjau dari dendogram adalah clustering yang menghasilkan gerombol dengan sebaran normal atau rata jumlahnya. Complete dan average memenuhi hal tersebut sehingga metode berhierarkhi yang lain diabaikan karena dianggap tidak representatif.

Analsisis Gerombol Tak Berhierarki (K-Means)

Kebalikan dari analisis gerombol berhierarkhi, analisis ini

Penentuan Cluster

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

fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "silhouette")

Penentuan gerombol atau kluster dilakukan berdasarkan plot “Optimal Number of Cluster”. Untuk metode Within-Cluster-Sum of Squared Errors (WSS), didapatkan bahwa titik 6 dan 8 merupakan titik yang sesuai. Sedangkan pada metode silhouette didapatkan bahwa titik 8 merupakan yang paling optimal denngan perolehan nilai average sihlouette width terbesar. Oleh karena itu akan ditentukan bahwa kluster yang digunakan adalah 8.

Clustering

K-Means Cliustering K=4

```r
    kmeans.data8 <- eclust(data, stand = TRUE, FUNcluster = "kmeans", k=8, graph = F)
kmeans.data8$cluster
```

```
##   [1] 3 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8
##  [38] 3 8 3 7 3 8 6 8 3 7 6 6 6 7 6 6 7 7 7 7 7 6 7 7 6 7 7 7 6 7 7 6 6 7 7 7 7
##  [75] 7 6 7 6 6 7 7 6 7 7 6 7 7 6 6 7 7 6 7 6 6 6 7 6 7 6 6 7 7 6 7 6 7 7 7 7 7
## [112] 6 6 6 6 6 7 7 7 7 6 6 6 5 1 5 2 5 2 5 2 5 1 5 1 5 2 5 1 5 2 5 6 5 1 5 2 5
## [149] 1 5 2 5 2 5 2 5 1 5 1 5 2 5 1 5 2 5 2 5 1 5 2 5 1 5 2 5 2 5 2 5 4 5 2 5 4
## [186] 5 2 5 4 5 4 5 4 5 4 5 4 5 4 5
```

```r
cekk8 <- data.frame("Observasi"= c(seq(1:200)), "Kluster" = kmeans.data8$cluster)
cekk8$Observasi <- as.character(cekk8$Observasi)
cekk8$Kluster <- as.character(cekk8$Kluster)
k8<- cekk8  %>% group_by(Kluster)%>% group_rows()
k8
```

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

```r
cekk8 %>% count(Kluster)
```

```
##   Kluster  n
## 1       1 11
## 2       2 18
## 3       3 23
## 4       4  8
## 5       5 39
## 6       6 36
## 7       7 44
## 8       8 21
```

```r
fviz_cluster(kmeans.data8)
```

<img src="PSD-individu_files/figure-html/unnamed-chunk-28-1.png" width="768" />

```r
aggregate(data_3, by=list(cluster=kmeans.data8$cluster), FUN = mean)
```

```
##   cluster CustomerID      Age Annual.Income Spending.Score
## 1       1  149.72727 28.00000      77.72727       14.18182
## 2       2  157.55556 49.38889      82.05556       18.38889
## 3       3   22.13043 25.00000      25.26087       77.60870
## 4       4  191.25000 38.75000     112.25000       22.62500
## 5       5  162.00000 32.69231      86.53846       82.12821
## 6       6   87.88889 27.16667      55.86111       50.11111
## 7       7   82.02273 56.34091      53.70455       49.38636
## 8       8   23.19048 45.52381      26.28571       19.38095
```

```r
kmeans.data8$centers
```

```
##            Age Annual.Income Spending.Score
## 1 -0.776719472     0.6536248   -1.394781947
## 2  0.754447946     0.8184193   -1.231865720
## 3 -0.991480616    -1.3439751    1.061384888
## 4 -0.007158705     1.9680392   -1.067824922
## 5 -0.440811016     0.9891010    1.236400114
## 6 -0.836375346    -0.1789050   -0.003442168
## 7  1.252122551    -0.2610138   -0.031507568
## 8  0.477758324    -1.3049552   -1.193448671
```

</div>

Berdasarkan plot dan tabel yang ada di atas, didapatkan bahwa metode K-Means dengan 8 gerombol menunjukkan beberapa gerombol dengan karakteristik yang berbeda.

  1. Gerombol 1,2,4, dan 5 merupakan gerombol dengan pendapatan tahunan yang tinggi namun dengan tingkat spending score yang rendah.

  2. Gerombol 3 merupakan gerombol dengan pendapatan tahunan yang rendah namun dengan tingkat spending score yang tinggi.

Gerombol 6,7, dan 8 merupakan gerombol dengan pendapatan tahunan yang sama dengan tingkat spending scorenya.

Untuk kasus market targetting, gerombol 3 merupakan target yang sangat cocok karena cenderung mudah tergiur untuk berbelanja atau konsumtif sehingga setiap penawaran atau barang trend yang dihadirkan, kemungkinan besar akan dibeli.

Kesimpulan

Didapatkan beberapa kesimpula sebagai berikut.

  1. Antara metode clustering berhierakhi dan tidak memiliki hasil yang berbeda. Dimana clustering berhierakhi cenderung memiliki gerombol yang lebih sedikit daripada K-Means.

  2. Gerombol sebagai market terbaik jatuh kepada gerombol dengan karakteristik besar pendapatan tahunannya jauh lebih kecil daripada spending scorenya. Gerombol yang termasuk kriteria tersebut adalah gerombol 7 dari K-Means, gerombol 2 dari average linkage, dan gerombol 2 dari complete linkage.

Daftar Pustaka

  1. Amei, W., Huailin, D., Qingfeng, W., & Ling, L. (2011). A survey of application-level protocol identification based on machine learning. 2011 International Conference on Information Management, Innovation Management and Industrial Engineering, 3, 201–204.

  2. Thupae, R., Isong, B., Gasela, N., & AbuMahfouz, A. M. (2018). Machine Learning Techniques for Traffic Identification and Classifiacation in SDWSN: A Survey. IECON 2018 - 44th Annual Conference of the IEEE Industrial Electronics Society, 4645–4650. https://doi.org/10.1109/IECON.2018.859 1178

  3. Sundari M, Sihombing PR, Hamik KF. 2021. Perbandingan Metode Analisis Gerombol K-Rataan dan Bicluster (Studi Kasus : Kerentanan Kelurahan di Depok Tahun 2020). 3(10) : 1-11.