1 Pendahuluan

Clustering adalah salah satu teknik Machine Learning, yang memiliki kemampuan untuk mengelompokkan kumpulan data yang tidak berlabel. Setiap data yang tidak berlabel nantinya akan diklasifikasikan ke dalam kelompok tertentu dimana, titik data yang berada dalam kelompok yang sama akan memiliki sifat atau fitur yang serupa, sedangkan titik data dalam kelompok yang berbeda diharapkan memiliki sifat atau fitur yang sangat berbeda.

Dalam ilmu data, kita dapat menggunakan clustering untuk mendapatkan beberapa wawasan berharga dari data kita dengan melihat hasil pengelompokan yang terjadi. Informasi yang berharga tersebut bisa kita bawa untuk membantu kita dalam menentukan segmentasi market, social netwrok analysis, dan masih banyak lagi. Di luar semua manfaat yang bisa kita dapatkan dari metode clustering, masih ada sebuah stigma yang menempel terhadap metode clustering. Pada artikel ini nantinya akan membahas metode clustering yang dapat digunakan untuk mengatasi stigma yang menempel terhadap metode clustering.

1.1 Stigma

Stigma yang menempel pada clustering adalah hanya bisa digunakan untuk data-data numerik. Hal tersebut terjadi karena banyak sekali implementasi atau contoh dari clustering yang hanya menggunakan data numerik.

Sesungguhnya clustering juga bisa digunakan terhadap data-data kategorikal, dan pada kesempatan kali ini kita akan mencoba menggunakan clustering untuk mengelompokan data kategorikal dan data numerik. Tipe algoritma yang akan kita gunakan nantinya bernama Partitioning Around Medoids dan metode perhitungan jarak yang akan digunakan adalah Gower Distance.

1.2 Partitioning Around Medoids (PAM)/K-Medoids

Algoritma Partitioning Around Medoids(PAM) atau bisa disebut K-Medoids adalah sebuah metode pengelompokan non-hierarki yang masih menjadi keluarga dekat dari metode K-Means. Metode PAM atau K-Medoids ini akan mengelompokan sekumpulan n objek menjadi ke beberapa k cluster. Jika metode pengelompokannya seperti itu, apa bedanya dengan metode K-Means kalau begitu? Perbedaanya terdapat pada bagaimana melakukan pengelompokannya.

Pada metode K-Means, penentuan sebuah objek masuk ke sebuah cluster tertentu berdasarkan perhitungan rata-rata jarak ecluidean. Sedangkan cara kerja metode K-Medoids akan diawali dengan penentuan Medoids (sebuah objek yang letaknya terpusat di dalam suatu cluster). Dari gambar di bawah, kita dapat melihat bagaimana perbedaan antara metode K-Means & K-Medoids dalam menentukan sebuah objek lebih sesuai untuk masuk ke sebuah cluster tertentu.

Penentuan Medoids itu tidak dilakukan hanya sekali, melainkan berulang sampai Medoids itu tidak bisa bergerak lagi. Mengapa tidak hanya sekali, dikarenakan peletakan Medoids belum tentu posisi paling optimal. Untuk mendapatkan posisi yang paling optimal nantinya posisi Medoids awal akan dihitung ulang total simpangannya dengan menggunakan rumus berikut di bawah ini.

\[ S = b - a \] Dimana:

  • a adalah jumlah jarak terdekat antara objek ke medoid awal
  • b adalah jumlah jarak terdekat antara objek ke medoid baru

Jika S < 0, maka tukar obyek dengan data untuk membentuk sekumpulan k baru sebagai Medoid

Langkah tersebut akan terus diulang sampai nantinya S > 0, yang berarti tidak adanya pergerakan lagi dari Medoid yang dipilih sebagai titik tengah. Dari titik Medoids yang paling optimum itu, akan dicari lagi objek yang menyerupai dari karakteristik Medoids tersebut. Supaya lebih terbayang dengan cara kerja dari metode PAM, kita bisa melihat visualisasi di bawah ini.

Untuk lebih memahami bagaimana cara kerja PAM, mari kita coba untuk melakukan pengelompokan dengan metode tersebut.

2 Library

# Data Wrangling
library(tidyverse)
library(Hmisc)

# Machine Learning
## Clustering 
library(cluster)
library(factoextra)

## Clustering Visualization
library(Rtsne)
library(rgl)
library(plotly)

# Knit
library(knitr)
library(rgl)

3 Explorasi Data

3.1 Data

Data yang akan digunakan di sini adalah data yang berasal dari kaggle.

diamond <- read.csv("data/diamond.csv", 
                    stringsAsFactors = T)

head(diamond)

Data yang akan kita gunakan adalah data karakteristik berlian yang baru saja selesai diolah, dari data tersebut nantinya akan coba kita kelompokan untuk membuat beberapa segmentasi produk dari setiap berlian tersebut.

Berikut penjelasan mengenai kolom-kolom untuk data yang kita gunakan:

  • carat: Berat dari berliannya
  • cut: Kualitas dari potongan berliannya (Fair < Good < Very Good < Premium < Ideal)
  • color: Kualitas warna dari berlian tersebut (J < I < H < G < F < E < D)
  • clarity: Seberapa jernih berlian tersebut (I1 < SI2 < SI1 < VS2 < VS1 < VVS2 < VVS1 < IF)
  • depth: Persentase dari kedalaman berlian tersebut
  • table: Lebar maksimal dari atas berlian
  • x: Panjang dalam mm
  • y: Lebar dalam mm
  • z: Tinggi dalam mm

3.2 Pendalaman datanya

Supaya kita lebih mengenal data yang kita miliki, kita bisa menggunakan fungsi summary() untuk melihat ringkasan dari data yang kita miliki berdasarkan tipe datanya. Untuk data dengan tipe kategorikal, fungsi summary() akan menghitung jumlah kemunculan setiap unique value dan untuk data dengan tipe numerik akan dihitung statistikanya.

summary(diamond)
##      carat               cut      color      clarity        depth      
##  Min.   :0.2000   Fair     : 62   D:129   SI1    :306   Min.   :53.00  
##  1st Qu.:0.7000   Good     : 89   E:240   VS2    :218   1st Qu.:60.90  
##  Median :0.7100   Ideal    :333   F:226   VS1    :159   Median :61.80  
##  Mean   :0.6893   Premium  :290   G:139   SI2    :154   Mean   :61.72  
##  3rd Qu.:0.7900   Very Good:226   H:125   VVS2   : 62   3rd Qu.:62.60  
##  Max.   :1.2700                   I: 95   VVS1   : 58   Max.   :69.50  
##                                   J: 46   (Other): 43                  
##      table             x               y               z        
##  Min.   :52.00   Min.   :3.790   Min.   :3.750   Min.   :2.270  
##  1st Qu.:56.00   1st Qu.:5.640   1st Qu.:5.630   1st Qu.:3.450  
##  Median :57.00   Median :5.770   Median :5.760   Median :3.550  
##  Mean   :57.73   Mean   :5.606   Mean   :5.599   Mean   :3.458  
##  3rd Qu.:59.00   3rd Qu.:5.920   3rd Qu.:5.910   3rd Qu.:3.640  
##  Max.   :70.00   Max.   :7.120   Max.   :7.050   Max.   :4.330  
## 

Dikarenakan hasil fungsi summary() untuk kolom clarity masih ada yang dikelompokan sebagai other, kita bisa akan coba analisis lebih lanjut proporsinya dengan menggunakan fungsi table().

table(diamond$clarity)
## 
##   I1   IF  SI1  SI2  VS1  VS2 VVS1 VVS2 
##   29   14  306  154  159  218   58   62

Dari hasil yang ditampilkan, kita bisa menarik kesimpulan bahwa,

  • Mayoritas dari hasil berlian yang sudah diolah memiliki potongan dengan hasil menengah ke eatas karena didominasi dengan hasil potongan dengan kategori very good sampai ideal.
  • Kualitas warna yang dihasilkan juga bisa dibilang cukup merata walaupun lebih condong dengan kualitas warna yang bisa dikategorikan menengah ke bawah.
  • Kejernihan dari batu berlian yang sudah diolah memiliki kejernihan dengan kualitas menengah ke bawah, karena hasilnya paling banyak didominasi dengan kategori SI2 sampai VS1.
  • Ukuran berlian yang sudah diolah memiliki panjang dan lebar dengan rentan dari 3.7 mm sampai 7.1 mm, sedangkan untuk tingginya memiliki rentan 2.2 mm sampai 4.3 mm.

Sebagai tambahan untuk data dengan tipe numerik kita bisa melakukan visualiasi dengan plot histogram untuk melihat jumlah observasinya.

diamond %>% 
  select(carat, depth, table, x, y, z) %>% 
  hist.data.frame()

Dari hasil visualisasi histogram plot, kita bisa menarik kesimpulan bahwa, masing-masing numerik variabel memiliki rentan yang cukup variatif dan jumlah observasinya juga tidak merata.

  • Jumlah kadar karat paling banyak dari data kita adalah 0.7 karat.
  • Persentase kedalaman berlian, paling banyak berada disekitaran 60-65%.
  • Lebar maksimal dari berlian kita paling banyak berada disekitaran 55-60.
  • Dari hasil berlian yang sudah diolah paling banyak memiliki panjang dan lebar dengan rentan 5.7 - 5.9 mm.
  • Dari hasil berlian yang sudah diolah paling banyak memiliki tinggir dengan rentan 3.5 - 3.7 mm.

4 Implementasi PAM/K-Medoids

Setelah berkenalan dengan data yang kita gunakan, mari kita coba implementasikan metode PAM untuk membuat segmentasi produk berlian. Secara garis besar akan ada 3 langkah yang nantinya akan dilakukan, yaitu:

  • Perhitungan jarak antar observasi data
  • Penentuan jumlah cluster
  • Clustering

4.1 Langkah 1: Perhitungan Jarak

Dari hasil eksplorasi data, kita mengetahui bahwa total observasi data kita adalah 10,000 baris dan setiap observasi data pastinya memiliki nilai yang berbeda. Agar nantinya hasil dari setiap kelompok terdiri dari data-data yang identik, kita harus mengetahui jarak antara satu observasi dengan observasi lainnya berdekatan atau tidak.

Pilihan paling populer untuk menghitung jarak adalah Euclidean, namun metode tersebut hanya berlaku untuk data numerik saja, oleh karena itu metode Euclidean tidak berlaku di sini. Ada satu metode yang dapat kita gunakan untuk kasus yang memiliki data campuran (data numerik dan data kategorikal), metode tersebut dinamakan Gower Distance.

Metode Gower Distance nantinya akan melakukan perbandingan pada setiap observasi data yang ada terhadap data-data yang lainnya, dengan cara melakukan perhitungan skala antara kedua observasi yang dibandingkan dengan rentan 0 sampai 1. Jika hasil dari perbandingannya mendekati 0 maka bisa dibilang kedua data tersebut identik atau jarak antara kedua observasi tersebut berdekatan, begitu juga sebaliknya, jika rentan perbandingannya mendekati 1 bisa dibilang kedua data tersebut tidak identik atau jarak antara kedua observasi tersebut berjauhan.

Supaya lebih terbayang bagaimana hasil dari metode Gower Distance, mari kita coba implementasikan ke data kita. Di R, metode Gower Distance tersimpan pada library(cluster) dan fungsi yang bisa digunakan adalah daisy(). Pada fungsi tersebut nantinya akan ada 2 parameter yang bisa diisi, yaitu:

  • x: Data frame yang ingin digunakan
  • metric: Metode apa yang ingin digunakan, karena kita akan menggunakan metode Gower Distance, kita bisa isi dengan “gower”.
diamond_gower <- daisy(x = diamond,
                       metric = "gower")

Sebagai pembuktian apakah metode Gower Distance memang bisa menempatkan data-data kita berdasarkan kemiripannya, kita bisa mencetak pasangan yang paling mirip dan berbeda dalam data kita dengan menggunakan fungsi di bawah ini.

  • Contoh pasangan data yang paling identik
example <- as.matrix(diamond_gower)

diamond[which(example == min(example[example != min(example)]),
        arr.ind = TRUE)[1, ], ]

Dari hasil pasangan data di atas, kita bisa melihat bahwa memang data observasi ke 952 dan 951 itu sangat identik, perbedaan yang terdapat pada kedua data di atas adalah panjang dan lebar dari hasil berlian yang diolah dan perbedaan hanya 0.01.

  • Contoh pasangan data yang paling tidak identik
diamond[which(example == max(example[example != max(example)]),
        arr.ind = TRUE)[1, ], ]

Dari hasil pasangan data di atas, kita bisa melihat bahwa memang data observasi ke 660 dan 22 itu sangat tidak identik, perbedaan yang terdapat pada kedua data di atas terdapat pada semua kolom, bahkan nilai yang terdapat pada setiap kolomnya hampir tidak ada yang mendekati.

4.2 Langkah 2: Penentuan Nilai Cluster(Kelompok)

Seperti yang sudah disampaikan pada bagian pendahuluan, tujuan dari melakukan clustering adalah menempatkan setiap observasi data yang ada ke beberapa kelompok yang sesuai dengan karakteristiknya atau bedasarkan kedekatan jarak antar setiap observasi. Pada langkah pertama kita sudah memiliki informasi jarak antar setiap observasi, kita akan memanfaatkan informasi tersebut untuk menentukan berapakah kelompok yang paling optimal. Hasil dari jumlah kelompok nantinya akan digunakan untuk menentukan berapa banyak segmentasi produk yang bisa dibuat berdasarkan data hasil olahan berlian.

Terdapat 3 metode yang dapat digunakan untuk menentukan jumlah kelompok yang paling optimum yaitu, Elbow Method, Silhouette Method & Gap Statistic Method. Ketiga metode tersebut dapat kita gunakan dengan menggunakan fungsi fviz_nbclust() dari library(factoextra). Pada fungsi tersebut nantinya akan ada 3 parameter yang bisa diisi, yaitu:

  • x = Data frame yang ingin digunakan

  • FUNcluster = Metode pengelompokan apa yang ingin digunakan, karena kita akan menggunakan metode PAM, kita bisa isi dengan pam.

  • method = Metode apa yang ingin digunakan untuk mengestimasi jumlah kelompok yang paling optimal.

  • Elbow Method

Dengan metode pertama ini kita akan memvariasikan jumlah kelompok dengan menghitung Within Sum of Square (WSS). WSS adalah akan menghasilkan jumlah kuadrat jarak antara setiap observasi terhadap titik Medoids untuk setiap kemungkinan jumlah kelompok, fungsi fviz_nbclust() secara otomatis akan menghitung WCSS sampai dengan 10 kelompok (jumlah kelompok yang ingin dicoba hitung bisa diatur secara manual sesuai dengan kebutuhan).

Dengan bertambahnya jumlah kelompok, nilai WSS akan mulai berkurang (nilai WSS terbesar ketika K = 1). Ketika kita menganalisis grafik kita dapat melihat bahwa grafik akan berubah dengan cepat pada suatu titik dan dengan demikian menciptakan bentuk siku. Dari titik ini, grafik mulai bergerak hampir sejajar dengan sumbu X. Nilai K yang sesuai dengan titik ini adalah nilai K optimal atau jumlah kelompok yang optimal.

set.seed(123)

fviz_nbclust(x = as.matrix(diamond_gower),
             FUNcluster = pam,
             method = "wss") +
  labs(subtitle = "Elbow Method")

Dari plot di atas dapat dilihat bahwa 2 adalah jumlah kelompok yang optimum. Karena setelah k=2, penambahan jumlah kelompok tidak mengakibatkan penurunan jumlah nilai WSS yang signifikan.

Cara lain untuk mengetahui nilai kelompok yang optimum adalah dengan memilih jumlah kelompok pada area yang membuat bentuk seperti lekukan siku manusia, namun metode ini dapat dikatakan sebagai metode bias karena pendapat setiap orang mungkin berbeda.

  • Silhouette Method

Metode kedua yang akan dicoba untuk menentukan jumlah kelompok yang optimal adalah Silhouette Method. Metode ini akan menghitung seberapa mirip sebuah observasi dengan kelompoknya sendiri jika dibandingkan dengan nilai kelompok lainnya. Hasil dari perhitungannya akan memiliki rentan koefisien dari -1 sampai 1. Jika nanti hasilnya makin mendekati 1 maka observasi tersebut cocok dengan kelompoknya dan kurang cocok dengan kelompok tetangga, begitu juga sebaliknya, jika hasilnya makin mendekati -1 maka observasi tersebut tidak cocok dengan kelompoknya akan tetapi lebih cocok dengan kelompok tetangganya.

Berbeda dengan elbow method, makin bertambahnya jumlah kelompok, nilai hasil perhitungan metode silhouette method tidak pasti akan berkurang. Penentuan nilai kelompok yang optimal akan ditentukan berdasarkan nilai koefisien paling tinggi pada saat membagi keseluruhan observasi ke berapa banyak kelompok.

set.seed(123)

fviz_nbclust(x = as.matrix(diamond_gower),
             FUNcluster = pam,
             method = "silhouette") +
  labs(subtitle = "Silhouette Method")

Dari plot dapat dilihat bahwa 2 adalah jumlah kelompok optimum, karena setelah k=2 nilai koefisiennya mulai berkurang.

  • Gap Statistic Method

Metode terakhir yang akan digunakan adalah Gap Statistic Method, metode ini akan menghitung seberapa berbeda total variansi antara setiap observasi pada sebuah kelompok terhadap observasi yang terdapat pada kelompok lainnya.

Jika dilihat dari plot di bawah ini, nilai kelompok optimum adalah 10.

set.seed(123)

fviz_nbclust(x = as.matrix(diamond_gower),
             FUNcluster = pam,
             method = "gap_stat") +
  labs(subtitle = "Gap Statistic Method")

Berdasarkan ketiga metode di atas, dua dari tiga metode menunjukkan bahwa k = 2 adalah jumlah kelompok yang optimal. Jadi, hasil dari berlian yang sudah diolah akan dibagi menjadi 2 kelompok.

Disclaimer : Penentuan jumlah kelompok tidak wajib menggunakan 3 metode pengujian di atas, penentuan kelompok juga dapat ditentukan berdasarkan pertanyaan bisnis atau kesepakatan bersama.

4.3 Clustering

Setelah mengetahui jumlah kelompok yang optimal, sekarang kita bisa memulai tahapan terakhir yaitu mengelompokan semua data berlian ke dua kelompok dengan menggunakan fungsi pam(). Pada fungsi tersebut nantinya akan ada 2 parameter yang bisa diisi, yaitu:

  • x = Data frame yang ingin digunakan
  • k = Jumlah kelompok
pam_fit <- pam(x = diamond_gower, 
               k = 2)

Fungsi di atas akan membantu kita untuk mengelompokan keseluruhan observasi data ke dua kelompok berdasarkan kemiripan setiap observasi terhadap titik pusat atau medoids. Supaya kita bisa mendapatkan intuisi awal bagaimana karakteristik olahan berlian untuk setiap kelompoknya, kita bisa melihat dari tabel di bawah ini.

diamond[pam_fit$medoids, ]

Seperti yang sudah disampaikan, dengan melihat tabel di atas kita hanya bisa mendapatkan intuisi awal bagaimana karakteristik dari masing-masing kelompok yang dibuat. Supaya kita dapat melakukan interpretasi lebih detail dan melihat apakah pengelompokan yang kita lakukan sudah dapat memisahkan setiap observasi data dengan baik, kita bisa memanfaatkan metode statistik deskriptif dan visualisasi.

4.3.1 Metode Statistik Deskriptif

Tujuan melakukan statistik deskriptif adalah untuk memahami karakteristik masing-masing kelompok, dan dalam kasus ini untuk mengetahui karakteristik untuk setiap segmentasi produk hasil olahan berlian.

pam_results <- diamond %>%
  mutate(cluster = pam_fit$clustering) %>%
  group_by(cluster) %>%
  do(the_summary = summary(.))
  • Kelompok 1
pam_results$the_summary[[1]]
##      carat               cut      color      clarity        depth      
##  Min.   :0.2000   Fair     : 22   D: 86   SI1    :249   Min.   :53.00  
##  1st Qu.:0.5325   Good     : 49   E:196   VS1    : 80   1st Qu.:61.12  
##  Median :0.7000   Ideal    :292   F: 48   SI2    : 59   Median :61.80  
##  Mean   :0.6326   Premium  : 66   G: 71   VS2    : 48   Mean   :61.77  
##  3rd Qu.:0.7400   Very Good:121   H: 68   VVS1   : 48   3rd Qu.:62.50  
##  Max.   :1.0300                   I: 62   VVS2   : 48   Max.   :67.90  
##                                   J: 19   (Other): 18                  
##      table             x               y               z            cluster 
##  Min.   :52.00   Min.   :3.790   Min.   :3.750   Min.   :2.270   Min.   :1  
##  1st Qu.:56.00   1st Qu.:5.230   1st Qu.:5.263   1st Qu.:3.220   1st Qu.:1  
##  Median :57.00   Median :5.720   Median :5.720   Median :3.520   Median :1  
##  Mean   :57.04   Mean   :5.434   Mean   :5.442   Mean   :3.358   Mean   :1  
##  3rd Qu.:58.00   3rd Qu.:5.830   3rd Qu.:5.830   3rd Qu.:3.590   3rd Qu.:1  
##  Max.   :69.00   Max.   :6.840   Max.   :6.770   Max.   :4.180   Max.   :1  
## 

Jika dilihat dari hasil di atas, kita bisa menarik kesimpulan bahwa hasil olahan berlian untuk kelompok 1 memiliki karakteristik:

  • Dari sudut pandang kualitas, hasil olahan berlian kelompok 1 didominasi dengan kualitas potongan yang sangat baik akan tetapi untuk kualitas warna dan kejernihannya kurang baik.

  • Dari sudut pandang ukuran, ukuran berlian yang sudah diolah memiliki panjang dan lebar dengan rentan dari 3.7 mm sampai 6.8 mm, sedangkan untuk tingginya memiliki rentan 2.2 mm sampai 4.1 mm.

  • Kelompok 2

pam_results$the_summary[[2]]
##      carat               cut      color      clarity        depth      
##  Min.   :0.2200   Fair     : 40   D: 43   VS2    :170   Min.   :55.80  
##  1st Qu.:0.7100   Good     : 40   E: 44   SI2    : 95   1st Qu.:60.50  
##  Median :0.7400   Ideal    : 41   F:178   VS1    : 79   Median :61.70  
##  Mean   :0.7585   Premium  :224   G: 68   SI1    : 57   Mean   :61.66  
##  3rd Qu.:0.8200   Very Good:105   H: 57   I1     : 23   3rd Qu.:62.70  
##  Max.   :1.2700                   I: 33   VVS2   : 14   Max.   :69.50  
##                                   J: 27   (Other): 12                  
##      table             x               y               z            cluster 
##  Min.   :52.00   Min.   :3.880   Min.   :3.840   Min.   :2.310   Min.   :2  
##  1st Qu.:57.00   1st Qu.:5.730   1st Qu.:5.700   1st Qu.:3.510   1st Qu.:2  
##  Median :58.00   Median :5.850   Median :5.840   Median :3.590   Median :2  
##  Mean   :58.58   Mean   :5.816   Mean   :5.791   Mean   :3.579   Mean   :2  
##  3rd Qu.:60.00   3rd Qu.:6.030   3rd Qu.:6.000   3rd Qu.:3.720   3rd Qu.:2  
##  Max.   :70.00   Max.   :7.120   Max.   :7.050   Max.   :4.330   Max.   :2  
## 

Jika dilihat dari hasil di atas, kita bisa menarik kesimpulan bahwa hasil olahan berlian untuk kelompok 2 memiliki karakteristik:

  • Dari sudut pandang kualitas, hasil olahan berlian kelompok 2 memiliki kualitas potongan yang cukup baik, dengan kualitas warna menengah dan tingkat kejernihan yang cukup baik.
  • Dari sudut pandang ukuran, ukuran berlian yang sudah diolah memiliki panjang dan lebar dengan rentan dari 3.7 mm sampai 6.8 mm, sedangkan untuk tingginya memiliki rentan 2.2 mm sampai 4.1 mm.

4.3.2 Metode Visualisasi

Jika dengan menggunakan metode statistik deskriptif kita bisa memahami karakteristik dari masing-masing kelompok, metode visualisasi dapat membantu kita untuk menilai bagaimana hasil pengelompokan. Metode visualisasi yang akan digunakan adalah metode t-SNE, metode ini merupakan salah satu cara untuk memvisualisasikan data yang tidak hanya memiliki nilai numerik saja melainkan nilai kategorikal juga.

set.seed(123)

tsne_obj <- Rtsne(X = diamond_gower, 
                  is_distance = TRUE)

tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))

ggplot(aes(x = X, y = Y), data = tsne_data) +
  geom_point(aes(color = cluster)) +
  labs(title = "Visualisasi Clustering 2D") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5),
        axis.title = element_blank())

Dari hasil plot di atas, kita bisa melihat bahwa setiap observasi sudah berhasil terbagi menjadi dua kelompok walaupun memang masih ada beberapa observasi yang tumpang tindih atau berdekatan pada sebuah kelompok yang didominasi oleh kelompok yang berlawanan.

Selain menampilkan hasil pengelompokan dengan menggunakan plot secara 2 dimensi, kita juga dapat menampilkan hasil clustering dengan menggunakan plot 3 dimensi.

set.seed(123)

tsne_obj_3d <- Rtsne(X = diamond_gower, 
                  is_distance = TRUE,
                  dims = 3)

tsne_data_3d <- tsne_obj_3d$Y %>%
  data.frame() %>%
  setNames(c("X", "Y", "Z")) %>%
  mutate(cluster = factor(pam_fit$clustering),
         Observasi = row_number())
tsne_3d <- plot_ly(tsne_data_3d,
               x = ~X,
               y = ~Y,
               z = ~Z,
               color = ~cluster,
               colors = c('#BF382A','#0C4B8E'),
               size = 3,
               text = ~paste("Product No:", Observasi),
               hoverinfo = 'text') %>% 
  layout(title = "Visualisasi Clustering 3D",
         scene = list(xaxis = list(title = ''),
                      yaxis = list(title = ''),
                      zaxis = list(title = '')))

tsne_3d <- tsne_3d %>% 
  add_markers() 
  
tsne_3d 

Jika kita lihat, plot 3 dimensi bisa memberikan kita gambaran yang lebih detail untuk hasil clustering karena jika kita melihat dari plot 2 dimensi yang ditampilkan sebelumnya hasil pengelompokan untuk masing-masing berlian masih ada yang tumpang tindih. Sedangkan dengan plot 3 dimensi, hasil yang sebelumnya terlihat tumpang tindih ternyata tidak tumpang tindih karena memiliki jarak pada sumbu Z.

5 Kesimpulan

Di sini kita bisa menarik kesimpulan bahwa clustering bisa digunakan untuk melakukan pengelompokan tidak hanya untuk data numerikal saja melainkan bisa juga digunakan untuk data kategorikal. Walaupun memang ada beberapa pendekatan yang berbeda dalam melakukan pengelompokan terutama metode yang digunakan dalam melakukan perhitungan jarak antara setiap observasi data, akan tetapi secara alur kerja bisa dibilang tidak ada perbedaan sama sekali.

Dalam kasus ini, implementasi dari clustering sangat berguna untuk sebuah perusahaan berlian yang baru berdiri dalam menentukan segmentasi produk karena clustering akan membantu kita dalam menentukan jumlah segmentasi yang paling optimum dan akan mengelompokan setiap hasil olahan berlian ke setiap kelompok yang memiliki karakteristik yang sama.

Disclaimer, metode clustering bukanlah jawaban mutlak ketika kita menghadapi data yang tidak berlabel atau ketika kita sedang mencari sebuah karakteristik yang sama dalam setiap observasi data kita. Jika memang dirasa kita tidak mendapatkan jawaban yang memuaskan dari metode clustering, setidaknya kita bisa memanfaatkan metode clustering sebagai intuisi awal dalam menghadapi permasalahan tersebut.

Happy Clustering!

Referensi

  1. Clustering datasets having both numerical and categorical variables
  2. K-Medoids/Partitioning Around Medoids (PAM) — Non Hierarchical Clustering with R
  3. K-Means Cluster Analysis
  4. t-SNE