net/publication/341787776
CITATIONS READS
0 2,228
1 author:
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
Aplikasi SVM dan ANN untuk Klasifikasi Penyakit Daun Padi View project
Analisis Determinan Tingkat Kepuasan Wisatawan Mancanegara dan Wisatawan Nusantara View project
All content following this page was uploaded by I Putu Eka N. Kencana on 01 June 2020.
Eka N Kencana
Program Studi Matematika UNUD
UNIVERSITAS UDAYANA
21 Mei 2020
Daftar Isi
1 Introduksi 1
2 Persyaratan 2
2.1 Mempersiapkan Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 Membentuk Matriks Jarak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Tiga klaster provinsi pada gambar 1 dibentuk menggunakan 2 atribut pada data, jumlah kasus pencurian
dan kasus perampokan. Perhatikanlah, tidak adanya variabel respon (response/dependent variable) pada
Analisis Gerombol menyebabkan teknik ini digolongkan sebagai unsupervised learning pada machine
learning. Klasterisasi sering digunakan, misalnya pada riset pemasaran, untuk mengidentifikasi pelanggan
yang berpotensi membeli produk dan/atau jasa baru yang diintroduksi perusahaan sehingga kegiatan promosi
bisa difokuskan pada kelompok ini. Contoh yang lain, klasterisasi juga bisa digunakan untuk menentukan
keluarga (family) dari sebuah spesies tanaman yang baru ditemukan dengan mencermati atribut-atributnya
(misal panjang daun, jumlah helai bunga, dan atribut lain) dan menggabungkannya ke keluarga yang memiliki
penciri atribut yang sama.
Salah satu kelemahan (drawback) dari teknik ini adalah ketiadaan teknik untuk memvalidasi relevansi dari
atribut yang digunakan untuk melakukan klasterisasi. Sebagai ilustrasi, pada pengelompokan provinsi di
Indonesia menurut tindak kriminal yang terjadi, seandainya periset menambahkan atribut ketiga – rata-rata
1
jumlah anggota keluarga per provinsi, maka sepenuhnya validitas atribut ini disertakan bersama jumlah
kasus pencurian dan kasus perampokan menjadi ‘tanggung jawab’ periset!
Tujuan penulisan artikel ini bukan untuk membahas secara rinci metode dan teknik pada Analisis Gerombol,
tetapi lebih diarahkan untuk mengantarkan aplikasinya pada ranah Sains Data menggunakan R [R Core
Team, 2020]. Anda dianjurkan untuk membaca buku teks mengenai Analisis Peubah Ganda, khususnya
Analisis Gerombol. Salah satu buku yang penulis anjurkan adalah tulisan dari Everitt et al. [2011].
2 Persyaratan
Artikel ini memerlukan Kriminalitas per 1M Penduduk.csv dan Data Covid-19 Asia per 31052020.dat
yang bisa diunduh di Google Drive ini. Selain itu, untuk mencoba chunks pada artikel ini, Anda mem-
butuhkan 3 packages R yang bisa diunduh menggunakan install.packages("NamaPackage"). Ketiga
package ini adalah:
tidyverse library ini [Wickham et al., 2019] digunakan untuk melakukan manipulasi data;
cluster library ini [Maechler et al., 2019] terisi dengan functions untuk melakukan klasterisasi; dan
factoextra library ini [Kassambara and Mundt, 2020] terisi functions tambahan untuk melakukan klaster-
isasi dan membuat visualisasi (grafik) yang menarik.
Pada bagian ini kita akan mendemonstrasikan penggunaan teknik K-mean Clustering yang tergolong ke
dalam metode klasifikasi non-hirarki, sebagai pendamping dari metode klasifikasi berhirarki. Sebagai
langkah awal, kita akan mengklasifikasikan 33 provinsi di negara kita berdasarkan tindak kriminal yang terjadi.
Data ini berasal dari Statistika Kriminal pada tahun 2014 yang diterbitkan Badan Pusat Statistik (BPS)
Indonesia. Gunakan file Kriminalitas per 1M Penduduk.csv untuk membentuk data frame datCrime.
Perhatikan kode berikut:
datCrime = read.csv("Kriminalitas per 1M Penduduk.csv", skip = 4)
str(datCrime, width=85, strict.width="cut")
2
Bila diperhatikan kolom pertama dari datCrime yaitu Provinsi terisi dengan value yang ‘terlalu panjang’
yang berpotensi ‘mengganggu’ plot yang akan dibuat. Memerhatikan hal ini, akan didefinisikan vektor
namaProv yang terisi dengan ‘singkatan’ yang umum digunakan untuk masing-masing provinsi. Selanjutnya
namaProv akan digunakan menamai observasi (rows) pada datCrime. Perhatikan chunks berikut:
namaProv = c("NAD","SUMUT","SUMBAR","Riau","Jambi","SUMSEL","Bengkulu",
"Lampung","BABEL","KEPRI","DKI","JABAR","JATENG","DIY","JATIM",
"Banten","Bali","NTB","NTT","KALBAR","KALTENG","KALSEL","KALTIM",
"SULUT","SULTENG","SULSEL","SULTRA","Gorontalo","SULBAR","Maluku",
"MALUT","PABAR","Papua")
rownames(datCrime) = namaProv
dim(datCrime)
## [1] 33 5
datCrime = datCrime[c(2:4)]
colnames(datCrime)
Terdapat beberapa ukuran jarak yang bisa digunakan pada Analisis Gerombol, 2 diantaranya yang lazim
digunakan adalah Jarak Euclid dan Jarak Manhattan. Anda dipersilakan membaca Everitt et al. [2011,
p. 46] bila terdapat atribut bertipe biner atau kategori yang tidak tepat bila jarak antarobservasi diukur
menggunakan Jarak Euclid atau Jarak Manhattan.
Bila P1 dan P2 merupakan 2 observasi yang berada pada Rn , maka Jarak Euclid (dEuclid ) dan Jarak Manhattan
(dM anhattan ) kedua observasi bisa dinyatakan melalui persamaan berikut:
v
u n
uX
dEuclid (P1 , P2 ) = t (P1i − P2i )2
i=1
3
n
X
dM anhattan (P1 , P2 ) = |(P1i − P2i )|
i=1
Pada R, penghitungan kedua jenis jarak tidak perlu dilakukan secara manual. Anda bisa menggunakan
fungsi get_dist() dari library factoextra dengan sintak fungsi get_dist(x, method, stand). Parameter
x bersifat mutlak, menyatakan matriks yang beranggotakan numerik atau sebuah data frame; sedangkan
parameter method dan stand bersifat opsional. Nilai default dari method yang menunjukkan metode
untuk mengukur jarak adalah euclidean, dengan pilihan yang lain manhattan, maximum, canberra, binary,
minkowski, pearson, spearman, atau kendal. Parameter ketiga, stand merupakan variabel biner yang bila
bernilai TRUE maka kolom dari x akan distandarisasi. Nilai defaultnya FALSE.
Kita akan menghitung ‘jarak’ antarprovinsi menggunakan jarak Euclid sebelum dilakukan klasterisasi. Seluruh
atribut dari datCrime akan digunakan. Ingatlah untuk mengaktifkan factoextra di memori komputer Anda.
Perhatikan chunks berikut:
library("factoextra")
dEuclid = get_dist(datCrime) # method = Euclid, stand = FALSE
head(as.matrix(dEuclid)[1:5,1:5])
4
set.seed(1234) # Digunakan agar penentuan awal klaster tidak berubah.
k3 = kmeans(dEuclid, centers = 3, nstart = 10)
k3
5
pada klaster 3 dan NTT memiliki mean terkecil pada klaster 1 menyebabkan NAD bergabung pada klaster
3 dan NTT bergabung pada klaster 1. Selain informasi tersebut, Anda juga bisa melihat jumlah kuadrat
dari observasi dalam klaster (within sum squares) dan proporsi jumlah kuadrat antarklaster (between sum
squares) dengan jumlah kuadrat total sebesar 81.7%.
Sebelum kita mengklasterisasikan kasus kriminal di 33 provinsi menggunakan datEucScaled, kita akan
membuat plot 2 dimensi dari klasifikasi k3 untuk memberikan gambaran ‘mental’ mengenai posisi provinsi
dari data kriminalitasnya. Anda bisa menggunakan fungsi fvis_cluster(). Sintaks dan penjelasan dari
fungsi ini bisa dibaca pada tautan ini. Perhatikan plot 2 dimensi berikut yang diperoleh menggunakan
fvis_cluster()
fviz_cluster(k3, data = dEuclid, repel = TRUE, labelsize = 8)
Cluster plot
10
NTT
MALUT
NAD
5 KALTIM
Dim2 (40.4%)
KALTENG cluster
Bali NTB
KALBAR a 1
SUMBAR
Riau JATENG
a 2
BABEL
JATIM
a 3
SUMUT SULBAR
0
SULTRA KALSEL
SULSEL SULTENG
Jambi DKI DIY Bengkulu
SUMSEL Lampung Papua Gorontalo
KEPRI PABAR Banten
SULUT JABAR Maluku
0 5 10 15
Dim1 (56.7%)
Klasterisasi di atas dilakukan menggunakan algoritma Hartigan-Wong [Hartigan and Wong, 1979] sebagai
algoritma standar klasterisasi dengan matriks jarak yang digunakan adalah jarak Euclid. Anda sangat
dianjurkan untuk membaca artikel mereka untuk memahami proses klasterisasi dilakukan. Algoritma ini
mereka ujicobakan menggunakan bahasa pemrograman ISO Fortran pada mesin IBM 370/158.
Perhatikan plot yang terbentuk. Sumbu-sumbu X dan Y merupakan komponen-komponen utama (principal
components) yang diformasi dari 3 atribut dEuclid. Masing-masing komponen ini (Dim1 dan Dim2) men-
jelaskan variansi data yang terjelaskan setiap komponen, masing-masing sebesar 56.7% dan 40.4%. Plot
menunjukkan klaster yang terletak di bagian bawah yang beranggotakan 15 provinsi memiliki nilai Dim2
lebih kecil dibandingkan 2 klaster lainnya. Klaster yang terletak di kiri plot beranggotakan 16 provinsi
memiliki nilai Dim1 lebih kecil dibandingkan 2 klaster lainnya. Klaster terakhir yang terletak di pojok kanan
atas yang beranggotakan Provinsi NTB dan NTT memiliki nilai Dim1 dan Dim2 lebih tinggi dibandingkan
dengan 2 klaster lainnya.
6
Sebelum plot data diinterpretasikan, mari kita lakukan klasterisasi kriminalitas di Indonesia menggunakan
obyek dEucScaled, distance matrix yang telah distandarisasi. Perhatikan plot klaster yang terbentuk:
set.seed(1234) # Digunakan agar penentuan awal klaster tidak berubah.
k3s = kmeans(dEucScaled, centers = 3, nstart = 10)
k3s
## [1] 954.2902
7
k3s$withinss
## [1] 441.5188
k3s$betweenss
## [1] 512.7715
Hasil klasterisasi yang dilakukan menggunakan jarak Euclid terstandarisasi (dEucScaled) berbeda dengan
hasil klasterisasi sebelumnya. Pada dEucScaled, jumlah provinsi pada masing-masing klaster adalah 6, 4,
dan 23 dengan anggotanya bisa dilihat pada luaran chunks. Informasi lainnya adalah rasio dari jumlah
kuadrat antarklaster (between sum squares) dengan jumlah kuadrat total (total sum squares) atau Akurasi
sebesar 53.7% yang diperoleh menggunakan persamaan berikut:
Between SS
Akurasi = (1)
Total SS
Apa makna dari besaran 53.7% ini? Pertanyaan ini bisa dijawab dengan mengingat kembali tujuan Analisis
Gerombol adalah untuk mengelompokkan observasi ke dalam kelas-kelas yang dibentuk sedemikian rupa
sehingga keragaman intra kelas (di dalam kelas) bernilai minimum dan keragaman antarkelas maksimum.
Memperhatikan hal ini tidak berlebihan bila Analisis Gerombol secara prinsip berhubungan dengan pemartisian
jumlah kuadrat (JK) total (Total SS) observasi menjadi beberapa komponen sebagai berikut:
1. JK Total: menunjukkan jumlah kuadrat total observasi, dihitung menggunakan <NamaList>$totss
pada luaran fungsi kmeans. Pada k3s diperoleh menggunakan k3s$totss;
2. JK Intra Kelas: sesuai namanya, menunjukkan jumlah kuadrat dari seluruh observasi pada sebuah
kelas. Bila terdapat k kelas, maka Anda akan memiliki k buah JK Intra Kelas. Pada contoh
sebelumnya, jumlah kuadrat ini bisa diketahui menggunakan k3s$withinss;
3. JK Antarkelas: diterjemahkan dari istilah between sum squares,PJK Antarkelas dapat dihitung
dari selisih JK Total dengan jumlah dari k JK Intra Kelas atau i=1 JK Intra Kelasi . Pada R, k
k
8
kebermaknaan interpretasi, dan berbagai faktor lainnya sangatlah penting untuk turut dipertimbangkan.
Sebagai misal, perhatikan plot 2 dimensi dari ketiga klaster yang terbentuk menggunakan k3s berikut, dan
bandingkan dengan plot k3 sebelumnya. Plot manakah yang lebih ‘mudah’ untuk diinterpretasikan?
fviz_cluster(k3s, data = dEucScaled, repel = TRUE, labelsize = 8)
Cluster plot
KALTIM
5.0 MALUT
Maluku
NTT
NAD Bengkulu
PABAR
2.5
Bali
Dim2 (22.8%)
SULBAR KALSEL
−2.5 Jambi
SULUT JATIM
KEPRI
Banten
DKI
Lampung
JABAR
−5.0
0 5 10
Dim1 (49.1%)
Perhatikan chunks berikut yang digunakan mendefinisikan matriks jarak Euclid, proses klasterisasi, dan
plot klaster dari datCrime menggunakan atribut/variabel jumlah Pencurian dan Perampokan per 1 juta
penduduk.
set.seed(888)
dE.CuriRampok = get_dist(datCrime[-3])
k3.CuriRampok = kmeans(dE.CuriRampok, centers = 3, nstart = 25)
k3.CuriRampok$size
## [1] 2 16 15
9
JK.AK = k3.CuriRampok$betweenss
JK.Tot = k3.CuriRampok$totss
Akurasi = (JK.AK/JK.Tot)*100
Papua
2
JATIM
Banten
NTB
Lampung
1 JABAR
KALBAR SULUT cluster
Perampokan
DKI
KALTENG Jambi a 1
SUMUT KEPRI
0 SULBAR SULSEL a 2
NTT
SUMBAR BABEL DIY SULTENG
SUMSEL a 3
MALUT JATENG KALSEL
Gorontalo
−1 Riau SULTRA
NAD Bengkulu
Bali
PABAR
KALTIM
Maluku
−2
−1 0 1 2 3
Pencurian
Pada plot di atas, centroid ketiga klaster disimbolkan sebagai , N, dan dengan ukuran sedikit lebih
besar dibandingkan simbol untuk masing-masing anggota klaster. Dua klaster terakhir, dibatasi dengan ellips
sebagai hasil dari argumen ellipse.type = "t" dengan t menyatakan vektor (Pencurian, Perampokan)
diasumsikan memiliki sebaran multivariate t-Student. Dua opsi lain untuk argumen ini adalah norm untuk
menyatakan sebaran multivariate normal dan euclid untuk membuat lingkaran dengan radius sebesar rerata
jarak Euclid yang diperoleh. Klaster pertama yang beranggotakan provinsi NTB dan NTT tidak dibatasi oleh
ellips memperhatikan anggota klaster yang sangat terbatas.
Saatnya kita menginterpretasikan klaster yang terbentuk. Provinsi NTB dan NTT yang membentuk klaster
pertama dicirikan oleh kasus pencurian tertinggi dibandingkan dengan anggota pada dua klaster lainnya. Jika
matriks data datCrime Anda cermati, NTT dan NTB merupakan 2 provinsi dengan kasus jumlah pencurian per
1 juta penduduk tertinggi di Indonesia. Klaster kedua dan klaster ketiga menunjukkan adanya overlapping,
khususnya pada Provinsi SULSEL, SUMSEL, dan Jambi. Pada klaster kedua yang beranggotakan 16 provinsi,
terlihat KALTIM dan Bali terletak di kiri bawah klaster yang menggambarkan kedua provinsi ini memiliki
kasus pencurian dan perampokan terkecil dibandingkan provinsi lainnya. Pada klaster ketiga terlihat dengan
jelas Provinsi Papua merupakan provinsi dengan jumlah kasus perampokan per 1 juta penduduk tertinggi di
Indonesia.
10
4.2 Klasifikasi Menurut Kasus Pencurian dan Penipuan
set.seed(888)
dE.CuriTipu = get_dist(datCrime[-2])
k3.CuriTipu = kmeans(dE.CuriTipu, centers = 3, nstart = 25)
k3.CuriTipu$size
## [1] 2 16 15
JK.AK = k3.CuriTipu$betweenss
JK.Tot = k3.CuriTipu$totss
Akurasi = (JK.AK/JK.Tot)*100
2
JATENG
JATIM
Riau DKI
1
KALSEL
Lampung a 1
SULBAR KEPRI Banten
0 KALTENG a 2
SULTRA Jambi PABAR
NTT
SUMBAR SUMUT Gorontalo a 3
SULUT Maluku
NAD SULTENG
BABEL SULSEL
Papua
−1 KALTIM SUMSEL Bengkulu
KALBAR
MALUT
−2
−1 0 1 2 3
Pencurian
Hasil klasterisasi berdasarkan jumlah kasus pencurian dan penipuan per 1 juta penduduk masing-masing
provinsi mirip dengan klasterisasi sebelumnya. Provinsi NTB dan NTT tergabung ke dalam kelas tersendiri
dengan jumlah kasus tertinggi. Selain itu, plot DIY terletak di ujung atas klaster ketiga yang menunjukkan
jumlah kasus penipuan di provinsi ini pada tahun 2011 tertinggi pada kelasnya dan mendekati provinsi NTB
yang berada di posisi pertama pada jumlah kasus penipuan (per 1 juta penduduk).
11
4.3 Klasifikasi Menurut Kasus Perampokan dan Penipuan
set.seed(888)
dE.RampokTipu = get_dist(datCrime[-1])
k3.RampokTipu = kmeans(dE.RampokTipu, centers = 3, nstart = 25)
k3.RampokTipu$size
## [1] 2 10 21
JK.AK = k3.RampokTipu$betweenss
JK.Tot = k3.RampokTipu$totss
Akurasi = (JK.AK/JK.Tot)*100
JATENG
JATIM
DKI
1
Riau JABAR cluster
Penipuan
MALUT
−2 0 2 4
Perampokan
Hasil klasterisasi menggunakan atribut Perampokan dan Penipuan memberikan deskripsi klaster yang berbeda
dengan 2 klasterisasi sebelumnya. Menggunakan parameter yang sama, NTT yang sebelumnya bergabung
dengan NTB sekarang masuk ke klaster kedua yang beranggotakan 10 provinsi. Klaster yang beranggotakan
DIY dan NTB dicirikan oleh jumlah kasus penipuan lebih tinggi dibandingkan kedua klaster lain. Informasi
lain yang bisa diperoleh, Maluku Utara sebagai pencilan (outlier) pada klaster ketiga merupakan provinsi
dengan jumlah penipuan terendah di Indonesia pada tahun 2011.
12
5 Menentukan Jumlah Klaster
Seperti penjelasan sebelumnya, jumlah klaster (k) pada Analisis Gerombol menggunakan metode K-Means
Clustering secara a priori ditetapkan peneliti sebelum analisis dilakukan, yang berimplikasi hasil klasterisasi
bisa berbeda bila k yang digunakan berbeda. Pada contoh-contoh sebelumnya klaster yang terbentuk akan
berbeda bila n dari parameter centers = <n> pada fungsi kmeans berbeda dengan 3. Adakah teknik atau
statistik yang bisa digunakan untuk menduga jumlah klaster pada sebuah matriks data? Bagian ini akan
menjelaskan secara ringkas beberapa teknik dan/atau statistik yang bisa diacu untuk menentukan k pada
matriks data.
Bagi Anda yang pernah menggunakan Analisis Faktor untuk mereduksi atribut data, scree plot merupakan
salah satu tampilan visual yang dapat digunakan sebagai alat bantu untuk menentukan jumlah faktor yang
akan diekstraksi. Metode elbow mirip dengan scree plot, menentukan jumlah klaster k dengan membuat plot
2 dimensi antara k dengan jumlah kuadrat total dalam k klaster (JK Intra Kelompok) yang dibentuk. Nilai
k akan ditentukan saat JK Intra Kelompok ‘mulai’ melandai.
Sebelumnya, kita akan membuat sebuah fungsi R yang ditujukan untuk menentukan JK Intra Kelompok
pada k klaster yang ingin dicoba. Anda perlu melihat kembali Artikel-4. Membangun Fungsi pada R un-
tuk memahami fungsi WithinSS dan Artikel-3. Ekstraksi Informasi dengan ggplot2 yang digunakan
membuat plot. Pada chunks berikut juga dibutuhkan 3 buah library R, yaitu purrr dari Henry and Wick-
ham [2020], scales dari Wickham and Seidel [2020], dan ggplot2 dari Wickham [2016]. Ingatlah untuk
mengunduh ketiga libraries ini bila belum tersedia di komputer Anda.
library(purrr) # Dibutuhkan fungsi map_dbl, memetakan x dengan y
WithinSS = function(k) {
kmeans(datCrime[-3], k, nstart = 10)$tot.withinss
}
Range = 1:10 # Jumlah klaster yang dicobakan, Min = 1; Max = 10
WithinSS.Val = map_dbl(Range, WithinSS)
13
The Elbow Plot
150,000,000
Total Kuadrat Intra Klaster
100,000,000
50,000,000
0
1 2 3 4 5 6 7 8 9 10
Jumlah Klaster
Plot menunjukkan kurva ‘mulai’ melandai pada k = 3 atau k = 4 yang mengindikasikan jumlah klaster pada
datCrime sebesar 3 atau 4 klaster, dan layak diperiksa saat menggunakan teknik K-Means Clustering pada
Analisis Gerombol. Cobalah untuk mengganti jumlah klaster k sama dengan 4 pada contoh-contoh klasterisasi
sebelumnya. Catatan kecil untuk Anda, sesungguhnya terdapat fungsi fviz_nbclust yang didefinisikan pada
library factoextra untuk memperoleh plot di atas. Silakan mencobanya, sintaksnya bisa diketahui dengan
mengetikkan ?fviz_nbclust pada console.
Metode kedua yang juga lazim digunakan untuk mengidentifikasi jumlah klaster yang cocok pada sebuah
matriks data adalah metode Silhouettes (siluet) yang diintroduksi Rousseeuw [1986]. Latar belakang teoritis
metode ini bisa dibaca pada artikel ini. Secara umum, metode Silhouettes ‘bekerja’ dengan membandingkan
seberapa layak sebuah observasi tergabung ke dalam kelas saat ini, Ci , dibandingkan dengan tergabung ke
dalam kelas yang lain, Cj . Secara matematis, bila observasi i tergabung sebagai elemen dari kelas Ci atau
i ∈ Ci maka:
1 X
a(i) = d(i, j)
| Ci | − 1
j∈Ci ; j6=i
dengan | Ci | menyatakan kardinalitas dari Ci ; d(i, j) merupakan jarak antara observasi i dengan j; dan a(i)
merupakan rata-rata jarak observasi i dengan observasi lainnya yang merupakan elemen dari Ci . Semakin
kecil a(i), maka semakin layak i bergabung ke dalam klaster Ci . Perhatikanlah, pada penghitungan a(i),
observasi i dan j merupakan elemen-elemen dari Ci . Bagaimana seandainya j merupakan elemen dari klaster
Ck atau j ∈ Ck ? Perhatikan persamaan berikut:
14
1 X
b(i) = min d(i, j)
k6=i | Ck |
j∈Ck
Pada persamaan di atas, b(i) yang merepresentasikan rataan minimum dari i dengan klaster-klaster lain
yang bukan klaster induknya. Semakin kecil nilai b(i), maka semakin ‘dekat’ i dengan Ck sebagai klaster
‘tetangga’. Menggunakan kedua nilai ini, a(i) dan b(i), maka nilai siluet (silhouette value) dari observasi i
atau s(i) bisa dinyatakan melalui persamaan berikut:
a(i)
1−
b(i) ,
jika a(i) < b(i)
s(i) = 0, jika a(i) = b(i)
a(i)
− 1, jika a(i) > b(i)
b(i)
Perhatikanlah bila jumlah klaster k = 1, maka a(i) = b(i) sehingga s(i) = 0. Bila a(i) b(i) maka s(i) → 1
yang menunjukkan semakin baik klaster yang terbentuk. Ketiga indikator ini, a(i), b(i) dan s(i) selanjutnya
dimanfaatkan untuk membuat plot antara jumlah klaster k pada sumbu x dengan rata-rata lebar siluet
kluster pada sumbu y oleh fungsi fviz_nbclust yang didefinisikan pada library factoextra. Perhatikan
chunks berikut:
Siluet = fviz_nbclust(datCrime[-3], FUNcluster = kmeans, k.max = 10)
Siluet$labels$title = "Jumlah Optimal Klaster"
Siluet$labels$y = "Rataan Lebar Siluet"
Siluet$labels$x = "Jumlah Klaster"
Siluet
0.6
Rataan Lebar Siluet
0.4
0.2
0.0
1 2 3 4 5 6 7 8 9 10
Jumlah Klaster
15
5.3 Gap Statistics
Menghitung statistik gap yang diintroduksi oleh Tibshirani et al. [2001] merupakan metode ketiga untuk
menduga jumlah klaster pada sebuah matriks data. Misalkan Xn×p merupakan matriks data dari n observasi
pada p atribut.
PpMisalkan pula 2dij merupakan ‘jarak’ observasi titik Pi dengan titik Pj pada R ; untuk jarak
p
Euclid dij = k=1 (Pik − Pjk ) . Misalkan n titik observasi ini diklasterisasi ke dalam r klaster C1 , C2 , · · ·,
Cr dengan nr = | Cr |. Misalkan pula:
k
X X 1
Dr = dij dan Wk = Dr
r=1
2n r
i,j∈Cr
dengan Dr menyatakan jumlah jarak dari seluruh pasangan titik pada klaster Cr dan Wk menyatakan jumlah
kuadrat intra klaster dari jarak Dr , maka menggunakan kedua definisi tersebut, statistik Gap selanjutnya
didefinisikan sebagai:
Nilai E∗n (log(Wk )) menyatakan ekspektasi dari log(Wk ) pada distribusi referensi dari n observasi. Semakin
besar nilai Gn (k), maka k semakin baik untuk dipilih sebagai jumlah klaster pada matriks data Xn×p .
Menggunakan statistik Gap, akan diduga jumlah klaster terbaik data kriminalitas 33 provinsi dengan
melibatkan hanya 2 peubah, Pencurian dan Perampokan. Dua teknik sebelumnya menunjukkan jumlah
klaster ideal (k) adalah 3 atau 4 klaster. Menghitung statistik Gap dengan R bisa dilakukan dengan
menambahkan parameter method = c("gap_stat") pada fungsi fviz_nbcluster(). Perhatikan chunks
berikut:
Gap = fviz_nbclust(datCrime, FUNcluster = kmeans, method = c("gap_stat"), k.max = 10)
Gap$labels$title = "Jumlah Optimal Klaster Berdasarkan Statistik Gap"
Gap$labels$y = "Nilai Statistik Gap"
Gap$labels$x = "Jumlah Klaster"
Mengacu nilai statistik Gap, terdapat indikasi pencurian dan perampokan di-33 provinsi di Indonesia
hanya membentuk klaster tunggal seperti diperlihatkan pada plot berikut. Memperhatikan ketiga metode
penentuan jumlah klaster yang optimal untuk mengklasifikasikan kasus pencurian dan perampokan di
Indonesia memberikan jumlah klaster (optimal) yang berbeda, maka penentuan jumlah klaster menjadi
tanggung jawab peneliti mengingat statistics is a tool to make scientific decision. Teori yang relevan untuk
mengkaji tindak kriminal di masyarakat merupakan another tool bagi Anda untuk menentukan jumlah klaster
yang akan dibentuk. Demikian pula halnya dengan riset-riset lain yang dilakukan sebelumnya yang terkait
dengan klasterisasi kriminal merupakan masukan berharga untuk menentukan jumlah klaster.
16
Jumlah Optimal Klaster Berdasarkan Statistik Gap
0.3
Nilai Statistik Gap
0.2
0.1
0.0
1 2 3 4 5 6 7 8 9 10
Jumlah Klaster
Klasterisasi Menurut Tindak Kriminal Pencurian & Perampokan
Papua
2
JATIM
Banten
NTB
cluster
Perampokan
Lampung
Bali PABAR
KALTIM
Maluku
−2
17
Perhatikan klasterisasi tersebut dengan hasil klasterisasi di halaman 9 yang jarak Euclid-nya dihitung tanpa
distandarisasi. Plot manakah yang lebih mudah Anda interpretasikan?
18
k.Siluet = fviz_nbclust(dCov, FUNcluster = kmeans, k.max = 10, method = "silhouette") +
theme(axis.text=element_text(size=9))
k.Siluet$labels$title = "Metode Silhouette"
k.Siluet$labels$y = "Lebar Siluet"
k.Siluet$labels$x = "Jumlah Klaster"
Lebar Siluet
3e+18 0.75
2e+18 0.50
1e+18 0.25
0e+00 0.00
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
Jumlah Klaster Jumlah Klaster
2.00
1.75
1.50
1.25
1 2 3 4 5 6 7 8 9 10
Jumlah Klaster
Ketiga plot menunjukkan terdapat perbedaan klaster optimal yang disarankan metode Elbow dan Silhou-
ette dengan statistik Gap. Dua metode pertama mengindikasikan klaster optimal berkisar 2–3 klaster,
sedangkan Gap menyarankan untuk membangun 5 klaster. Memperhatikan perbedaan jumlah klaster yang
disarankan, kita akan mencoba mengklasterisasi kasus pandemi Covid-19 di Asia menjadi 3 dan 4 klaster
untuk mengakomodir 2 hingga 5 klaster yang disarankan.
dEuclid = get_dist(dCov, stand = TRUE)
k3 = kmeans(dEuclid, centers = 3, nstart = 25)
k4 = kmeans(dEuclid, centers = 4, nstart = 25)
Plot3 = fviz_cluster(k3, data = dCov, repel = TRUE, labelsize = 7,
main = "Klasterisasi Kasus Covid-19 Asia - 3 Klaster")
Plot4 = fviz_cluster(k4, data = dCov, repel = TRUE, labelsize = 7,
main = "Klasterisasi Kasus Covid-19 Asia - 4 Klaster")
19
Klasterisasi Kasus Covid−19 Asia − 3 Klaster
Iran
Turkey
2
Bhutan
Palestine Hong Kong Azerbaijan
Timor−Leste Georgia Israel
Saudi Arabia
1 Cyprus Lebanon
Singapore UAE
Dim2 (11.5%)
Macao Kyrgyzstan
Bahrain Qatar Armenia cluster
BruneiMaldives
Kuwait South Korea Malaysia a 1
Laos Kazakhstan Tajikistan Oman
0 Pakistan
Afghanistan Japan
a 2
Mongolia Iraq
Uzbekistan Bangladesh a 3
CambodiaThailand
Indonesia Philippines
Taiwan Nepal
−1 Syria Vietnam Sri Lanka
Jordan
Myanmar Yemen
−2
China India
0 2 4 6 8
Dim1 (77.1%)
Klasterisasi Kasus Covid−19 Asia − 4 Klaster
Iran
Turkey
Macao Qatar
Georgia Bahrain UAE a 1
Kuwait Azerbaijan
Laos Armenia
South Korea Kazakhstan Pakistan a 2
0
Iraq Tajikistan Japan Oman
a 3
Mongolia Afghanistan Bangladesh Malaysia
Syria Thailand Indonesia Philippines a 4
−1 Myanmar Nepal Jordan Uzbekistan
Cambodia Yemen Sri Lanka
Vietnam Taiwan
−2
China India
0 2 4 6 8
Dim1 (77.1%)
20
Perhatikan kedua sumbu, x dan y, merupakan komponen-komponen utama (principal component) yang
terbentuk dari kelima atribut dCov. Komponen utama pertama (Dim1) menjelaskan variansi data sebesar
77.1% dan komponen kedua (Dim2) sebesar 11.5%. Kedua dimensi ini mampu mengekstraksi total matriks
data sebesar 88.5%. Nilai-nilai ini bisa diketahui menggunakan fungsi princomp() untuk memperoleh 5
komponen utama, dibentuk dari 5 atribut yang dianalisis; dan mengekstraksi informasi nilai eigen dari setiap
komponen melalui fungsi get_eig. Kedua fungsi ini didefinisikan pada library factoextra. Perhatikan
chunks berikut:
aku = princomp(scale(dCov)) # Membentuk 5 komponen utama dari dCov yang distandarisasi
aku$center # Menampilkan pusat dari masing-masing atribut
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## TotCases 0.499 0.224 0.125 0.259 0.786
## TotDeath 0.471 0.165 -0.408 -0.764
## Recovered 0.474 0.374 -0.252 0.528 -0.541
## ActCases 0.411 -0.103 0.831 -0.202 -0.297
## Pop 0.369 -0.879 -0.250 0.171
##
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## SS loadings 1.0 1.0 1.0 1.0 1.0
## Proportion Var 0.2 0.2 0.2 0.2 0.2
## Cumulative Var 0.2 0.4 0.6 0.8 1.0
eigen = get_eig(aku)
eigen # Menampilkan nilai vektor eigen untuk setiap komponen
## [1] 92.62079
Akurasi4
## [1] 94.66867
Penghitungan keakurasian menunjukkan penambahan jumlah klaster dari 3 menjadi 4 klaster menyebabkan
peningkatan keakuratan sebesar 2.04%; sebuah ukuran yang secara relatif sangat kecil. Mempertimbangkan
hal ini, jumlah klaster optimal sebesar 3 nampaknya menjadi pilihan yang rasional.
21
Dengan demikian, menggunakan setup klasterisasi di halaman 18, terdapat 3 klaster tentang kondisi pandemi
Covid-19 49 negara di Asia, sebagai berikut:
1. Klaster I, terletak di bagian kanan plot, beranggotakan India, Iran, Turki, dan China; merupakan klaster
dengan jumlah kasus Covid-19 tertinggi dengan jumlah kematian tertinggi. Saudi Arabia yang memiliki
total kasus tertinggi keempat, melebihi China, tidak tersertakan pada klaster ini memperhatikan jumlah
kematian di kerajaan ini jauh lebih kecil dibandingkan keempat negara lainnya;
2. Klaster II, terletak di bagian tengah plot, beranggotakan 5 negara yaitu Indonesia, Bangladesh, Pakistan,
Saudi Arabia, dan Qatar. Klaster ini juga dicirikan oleh jumlah kasus Covid-19 yang relatif tinggi bila
dibandingkan dengan kasus yang dijumpai di negara-negara lain yang tidak tergabung ke dalam klaster
I dan II;
3. Klaster III, terletak di bagian kiri plot dengan nilai pada ‘Dim1‘ dan ‘Dim2‘ secara relatif lebih kecil
dibandingkan dengan nilai dari negara-negara pada Klaster I dan II. Beranggotakan 40 negara, Laos,
Timor Leste, Kerajaan Bhutan, dan Macao merupakan 4 negara Asia dengan jumlah kasus dan jumlah
kematian terendah.
Apakah klasterisasi dan interpretasi di atas memuaskan? Anda bisa mencoba untuk mereklasterisasi dengan
memodifikasi nilai pada sumbu x dan y, menggunakan atribut asli, bukan komponen utama dari matriks
data asli. Silakan bereksperimen untuk ‘mencari’ interpretasi yang lebih baik.
Referensi
Brian S. Everitt, Sabina Landau, Moveen Leese, and Daniel Stahl. Cluster Analysis. John Wiley & Sons,
Ltd, West Sussex, UK, 5th edition, 2011.
J. A. Hartigan and M. A. Wong. Algorithm AS 136: A K-Means Clustering Algorithm. Journal of the Royal
Statistical Society. Series C (Applied Statistics), 28(1):100–108, 1979.
Lionel Henry and Hadley Wickham. purrr: Functional Programming Tools, 2020. URL https://CRAN.R-
project.org/package=purrr. R package version 0.3.4.
Alboukadel Kassambara and Fabian Mundt. factoextra: Extract and Visualize the Results of Multivariate
Data Analyses, 2020. URL https://CRAN.R-project.org/package=factoextra. R package version 1.0.7.
Martin Maechler, Peter Rousseeuw, Anja Struyf, Mia Hubert, and Kurt Hornik. cluster: Cluster Analysis
Basics and Extensions, 2019.
R Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical
Computing, Vienna, Austria, 2020. URL https://www.R-project.org/.
Peter J. Rousseeuw. Silhouettes: a graphical aid to the interpretation and validation of cluster analysis.
Journal of Computational and Applied Mathematics, 20:53–65, 1986.
Robert Tibshirani, Guenther Walther, and Trevor Hastie. Estimating the number of clusters in a data set via
the gap statistic. Journal of Royal Statistical Society, B Series, 63 Part 2:411–423, 2001.
Hadley Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. ISBN
978-3-319-24277-4. URL https://ggplot2.tidyverse.org.
Hadley Wickham and Dana Seidel. scales: Scale Functions for Visualization, 2020. URL https://CRAN.R-
project.org/package=scales. R package version 1.1.1.
Hadley Wickham, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain
François, Garrett Grolemund, Alex Hayes, Lionel Henry, Jim Hester, Max Kuhn, Thomas Lin Pedersen,
Evan Miller, Stephan Milton Bache, Kirill Müller, Jeroen Ooms, David Robinson, Dana Paige Seidel,
Vitalie Spinu, Kohske Takahashi, Davis Vaughan, Claus Wilke, Kara Woo, and Hiroaki Yutani. Welcome
to the tidyverse. Journal of Open Source Software, 4(43):1686, 2019. doi: 10.21105/joss.01686.
22