Memakai Bahasa Pemograman R Untuk Analisa Statistik


Penerapan statistik dapat dijumpai dengan mudah di berbagai bidang ilmu seperti ekonomi, biologi (biostatistik), geologi, psikologi, ilmu komputer, dan sebagainya. Semakin banyak pula karya ilmiah mahasiswa yang kini dilengkapi dengan presentasi hasil analisa statistik. Salah satu tool yang sering dipakai untuk pembelajaran statistik adalah IBM SPSS (Statistical Package for the Social Science). Walaupun user friendly, tool ini tidak gratis dan tidak open source! Salah satu alternatif yang menarik adalah bahasa pemograman R. R adalah sebuah bahasa pemograman yang dikembangkan khusus untuk hal-hal yang berkaitan dengan statistik. Saya merasa R sangat tepat dipakai oleh mahasiswa ilmu komputer karena mereka sudah terbiasa dengan hal-hal teknis seperti kode program.

Bila IBM SPSS memiliki tampilan GUI, R dipakai dengan memberikan perintah atau kode program. Sebenarnya IBM SPSS juga memiliki kemampuan scripting, tetapi terbatas dan tidak secanggih R. Apa kelebihan scripting dibandingkan GUI? Hal yang sering saya jumpai pada saat ‘belajar kelompok’ IBM SPSS adalah mahasiswa yang satu meminta rekannya mendemonstrasikan langkah demi langkah seluruh menu yang di-klik dan textbox yang di-isi untuk memperoleh sebuah hasil. Sebagai informasi, untuk memperoleh sebuah hasil yang berguna, mahasiswa harus melakukan banyak eksperimen dan membuat berbagai grafis untuk di-analisa (semua langkah ini cukup untuk dijadikan satu soal UASπŸ™‚. Langkah-langkah ini terkadang sulit di-reproduksi ulang dengan mudah dan ada kemungkinan langkah yang terlupakan oleh mahasiswa. Bila memakai R, para mahasiswa hanya perlu men-‘copy paste’ kode program untuk memperoleh hasil yang sama. Mereka juga bisa menjalankan kembali kode program R yang sama pada data yang berbeda.

R dapat di-download di http://www.r-project.org/. Selain itu, saya juga dapat men-download versi Revolution R Open di http://revolutionanalytics.com/download-r yang dilengkapi dengan tambahan Intel Math Kernel Library (MKL) yang memberikan peningkatan kinerja terutama di Windows dan juga prosesor non-Intel. Selanjutnya, saya butuh sebuah IDE agar lebih nyaman bekerja dengan R. Untuk itu, saya akan memakai R Studio yang dapat di-download secara gratis di http://www.rstudio.com/products/rstudio/download.

Tampilan awal R Studio akan terlihat seperti pada gambar berikut ini:

Tampilan R Studio

Tampilan R Studio

Salah satu kendala awal dalam beralih ke R yang sering jumpai adalah bagaimana cara memasukkan data? IBM SPSS memiliki worksheet mirip Excel dimana pengguna bisa mengisi nilai untuk setiap variabel. R tidak memiliki kemampuan serupa! Walaupun ada beberapa package tambahan untuk membaca data dari file Excel atau database, cara paling mudah untuk ‘mengisi’ data adalah menggunakan file CSV. Hampir semua aplikasi modern sudah bisa men-export data dalam bentuk CSV. Sebagai contoh, saya bisa men-export isi file Excel menjadi file CSV dengan memilih CSV (Command delimited) di bagian Save as type pada saat menyimpan file. Bila ingin menyimpan hasil query MySQL Workbench menjadi file CSV, saya bisa men-klik tombol Export dan memilih CSV di Save as type.

Setelah itu, saya bisa membaca file CSV dengan memberikan perintah seperti berikut ini:

> penjualan <- read.csv("~/Desktop/penjualan_produk1.csv", header=TRUE)

Untuk melihat isi dari variabel penjualan yang telah dibaca di R Studio, saya dapat men-klik tombol tabel di samping kanan nama variabel seperti yang terlihat pada gambar berikut ini:

Melihat Isi DataFrame

Melihat Isi DataFrame

Selain itu, saya juga dapat melihat preview data dengan menggunakan function head() atau tail() seperti:

> head(penjualan_produk1)
     tanggal qty
1 2014-09-02  20
2 2014-09-03  30
3 2014-09-04 100
4 2014-09-05  10
5 2014-09-06  90
6 2014-09-08  40

penjualan adalah sebuah variabel sama seperti variabel pada bahasa pemograman lainnya. Function read.csv() akan menghasilkan nilai dalam tipe data dataframe. Sebagai informasi, karena R adalah bahasa pemograman khusus untuk pengolahan statistik, ia memiliki beberapa tipe data bawaan yang unik seperti vector, matrix, dan dataframe. Sebuah dataframe mirip seperti matrix tetapi masing-masing kolom boleh memiliki tipe data berbeda. Cara paling gampang untuk memahami dataframe adalah dengan menganggapnya sebagai sebuah sheet Excel dimana masing-masing kolom mewakili nilai sebuah variabel (pada statistik) dalam bentuk vector.

Salah satu masalah yang sering timbul pada saat membaca data adalah permasalahan yang berkaitan dengan tipe data. Seperti apa tipe data setiap kolom di penjualan? Saya dapat melihatnya dengan memberikan perintah berikut ini:

> sapply(penjualan_produk1, class)
  tanggal       qty 
 "factor" "integer" 

factor adalah tipe data di R untuk nilai yang terdiri atas pilihan atau kategori, seperti “iya” atau “tidak”. Pada data yang saya baca, nama konsumen dan nama produk sudah tepat bila dianggap sebagai factor karena nama konsumen atau nama produk adalah variabel kualitatif/kategorikal. Tapi hal yang sama tidak berlaku pada kolom tanggal! Kolom tanggal bukan variabel kualitatif melainkan continuous variable yang harus dibaca dalam bentuk Date. Oleh sebab itu, saya perlu membaca file CSV dengan perintah seperti berikut ini:

> penjualan_produk1 <- read.csv('penjualan_produk1.csv', header=TRUE,
+   colClasses=c('Date', 'integer')
+ )
> sapply(penjualan_produk1,class)
  tanggal       qty 
   "Date" "integer" 

Sebagai latihan, saya akan mencoba membandingkan penjualan produk1 dan produk2. Untuk itu, saya kembali membaca sebuah file CSV baru yang berisi data penjualan untuk produk2 dengan memberikan perintah berikut ini:

> penjualan_produk2 <- read.csv('penjualan_produk2.csv', header=TRUE,
+   colClasses=c('Date', 'integer')
+ )
> head(penjualan_produk2)
     tanggal qty
1 2014-09-02  80
2 2014-09-03  90
3 2014-09-04  90
4 2014-09-05  40
5 2014-09-06  30
6 2014-09-08 150

Langkah berikutnya yang perlu saya lakukan adalah membuat sebuah dataframe baru yang mengkombinasikan kolom qty untuk penjualan produk1 dan kolom qty untuk penjualan produk2. Pada istilah statistik, proses ini disebut sebagai data reshaping. Programmer akan lebih mengenalnya dengan istilah sepeti inner join, left join, aggregation, dan sebagainyaπŸ™‚ Sebagai contoh, saya memberikan perintah berikut ini:

> require(plyr)
Loading required package: plyr
> p <- join(penjualan_produk1, penjualan_produk2, 'tanggal')
> head(p)
     tanggal qty qty
1 2014-09-02  20  80
2 2014-09-03  30  90
3 2014-09-04 100  90
4 2014-09-05  10  40
5 2014-09-06  90  30
6 2014-09-08  40 150

Saya memakai require() untuk membaca package dan menyertakan function yang ada di dalam package tersebut sehingga dapat dipakai. Salah satu kelebihan R adalah jumlah package-nya yang sangat banyak sekali! Pada repository resmi-nya di http://cran.r-project.org/web/packages disebutkan bahwa saat ini terdapat 6.010 package yang tersedia. Pengguna R dapat men-install package dengan perintah install.packages() atau memilih menu Tools, Install Packages… di R Studio. Bila dirasa belum cukup, siapa saja boleh membuat package baru dan mendistribusikannya di situs pribadi bahkan bisa langsung di-download oleh R dari GitHub.com.

Pada perintah di atas, saya memakai join() untuk menggabungkan kolom qty dari dataframe penjualan_produk1 dan penjualan_produk2 berdasarkan tanggal. Hasil penggabungan kemudian disimpan pada sebuah variabel p. Masalah baru yang muncul adalah kini terdapat dua kolom dengan nama yang sama di p, yaitu qty. Untuk mengubah nama kolom, saya memberikan perintah berikut ini:

> names(p) <- c('tanggal', 'qty_produk1', 'qty_produk2')
> head(p)
     tanggal qty_produk1 qty_produk2
1 2014-09-02          20          80
2 2014-09-03          30          90
3 2014-09-04         100          90
4 2014-09-05          10          40
5 2014-09-06          90          30
6 2014-09-08          40         150

Saya bisa melakukan agregasi untuk memperoleh rata-rata dari qty_produk2 per qty_produk1 dengan menggunakan ddply dari package plyr. Sebagai contoh, perintah berikut ini setara dengan SELECT AVG(qty_produk2) FROM p GROUP BY qty_produk1 di SQL:

> p <- ddply(p, ~ qty_produk1, summarize, qty_produk2 = mean(qty_produk2, na.rm=TRUE))
> head(p)
  qty_produk1 qty_produk2
1           5    57.50000
2          10    52.66667
3          16         NaN
4          20    41.66667
5          23         NaN
6          25    20.00000

Sekarang, saya akan mencoba metode klasik di statistik dengan melakukan fitting data di atas ke sebuah persamaan linear Y = B0 * X + B1 (metode ini disebut linear regression). Karena saya memakai komputer, tentu saja saya tidak perlu menghitung nilai koefisien B0 dan B1 secara manual. Saya dapat memperoleh hasil perhitungan cukup dengan menggunakan perintah lm() seperti yang terlihat pada perintah ini:

> fit1 <- lm(qty_produk1 ~ qty_produk2, data = p)
> summary(fit1)

Call:
lm(formula = qty_produk1 ~ qty_produk2, data = p)

Residuals:
    Min      1Q  Median      3Q     Max 
-46.281 -26.616  -8.119  29.186  57.680 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  64.6446    17.4663   3.701  0.00237 **
qty_produk2  -0.2324     0.3221  -0.722  0.48246   
---
Signif. codes:  
0 β€˜***’ 0.001 β€˜**’ 0.01 β€˜*’ 0.05 β€˜.’ 0.1 β€˜ ’ 1

Residual standard error: 35.12 on 14 degrees of freedom
  (6 observations deleted due to missingness)
Multiple R-squared:  0.03585,   Adjusted R-squared:  -0.03301 
F-statistic: 0.5206 on 1 and 14 DF,  p-value: 0.4825

Saya menyimpan hasil dari lm() pada variabel fit1. Setelah itu saya menggunakan summary() untuk menampilkan informasi yang berkaitan dengan hasil fitting tersebut.

Pada perintah lm() di atas, R menghitung nilai coefficients dengan menggunakan metode linear least squares (disebut juga ordinary least squares). Bila persamaan linear adalah Y = B0 * X + B1, maka estimasi nilai B0 adalah -0,2324 dan nilai B1 adalah 64,6446. Ini berarti peningkatan penjualan produk2 akan menyebabkan penurunan penjualan produk1 sebesar 0,2324.

Walaupun demikian, dapat dilihat bahwa nilai B0 memiliki p-value sebesar 0,48246: sebuah nilai yang terlalu besar. Ini menunjukkan bahwa terdapat kemungkinan besar peluang yang mengarah pada null hyphothesis yaitu penjualan produk2 tidak memiliki hubungan dengan penjualan produk1 (hubungan yang terlihat kemungkinan besar hanya kebetulan atau akibat kesalahan). Output dari summary() secara otomatis memberi tanda bintang seperti ***, **, *, dan . pada koefisien yang signifikan secara statistik.

Nilai lainnya yang penting adalah R-squared. Nilai R-squared (disebut juga coefficient of determination) yang semakin mendekati 1 menunjukkan bahwa persamaan linear semakin mendekati data. Pada output summary() di atas, terlihat bahwa persamaan linear hanya mencakup 1% (0.01076) data.

R juga memiliki fasilitas yang mempermudah pengguna dalam menggambarkan grafis. Analisa visual tetap berguna dalam melengkapi analisa numeris. Untuk menggambar grafis, saya bisa menggunakan fungsi bawaan R yaitu plot(). Akan tetapi, pada artikel ini, saya akan memakai function pada package ggplot2 yang perlu di-download secara terpisah. Sebagai contoh, saya dapat menggambarkan nilai p dalam bentuk plot titik dengan menggunakan perintah seperti berikut ini:

> require(ggplot2)
Loading required package: ggplot2
> ggplot(p, aes(x=qty_produk2, y=qty_produk1)) + geom_point()
Hasil plot dengan ggplot()

Hasil plot dengan ggplot()

Saya bisa menambahkan geom_smooth() untuk menampilkan persamaan linear yang dihasilkan oleh lm() dengan menggunakan perintah berikut ini:

> ggplot(p, aes(x=qty_produk2, y=qty_produk1)) + geom_point() + geom_smooth(method='lm')
Hasil plot dengan ggplot()

Hasil plot dengan ggplot()

Sebagai informasi tambahan, R juga memiliki cor() dan cov() untuk menghitung nilai correlation dan covariance secara mudah. Sebagai contoh, saya dapat memberikan perintah seperti berikut ini:

> cov(p$qty_produk1, p$qty_produk2, use='pairwise')
[1] -184.1778
> cor(p$qty_produk1, p$qty_produk2, use='pairwise')
[1] -0.1893496

Nilai covariance yang negatif (-184,1778) sehingga menunjukkan bahwa terdapat hubungan berbanding terbalik (bila jumlah produk1 bertambah maka jumlah produk2 cenderung berkurang). Nilai correlation yang mendekati nol (-0.1893496) menunjukkan variabel yang dibandingkan tidak saling mempengaruhi.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: