1 Dasar Data Clustering di R

1.1 Pendahuluan

Definis data clustering atau clustering adalah sebuah proses untuk mengelompokan data ke dalam beberapa cluster atau kelompok sehingga data dalam satu cluster memiliki tingkat kemiripan yang maksimum dan data antar cluster memiliki kemiripan yang minimum.

Clustering banyak diterapkan pada kasus dunia nyata seperti pada business intelligence, pengenalan pola citra, web search, bidang ilmu biologi, dan untuk keamanan (security). Di dalam business intelligence, clustering bisa mengatur banyak customer ke dalam banyaknya kelompok. Contohnya mengelompokan customer dalam beberapa cluster dengan kesamaan karakteristik yang kuat. Ini sudah dibahas di artikel Algoritma K-Means dan Customer Segmentation pada Marketing di R.

Terdapat beberapa tipe teknik dalam data clustering, termasuk:

  • Partitioning clustering, yang mengelompokkan data dengan memilah-milah data yang dianalisa ke dalam cluster-cluster yang ada. Salah satu metode yang populer untuk klastering partisi non-hirarki adalah K-Means.

  • Hierarchical clustering, yang mengelompokkan data dengan membuat suatu hirarki berupa dendogram dimana data yang mirip akan ditempatkan pada hirarki yang berdekatan dan yang tidak pada hirarki yang berjauhan.

Artikel ini mempersembahkan pondasi dasar untuk memahami tentang analisis klastering dengan bahasa R. Adapun yang akan kita pelajari yaitu:

  • Persiapan data dan paket-paket (packages) penting yang digunakan untuk analisis klaster
  • Klasterisasi untuk mengukur penyebara atau jarak
  • Perintah-perintah untuk melakukan klasterisasi k-means dan hirarki.

2 Persiapan Data dan Paket yang Digunakan

2.1 Pendahuluan

Di bab ini, kita mulai dengan menyiapkan data yang digunakan untuk clustering analysis. Lalu, kita gunakan dua packages - clutser dan factoextra - untuk komputasi perhitungan dan visualisasi klasternya

2.2 Persiapan Data

Untuk melakukan analisis klaster di R, umumnya, data harus disiapkan dengan ketentuan seperti berikut.

  1. Baris sebagai observasi, dan kolom sebagai variabel/variables.

  2. Setiap data yang hilang atau tidak ada (missing values) harus dihilangkan atau diperkirakan.

  3. Data yang digunakan harus berstandar (contoh: di-scaled) dalam artian memang bisa untuk dianalisis atau perbandingan.

Disini, digunakan dataset “USArrests”. USArrests adalah dataset built-in di R, yang berisi statistik penangkapan/penahanan per 100,000 penduduk dengan catatan kriminal seperti kekerasan, pembunuhan, dan pemerkosaan yang ada di setiap 50 negara bagian di Amerika Serikat pada tahun 1973. Termasuk juga data persentase populasi yang tinggal di daerah perkotaan.

# Melihat daftar dataset dan memilih dataset
data("USArrests")

# Assign dataset ke variabel df
df <- USArrests 
  1. Untuk menghilangkan missing values yang mungkin ada di dalam dataset, gunakan perintah berikut:
df <- na.omit(object = df)
  1. Kita tidak ingin algoritma clustering bergantung pada arbitrary variable unit atau data yang berubah-ubah, disinilah kita scaling/menstandarisasikan datanya menggunakan fungsi scale(). Perintahnya:
df <- scale(x = df)

head(x = df, n = 5)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292

Apa proses yang terjadi dalam fungi scale()? Fungsi scale() akan menghitung rata-rata (mean) dan standar deviasi (standard deviation) dari seluruh vektor yaitu dataset atau variabel df, lalu “menskalakan” (scaling) setiap elemen dengan nilai-nilai tersebut dengan mengurangi mean dan membaginya dengan sd.

Berikut contoh prosesnya:

# Scaling manual kolom Murder
scl <- (USArrests$Murder - mean(USArrests$Murder)) / sd(USArrests$Murder)

head(scl, 5)
## [1] 1.24256408 0.50786248 0.07163341 0.23234938 0.27826823

Terlihat diatas, hasilnya pun sama dengan kolom Murder dari variabel df yang sudah di scaling.

Perbandingan sebelum dan sesudah di scaling/distandarisasi:

##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292

2.3 Paket yang Dibutuhkan

Untuk bahasan ini, kita menggunakan packages berikut:

  • cluster untuk komputasi algoritma clusterin dan,
  • factoextra untuk visualisasi hasil dari clustering.

Paket factoextra berisi banyak functions untuk kebutuhan analisis klaster dan visualisasinya, termasuk:

FUNGSI DESKRIPSI
dist(fviz_dist, get_dist) Komputasi Jarak Matriks dan Visualisasi
get_clust_tendency Menilai Banyaknya Clustering
fviz_nbclust(fviz_gap_stat) Menentukan Jumlah Optimal Cluster
fviz_dend Meningkatkan Visualisasi Dendogram
fviz_cluster Memvisualisasikan Hasil Clustering
fviz_mclust Memvisualisasikan Hasil Model Clustering
fviz_silhouette Memvisualisasikan Bentuk Silhouette dari Clustering
hcut Menghitung Clustering Hirarki dan Memotong Jumlah Cluster
hkmeans Clustering untuk k-means Hirarki
eclust Memvisualisasikan Penyebaran Cluster
Sumber:
www.rpkgs.datanovia.com/factoextra/index.html

Untuk meng-install dan load dua paket tersebut, gunakan perintah berikut:

# Install packages
install.packages(c("cluster", "factoextra"))

# Load packages
require(cluster)
require(factoextra)

2.4 Kesimpulan

Bab ini mengenalkan bagaimana cara mempersiapkan data untuk analisis klaster dan menjelaskan paket apa yang dibutuhkan.

3 Mengukur Jarak Clustering

3.1 Pendahuluan

Mengukur jarak klasterisasi atau Clustering Distance Measures. Kegiatan ini adalah mengklasifikasi observasi ke dalam beberapa kelompok - hal itu membutuhkan beberapa metode menghitung jarak atau ke(tidak)samaan antara setiap pasangan observasi. Hasil komputasi ini disebut sebagai matriks jarak atau ketidaksamaan.

3.2 Metode Mengukur Jarak

Metode yang digunakan untuk mengukur jarak adalah langkah yang kritikal dalam clustering. Karena hal tersebut menjelaskan bagaimana kesamaan antar dua elemen (x, y) dihitung dan hal itu juga yang mempengaruhi bentuk dari klaster.

Ada dua metode klasik yang digunakan mengukur jarak; Euclidean dan Manhattan distances, yang berumus seperti berikut:


1. Euclidean distance \[d_{euc}(x,y) = \sqrt{\sum_{i=1}^n(x_i - y_i)^2}\]


2. Manhattan distance \[d_{man}(x,y) = \sum_{i=1}^n |{(x_i - y_i)|}\]

Dimana, x dan y adalah dua vektor dengan panjang n.


Ada pengukur untuk ketidaksamaan (dissimilarity) lainnya seperti jarak berbasis korelasi a.k.a correlation-based distances, yang banyak digunakan untuk analisis data ekspresi gen. Jarak berbasis korelasi didefinisikan dengan mengurangkan koefisien korelasi dari 1. Berbagai jenis metode korelasi dapat digunakan seperti:


1. Pearson correlation distance: \[d_{cor}(x, y) = 1 - \frac{\sum\limits_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum\limits_{i=1}^n(x_i - \bar{x})^2 \sum\limits_{i=1}^n(y_i -\bar{y})^2}}\]

Catatan: Korelasi Pearson mengukur derajat hubungan linier antara dua profil.


2. Eisen cosine correlation distance (Eisen *et al., 1998):

Ini adalah kasus khusus korelasi Pearson dengan \(\bar{x}\) dan \(\bar{y}\) keduanya diganti dengan nol:

\[d_{eisen}(x, y) = 1 - \frac{\left|\sum\limits_{i=1}^n x_iy_i\right|}{\sqrt{\sum\limits_{i=1}^n x^2_i \sum\limits_{i=1}^n y^2_i}}\]

FYI: et al. artinya yaitu “dan yang lainnya.” Istilah tersebut berasal dari Latin “et alia”. Istilah ini digunakan di dunia akademik terutama akademik negara Barat untuk mengutip/mensitasi saat sumbernya ditulis lebih dari satu atau beberapa penulis. #TheMoreYouKnow


3. Spearman correlation distance:

Metode korelasi Spearman menghitung korelasi antara pangkat x dan pangkat variabel y.

\[d_{spear}(x, y) = 1 - \frac{\sum\limits_{i=1}^n (x'_i - \bar{x'})(y'_i - \bar{y'})}{\sqrt{\sum\limits_{i=1}^n(x'_i - \bar{x'})^2 \sum\limits_{i=1}^n(y'_i -\bar{y'})^2}}\]

Dimana \(x'_i = rank(x_i)\) dan \(y'_i = rank(y)\).


4. Kendall correlation distance:

Metode korelasi Kendall mengukur korespondensi atau kecocokan antara pemeringkatan variabel x dan y. Jumlah total kemungkinan pemasangan observasi x dengan y adalah \(n(n-1)/2\), di mana n adalah ukuran dari x dan y. Mulai dengan mengurutkan pasangan (x, y) dengan nilai x. Jika x dan y berkorelasi, maka mereka akan memiliki urutan peringkat relatif yang sama. Lalu, untuk setiap \(y_i\), hitung banyaknya \(yj> yi\) (kesusaian pasangan (c)) dan banyaknya \(yj <yi\) (ketidaksesuaian pasangan (d)).

Jarak korelasi Kendall didefinisikan sebagai berikut:

\[d_{kend}(x, y) = 1 - \frac{n_c - n_d}{\frac{1}{2}n(n-1)}\]

Dimana:

  • \(n_c\): jumlah kesesuaian pasangan (concordant)
  • \(n_d\): jumlah ketidaksesuaian pasangan (discordant)
  • \(n\): ukuran x dan y

Catatan:

  • Analisis Korealsi Pearson adalah metode yang paling umum dan sering digunakan. Metode ini juga dikenal dengan parametric correlation yang tergantung pada ditribusi atau penyebaran data.
  • Kendall dan Speaman adalah korelasi non-parametric dan mereka digunakan untuk melakukan analisis korelasi berbasis peringkat (rank-based correlation).

Pada rumus diatas, x dan y adalah dua vektor dengan panjang n dan, berarti \(\bar{x}\) dan \(\bar{y}\), masing-masing. Jarak antara x dan y dilambangkan dengan d(x, y).

3.3 Apa Tipe Mengukur Jarak yang Harus Dipilih?

Pemilihan ukuran jarak (distance measures) sangat penting, karena memiliki pengaruh yang kuat terhadap hasil pengelompokan. Bagi software untuk clustering pada umumnya, pengukur jarak default adalah Euclidean distance.

Bergantung pada jenis data dan diteliti, ukuran ketidaksamaan lainnya mungkin lebih disukai. Misalnya, jarak berbasis korelasi sering digunakan dalam analisis data ekspresi gen.

Jarak berbasis korelasi (correlation-based measures) menganggap dua objek serupa jika fiturnya sangat berkorelasi, meskipun nilai yang diamati mungkin berjauhan dalam hal jarak Euclidean. Jarak antara dua objek adalah 0 jika mereka berkorelasi sempurna. Korelasi Pearson cukup sensitif terhadap data asing. Ini tidak masalah ketika mengelompokkan sampel, karena korelasinya melebihi ribuan gen atau data. Saat mengelompokkan gen, penting untuk menyadari kemungkinan dampak pencilan (outliers). Ini dapat dikurangi dengan menggunakan korelasi Spearman daripada korelasi Pearson.

Jika kita ingin mengidentifikasi kelompok pengamatan dengan profil keseluruhan yang sama terlepas dari besarnya, maka kita harus menggunakan jarak berbasis korelasi sebagai ukuran ketidaksamaan. Hal ini terutama terjadi dalam analisis data ekspresi gen, di mana kita mungkin ingin mempertimbangkan kesamaan gen ketika mereka “naik” dan “turun” bersama-sama. Demikian pula halnya, dalam pemasaran jika kita ingin mengidentifikasi kelompok pembeli dengan preferensi yang sama dalam hal barang, terlepas dari volume barang yang mereka beli.

Jika jarak Euclidean dipilih, maka observasi dengan nilai fitur yang tinggi akan dikelompokkan bersama. Hal yang sama berlaku untuk observasi dengan nilai fitur yang rendah.

3.4 Standarasisasi Data

Nilai pengukuran jarak berkaitan erat dengan skala pengukuran dibuat. Oleh karena itu, variabel sering diskalakan (yaitu distandarisasi) sebelum mengukur ketidaksamaan antar observasi. Hal ini sangat disarankan jika variabel diukur dalam skala yang berbeda (misalnya: kilogram, kilometer, sentimeter,…); jika tidak, ukuran ketidaksamaan yang diperoleh akan sangat terpengaruh.

Tujuannya adalah membuat variabel menjadi sebanding atau yang dapat dibandingkan. Umumnya variabel diskalakan untuk memiliki i) deviasi standar satu dan ii) rata-rata nol.

Standarisasi data merupakan pendekatan yang banyak digunakan dalam konteks analisis data ekspresi gen sebelum pengelompokan. Kita mungkin juga ingin menskalakan data ketika mean dan/atau deviasi standar variabel sangat berbeda.

Saat menskalakan variabel, data dapat diubah sebagai berikut: \[\frac{x_i - center(x)}{scale(x)}\]

Dimana \(center(x)\) bisa sebagai rata-rata (mean) atau nilai tengah (median) pada nilai x, dan \(scale(x)\) dapat sebagai standar deviasi (Standard Deviation), jangkauan interkuartil (Interquartile Range) atau sebagai deviasi absolut median (MAD).


Standardisasi membuat empat metode pengukuran jarak (yaitu) Euclidean, Manhattan, Correlation, dan Eisen - lebih mirip dibandingkan dengan data yang tidak diubah.

Perhatikan bahwa, ketika data distandarisasi, ada hubungan fungsional antara koefisien korelasi Pearson r(x, y) dan jarak Euclidean.

Dengan perhitungan matematika, hubungannya dapat didefinisikan sebagai berikut: \[d_{euc}(x, y) = \sqrt{2m[1 - r(x, y)]}\]

Dimana x dan y adalah dua m-vectors yang standardized dengan rata-rata nol dan panjang unit.

Oleh karena itu, hasil yang diperoleh dengan ukuran korelasi Pearson dan jarak Euclide standar sebanding/dapat dibandingkan.


Untuk lebih jelas, baca tentang ekuasi hitungan berikut:

4 Perhitungan Jarak Matrix

4.1 Persiapan Data

Kita menggunakan dataset USArrests. Data yang diambil akan di-subset alias hanya 15 baris acak yang diambil dari 50 baris yang ada. Kegiatan subset ini dilakukan dengan fungsi sample(). Selanjutnya, kita standardized data yang diambil dengan fungsi scale().

set.seed(123)

ss <- sample(1:50, 15)
df <- USArrests[ss, ]
df.scaled <- scale(df)

print(df.scaled)
##                     Murder     Assault    UrbanPop        Rape
## New Mexico      0.58508090  1.02300309  0.22505574  0.61101857
## Iowa           -1.70220419 -1.54760088 -0.68923319 -1.43885018
## Indiana        -0.45911447 -0.90775622 -0.12659385 -0.48290177
## Arizona        -0.23535832  1.12403120  0.92835492  0.50261205
## Tennessee       1.03259320 -0.06585536 -0.54857336  0.09855138
## Texas           0.90828422  0.08007413  0.92835492 -0.03942055
## Oregon         -1.03093574 -0.39139036  0.01406598  0.33507470
## West Virginia  -0.83204139 -1.26696726 -1.95517172 -1.63595295
## Missouri       -0.01160217 -0.17810880  0.22505574  0.22666818
## Montana        -0.75745600 -0.95265760 -0.97055287 -0.93623813
## Nebraska       -1.18010651 -1.03123501 -0.33758361 -0.92638299
## California     -0.01160217  0.92197499  1.70198401  1.44870532
## South Carolina  1.33093473  0.95565102 -1.32220246 -0.33507470
## Nevada          0.78397525  0.65256671  0.99868483  1.98088278
## Florida         1.57955267  1.58427034  0.92835492  0.59130829
## attr(,"scaled:center")
##     Murder    Assault   UrbanPop       Rape 
##   9.046667 193.866667  66.800000  25.900000 
## attr(,"scaled:scale")
##    Murder   Assault  UrbanPop      Rape 
##  4.022236 89.084123 14.218700 10.146991

Dimana:

  • set.seed(123): Fungsi set.seed() digunakan untuk menentukan seed/Random Number Generator (RNG) agar data/keacakan sesuatu dapat diatur sehingga antara percobaan pertama dan seterusnya menggunakan data acak yang sama.

  • USArrests[ss, ]: Semua baris di dalam dataset USArrests mengikuti kondisi yang sesuai di variabel ss, kecuali kolomnya.

  • scaled(df): Fungsi scale() akan menghitung rata-rata (mean) dan standar deviasi (standard deviation/SD) dari seluruh variabel “df”, lalu “menskalakan” atau (scaling) setiap elemen dengan nilai-nilai hasil tersebut dengan mengurangi mean dan membaginya dengan sd. Sebagai contoh jelasnya, lihat baris kode di bawah ini.

x <- df[,1] # Mengambil semua baris di kolom ke-1

(x - mean(x)) / sd(x) # Rumus dari fungsi scale()
##  [1]  0.58508090 -1.70220419 -0.45911447 -0.23535832  1.03259320  0.90828422
##  [7] -1.03093574 -0.83204139 -0.01160217 -0.75745600 -1.18010651 -0.01160217
## [13]  1.33093473  0.78397525  1.57955267

4.2 Function dan Packages

Terdapat banyak fungsi R untuk komputasi atau perhitungan jarak antara pasangan observasi/pengamatan:

  1. Fungsi dist() dari paket stats: Hanya menerima tipe data numerik sebagai input-an.

  2. Fungsi get_dist() dari paket factoextra: Hanya menerima tipe data numerik sebagai input-an. Perbedaan dengan fungsi dist(), fungsi ini mendukung pengukuran jarak berbasis korelasi (correlation-based distance) termasuk metode “pearson”, “kendall” dan “spearman”.

  3. Fungsi daisy() dari paket cluster: Mampu menangani jenis variabel lain (misalnya nominal, ordinal, biner (a)simetris). Dalam hal ini, koefisien Gower akan secara otomatis digunakan sebagai metrik. Itu adalah salah satu ukuran kedekatan (proximity) yang paling populer untuk jenis data campuran. Untuk lebih jelasnya, baca dokumentasi R tentang fungsi daisy() disini atau ketik ?Daisy di console RStudio.

Semua fungsi diatas menghitung jarak antar baris data.

4.3 Menghitung Jarak Euclidean

Untuk menghitungnya, kita dapat menggunakan fungsi dist(), seperti berikut:

dist.eucl <- dist(df.scaled, method = "euclidean")

Catatan: dari argumen method juga dapat menerima metode lain, diantaranya seperti: “euclidean”, “maximum”, “manhattan”, “canberra”, “binray”, “minkowski”.

Untuk lebih mudah melihat informasi jarak yang dihasilkan oleh fungsi dist(). kita bisa reformat atau format ulang vektor jaraknya ke bentuk matriks menggunakan fungsi as.matrix().

round(as.matrix(dist.eucl)[1:3, 1:3], 1)
##            New Mexico Iowa Indiana
## New Mexico        0.0  4.1     2.5
## Iowa              4.1  0.0     1.8
## Indiana           2.5  1.8     0.0

Dimana:

  • round(..., 1): Fungsi ini membulatkan nilai dengan menetapkan satu bilangan setelah koma.
  • as.matrix(...): Fungsi untuk mengkonversi ke bentuk matriks.
  • dist.eucl[1:3, 1:3]: Mengambil barik 1 sampai 3 dan kolom 1 sampai 3 dari variabel dist.eucl.

Hasil matriks diatas, nilai merepresentasikan jarak antar objek/objects. Nilai-nilai pada diagonal matriks mewakili jarak antara objek dan dirinya sendiri (yang bernilai nol: 0.0, 0.0, 0.0).

Catatan: Dalam kumpulan data ini, kolomnya adalah variabel. Oleh karena itu, jika kita ingin menghitung jarak berpasangan (pairwise distance) antar variabel, kita harus mulai dengan mentransposisi (membalikkan posisi matriks) data agar memiliki variabel dalam baris sebelum menggunakan fungsi dist(). Fungsi t() digunakan untuk mentransposisi data.

4.4 Menghitung Jarak Berbasis Korelasi

Correlation-based distance biasanya digunakan dalam analisis data expresi gen.

Fungsi get_dist() dari paket factoextra dapat digunakan untuk menghitung jarak berbasis korelasi. Metode korelasi dapat berupa pearson, spearman atau kendall.

library("factoextra")

dist.cor <- get_dist(df.scaled, method = "pearson")

round(as.matrix(dist.cor)[1:3, 1:3], 1)
##            New Mexico Iowa Indiana
## New Mexico        0.0  1.7     2.0
## Iowa              1.7  0.0     0.3
## Indiana           2.0  0.3     0.0

4.5 Menghitung Jarak untuk Data Campuran

Fungsi daisy() dari paket cluster menyediakan sebuah solusi (metrik Gower) untuk menghitung matriks jarak, dalam situasi di mana data tidak berisi kolom numerik.

Baris kode dibawah berikut menerapkan fungsi daisy() pada sebuah dataset tentang bunga (flower) yang berisi variabel faktor, terurut (ordered), dan numerik:

library(cluster)

# Load data
data(flower)
head(flower, 5)
##   V1 V2 V3 V4 V5 V6  V7 V8
## 1  0  1  1  4  3 15  25 15
## 2  1  0  0  2  1  3 150 50
## 3  0  1  0  3  3  1 150 50
## 4  0  0  1  4  2 16 125 50
## 5  0  1  0  5  2  2  20 15
str(flower)
## 'data.frame':    18 obs. of  8 variables:
##  $ V1: Factor w/ 2 levels "0","1": 1 2 1 1 1 1 1 1 2 2 ...
##  $ V2: Factor w/ 2 levels "0","1": 2 1 2 1 2 2 1 1 2 2 ...
##  $ V3: Factor w/ 2 levels "0","1": 2 1 1 2 1 1 1 2 1 1 ...
##  $ V4: Factor w/ 5 levels "1","2","3","4",..: 4 2 3 4 5 4 4 2 3 5 ...
##  $ V5: Ord.factor w/ 3 levels "1"<"2"<"3": 3 1 3 2 2 3 3 2 1 2 ...
##  $ V6: Ord.factor w/ 18 levels "1"<"2"<"3"<"4"<..: 15 3 1 16 2 12 13 7 4 14 ...
##  $ V7: num  25 150 150 125 20 50 40 100 25 100 ...
##  $ V8: num  15 50 50 50 15 40 20 15 15 60 ...
dd <- daisy(flower)

round(as.matrix(dd)[1:3, 1:3], 2)
##      1    2    3
## 1 0.00 0.89 0.53
## 2 0.89 0.00 0.51
## 3 0.53 0.51 0.00

4.6 Visualisasi Jarak Matriks

Solusi sederhana untuk memvisualisasikan matriks jarak adalah dengan menggunakan fungsi fviz_dist() dari paket factoextra. Adapun metode khusus lainnya, seperti pengelompokan hierarki aglomeratif (agglomerative hierarchical clustering) atau peta penyebaran panas a.k.a heatmap, akan dijelaskan secara lebih detail di kesempatan lain.

Untuk menggunakan fviz_dist() ketik seperti berikut:

library(factoextra)

fviz_dist(dist.eucl)

Dimana heatmap diatas:

  • Merah: tingkat kesamaan/kecocokan tinggi
  • Biru: tingkat kesamaan/kecocokan rendah

Tingkat warna sebanding dengan nilai ketidaksamaan antara hasil pengamatan: merah jika \(dist(x_i, x_j) = 0\) dan biru sesuai dengan nilai tertinggi jarak euclidean yang dihitung (lihat bagian legend value). Objek yang termasuk dalam cluster yang sama ditampilkan secara berurutan.

4.7 Kesimpulan

Kita belajar cara menghitung matriks jarak menggunakan Euclidean atau pengukuran berbasis korelasi (correlation-based distance). Cara tersebut biasanya disarankan untuk menstandarkan (standardized) variabel sebelum penghitungan jarak matriks. Standarisasi membuat variabel dapat dibandingkan, dalam situasi di mana mereka diukur dalam skala yang berbeda.

5 Contoh Cluster Analysis

Bab ini menjelaskan contoh analisis cluster menggunakan software R. Sudah disediakan contoh baris kode R untuk menghitung dan memvisualisasikan K-means dan pengelompokan hierarki/hierarchical clustering.

5.1 Paket yang Digunakan

  • cluster untuk analisis pengelompokan/cluster

  • factoextra untuk visualisasi pengelompokan/cluster

library(cluster)
library(factoextra)

5.2 Persiapan Data

Untuk kemudahan kita langsung gunakan dataset yang sudah disediakan oleh R, yaitu USArrests.

df <- scale(USArrests)

5.3 K-means Clustering

K-means adalah teknik pengelompokan atau clustering yang membagi/memecahkan kumpulan data menjadi sekumpulan k grup, dimana k adalah jumlah grup yang sudah ditentukan sebelumya.

Baris kode R dibawah ini menunjukkan cara menentukan jumlah cluster optimal dan cara menghitung k-means.

  1. Menentukan jumlah cluster yang optimal: gunakan factoextra::fviz_nbclust()
fviz_nbclust(x = df, FUNcluster = kmeans, method = "gap_stat")

Dimana penjelasan dari baris kode diatas adalah:

  • fviz_nbclust(...): Fungsi yang menentukan dan memvisualisasikan jumlah cluster yang optimal.
  • x = df: parameter penyimpan data frame,
  • FUNcluster = kmeans: parameter partisi atau yang berfungsi untuk membagi cluster,
  • method = "gap_stat": adalah metode yang digunakan untuk memperkirakan jumlah cluster.

Jika baris kode diatas dijalankan maka output-nya seperti berikut:

Dari visual diatas terlihat jumlah cluster yang disarankan adalah 2.

  1. Menghitung dan visualisasi clustering k-means:
set.seed(123)

km.res <- kmeans(x = df, centers = 2, nstart = 25)

str(km.res)

fviz_cluster(object = km.res, data = df, palette = "jco", ggtheme = theme_minimal())

Dimana penjelasan dari baris kode diatas adalah:

  • kmeans(...): Melakukan klastersisasi pada data matriks dengan perhitungan k-means.
  • x = df: parameter penyimpan data frame,
  • centers = 2: jumlah clutser yang didapat atau diinginkan,
  • nstart = 25: jumlah random sets yang dipilih. Ini berlaku hanya jika parameter centers berisi nomor/angka,
  • fviz_cluster(...): fungsi untuk memvisualisasikan hasil klasterisasi,
  • object = km.res: objek yang berisi hasil partisi dari fungsi kmeans(),
  • data = df: df adalah data yang sudah digunakan untuk clustering. Ini hanya digunakan bila objeknya (parameter object) berbentuk class yang terlihat seperti di akhir baris dari kode str(km.res) yang ada dibawah ini.
  • ggtheme = theme_minimal(): Bentuk visual atau tema yang disediakan ggplot2. Pilihannya ada theme_gray(), theme_classic() dll.

Jika dijalankan maka hasilnya akan seperti berikut:

## List of 9
##  $ cluster     : Named int [1:50] 1 1 1 2 1 1 2 2 1 1 ...
##   ..- attr(*, "names")= chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
##  $ centers     : num [1:2, 1:4] 1.005 -0.67 1.014 -0.676 0.198 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:2] "1" "2"
##   .. ..$ : chr [1:4] "Murder" "Assault" "UrbanPop" "Rape"
##  $ totss       : num 196
##  $ withinss    : num [1:2] 46.7 56.1
##  $ tot.withinss: num 103
##  $ betweenss   : num 93.1
##  $ size        : int [1:2] 20 30
##  $ iter        : int 1
##  $ ifault      : int 0
##  - attr(*, "class")= chr "kmeans"

5.4 Hierarchical Clustering

Hierarchical clustering atau pengemlompokan hierarki adalah cara alternatif untuk pengelompokan partisi (partition clustering) yang digunakan mengidentifikasi kelompok dalam kumpulan data. Tidak perlu menentukan sebelumnya jumlah cluster yang akan dibuat.

Hasil pengelompokan hierarki adalah representasi objek yang berbasis pohon (tree-based), yang juga dikenal sebagai dendogram. Pengamatan dapat dibagi lagi menjadi beberapa kelompok dengan memotong dendrogram pada tingkat kemiripan yang diinginkan.

Baris kode dibawah ini adalah yang digunakan untuk menghitung dan memvisualisasikan klasterisasi hierarki:

res.hc <- hclust(dist(df), method = "ward.D2")

fviz_dend(x = res.hc, cex = 0.5, k = 4, palette = "jco") 

Dimana penjelasan dari baris kode diatas adalah:

  • hclust(...): Sesuai namanya hclust alias hierarchical clustering yaitu fungsi yang mencari dan menganalisa klaster hierarki dalam suatu data yang diberikan. Dalam kasus ini, datanya adalah yang sudah diolah dengan fungsi dist().
  • dist(df): Distance matrix computation atau dist adalah fungsi yang menghitung dan mengembalikan nilai matriks jarak dari sebuah data.
  • method = "ward.D2": Metode aglomerasi atau mudahnya perhitungan yang dipakai, yaitu ward.D2. Pengenalan tentang apati ward.D2 bisa di lihat di sini dan sini.
  • fviz_dend(...): Fungsi turunan dari ggplot2 yang otomatis membuat visual dendogram.
  • x = res.hc: Objek data yang berbentuk class atau yang sudah diolah dengan fungsi hclust(), dlana(), hkmeans(), dll.
  • cex = 0.5: Ukuran label.
  • k = 4: k_colors atau singkatnya k adalah parameter untuk memberikan jumlah variasi warna untuk per grup yang diambil dari parameter palette. Jika diberikan angka 2 maka variasi warnanya cuma dua misal merah dan hijau.
  • palette = "jco": Parameter palette dengan input-an jco adalah kumpulan atau set warna yang siap pakai. Bisa diganti dengan warna npg, aaas, uchicago, dll. Lengkapnya lihat di sini.

Jika baris kode diatas dijalankan, maka hasilnya akan seperti berikut"

Peta penyebaran panas atau heatmap adalah cara lain untuk memvisualisasikan pengelompokan/klasterisasi hierarki. Heatmap memungkinkan kita untuk secara bersamaan memvisualisasikan kelompok sampel dan fitur.

Umumnya dalam heatmap, kolom adalah sampelnya dan baris adalah variabelnya. Oleh karena itu, kita mulai dengan mentransposisi data sebelum membuat heatmap.

library(pheatmap)

pheatmap(t(df), cutree_cols = 4, fontsize_col = 8.5)

Penjelasan dari baris kode diatas:

  • pheatmap(...): Fungsi untuk menggambarkan penyebaran kelompok atau cluster.
  • t(df): Parameter t untuk membalikkan posisi matriks sepanjang diagonal utamanya. Atau simpelnya yaitu transpose.
  • cutree_cols = 4: Jumlah kolom yang akan dibagi atau dipecah berdasarkan jumlah cluster. Kenapa 4? Coba jalankan dan lihat hasil dari baris kode t(df) agar tahu jawabannya.
  • fontsize_col = 8.5: Menentukan ukuran besar-kecil label kolom.

Hasil dari baris kode diatas adalah sebagai berikut:

5.5 Kesimpulan

Bab ini menyajikan beberapa contoh code bahasa R untuk menghitung dan memvisualisasikan k-means dan pengelompokan hierarki.


Sumber: