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

Self Organizing Map (SOM) merupakan suatu metode pengelompokan cemerlang yang ditemukan oleh Teuvo kohonen. Konsep utamanya adalah bagaimana menempatkan data kompleks ke dalam suatu penyajian atau visualisasi kertas datar (dua dimensi). Berikut contoh sederhana untuk memahami SOM melalui data yang kecil dengan maksud agar nantinya dapat dikembangkan sendiri untuk data yang besar. Teori dan perhitungan dapat dilihat dari berbagai sumber yang lain.

Misalkan dipunyai data seperti berikut

No Name Value1 Value2

1 A 237890 0.00212

2 B 123098 0.00032

3 C 228900 0.07651

4 D 94521 0.01234

Dipunyai 4 buah object ABCD dengan nilai yang bervariasi. Nilai pada ‘Value1’ berkisar antara puluhan ribu sampai raturan ribu, sementara nilai pada ‘Value2’ sangat kecil. Dua buah variabel berupa ‘Value1’ dan ‘Value2’ seolah-olah mempunyai dimensi yang sangat berjauhan. Bagaimana cara mengelompokkan object-object tersebut?

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)

kemudian ketikkan data tersebut ke dalam Microsoft Excell dan disimpan file tersebut sesuai keinginan anda. Dalam contoh ini, kita simpan dalam folder ‘SOM’ di drive D dengan nama file ‘datasom.csv’ (kita simpan dengan format csv). Setiap lokasi penyimpanan akan berbeda sesuai dengan keinginan kita sendiri dalam menyimpannya.

Setelah itu kita panggil sesuai dengan command berikut,

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

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

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

tanpa menghilangkan urutan, variabel “Name” dalam kasus ini akan kita sembunyikan terlebih dahulu.

datasomlatih<-datasom[,c(2,3)]

kemudian kita panggil kembali data tersebut

datasomlatih
##   Value1  Value2
## 1 237890 0.00212
## 2 123098 0.00032
## 3 228900 0.07651
## 4  94521 0.01234

kemudian kita visualisasi dari object-object tersebut,

plot(datasomlatih,cex=0.01)
text(datasomlatih,labels=datasom$Name,cex=1)

nampak dari gambar diatas nilai sumbu X dan sumbu Y berada pada rentang yang sangat berbeda. Sehingga nilai-nilai tersebut dapat dibuat dalam rentang yang berdekatan

datasomlatih<-scale(datasomlatih)

datasomlatih kita buat dengan nama yang sama, kemudian kita coba untuk plot ulang

plot(datasomlatih,cex=0.01)
text(datasomlatih,labels=datasom$Name,cex=1)

nampak bahwa nilai sumbu X dan sumbu Y dalam rentang yang sama, serta akan memudahkan kita dalam mengelompokkan ke dalam visualisasi SOM.

Sementara itu akan kita siapkan terlebih dahulu ‘tempat’ untuk meletakkan object-object ABCD diatas.

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

pada perintah diatas, kita ingin membuatkan tempat untuk keempat object kita ke dalam empat buah lingkaran (xdim = 2 dikali ydim 2 = 4 lingkaran), kemudian kita lakukan pengelompokan dengan SOM,

mapdatasom<-som(datasomlatih,grid=griddatasom)

kita coba untuk memvisualkan,

plot(mapdatasom,type="mapping")

terlihat ke empat buah lingkaran yang merupakan tempat bagi object-object kita untuk menempatkan dirinya.

yang menarik disini adalah pada perintah

“mapdatasom<-som(datasomlatih, grid=griddatasom)”

apa saja yang dihasilkan oleh perintah ‘som’ didalam nama ‘mapdatasom’ tersebut?

mapdatasom
## som map of size 2x2 with a hexagonal topology.
## Training data included.

maka hanya informasi tersebut yang kita dapatkan, lalu bagaimana kita bisa mengetahui informasi yang lebih lengkap untuk isi dari ‘mapdatasom’?

di dalam R ada perintah yang cukup penting, yakni ‘str’, perintah ini dapat digunakan untuk mengetahui informasi yang lebih detil dari sebuah perintah yang telah selesai dikerjakan.

str(mapdatasom)
## 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:4, 1:2] 1.5 2.5 1 2 0.866 ...
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : NULL
##   .. .. ..$ : chr [1:2] "x" "y"
##   ..$ xdim  : num 2
##   ..$ ydim  : num 2
##   ..$ topo  : chr "hexagonal"
##   ..$ n.hood: chr "circular"
##   ..- attr(*, "class")= chr "somgrid"
##  $ codes       : num [1:4, 1:2] -0.658 0.789 0.91 -1.049 -0.622 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:2] "Value1" "Value2"
##  $ changes     : num [1:100, 1] 0.0269 0.0252 0.0139 0.024 0.025 ...
##  $ alpha       : num [1:2] 0.05 0.01
##  $ radius      : num [1:2] 1 -1
##  $ toroidal    : logi FALSE
##  $ unit.classif: int [1:4] 3 1 2 4
##  $ distances   : num [1:4] 3.22e-05 0.00 3.82e-05 5.01e-07
##  $ method      : chr "som"
##  - attr(*, "class")= chr "kohonen"

nampak ada 10 informasi didalam ‘mapdatasom’ dan didalam setiap informasi tersebut masih ada beberapa didalamnya lagi informasi tambahan. Semisal didalam ‘mapdatasom’ terdapat informasi $data, $grid, $codes, $changes dan seterusnya. Didalam $grid terdapat informasi tambahan lagi berupa $pts, $xdim, $ydim dan seterusnya.

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

mapdatasom$grid$pts
##        x         y
## [1,] 1.5 0.8660254
## [2,] 2.5 0.8660254
## [3,] 1.0 1.7320508
## [4,] 2.0 1.7320508

sehingga lingkaran pertama mempunyai titik (1.5, 0.8660254) dalam sumbu x dan y. begitu pula dengan lingkaran kedua, ketiga dan keempat. Urutan lingkaran dimulai dari pojok kiri bawah terurut seperti dalam diagram kartesian.

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

mapdatasom$unit.classif
## [1] 3 1 2 4

urutan hasil itulah sesuai dengan urutan dari object-object yang kita miliki secara terurut pula, setiap kali kita menjalankan perintah ‘som’ maka hasil yang kita dapatkan bisa berbeda sesuai sifat dasar SOM dimana pengambilan awal perhitungan secara random.

misal setelah kita menggunakan perintah ‘mapdatasom$unit.classif’ adalah

[1] 3 1 2 4

yakni

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

sehingga urutan data yang semula ABCD menjadi BCAD, di dalam visualisasi lingkaran terurut dari satu sampai empat dari pojokk kiri menuju ke pojok kanan dengan nilai di dalam lingkaran mengikuti objectnya,

sehingga

lingkaran 1 berisi object B lingkaran 2 berisi object C lingkaran 3 berisi object A lingkaran 4 berisi object D

jadi sekali lagi, tinggal disesuaikan hasil dari ‘mapdatasom$unit.classif’ dengan urutan object A B C D kita.

Bagaimana cara memvisualkan keempat object tersebut?

plot(mapdatasom)

jika kita lihat kembali data untuk setiap object,

mapdatasom$data
##          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

Terlihat lingkaran pertama yakni object B memiliki nilai yang rendah untuk masing-masing parameternya, lingkaran kedua yakni object C memiliki nilai yang tinggi untuk masing-masing parameternya dan seterusnya.

Lalu bagaimana memastikan object-object tersebut masuk dalam lingkaran?

datasombaru<-datasom
datasombaru$Name<-c("B","C","A","D")

kemudian kita plot kembali visualisasi diatas

plot(mapdatasom)
text(mapdatasom$grid$pts,labels=datasombaru$Name, cex=2)

Dari gambar nampak posisi masing-masing object dalam lingkaran dengan angka yang mewakili kelompoknya (lingkaran 1 merupakan kelompok 3 mewakili object B dst) Lalu bagaimana jika object-object tersebut dikelompokkan ke dalam kelompok yang lebih kecil daripada jumlah objectnya?

Misal, hanya disediakan dua buah lingkaran untuk empat object ABCD?

silahkan masuk dalam [Part 2]

Semoga bermanfaat

Salam

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

Depart. of Statistics, Universitas Islam Indonesia.