Monday, April 21, 2014

Transformasi Box Cox Univariate Menggunakan R


Assalamu'alaikum , salam sejahtera , dan cepat wisuda!
Kali ini kita akan bahas tentang sesuatu yang agak serius, yaitu transformasi data. Kenapa mesti dilakukan transformasi data?, kita tahu dalam statistik itu ada dua mahzab, yaitu mahzab parametrik dan mahzab nonparametrik. Dalam statistik parametrik, data yang akan dianalisis harus berdistribusi normal, jika tidak normal maka pakailah statistik nonparametrik.

Bagaimana kalau data kita tidak normal tetapi kita tetap ingin melakukan analisis parametrik?, caranya dengan melakukan transformasi agar data tersebut menjadi lebih "terlihat normal". Pada postingan ini kita akan membahas prakteknya menggunakan R, dan teknik transformasinya adalah memakai Transformasi BoxCox. 

Kenapa kita bahas Transformasi BoxCox? bukan yang lain?, karena transformasi BoxCox lebih mudah dilakukan tanpa kita perlu repot-repot melakukan trial and error untuk mencari nilai lambda yang sesuai (lambda itu apa?). Oke daripada tambah pusing membahas teori mari kita langsung ke TKP.

Sebelumnya saya asumsikan (seorang statistisi itu penuh asumsi) :
  1. Pembaca sudah paham mengenai transformasi boxcox, jadi saya tidak akan bahas teorinya secara detail.
  2. Sudah memahami fungsi-fungsi dasar R, seperti menyimpan variabel, meload data, menginstall package R, dll. 
Package-package yang dibutuhkan adalah:
  1. Package car, 
  2. Package MASS
Kalau package diatas belum terinstall, install dengan command install.packages("nama package"), perlu koneksi internet untuk mendownload packages.

Pertama kita buka GUI R kesayangan anda, kalau saya memakai RStudio, mengenai GUI lainnya dapat dilihat di post sebelumnya mengenai R.
Tampilan GUI Rstudio
Untuk simulasi, kita akan gunakan data radiasi oven yang diambil dari buku Applied Multivariate Statistical Analysis (Richard A. Johson dan W. Wichern), datanya bisa di download di SINI !. data ini terdiri dari 42 sampel mengenai tingkat radiasi oven pada pintu tertutup dan terbuka.

Load datanya ke R menggunakan fungsi read.csv(file.choose(), header = TRUE), akan muncul jendela untuk memilih file, pilih file yang anda download tadi. filenya ini akan saya simpan ke variabel dengan nama data.






Kita tertarik untuk menguji apakah data radiasi pintu tertutup normal atau tidak, maka harus kita uji terlebih dahulu. Terdapat banyak cara untuk menguji kenormalan, baik itu : uji kolmogorov smirnov,shapiro wilk, atau dengan menggunakan Q - Q plot, kita akan bahas dengan menggunakan Q - Q plot karena paling mudah.

Untuk membuat Q - Q plot di R sangat mudah, cukup dengan memakai fungsi qqnorm. 

Syntax Q - Q plot di R.
Q - Q plot dari data radiasi pintu tertutup.
Terlihat data tidak berdistribusi normal, dan terdapat outlier. Untuk itu, kita akan melakukan transformasi boxcox pada data ini agar data menjadi lebih normal. Pertama kita plot dulu pasangan lambda dan l(lambda) untuk mencari nilai yang memaksimal fungsi l(lambda)  . Di R sangat mudah dilakukan dengan menggunakan fungsi boxcox dari package MASS. 

Syntax boxcox di R.
Plot dari l(lambda) dan lambda 
Kemudian untuk mencari nilai dari lambda juga sangat mudah, menggunakan fungsi powerTransform dari package car.

Nilai l(lambda) dari fungsi power transfrom
Nilai yang didapat sangat akurat, nilai yang tertulis di buku adalah  = 0.28, dan dengan menggunakan R didapat nilai  = 0.2759394.

            Selanjutnya setelah didapat nilai  maksimum, maka kita lakukan transformasi boxcox, menggunakan fungsi bcPower dari package car. 

Data radiasi (pintu tertutup) setelah ditranformasi.
Selanjutnya, mari kita lihat apakah data kita telah normal setelah di transformasikan, kembali kita pakai fungsi qqnorm.
Q-Q plot dari data radiasi (pintu tertutup) setelah ditransformasi
Terlihat bahwa data telah mendekati distribusi normal, berarti kita telah berhasil melakukan transformasi data mendekati normal menggunakn trasnformasi boxcox di R. 

Tapi jangan senang dan berbangga diri dulu, ini baru transformasi untuk data univariate, belum untuk data multivariate, membayangkannya saja sudah bikin anda ingin berhenti belajar statistik dan segera wisuda untuk segera menikah. Tapi jangan, statistik itu sangat menarik, menurut data dari link ini, dengan tingkat kepeceryaan yang tidak disebutkan, rata-rata gaji seorang statistisi itu lebih besar 56% dari gaji seluruh pekerjaan yang di post di  seluruh dunia. 

Kembali ke pokok permasalahan, mungkin masih banyak sekali yang saya belum jelaskan pada post kali ini, selanjutnya saya akan posting mengenai transformasi boxcox pada data multivariate. 
Salam Statistisi dan cepat wisuda! 


9 comments:

  1. Assalamualaikum.wr.wb. maap mas saya mau nanyakan serta meminta saran, begini mas yang saya tahu tidak ada jaminan bila tasformasi bisa memperbaiki akurasi peramalan, cuma saya belum mendapatkan sumber/referensinya mas, kira2 saya bisa mendapatkan referensinya dimana ya mas? Terima kasih atas bantuannya mas.

    ReplyDelete
  2. Kak pas aku ngejalanin kodingan diatas kok tulisannya response variable must be positive? Salah dimana ya kak?

    ReplyDelete
  3. kak, ditunggu untuk data multivariat nyaa kak. semangat kak!

    ReplyDelete
  4. pada saat menjalankan perintah "boxcox....." yang tampil begini = "Error in boxcox.default(data$Return ~ 1) :
    response variable must be positive" itu maksudnya bagaimana yah? mohon sarannya. apa harus nilainya negatif? bagaimana jika data yang ada nilai negatifnya

    ReplyDelete
  5. apa datanya harus positif? bagaimana jika datanya ada nilai negatif?

    ReplyDelete
  6. This comment has been removed by the author.

    ReplyDelete
  7. Kak saya mau tanya, data saya simulasi tapi saat di tampilkan data data semua tidak ada yang bernilai negatif maupun 0, tapi kenapa ketika di perintahkan untuk melakukan boxcox selalu error "respont variable must be positif" apakah ada salah dari perintah saya? Script yang saya ginuakan sama dengan yang kakak kasih tau kak. Terimakasih

    ReplyDelete
    Replies
    1. Izin kak sama dengan punya saya. Kalau boleh tau bagaimana ya ini cara mengatasinya? Terimakasih

      Delete