Belajar Melakukan Penelitian Sederhana Dengan R


Masyarakat awam sering kali menganggap peneliti aneh. Hal ini mungkin karena pola pikir peneliti yang ‘khas’ dalam menyelesaikan masalah. Salah satu contohnya adalah orang awam sering menganggap peneliti suka mencari-cari kesalahan. Mengapa demikian? Banyak masyarakat awan memperoleh kebenaran secara emosional misalnya melalui keyakinan, insting, rayuan, empati, dan sebagainya. Masyarakat awam bisa saja menerima kebenaran tanpa syarat bila hal serupa diakui oleh mayoritas orang disekitarnya.

Sebaliknya, peneliti hanya akan menerima kebenaran setelah terbukti. Membuktikan sesuatu benar, apalagi benar 100% dalam setiap kondisi, adalah sesuatu yang sangat sulit. Akan tetapi, bila peneliti dapat menunjukkan kesalahan dari apa yang dianggap benar, maka apa yang tadinya dianggap benar bisa jadi mungkin adalah salah. Filosofer Karl Popper memiliki ide bahwa sesuatu yang ilmiah (scientific) adalah sesuatu yang bisa disangkal. Penyangkalan (falsifiability) berkaitan dengan pengujian (testability). Sebuah teori ilmiah adalah sesuatu yang bisa diuji (karena ia bisa salah) dan terbukti lolos dari pengujian dengan hasil yang diharapkan. Sebaliknya, sebuah pernyataan yang tidak dapat disangkal akan sulit untuk diuji. Ini hanya menunjukkan bahwa pernyataan tersebut tidak ilmiah (unscientific) tetapi bukan berarti ia salah atau tidak bermanfaat.

Filosofi Karl Popper menjadi landasan dari pengujian null hypothesis. Hipotesa yang hendak dibuktikan kebenarannya disebut sebagai alternative hypothesis (H1). Kebalikannya disebut sebagai null hypothesis (H0). Peneliti biasanya berfokus pada H0. Hasil penelitiannya adalah menolak atau gagal menolak H0! Kenapa peneliti menggunakan kalimat “gagal menolak H0” dan bukan “menerima H0”? Hal ini untuk menghindari kesalahan logika yang disebut sebagai argument from ignorance. Sebagai analogi: bila pengadilan gagal membuktikan kesalahan seorang terdakwa, bukan berarti terdakwa sudah pasti orang benar, bukan? Bisa saja terdakwa sudah menghapus bukti kesalahannya atau pencarian bukti tidak dilakukan di lokasi yang tepat😀

Pada suatu hari, seorang mahasiswa pernah mengeluhkan harus membaca banyak baris kode program karena ia percaya bahwa kode program yang baik harus singkat. Ia berpendapat bahwa kode program yang jumlah barisnya banyak sudah pasti terlalu kompleks. Apakah benar demikian? Sebelum bisa menguji pendapat mahasiswa tersebut, saya perlu mendefinisikan lebih lanjut apa yang disebut sebagai kompleks. Saya akan menggunakan nilai cyclomatic complexity (https://en.wikipedia.org/wiki/Cyclomatic_complexity) sebagai acuan tingkat kerumitan kode program. Semakin banyak percabangan akibat perintah if, nilai cyclomatic complexity (M) akan semakin meningkat dan kode program akan semakin sulit ditelusuri. Dengan demikian:

H1: semakin besar jumlah baris program (LOC), maka semakin besar nilai cyclomatic complexity (M)

H0: jumlah baris program (LOC) tidak mempengaruhi nilai cyclomatic complexity (M)

Untuk membuktikan mahasiswa tersebut benar, saya perlu menguji dan menolak H0. Saya tidak mungkin melakukan pengujian pada seluruh kode program yang ada di dunia ini. Oleh sebab itu, saya hanya akan mengambil beberapa sampel pengujian, misalnya dari situs yang menyediakan statistik proyek open source seperti http://nemo.sonarqube.org. Saya kemudian mengelompokkan sampel yang ada menjadi 2 jenis: sampel dengan jumlah baris di bawah 10.000 dan sampel dengan jumlah baris program di atas 10.000. Gambar berikut ini memperlihatkan contoh sampel yang terkumpul:

Contoh sampel

Contoh sampel

Untuk menguji H0, saya dapat membandingkan mean dari sampel dengan jumlah baris di bawah 10.000 dan sampel dengan jumlah baris di atas 10.000. Bila nilai keduanya berbeda, saya bisa menolak H0 dengan aman.

Untuk membandingkan dua populasi yang tidak saling berhubungan, saya dapat menggunakan Student’s t-test (http://en.wikipedia.org/wiki/Student’s_t-test), tepatnya pengujian yang disebut sebagai independent sample t-test. Syarat untuk melakukan t-test adalah populasi yang dibandingkan harus mengikuti distribusi normal dan variance untuk kedua kelompok sampel yang diujikan harus sama. Bila variasi kedua kelompok sampel tidak sama, maka metode pengujian yang harus dipakai adalah Welch t-test. Function t.test() pada R secara default mengasumsikan kedua kelompok sampel memiliki variance yang berbeda sehingga akan menerapkan Welch’s t-test bila pengguna tidak memberikan argumen var.equal=TRUE.

Sebagai contoh, saya memberikan perintah seperti berikut ini di R:

> t.test(loc_besar$m, loc_kecil$m)

    Welch Two Sample t-test

data:  loc_besar$m and loc_kecil$m
t = 4.0958, df = 147.153, p-value = 6.92e-05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4729933 1.3550135
sample estimates:
mean of x mean of y 
 3.233871  2.319868 

Hasil paling penting yang perlu diperhatikan dari nilai di atas adalah p-value atau nilai p. Apa itu nilai p? Peneliti biasanya tidak pernah yakin 100%. Hampir semua peneliti akan skeptis mendengar pernyataan yang terlalu sempurna tanpa celah! Nilai p adalah peluang terjadinya Type I error dimana null hypothesis benar tetapi malah ditolak. Pada hasil di atas, peluang ini adalah 0.0000692. Hal ini berarti dari 2.500.000 kali percobaan dengan sampel berbeda, ada kemungkinan 173 kali hasil pengujian semata-mata terjadi karena kebetulan. Nilai p yang sering kali dijadikan patokan adalah 0.05. Karena nilai p untuk hasil pengujian di bawah 0.05, maka ada peluang besar bahwa mean kedua populasi tersebut memang berbeda.

Hasil pengujian t-test akan akurat bila populasi yang diperbandingkan memiliki distribusi normal. Saya akan mencoba melakukan pengujian dengan menggunakan Mann-Whitney U test yang tidak mengasumsikan distribusi normal, dengan memberikan perintah seperti berikut ini:

> wilcox.test(loc_besar$m, loc_kecil$m)

    Wilcoxon rank sum test with continuity correction

data:  loc_besar$m and loc_kecil$m
W = 12700.5, p-value = 3.544e-07
alternative hypothesis: true location shift is not equal to 0

Nilai p yang dibawah 0.05 kembali menunjukkan bahwa mean populasi kemungkinan besar tidak sama. Berdasarkan hasil ini, saya bisa menolak H0 (jumlah LOC tidak mempengaruhi M). Dengan demikian, bukti yang kuat semakin mengarah ke H1. Saya dapat menambahkan nilai alternative pada perintah sebelumnya untuk menguji arah (one sided test):

> wilcox.test(loc_besar$m, loc_kecil$m, alternative='greater')

    Wilcoxon rank sum test with continuity correction

data:  loc_besar$m and loc_kecil$m
W = 12700.5, p-value = 1.772e-07
alternative hypothesis: true location shift is greater than 0

alternative='greater' akan menguji apakah nilai rata-rata populasi di sebelah kiri (loc_besar$m) lebih besar daripada rata-rata populasi di sebelah kanan (loc_kecil$m). Nilai p yang kecil menunjukkan bahwa ada peluang hasil ini bukan kebetulan.

Salah satu pertanyaan yang mungkin muncul adalah mengapa tidak langsung membandingkan rata-rata (mean) sampel? Hasil akan kurang akurat karena rata-rata sampel tidak dapat dipakai untuk mendeskripsikan rata-rata populasi. Pengujian seperti t-test dan Mann-Whitney U test akan bekerja pada rata-rata (mean) populasi. Dengan demikian, walaupun saya hanya bekerja pada sampel yang jumlahnya terbatas (kode program pada beberapa proyek open-source), hasil yang diperoleh dapat diaplikasikan pada populasi yang saya teliti (yaitu seluruh kode program pada proyek open-source).

Untuk menunjukkan hubungan antar jumlah baris kode program (LOC) dan cyclomatic complexity (M), saya dapat membuat scatterplot untuk seluruh sampel yang ada seperti pada gambar berikut ini:

> require(ggplot2)

> ggplot(d, aes(x=loc, y=m)) + geom_point() + geom_smooth(method=lm)
Scatterplot yang memperlihatkan relasi diantara 2 variabel

Scatterplot yang memperlihatkan relasi diantara 2 variabel

Agar lebih yakin lagi, saya dapat menguji korelasi antar variabel dengan mencari nilai Pearson’s Product-Moment Correlation Coefficient (nilai r). Sebagai contoh, saya memberikan perintah berikut ini di R:

> cor.test(~ m + loc, d)

    Pearson's product-moment correlation

data:  m and loc
t = 3.7321, df = 270, p-value = 0.0002315
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1053281 0.3316868
sample estimates:
      cor 
0.2214889 

Karena nilai p dibawah 0.05, maka hasil pengujian menunjukkan kemungkinan adanya korelasi yang lemah antara jumlah baris dan cyclomatic complexity dengan nilai r berupa 0.2214889. Nilai r yang semakin mendekati 0 menunjukkan semakin tidak ada korelasi, dan nilai r yang semakin mendekati 1 atau -1 menunjukkan korelasi yang semakin erat.

Bila nilai r dipangkat dua, maka saya akan memperoleh nilai coefficient of determination yang berupa 0.04905735 atau 4.9%. Nilai ini menunjukkan bahwa jumlah baris memberikan dampak 4.9% perubahan pada kerumitan. Tentu saja masih ada kemungkinan variabel tersembunyi (yang ikut meningkat seiring peningkatan jumlah baris) yang belum saya temukan yang sesungguhnya memiliki dampak besar.

Setelah percobaan sederhana ini, saya kemudian bisa menyimpulkan bahwa pernyataan si mahasiswa memiliki landasan bukti yang bisa diterima. Sesungguhnya sudah ada beberapa paper yang membahas masalah ini secara lebih ilmiah, misalnya paper Cyclomatic Complexity and Lines of Code: Empirical Evidence of a Stable Linear Relationship yang diterbitkan di Journal of Software Engineering and Applications, Vol. 2 No. 3, 2009 dan paper Empirical Analysis of the Relationship between CC and SLOC in a Large Corpus of Java Methods yang diterbitkan di Software Maintenance and Evolution (ICSME), 2014 IEEE International Conference on.

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: