Mengenal Data Secara Visual dengan PCA

Sebelum melakukan proses data untuk pembelajaran pada Machine Learning atau mungkin sebagian orang menyebutnya Data Mining. Maka terlebih dahulu perlu dilakukan pengenalan lebih lanjut terdahap data data tersebut.

 

{Statistik}

Pengenalan data dapat dilakukan secara statistik dengan melihat modus, mean, median atau mengambarnya dalam suatu distribusi.  Sebagai contoh, dengan menggunakan fungsi summary() pada R maka akan didapat rangkuman data seperti berikut.  Dengan perintah tersebut dapat dilihat distribusi dataset iris.

summary(iris)

 

blog01

Dan jika ingin melihat rangkuman data tersebut dalam bentuk grafik dengan memanfaatkan fungsi boxplot() dengan perintah seperti berikut ini.

boxplot(Sepal.Length ~ Species, data = iris, main = "Box Plot", xlab = "Species", ylab = "Sepal Length")

 

Maka akan dihasilkan grafik seperti berikut.

blog02

Dari gambar ini dapat dilihat mean dari data masing-masing class (garis horizontal tebal berwarna hitam), Q1 dan Q3. Dengan grafik ini juga dapat juga diketahui outlier pada data. Box plot juga merupakan versi lain dari grafik distribusi seperti yang dijelaskan oleh gambar di bawah ini.

blog03

Dari kedua gambar di atas, kita dapat melihat di sisi mana instance banyak berkumpul dan berdesak-desakan 🙂

 

{Data Space}

Selain mengenali data seperti cara di atas, sering kali dilakukan melihat posisi instance-instance pada data space.  Hal ini kadang digunakan untuk melihat karakteristik dari data sehingga jika ingin melakukan klasifikasi atau clustering dapat ditentukan metode atau algoritma yang cocok.

Apa sih maksudnya “instance-instance pada data space”? Misal yang menjadi data space adalah stadion sepak bola dan akan dilakukan klasifikasi manusia di dalam stadion itu berdasarkan perannya. Manusia-manusia di dalam stadion adalah instance-instance. Sedangkan peran manusia tersebut adalah class label. Maka peran (class label) manusia (instance) di dalam stadion (data space) dapat menjadi seperti berikut ini:

  1. Penonton.
  2. Pemain bola.
  3. Pemain bola cadangan dan pelatih.
  4. Staf kesehatan.
  5. Wartawan.

Dengan melihat stadion bola berikut ini, maka kita bisa menentukan posisi setiap instance-instance sesuai class labelnya pada data space.

blog04

Pada kasus ini, kita sudah bisa menebak posisi setiap instance sesuai dengan class labelnya. Bagaimana dengan kasus yang lain, misalnya klasifikasi manusia berdasarkan perannya di lapangan upacara ini.

blog05

Jika dibandingkan kedua kasus di atas (domain permasalahan), maka sudah bisa dipastikan ada perbedaan posisi setiap instance-instance di kedua kasus tersebut.  Ini menandakan instance-instance pada data space akan berbeda penyebarannya tergantung kasus atau domain masalahnya.  Jadi ada kemungkinan beda domain masalah maka posisi instance-instancenya akan berbeda penyebarannya pada data space. Bahkan pada domain masalah yang sama pun kemungkinan posisi instance-instancenya akan berbeda juga.

Dengan mengetahui informasi tersebut maka kemungkinan kita dapat menentukan strategi yang digunakan untuk menyelesaikan masalah tersebut.  Sebagai contoh untuk kasus klasifikasi, maka kita dapat menentukan metode atau algoritma yang cocok.

Jika kita memiliki data yang hanya terdiri atas 2 feature dan 1 class label, atau 3 feature dan 1 class label tentunya sangat mudah untuk menggambarkannya pada data space. Karena dapat digambarkan dalam gambar 2 dimensi atau 3 dimensi.

Sebagai contoh dimiliki data dengan 2 feature dan 1 class label seperti berikut:

size <- 20             
set.seed(1) 
x <- runif(size)       
y <-runif(size) 
class_label = c("A", "B", "C", "C", "D", "A", "A", "A", "B", "C","A", "B", "C", "C", "D", "A", "A", "A", "B", "C")
df <-data.frame(x,y, class_label)

 

Maka akan dihasilkan data seperti berikut ini.

blog06

Dan untuk melihat posisi setiap instance pada data space maka dapat digunakan fungsi plot() seperti pada contoh berikut ini.

plot(df$x, df$y, col=as.numeric(df$class_label), pch = 16)

 

Atau dengan menggunakan kode berikut:

plot(df[,1:2], col = as.numeric(df$class_label), pch = 16)

 

Dan akan dihasilkan gambar seperti berikut.

blog07

Sedangkan jika data yang dimiliki memiliki 3 feature dan 1 class label seperti data yang dihasilkan dari kode berikut ini:

size <- 20
set.seed(1)
x <- runif(size)
y <- runif(size)
z <- runif(size)
class_label = c("A", "B", "C", "C", "D", "A", "A", "A", "B", "C", "A", "B", "C", "C", "D", "A", "A", "A", "B", "C")
df <- data.frame(x, y, z, class_label)

 

Sehingga dihasilkan data seperti berikut ini.

blog08

Untuk mengambar data tersebut maka bisa digunakan fungsi plot3d() dari package rgl.  Jika package rgl belum tersedia pada sistem maka dapat dilakukan installasi package dengan perintah berikut.

install.package("rgl")

 

Jika sudah terinstall maka dapat digunakan perintah berikut ini untuk mengambar scatter plot secara 3D dengan menggunakan fungsi plot3d()

plot3d(df[,1:3], col=as.numeric(df$class_label))

 

Dan berikut ini adalah hasil dari fungsi tersebut.  Grafik yang dihasil dapat digerakan ke berbagai arah agar memudahkan untuk melihat instance-instance pada data space dalam berbagai sudut.  Selain itu juga dapat dilakukan zoom in dan zoom out.

blog09

Bagaimana dengan data yang memiliki banyak feature? Karena data pada dunia nyata sangat beragam. Pada lingkungan R telah tersedia dataset dunia nyata yang dapat langsung digunakan, seperti:

  • Iris, Edgar Anderson’s Iris Data.
  • AirPassengers, The classic Box & Jenkins airline data. Monthly totals of international airline passengers, 1949 to 1960..
  • mtcars, Motor Trend Car Road Tests.
  • Titanic, Survival of passengers on the Titanic.
  • dan lain-lain, untuk lebih lengkapnya dapat melihat daftarnya di sini https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html.

Selain jumlah featurenya beragam, juga tipe setiap type data dari feature juga beragam, tidak hanya berisi data numerik tetapi juga dapat berisi data nominal.  Tetapi pada posting ini hanya akan berfokus pada pembahasan feature dengan tipe data numerik.  Sebagai informasi, jumlah feature untuk data biologi dapat berjumlah ratusan, ribuan bahkan puluhan ribu.  Hal ini perlu dilakukan pensiasatan untukk menggambar posisi instance pada data space.

Salah satu strategi yang dapat digunakan adalah memanfaatkan PCA atau Principal Component Analysis. Secara singkat PCA adalah sebuah teknik untuk menyederhanakan suatu data, sehingga sering kali teknik ini digunakan untuk mereduksi dimensi/feature suatu data tanpa mengurangi karakteristik data tersebut secara signifikan.

 

{Principal Component Analysis}

Dalam praktiknya, saya sering menggunakan PCA untuk menggambarkan posisi instance pada dataspace sehingga mempunyai gambaran tentang kompleksitas data yang sedang saya hadapi.  Pada posting akan ditulis langkah-langkah untuk menggunakan teknik PCA pada lingkungan R dengan menggunakan R Tools for Visual Studio. Dan PCA hanya akan digunakan untuk mengambar posisi instance-instance dari data pada data space.

Fungsi PCA yang dapat digunakan pada lingkungan R adalah prcomp(). Berikut adalah contoh sederhana yang dapat dicoba:

iris_pca = princomp(iris[, 1:4], cor = TRUE, scores = TRUE)
biplot(iris_pca)

 

Dan berikut adalah grafik dari hasil kode di atas.

blog10

Untuk mendapatkan gambar yang lebih bagus, dapat dipergunakan fungsi autoplot() dari package “ggfortify”. Untuk menginstall package “ggfortify” dapat dilakukan dengan fungsi install.package() seperti berikut ini.

install.packages("ggfortify")

 

Kemudian untuk mengambar grafik di atas dapat digunakan kode seperti berikut ini.

library(ggfortify)
autoplot(prcomp(iris[, 1:4]), data = iris, colour = 'Species', label = FALSE)

 

Dan berikut adalah hasil dari kode di atas, karena ada perbedaan warna maka dapat terlihat dengan jelas bagaimana posisi setiap instance berdasarkan class labelnya.

blog15

Sedangkan jika ingin menggambar secara 3D maka tetap diperlukan hanya 3 input saja, oleh karena itu kita bisa memanfaatkan output score dari hasil perhitungan PCA.  Untuk melihat output score dari perhitungan tersebut dapat menggunakan perintah seperti berikut.

blog11

Dari gambar di atas terdapat 4 kolom (sesuai dengan jumlah kolom feature dari data original) dan 150 row (sesuai dengan jumlah record dari data original). Kalau diperhatikan dengan nilai di atas dengan nilai dari data iris di bawah ini maka dapat dilihat perbedaannya.

blog12

Output score di atas merupakan hasil perhitungan kombinasi bentuk linear. Sehingga jika ingin menggambar plot 2D maka dapat digunakan kolom 1 & 2 saja, atau jika ingin menggambar plot 3D dapat digunakan kolom 1, 2 dan 3 seperti contoh kode di bawah ini.

library(rgl)
plot3d(iris_pca$scores[, 1:3], col = as.numeric(iris$Species))

 

Dan berikut adalah hasilnya. Dari gambar di bawah ini dapat dilihat jika sebaran instance-instance per class label sangat baik, karena setiap class label berkumpul berdekatan antar sesama instance dengan class label yang sama. Dengan melihat informasi seperti ini, sepertinya metode atau algoritma konvensional klasifikasi (jika ingin melakukan klasifikasi) atau clustering (jika ingin melakukan clustering) dapat dengan mudah menyelesaikan masalah dengan data iris ini.

blog13

Data yang lain yang akan digunakan adalah dataset Abalone yang dapat diperoleh pada UCI Repository dengan link berikut https://archive.ics.uci.edu/ml/datasets/Abalone. Dengan menggunakan fungsi read.cvs() untuk membaca isi data file abalone.data, seperti contoh berikut.

abalone = read.csv("abalone.data", header = FALSE)
head(abalone)
summary(abalone)
boxplot(abalone)

 

Maka dapat dilihat hasil seperti berikut.

blog14

Dan berikut ini adalah grafik posisi instance-instance hasil proses PCA dengan perintah:

autoplot(prcomp(abalone[, 2:8]), data = abalone, colour = 'V9', label = FALSE)

 

blog16

Dan untuk grafik 3D digunakan perintah berikut ini.

abalone_pca = princomp(abalone[,2:8], cor = TRUE, scores = TRUE)
plot3d(abalone_pca$scores[, 1:3], col = as.numeric(abalone$V9))

 

Dan berikut adalah grafik plot yang dihasilkan.

blog17

Dari informasi tersebut, maka kemungkinan metode atau algoritma klasifikasi sederhana tidak bisa langsung digunakan, harus dilakukan prepocessing data terlebih dahulu, atau perlu digunakan teknik classifikasi yang lebih rumit (yang akan dibahas pada posting selanjutnya).

 

{Kesimpulan}

Jadi dengan mengetahui lebih detail data yang akan ditangani akan membuat kita lebih siap dalam memilih teknik atau metode yang digunakan untuk menyelesaikan masalah.

Leave a Comment

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *