Clustering atau yang disebut dengan klastering, merupakan suatu metode untuk mengelompokkan setiap data dengan konsep kedekatan jarak antar tiap datanya, di mana jarak antar cluster sangat tinggi sedangkan jarak dalam cluster sangat dekat. Terdapat 2 tipe clustering; hierarki cluster dan non-hierarki cluster. Hierarki cluster merupakan metode cluster yang memperhitungkan jarak antar datanya, di mana semakin dekat jarak antar data, maka akan dijadikan menjadi satu cluster. dalam hierarki cluster juga terdapat dendogram yang digunakan untuk menentukan banyak cluster yang akan terbentuk.Terdapat beberapa metode cluster yang dapat digunakan dalam hierarki cluster seperti single lingkage, average lingkage, dan complete lingkage. Sedangkan no-hierarki cluster merupakan metode cluster yang memperhitungkan jarak data dengan pusat cluster atau centroid. K-means clustering merupakan salah satu metode cluster yang termasuk dalam hierarki cluster, karena dalam K-Means, pengclusteran dilakukan dengan memperhitungkan jarak antar data dengan centroid.
Seperti yang telah dijelaskan diatas, bahwa K-Means clustering merupakan metode cluster yang memperhitungkan jarak antar data dengan centroid. Centroid dalam masing-masing cluster mulanya akan diberikan secara random, dan dihitung kedekatan jarak antar data dengan masing-masing centroid. Semakin dekat data tersebut dengan centroid salah satu cluster, maka akan menjadi satu cluster dengan centroid tersebut, begitu juga sebaliknya.
Install beberapa package dibawah ini jika belum terinstall, dan jalankan package dengan fungsi library() :
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.0 v purrr 0.2.5
## v tibble 2.0.1 v dplyr 0.7.8
## v tidyr 0.8.2 v stringr 1.3.1
## v readr 1.3.1 v forcats 0.3.0
## -- Conflicts ---------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(cluster)
library(factoextra)
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ
Dalam melakukan analisis cluster, yang perlu disiapkan adalah : 1. Data numerik 2. Row atau baris merupakan nilai dari masing-masing observasi, dan coloumn atau kolom merupakan variabel-variabel 3. Tidak terdapat NA data atau data missing, jika terdapat data missing diatasi terlebih dahulu dengan menggunakan na.omit() atau complete.cases(). 4. Data distandarisasi agar range dari masing-maisng variabel sama
Data yang akan digunakan adalah data landdata-states.csv yang dapat diunduh disini. Data ini berisi informasi nilai tanah dan rumah yang ada di US.
land <- read.csv("C:/Users/Algoritma/Downloads/Latihan UL/landdata-states.csv")
str(land)
## 'data.frame': 7803 obs. of 9 variables:
## $ State : Factor w/ 51 levels "AK","AL","AR",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ region : Factor w/ 4 levels "Midwest","N. East",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ Date : int 20101 20102 20093 20094 20074 20081 20082 20083 20084 20091 ...
## $ Home.Value : int 224952 225511 225820 224994 234590 233714 232999 232164 231039 229395 ...
## $ Structure.Cost : int 160599 160252 163791 161787 155400 157458 160092 162704 164739 165424 ...
## $ Land.Value : int 64352 65259 62029 63207 79190 76256 72906 69460 66299 63971 ...
## $ Land.Share..Pct.: num 28.6 28.9 27.5 28.1 33.8 32.6 31.3 29.9 28.7 27.9 ...
## $ Home.Price.Index: num 1.48 1.48 1.49 1.48 1.54 ...
## $ Land.Price.Index: num 1.55 1.58 1.49 1.52 1.88 ...
head(land)
## State region Date Home.Value Structure.Cost Land.Value Land.Share..Pct.
## 1 AK West 20101 224952 160599 64352 28.6
## 2 AK West 20102 225511 160252 65259 28.9
## 3 AK West 20093 225820 163791 62029 27.5
## 4 AK West 20094 224994 161787 63207 28.1
## 5 AK West 20074 234590 155400 79190 33.8
## 6 AK West 20081 233714 157458 76256 32.6
## Home.Price.Index Land.Price.Index
## 1 1.481 1.552
## 2 1.484 1.576
## 3 1.486 1.494
## 4 1.481 1.524
## 5 1.544 1.885
## 6 1.538 1.817
land <- na.omit(land)
summary(land)
## State region Date Home.Value
## AK : 153 Midwest:1836 Min. :19751 Min. : 18763
## AL : 153 N. East:1377 1st Qu.:19843 1st Qu.: 61684
## AR : 153 South :2448 Median :19941 Median :107429
## AZ : 153 West :1989 Mean :19939 Mean :132268
## CA : 153 3rd Qu.:20033 3rd Qu.:169045
## CO : 153 Max. :20131 Max. :862885
## (Other):6732
## Structure.Cost Land.Value Land.Share..Pct. Home.Price.Index
## Min. : 17825 Min. : 938 Min. : 5.00 Min. :0.1350
## 1st Qu.: 53640 1st Qu.: 4133 1st Qu.: 5.00 1st Qu.:0.4550
## Median : 89001 Median : 9200 Median :10.00 Median :0.7830
## Mean : 99842 Mean : 32426 Mean :17.31 Mean :0.8649
## 3rd Qu.:135458 3rd Qu.: 36846 3rd Qu.:24.80 3rd Qu.:1.2050
## Max. :325595 Max. :594417 Max. :78.40 Max. :2.6150
##
## Land.Price.Index
## Min. : 0.0000
## 1st Qu.: 0.0020
## Median : 0.2385
## Mean : 0.9875
## 3rd Qu.: 1.1438
## Max. :15.4340
##
landfix <- scale(land[,4:9]) #untuk standarisasi data
Dalam menentukan k pada cluster, ada beberapa pendekatan yang dapat digunakan yaitu : 1. Silhouette 2. Elbow 3. Gap Statistic
Pertama, kita akan coba menggunakan metode Elbow terlebih dahulu. Metode ini menggunakan pendekatan nilai within sum of square (wss) sebagai penentu k optimal.
fviz_nbclust(landfix, kmeans, method = "wss")
Berdasarkan grafik diatas, terlihat penurunan paling tajam membentuk elbow atau mementuk siku pada k=2. Sehingga untuk metode elbow diperoleh hasil k optimal 2. Mari kita coba dengan menggunakan metode Silhouette.
fviz_nbclust(landfix, kmeans, method = "silhouette")
Pendekatan silhouette menggunakan rata-rata nilai cluster untuk menduga nilai k optimum. Semakin tinggi nilai rata-ratanya maka akan semakin baik clusternya. Berdasarkan grafik silhouette yang terbentuk, diperoleh banyak cluster optimal seanyak 2. Hasil ini sama dengan penentuan k optimal menggunakan metode elbow. Mari bandingkan lagi menggunakan metode Gap Statistic.
set.seed(123)
gap_stat <- clusGap(landfix, FUN = kmeans, nstart = 25, K.max = 10, B = 123)
fviz_gap_stat(gap_stat)
Nilai B diatas, merupakan banyak sampel yang digunakan. Diperoleh k=2. Sehingga dapat kita simpulkan bahwa k optimal dalam pengclusteran ini adalah sebanyak 2.
hasil <- kmeans(landfix, center = 2, nstart = 25)
hasil$centers
## Home.Value Structure.Cost Land.Value Land.Share..Pct. Home.Price.Index
## 1 1.4031357 1.2584378 1.1590816 1.0095240 1.3217976
## 2 -0.3969629 -0.3560263 -0.3279173 -0.2856057 -0.3739515
## Land.Price.Index
## 1 1.2114879
## 2 -0.3427436
hasil$size
## [1] 1687 5963
hasil$tot.withinss
## [1] 26134.38
Nilai nstart merupakan nilai random set yang akan digunakan. Karena menggunakan random set 25, sehingga terdapat 25 model cluster dan dari 25 model tersebut, kmeans akan menampilkan model optimum menurut mesinnya. Dari hasil cluster tersebut terbentuk cluster 1 sebanyak anggota, cluster 2 sebanyak anggota. untuk merepresentasikan masing-masing cluster, kita dapat menggunakan nilai acuan mean atau standar deviasi dari masing-masing variabel tiap clusternya. Namun sebelumnya, kita harus mengembalikan datanya menggunakan data asli agar lebih memiliki makna.
fviz_cluster(hasil, data = landfix)
library(dplyr)
str(land)
## 'data.frame': 7650 obs. of 9 variables:
## $ State : Factor w/ 51 levels "AK","AL","AR",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ region : Factor w/ 4 levels "Midwest","N. East",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ Date : int 20101 20102 20093 20094 20074 20081 20082 20083 20084 20091 ...
## $ Home.Value : int 224952 225511 225820 224994 234590 233714 232999 232164 231039 229395 ...
## $ Structure.Cost : int 160599 160252 163791 161787 155400 157458 160092 162704 164739 165424 ...
## $ Land.Value : int 64352 65259 62029 63207 79190 76256 72906 69460 66299 63971 ...
## $ Land.Share..Pct.: num 28.6 28.9 27.5 28.1 33.8 32.6 31.3 29.9 28.7 27.9 ...
## $ Home.Price.Index: num 1.48 1.48 1.49 1.48 1.54 ...
## $ Land.Price.Index: num 1.55 1.58 1.49 1.52 1.88 ...
## - attr(*, "na.action")= 'omit' Named int 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 ...
## ..- attr(*, "names")= chr "7651" "7652" "7653" "7654" ...
karakter <- land %>%
mutate(Cluster = hasil$cluster) %>%
group_by(Cluster) %>%
summarise_at(4:9, "sd")
karakter
## # A tibble: 2 x 7
## Cluster Home.Value Structure.Cost Land.Value Land.Share..Pct.
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 113064. 49095. 96065. 17.9
## 2 2 45467. 39653. 15288. 11.8
## # ... with 2 more variables: Home.Price.Index <dbl>,
## # Land.Price.Index <dbl>
Berdasarkan hasil diatas, maka dapat dilakukan profilisasi atau diketahui karakteristik dari tiap cluster yang terbentuk. Pada cluster 1 merupakan cluster yang memiliki Home value, Land value dan Land price index tinggi. Sedangkan pada cluster 2 merupakan cluster yang memiliki karakteristik dari semua variabel rendah.
library(mclust)
## Package 'mclust' version 5.4.2
## Type 'citation("mclust")' for citing this R package in publications.
##
## Attaching package: 'mclust'
## The following object is masked from 'package:purrr':
##
## map
fitM <- Mclust(landfix)
plot(fitM)
Plot diatas menunjukkan persebaran observasi berdasarkan nilai BIC, klasifikasi, uncertainty, dan density dari masing-masing data per variabel.
Sekian dulu postingan untuk clustering saat ini, mohon koreksinya jika terdapat salah-salah, masih sama-sama belajar hehehe⦠Jangan lelah untuk belajar dan semoga sukses teman-teman :)