Anda di halaman 1dari 24

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/341787776

Sains Data dengan R: Klasterisasi Menggunakan K-Means Clustering

Preprint · May 2020


DOI: 10.13140/RG.2.2.29495.34721

CITATIONS READS
0 2,228

1 author:

I Putu Eka N. Kencana


Udayana University
102 PUBLICATIONS   109 CITATIONS   

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.

The user has requested enhancement of the downloaded file.


Sains Data dengan R:
Klasterisasi Menggunakan K-Means Clustering

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

3 Klasterisasi dengan K-Means Clustering 4

4 Memilih Atribut Pengklasifikasi 9


4.1 Klasifikasi Menurut Kasus Pencurian dan Perampokan . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Klasifikasi Menurut Kasus Pencurian dan Penipuan . . . . . . . . . . . . . . . . . . . . . . . 11
4.3 Klasifikasi Menurut Kasus Perampokan dan Penipuan . . . . . . . . . . . . . . . . . . . . . . 12

5 Menentukan Jumlah Klaster 13


5.1 Metode Elbow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2 Metode Silhouettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.3 Gap Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

6 Aplikasi K-Means Clustering pada Pandemi Corona Virus 18


1 Introduksi
Klasterisasi (clustering) merupakan sebuah proses untuk mengelompokkan n observasi ke dalam g grup
(g ≪ n) sedemikian rupa sehingga keragaman (variansi) dalam grup (within group) minimum dan keragaman
antargrup (between group) maksimum. Proses ini bisa dilakukan menggunakan beberapa teknik, salah
satunya menggunakan Analisis Gerombol (cluster analysis) yang tergolong ke dalam statistika peubah
ganda (multivarite statistics). Perhatikan gambar 1 yang menunjukkan pengelompokkan 33 provinsi di
Indonesia (selain Prov. Kalimantan Utara yang belum terbentuk) menurut jumlah kasus pencurian dan
perampokan per satu juta penduduk pada tahun 2011 menjadi 3 grup.

Gambar 1: Pengelompokan Provinsi di Indonesia Menurut Jumlah Pencurian & Perampokan

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.

2.1 Mempersiapkan Data

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")

## 'data.frame': 33 obs. of 5 variables:


## $ Provinsi : chr "Aceh" "Sumatera Utara" "Sumatera Barat" "Riau" ...
## $ Pencurian : int 2432 4447 3496 3631 5535 5636 8080 6221 4100 5993 ...
## $ Perampokan: int 246 524 476 302 607 467 229 934 383 610 ...
## $ Penipuan : int 429 501 513 1107 625 448 372 932 452 736 ...
## $ Populasi : int 4494410 12982204 4846909 5538367 3092265 7450394 1715518 760840..
head(datCrime, 10)

## Provinsi Pencurian Perampokan Penipuan Populasi


## 1 Aceh 2432 246 429 4494410
## 2 Sumatera Utara 4447 524 501 12982204
## 3 Sumatera Barat 3496 476 513 4846909
## 4 Riau 3631 302 1107 5538367
## 5 Jambi 5535 607 625 3092265
## 6 Sumatera Selatan 5636 467 448 7450394
## 7 Bengkulu 8080 229 372 1715518
## 8 Lampung 6221 934 932 7608405
## 9 Kep. Bangka Belitung 4100 383 452 1223296
## 10 Kep. Riau 5993 610 736 1679163

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)

## [1] "Pencurian" "Perampokan" "Penipuan"


head(datCrime, 10)

## Pencurian Perampokan Penipuan


## NAD 2432 246 429
## SUMUT 4447 524 501
## SUMBAR 3496 476 513
## Riau 3631 302 1107
## Jambi 5535 607 625
## SUMSEL 5636 467 448
## Bengkulu 8080 229 372
## Lampung 6221 934 932
## BABEL 4100 383 452
## KEPRI 5993 610 736
Perhatikanlah atribut Populasi, jumlah penduduk di masing-masing provinsi yang diperoleh menggunakan
hasil sensus penduduk tahun 2010 dihapus mempertimbangkan Pencurian, Perampokan, dan Penipuan
dihitung berdasarkan jumlah kasus per satu juta penduduk!. Hingga tahapan ini, kita telah siap untuk
mengklasterisasi 33 provinsi menggunakan ketiga atribut ini. Sebelumnya, Anda perlu mengingat kembali
matriks jarak (distance matrix) yang menunjukkan kemiripan (atau ketakmiripan) antarobservasi berdasarkan
‘jarak’ yang dibentuk pada Rn , dengan n menyatakan jumlah atribut.

2.2 Membentuk Matriks Jarak

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])

## NAD SUMUT SUMBAR Riau Jambi


## NAD 0.000 2035.3607 1091.8113 1378.5576 3130.071
## SUMUT 2035.361 0.0000 952.2862 1040.3730 1098.184
## SUMBAR 1091.811 952.2862 0.0000 633.5116 2046.271
## Riau 1378.558 1040.3730 633.5116 0.0000 1987.603
## Jambi 3130.071 1098.1844 2046.2712 1987.6028 0.000
Perhatikanlah bahwa obyek dEuclid  bertipe 33!
distance dengan jumlah elemen = 528. Angka ini diperoleh
dengan menghitung kombinasi 33 2 sebesar 2!31! . Untuk mengubahnya menjadi bertipe matriks, digunakan
fungsi as.matrix(). Selanjutnya, ditampilkan 5 baris dan kolom pertama. Bila dicermati, elemen-elemen
pada dEuclid memiliki rentang data yang relatif lebar. Dengan demikian, diperlukan standarisasi nilai ketiga
atribut yang dapat dilakukan menggunakan fungsi scale(). Perhatikan chunks berikut dan luarannya:
dEucScaled = get_dist(datCrime, stand = TRUE) # Data distandarisasi
head(as.matrix(dEucScaled)[1:5,1:5])

## NAD SUMUT SUMBAR Riau Jambi


## NAD 0.0000000 1.3281569 0.9664542 1.783491 1.9130009
## SUMUT 1.3281569 0.0000000 0.4393342 1.749818 0.6309865
## SUMBAR 0.9664542 0.4393342 0.0000000 1.615135 1.0232667
## Riau 1.7834911 1.7498184 1.6151346 0.000000 1.8205887
## Jambi 1.9130009 0.6309865 1.0232667 1.820589 0.0000000
Pada matriks jarak dEuclied dan dEucScale, seluruh elemen pada diagonal utama bernilai 0. Kenapa?

3 Klasterisasi dengan K-Means Clustering


Pengamatan penulis menunjukkan K-Means Clustering merupakan teknik yang terdominan digunakan untuk
melakukan klasterisasi pada unsupervised mach ine learning. Mempertimbangkan tidak tersedianya acuan
untuk menentukan jumlah klaster (k) yang akan dibentuk, maka pada K-Means Clustering k sepenuhnya
ditentukan peneliti dengan alasan-alasan yang rasional. Mari kita asumsikan bahwa kondisi kriminalitas di
33 provinsi Indonesia dapat dibedakan menjadi 3 kelas: (a) provinsi-provinsi dengan tindak kriminalitas
rendah, (b) provinsi-provinsi dengan tindak kriminalitas menengah, dan (c) provinsi-provinsi dengan
tindak kriminalitas tinggi. Menggunakan kedua jenis matriks jarak, datEuclid dan datEucScaled, kita
akan mengklasterisasi ke–33 provinsi menjadi 3 klaster. Perhatikan chunks berikut:

4
set.seed(1234) # Digunakan agar penentuan awal klaster tidak berubah.
k3 = kmeans(dEuclid, centers = 3, nstart = 10)
k3

## K-means clustering with 3 clusters of sizes 2, 15, 16


##
## Cluster means:
## NAD SUMUT SUMBAR Riau Jambi SUMSEL Bengkulu Lampung
## 1 9270.610 7256.784 8198.024 8034.150 6166.257 6095.758 3796.228 5459.463
## 2 4438.995 2431.541 3367.474 3262.768 1376.789 1336.381 1496.439 1026.568
## 3 1352.182 1005.058 834.796 878.109 1932.517 2041.004 4457.357 2652.251
## BABEL KEPRI DKI JABAR JATENG DIY JATIM Banten
## 1 7610.7206 5701.943 5403.496 5106.8018 7699.360 4231.610 7423.693 4368.012
## 2 2784.0081 1058.193 1024.006 934.4598 2992.722 1472.816 2720.735 1089.723
## 3 880.6463 2376.175 2679.752 2969.5043 1036.720 3969.257 1167.684 3741.528
## Bali NTB NTT KALBAR KALTENG KALSEL KALTIM SULUT
## 1 8412.8934 1379.746 1379.746 8447.6749 8791.434 7203.855 9099.787 5405.6070
## 2 3632.7478 3762.641 6082.921 3618.1139 3968.150 2427.494 4273.698 971.7827
## 3 967.1642 6824.797 9234.891 968.2444 1055.802 1021.227 1259.682 2730.0941
## SULTENG SULSEL SULTRA Gorontalo SULBAR Maluku MALUT PABAR
## 1 3321.424 6923.582 7233.402 4053.986 7556.3492 4816.376 9315.187 5042.7132
## 2 1828.650 2103.808 2426.454 1244.959 2750.9576 1057.146 4480.394 979.0284
## 3 4915.798 1246.280 1003.983 4114.748 839.0605 3381.170 1468.711 3099.1514
## Papua
## 1 4872.039
## 2 1131.392
## 3 3389.751
##
## Clustering vector:
## NAD SUMUT SUMBAR Riau Jambi SUMSEL Bengkulu Lampung
## 3 3 3 3 2 2 2 2
## BABEL KEPRI DKI JABAR JATENG DIY JATIM Banten
## 3 2 2 2 3 2 3 2
## Bali NTB NTT KALBAR KALTENG KALSEL KALTIM SULUT
## 3 1 1 3 3 3 3 2
## SULTENG SULSEL SULTRA Gorontalo SULBAR Maluku MALUT PABAR
## 2 3 3 2 3 2 3 2
## Papua
## 2
##
## Within cluster sum of squares by cluster:
## [1] 94646235 281904277 236164533
## (between_SS / total_SS = 81.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Mari perhatikan obyek k3. Luaran diawali dengan informasi jumlah observasi pada masing-masing klaster,
yaitu 2, 15, dan 16. Anggota masing-masing klaster diperlihatkan di bawah entri Clustering vector:. Lihatlah
provinsi-provinsi NTB, dan NTT merupakan anggota pada klaster 1. Pada entri Cluster means: diperlihatkan
nilai-nilai mean masing-masing provinsi pada ketiga klaster. Nilai mean terkecil digunakan untuk memilih
klaster yang ‘cocok’ untuk provinsi yang bersangkutan. Sebagai contoh, NAD yang memiliki mean terkecil

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

## K-means clustering with 3 clusters of sizes 6, 4, 23


##
## Cluster means:
## NAD SUMUT SUMBAR Riau Jambi SUMSEL Bengkulu Lampung
## 1 3.082851 2.112724 2.314225 2.091292 1.666860 2.221312 3.022286 1.016002
## 2 4.493725 3.509555 3.798321 3.619226 3.041426 3.373685 3.515202 2.575627
## 3 1.575774 1.151560 1.218861 1.752518 1.292057 1.183314 1.814288 2.415239
## BABEL KEPRI DKI JABAR JATENG DIY JATIM Banten
## 1 2.492814 1.460096 0.9769473 0.9166645 1.907347 2.271541 1.342993 1.231368
## 2 3.826917 2.837818 2.4982149 2.4465538 3.410522 2.413197 3.066463 2.436777
## 3 1.161129 1.406632 2.0903396 2.1142838 2.328710 3.343729 2.920411 2.559094
## Bali NTB NTT KALBAR KALTENG KALSEL KALTIM SULUT
## 1 2.577989 2.789609 3.426927 2.343832 2.047777 1.660338 3.443029 1.841178
## 2 4.000799 2.228130 2.591983 3.810828 3.718137 3.218993 4.737902 2.966470
## 3 1.855406 4.309610 3.556934 1.717657 1.489038 1.472441 1.802564 1.650750
## SULTENG SULSEL SULTRA Gorontalo SULBAR Maluku MALUT PABAR
## 1 2.611631 2.175505 2.408112 2.504985 1.773689 3.178692 3.538166 2.738244
## 2 3.063153 3.493245 3.711296 3.156411 3.362001 3.851393 4.814767 3.541620
## 3 1.822053 1.128574 1.218466 1.570027 1.285343 1.798584 1.947245 1.545153
## Papua
## 1 2.468028
## 2 2.934758
## 3 3.305011
##
## Clustering vector:
## NAD SUMUT SUMBAR Riau Jambi SUMSEL Bengkulu Lampung
## 3 3 3 3 3 3 3 1
## BABEL KEPRI DKI JABAR JATENG DIY JATIM Banten
## 3 3 1 1 1 2 1 1
## Bali NTB NTT KALBAR KALTENG KALSEL KALTIM SULUT
## 3 2 2 3 3 3 3 3
## SULTENG SULSEL SULTRA Gorontalo SULBAR Maluku MALUT PABAR
## 3 3 3 3 3 3 3 3
## Papua
## 2
##
## Within cluster sum of squares by cluster:
## [1] 54.41059 80.66605 306.44211
## (between_SS / total_SS = 53.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
k3s$totss

## [1] 954.2902

7
k3s$withinss

## [1] 54.41059 80.66605 306.44211


k3s$tot.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

JK Intra Kelas bisa diketahui melalui komponen tot.withinss.


Luaran k3s sebelumnya menunjukkan:
1. JK Total = k3s$totss = 954.29;
2. Total JK Intra Kelas = k3s$tot.withinss =
P3
i=1 withinssi = 54.41 + 80.67 + 306.44 =
441.42;
3. JK Antarkelas = JK Total - JK Total Intra Kelas = k3s$betweenss = 512.77; dan
4. Akurasi = JKAntarkelas
JKTotal = 512.77
954.29 = 53.73%.
Jadi, sebagai sebuah indikator, Akurasi menunjukkan seberapa baik klaster yang dibentuk bisa merepre-
sentasikan matriks observasi. Semakin tinggi nilai ini, maka keragaman antarkelas juga meningkat yang
menyebabkan semakin berkualitasnya klaster yang dilakukan. Semakin rendah akurasi, maka kualitas klaster
yang terbentuk menurun. Ingatlah bahwa jumlah klaster (k) ditentukan periset sebelum analisis dilakukan.
Jadi, bisa saja kita kurang tepat dalam memilih jumlah klaster untuk mengelompokkan kasus kriminal di
Indonesia.
Bila akurasi klaster dengan data terstandarisasi dibandingkan dengan klaster yang dibentuk tanpa data
distandarisasi, terlihat keakurasian klaster pada data tanpa standarisasi (k3) lebih baik dengan akurasi
sebesar 81.7%. Tidakkah seharusnya kita memilih klaster yang dibangun tanpa data distandarisasi? Menurut
penulis, penggunaan Statistika sebagai disiplin ilmu yang digunakan dalam menginferensia data tidak cukup
berpatokan hanya kepada signifikansi hipotesis dan/atau nilai-nilai statistik semata. Rasionalitas peneliti,

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%)

SULTRA SULTENG cluster


NTB
Gorontalo
BABEL a 1
SUMBAR Riau
0.0 SUMSEL DIY a 2
JATENG
SULSEL KALBAR a 3
SUMUT KALTENG Papua

SULBAR KALSEL
−2.5 Jambi
SULUT JATIM
KEPRI

Banten
DKI
Lampung
JABAR
−5.0
0 5 10
Dim1 (49.1%)

4 Memilih Atribut Pengklasifikasi


Pada contoh sebelumnya ketiga jenis tindak kriminal secara simultan digunakan untuk mengklasterisasikan
ke-33 provinsi. Hal inilah yang menyebabkan sumbu x dan y menyatakan komponen-komponen utama
(principal components) dari matriks data. Mungkinkah kita memilih atribut ‘asli’ pada tampilan klaster yang
terbentuk? Bila memungkinkan, seharusnya interpretasi klaster lebih mudah dilakukan. Menggunakan 3
kelas yang didefinisikan sebelumnya, 33 provinsi diklasterisasi menurut 3 pasangan atribut berikut:

4.1 Klasifikasi Menurut Kasus Pencurian dan Perampokan

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

cat("Akurasi Klaster = ", Akurasi, "%")

## Akurasi Klaster = 81.98273 %


fviz_cluster(k3.CuriRampok, data = datCrime[-3], repel = TRUE, labelsize = 8,
ellipse.type = "t", main = "Klasterisasi Menurut Pencurian dan Perampokan")

Klasterisasi Menurut Pencurian dan Perampokan


3

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

cat("Akurasi Klaster = ", Akurasi, "%")

## Akurasi Klaster = 81.86608 %


fviz_cluster(k3.CuriTipu, data = datCrime[-2], repel = TRUE, labelsize = 8, ellipse.type =

Klasterisasi Menurut Pencurian dan Penipuan


NTB
DIY

2
JATENG

JATIM

Riau DKI
1

Bali JABAR cluster


Penipuan

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

cat("Akurasi Klaster = ", Akurasi, "%")

## Akurasi Klaster = 67.63034 %


fviz_cluster(k3.RampokTipu, data = datCrime[-1], repel = TRUE, labelsize = 8,
ellipse.type = "t", main = "Klasterisasi Menurut Perampokan dan Penipuan")

Klasterisasi Menurut Perampokan dan Penipuan


NTB
DIY

JATENG
JATIM

DKI
1
Riau JABAR cluster
Penipuan

Bali KALSEL Lampung a 1


SULBAR a 2
KEPRI Banten
0 SULTRA NTT a 3
KALTENG
PABAR SUMBAR
Gorontalo Jambi
Maluku SULTENG
NAD SUMUT
KALTIM SULUT
BABEL SULSEL Papua
−1 Bengkulu SUMSEL KALBAR

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.

5.1 Metode Elbow

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)

library(scales) # Dibutuhkan untuk mengatur skala sumbu plot


Plot = ggplot(mapping = aes(x = Range, y = WithinSS.Val)) + geom_line() +
geom_point(size = 2) + labs(title = "The Elbow Plot", x = "Jumlah Klaster",
y = "Total Kuadrat Intra Klaster") +
scale_x_discrete(limits = 1:10) + scale_y_continuous(labels = label_comma())

Plot # Mencetak Plot

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.

5.2 Metode Silhouettes

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

Jumlah Optimal Klaster

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:

Gn (k) = E∗n (log(Wk )) − log(Wk )

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

KALBAR SULUT JABAR a 1


Jambi DKI
KALTENG a 2
SUMUT KEPRI
SULBAR DIY
a 3
0 SULSEL
NTT
SUMBAR SUMSEL SULTENG
KALSEL
MALUT JATENG
BABEL
NAD Riau Bengkulu
SULTRA Gorontalo

Bali PABAR
KALTIM
Maluku
−2

−2.5 0.0 2.5


Pencurian

17
Perhatikan klasterisasi tersebut dengan hasil klasterisasi di halaman 9 yang jarak Euclid-nya dihitung tanpa
distandarisasi. Plot manakah yang lebih mudah Anda interpretasikan?

6 Aplikasi K-Means Clustering pada Pandemi Corona Virus


Saatnya kita menggunakan metode K-Means Clustering untuk mengklasterisasi informasi dari 49 negara di
Asia mengenai pandemi Corona Virus (Covid-19). Ingatlah untuk mengunduh file Data Covid-19 Asia per
31052020.dat di Google Drive sesuai dengan tautan yang diberikan di halaman 2. Tabel ini terisi dengan 10
atribut (kolom) dengan atribut pertama menyatakan total kasus Covid-19 yang tercatat di masing-masing
negara (sebagai rownames) hingga 31 Mei 2020, dan atribut terakhir terisi informasi apakah negara termaksud
merupakan anggota dari the Association of Southeast Asian Nations (ASEAN). Data diunduh dari situs ini
pada tanggal 31 Mei 2020.
Tujuan dari analisis yang akan dilakukan adalah ‘melihat’ apakah pandemi Covid-19 di Asia bisa diklasterisasi
berdasarkan atribut-atribut yang tersedia pada tabel. Bila ya, seperti apakah klaster yang terbentuk? Tujuan
ini dijawab dengan terlebih dahulu melakukan preparasi data frame df yang dilakukan melalui tahapan
berikut:
df = read.table("Data Covid-19 Asia per 31052020.dat", header = TRUE)
head(df, n = 5) # Menampilkan 5 observasi pertama pada dataframe

## TotCases TotDeath Recovered ActCases Cases1M Deaths1M TotTests


## Afghanistan 14525 249 1303 12973 373.91 6.41 37348
## Armenia 8927 127 3317 5483 3013.04 42.87 57081
## Azerbaijan 5246 61 3327 1858 517.80 6.02 294264
## Bahrain 10793 17 5826 4950 6365.23 10.03 309573
## Bangladesh 44608 610 9375 34623 271.10 3.71 297054
## Tests1M Pop ASEAN
## Afghanistan 961.43 38846163 0
## Armenia 19265.99 2962785 0
## Azerbaijan 29045.09 10131281 0
## Bahrain 182572.48 1695617 0
## Bangladesh 1805.29 164546795 0
Pada bagian ini kita akan melakukan klasterisasi berdasarkan atribut TotCases, TotDeath, Recovered,
ActCases dan Pop yang menunjukkan jumlah total kasus, angka kematian, pasien sembuh, kasus aktif, serta
jumlah penduduk di masing-masing negara. Berikut adalah setup klasterisasi yang dilakukan menggunakan
K-Means Clustering:
• Elemen-elemen pada matriks jarak antarnegara yang dgunakan adalah Jarak Euclid;
• Matriks data yang dianalisis distandarisasi mempertimbangkan adanya rentang nilai yang lebar pada
atribut jumlah penduduk; dan
• Jumlah klaster optimal diperiksa dengan menggunakan ketiga metode yang sudah dijelaskan sebelumnya.
set.seed(999)
dCov = df[c(1:4,9)]
colnames(dCov) # Menampilkan nama-nama atribut pada dCov

## [1] "TotCases" "TotDeath" "Recovered" "ActCases" "Pop"


k.Within = fviz_nbclust(dCov, FUNcluster = kmeans, k.max = 10, method = "wss") +
theme(axis.text=element_text(size=9))
k.Within$labels$title = "Metode Elbow"
k.Within$labels$y = "JK Intra Klaster"
k.Within$labels$x = "Jumlah Klaster"

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"

k.Gap = fviz_nbclust(dCov, FUNcluster = kmeans, k.max = 10, method = "gap_stat") +


theme(axis.text=element_text(size=9))
k.Gap$labels$title = "Jumlah Klaster (Statistik Gap)"
k.Gap$labels$y = "Nilai Statistik Gap"
k.Gap$labels$x = "Jumlah Klaster"

gridExtra::grid.arrange(k.Within, k.Siluet, k.Gap, nrow=2)

Metode Elbow Metode Silhouette


1.00
JK Intra 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

Jumlah Klaster (Statistik Gap)


Nilai Statistik Gap

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

Bhutan Cyprus Lebanon


Brunei Maldives Saudi Arabia
1 Timor−Leste Hong Kong Israel
Palestine Kyrgyzstan
Singapore cluster
Dim2 (11.5%)

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

## TotCases TotDeath Recovered ActCases Pop


## 9.974660e-18 -4.064403e-17 7.155734e-18 -2.818926e-17 -2.577691e-17
aku$loadings # Menampilkan loading values (korelasi) antara komponen utama dengan atribut asal

##
## 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

## eigenvalue variance.percent cumulative.variance.percent


## Dim.1 3.77453252 77.063372 77.06337
## Dim.2 0.56083442 11.450369 88.51374
## Dim.3 0.48102053 9.820836 98.33458
## Dim.4 0.08157172 1.665423 100.00000
## Dim.5 0.00000000 0.000000 100.00000
Sebelum klaster terbentuk diinterpretasikan, kita akan melihat ‘keakurasian’ dari klasterisasi yang dilakukan.
Ingatlah akurasi klaster bisa diketahui dengan menghitung rasio dari jumlah kuadrat antarklaster dengan
jumlah kuadrat total (lihat persamaan 1 di halaman 8). Menggunakan persamaan 1 bisa dihitung akurasi
untuk 3 dan 4 klaster, sebagai berikut:
Akurasi3 = (k3$betweenss/k3$totss)*100
Akurasi4 = (k4$betweenss/k4$totss)*100
Akurasi3

## [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

View publication stats

Anda mungkin juga menyukai