Algoritma k-Means

Oktaviyani Nurrohmah

2023-01-19

Analisis Klaster

Analisis klaster adalah salah satu metode statistik yang bertujuan untuk memisahkan objek ke dalam beberapa klaster (kelompok data) yang mempunyai sifat:

  • Objek memiliki karakteristik yang serupa dalam satu klaster
  • Objek memiliki karakteristik berbeda antar klaster

K-Means

K-Means merupakan salah satu metode pengelompokan data nonhierarki (sekatan) yang berusaha mempartisi data yang ada ke dalam bentuk dua atau lebih kelompok. Metode ini mempartisi data ke dalam kelompok sehingga data berkarakteristik sama dimasukkan ke dalam satu kelompok yang sama dan data berkarakteristik berbeda dikelomokkan ke dalam kelompok yang lain.

Load Library

library(cluster)    # Algoritma klastering
library(factoextra) # Algoritma klastering dan visualisasi
library(ggplot2)

Data Preparation

Untuk melakukan analisis klaster dengan R, biasanya kriteria data yang harus dipersiapkan adalah sebagai berikut:

  • Row atau baris sebagai nilai observasi, dan coloumn tau kolom sebagai variabel.
  • Hilangkan missing pada data(jika ada data missing).
  • karena data yang digunakan memiliki satuan dan rentang yang berbeda maka perlu dilakukan standarisasi data terlebih dahulu.

Input Data

Nah kali ini akan digunakan data Iris yang berisi data observasi 3 spesies anggrek dengan jumlah observasi tiap spesiesnya sebanyak 50 observasi.

dataclus <- iris[-5]
str(dataclus)
## 'data.frame':    150 obs. of  4 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
head(dataclus)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4

Hilangkan Data Missing

dataclus1 <- na.omit(dataclus)
summary(dataclus1)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

Standarisasi Data

Data harus di standarisasi supaya satuan tiap variabel sama. Ketika nanti dilakukan profilisasi tiap klasternya data dikembalikan ke satuan semula.

datafix <- scale(dataclus1)

Mencari K Optimal Klaster

Pada K-means ini ada pertimbangan untuk dapat menentukan banyak k kelompok yang paling optimal. Ada metode pendekatan yang paling populer digunakan untuk membantu menentukan banyak K optimal diantaranya adalah

  • Metode Elbow
  • Metode Silhoette

Metode Elbow

library(ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_nbclust(datafix, kmeans, method = "wss")

Metode elbow menggunakan nilai total wss (whitin sum square) sebagai penentu k optimalnya. Dari gambar di atas, garis mengalami patahan yang membentuk elbow atau siku pada saat k=2. Maka dengan menggunakan metode ini diperoleh k optimal pada saat berada di k=2. untuk menjadi pembanding, dilakukan uji lainnya.

Metode Silhouette

Pendekatan rata-rata nilai metode *silhoutte untuk menduga kualitas dari klaster yang terbentuk.semakin tinggi nilai rata-ratanya maka akan semakin baik.

fviz_nbclust(datafix, kmeans, method = "silhouette")

Berdasarkan hasil data diatas diperoleh banyak klaster optimal yang terbentuk pada k=2. dedangkan opsi keduanya pada k=4. Karena nilai rata-rata *silhoutte pada k=2 dan k=4 merupakan yang tertinggi dari yang lain.

Analisis Klaster

Analisis klaster di R dapat dilakukan dengan fungsi kmeans() dan menggunakan data yang telah distandardisasi.Dalam fungsi kmeans() terdapat parameter nstart yang digunakan untuk memberitahu fungsi berapa kali inisiasi awal yang pengguna inginkan.

final <- kmeans(datafix, 2, nstart = 25)
print(final)
## K-means clustering with 2 clusters of sizes 50, 100
## 
## Cluster means:
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1   -1.0111914   0.8504137    -1.300630  -1.2507035
## 2    0.5055957  -0.4252069     0.650315   0.6253518
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   1   1   1   1   1   1   1   1   1   1   2   2   2   2   2   2   2   2   2   2 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 141 142 143 144 145 146 147 148 149 150 
##   2   2   2   2   2   2   2   2   2   2 
## 
## Within cluster sum of squares by cluster:
## [1]  47.35062 173.52867
##  (between_SS / total_SS =  62.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Output dari fungsi kmeans() terdiri atas beberapa informasi sebagai berikut :

  • cluster : vector yang berisikan lokasi klaster tiap objek.
  • centers : matriks yang berisikan centroid/rata-rata nilai tiap klaster.
  • withinss: vektor yang berisikan simpangan tiap klaster yang terbentuk.
  • tot.withinss : total dari simpangan tiap klaster yang terbentuk. Biasa digunakan untuk membuat Elbow Plot guna mengetahui banyak klaster yang sebaiknya dipilih.
  • size : jumlah objek pada tiap klaster.

Menentukan nilai Centroid akhir K-Means untuk melihat karakteristik data

aggregate(datafix, by=list(cluster=final$cluster), mean)
##   cluster Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1       1   -1.0111914   0.8504137    -1.300630  -1.2507035
## 2       2    0.5055957  -0.4252069     0.650315   0.6253518

Menggabungkan hasil cluster algoritma K-Means dengan data

dd <- cbind(datafix, cluster =final$cluster)
head(dd)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width cluster
## 1   -0.8976739  1.01560199    -1.335752   -1.311052       1
## 2   -1.1392005 -0.13153881    -1.335752   -1.311052       1
## 3   -1.3807271  0.32731751    -1.392399   -1.311052       1
## 4   -1.5014904  0.09788935    -1.279104   -1.311052       1
## 5   -1.0184372  1.24503015    -1.335752   -1.311052       1
## 6   -0.5353840  1.93331463    -1.165809   -1.048667       1

Melihat hasil cluster akhir pada

final$cluster
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   1   1   1   1   1   1   1   1   1   1   2   2   2   2   2   2   2   2   2   2 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
## 141 142 143 144 145 146 147 148 149 150 
##   2   2   2   2   2   2   2   2   2   2

Membuat plot hasil cluster

final$centers
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1   -1.0111914   0.8504137    -1.300630  -1.2507035
## 2    0.5055957  -0.4252069     0.650315   0.6253518
fviz_cluster(final, data = datafix)