Clustering

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.

K-Means Clustering

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.

Loading Package

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

Data Preparation

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

Mencari k Optimal

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.

Cluster K-Means dengan K optimal

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