Memahami dasar SOM dari library(kohonen) [Part II]

Seperti contoh dalam Part I, kali ini akan diberikan contoh sederhana bagaimana jika terdapat empat object ABCD hendak dikelompokkan dalam dua kelompok saja.

Langkah pertama adalah kita memanggil package kohonen, dimana package ini mempersyaratkan package ‘class’ dan ‘MASS’ sudah dipanggil terlebih dahulu.

library(class)
library(MASS)
library(kohonen)

Dalam contoh ini sama seperti pada Part I, kita ambil data dalam folder ‘SOM’ di drive D dengan nama file ‘datasom.csv’ (dengan format csv). Setiap lokasi pemanggilan data akan berbeda sesuai dengan keinginan kita sendiri dalam memanggilnya.

Setelah itu kita panggil sesuai dengan command berikut,

datasom2<-read.csv("D://SOM/datasom.csv")

kita berikan nama yang sama di dalam R yakni ‘datasom2’. Kemudian kita panggil data tersebut,

datasom2
##   Name Value1  Value2
## 1    A 237890 0.00212
## 2    B 123098 0.00032
## 3    C 228900 0.07651
## 4    D  94521 0.01234

Sama seperti pada contoh sebelumnya, variabel Name pada kasus ini kita sembunyikan terlebih dahulu,

datasomlatih2<-datasom2[,c(2,3)]
datasomlatih2
##   Value1  Value2
## 1 237890 0.00212
## 2 123098 0.00032
## 3 228900 0.07651
## 4  94521 0.01234

kemudian nilai-nilai pada variabel tersebut kita buat dalam rentang yang berdekatan

datasomlatihan<-scale(datasomlatih2)
datasomlatihan
##          Value1     Value2
## [1,]  0.9153795 -0.5721932
## [2,] -0.6579366 -0.6219431
## [3,]  0.7921644  1.4838604
## [4,] -1.0496073 -0.2897242
## attr(,"scaled:center")
##       Value1       Value2 
## 1.711023e+05 2.282250e-02 
## attr(,"scaled:scale")
##       Value1       Value2 
## 7.296181e+04 3.618096e-02

kemudian kita buatkan terlebih dahulu tempat untuk meletakkan masing-masing object itu nantinya,

griddatasom2<-somgrid(xdim=2,ydim=1,topo="hexagonal")

kita buat xdim=2 dan ydim=1 sehingga hanya terdapat 2x1 = 2 lingkaran.

mapdatasom2<-som(datasomlatihan,grid=griddatasom2)
mapdatasom2
## som map of size 2x1 with a hexagonal topology.
## Training data included.

untuk mendapatkan informasi lebih lengkap tentang mapdatasom2, maka dapat kita gunakan perintah seperti berikut,

str(mapdatasom2)
## List of 10
##  $ data        : num [1:4, 1:2] 0.915 -0.658 0.792 -1.05 -0.572 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:2] "Value1" "Value2"
##   ..- attr(*, "scaled:center")= Named num [1:2] 1.71e+05 2.28e-02
##   .. ..- attr(*, "names")= chr [1:2] "Value1" "Value2"
##   ..- attr(*, "scaled:scale")= Named num [1:2] 7.30e+04 3.62e-02
##   .. ..- attr(*, "names")= chr [1:2] "Value1" "Value2"
##  $ grid        :List of 5
##   ..$ pts   : num [1:2, 1:2] 1.5 2.5 0.866 0.866
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : NULL
##   .. .. ..$ : chr [1:2] "x" "y"
##   ..$ xdim  : num 2
##   ..$ ydim  : num 1
##   ..$ topo  : chr "hexagonal"
##   ..$ n.hood: chr "circular"
##   ..- attr(*, "class")= chr "somgrid"
##  $ codes       : num [1:2, 1:2] -0.857 0.856 -0.452 0.417
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:2] "Value1" "Value2"
##  $ changes     : num [1:100, 1] 0.504 0.335 0.454 0.324 0.308 ...
##  $ alpha       : num [1:2] 0.05 0.01
##  $ radius      : num [1:2] 1 -1
##  $ toroidal    : logi FALSE
##  $ unit.classif: int [1:4] 2 1 2 1
##  $ distances   : num [1:4] 0.9827 0.0685 1.1416 0.0634
##  $ method      : chr "som"
##  - attr(*, "class")= chr "kohonen"

kita coba untuk memvisualkan,

plot(mapdatasom2,type="mapping")

Jika ingin mengetahui dititik manakah letak masing-masing pusat lingkaran pada plot diatas? maka dapat kita gunakan perintah berikut,

mapdatasom2$grid$pts
##        x         y
## [1,] 1.5 0.8660254
## [2,] 2.5 0.8660254

kemudian dimanakah letak masing-masing object didalam lingkaran tersebut? bisa kita lihat melalui informasi “$unit.classif”" yang bisa kita panggil seperti berikut,

mapdatasom2$unit.classif
## [1] 2 1 2 1

urutan hasil itulah sesuai dengan urutan dari object-object yang kita miliki secara terurut pula, yakni

object A masuk dalam kelompok 1 pada lingkaran 1 object B masuk dalam kelompok 2 pada lingkaran 2 object C masuk dalam kelompok 1 pada lingkaran 1 object D masuk dalam kelompok 2 pada lingkaran 2

plot(mapdatasom2)

kita juga bisa melihat kelompok untuk masing-masing object dengan cara kita plot kembali visualisasi diatas

plot(mapdatasom2)
text(mapdatasom2$grid$pts,labels=mapdatasom2$unit.classif, cex=2)

sehingga dapat kita simpulkan,

mapdatasom2$unit.classif
## [1] 2 1 2 1
datasom2$Name
## [1] A B C D
## Levels: A B C D

Dari kedua urutan diatas dapat dibaca, object A masuk dalam kelompok 2 object B masuk dalam kelompok 1 object C masuk dalam kelompok 2 object D masuk dalam kelompok 1

Jadi, bahwa Kelompok Pertama terdiri dari object A dan C, dan Kelompok Kedua terdiri dari object B dan D.

hal ini juga sesuai dengan plot awal dari datanya,

plot(datasomlatih2,cex=0.01)
text(datasomlatih2,labels=datasom2$Name,cex=1)

object B dan D berdekatan secara jarak, begitu pula dengan object A dan C.

Untuk pembahasan lebih lanjut tentang SOM dan bagaimana prediksi terhadap object baru untuk kelompok yang telah terbentuk dari data latih. Tunggu bagian berikutnya :)

Semoga bermanfaat :)

Salam,

RB Fajriya Hakim, email = hakimf@uii.ac.id

Dept of Statistics, Universitas Islam Indonesia