Pengelompokan kode program c berdasarkan kemiripan struktur menggunakan metode hierarchical agglomerative clustering

PENGELOMPOKAN KODE PROGRAM C BERDASARKAN
KEMIRIPAN STRUKTUR MENGGUNAKAN METODE
HIERARCHICAL AGGLOMERATIVE CLUSTERING

RUSMAN TRIATMOJO

DEPARTEMEN ILMU KOMPUTER
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
BOGOR
2014

PERNYATAAN MENGENAI SKRIPSI DAN
SUMBER INFORMASI SERTA PELIMPAHAN HAK CIPTA
Dengan ini saya menyatakan bahwa skripsi berjudul Pengelompokan Kode
Program C Berdasarkan Kemiripan Struktur Menggunakan Metode Hierarchical
Agglomerative Clustering adalah benar karya saya dengan arahan dari komisi
pembimbing dan belum diajukan dalam bentuk apa pun kepada perguruan tinggi
mana pun. Sumber informasi yang berasal atau dikutip dari karya yang diterbitkan
maupun tidak diterbitkan dari penulis lain telah disebutkan dalam teks dan
dicantumkan dalam Daftar Pustaka di bagian akhir skripsi ini.

Dengan ini saya melimpahkan hak cipta dari karya tulis saya kepada Institut
Pertanian Bogor.
Bogor, Agustus 2014
Rusman Triatmojo
NIM G64100090

ABSTRAK
RUSMAN TRIATMOJO. Pengelompokan Kode Program C Berdasarkan
Kemiripan Struktur Menggunakan Metode Hierarchical Agglomerative
Clustering. Dibimbing oleh AHMAD RIDHA.
Tujuan penelitian ini adalah mengimplementasikan algoritme hierarchical
agglomerative clustering untuk membantu pendeteksian penjiplakan pada kode
program C secara otomatis dan membandingkan hasil penelitian dengan penelitian
sebelumnya menggunakan metode iterasi K-means otomatis dan bisecting Kmeans. Data yang digunakan dalam penelitian ini sebanyak 386 kode program C
yang terdiri atas 4 dataset. Metode yang digunakan Single Linkage, Complete
Linkage, dan Average Linkage. Hasil clustering yang dilakukan menunjukkan
eksekusi waktu metode Single Linkage sebesar 1.7220 detik dengan jumlah
cluster 14 dan RI sebesar 0.9706, eksekusi waktu metode Complete Linkage sebesar
1.7500 detik dengan jumlah cluster 10 dan RI sebesar 0.8560, dan eksekusi waktu
metode Average Linkage sebesar 1.7400 detik dengan jumlah cluster 14 dan RI

sebesar 0.9546. Hasil penelitian ini menunjukkan adanya perbaikan waktu
eksekusi clustering dari penelitian sebelumnya yang menggunakan metode iterasi
K-means sebesar 8.41 detik dan metode bisecting K-means sebesar 4.69 detik.
Katakunci : Hierarchical clustering, Kode Program C, Pendeteksi penjiplakan.

ABSTRACT
RUSMAN TRIATMOJO. Grouping of C Programs Based on Structure Similarity
Using Hierarchical Agglomerative Clustering. Supervised by AHMAD RIDHA.
The purpose of this research is to implement the agglomerative
hierarchical clustering algorithm to assist plagiarism detection in C program code
automatically and compare this research’s results with previous research using Kmeans automatic iteration and bisecting K-means method. The data used in this
research are 386 C programs comprised of 4 datasets. The method used are Single
Linkage, Complete Linkage, and Average Linkage. The results show that the
execution time of Single Linkage method is 1.7440 seconds with 14 clusters
found and 0.9706 of RI, the execution time of Complete Linkage method is
1.7240 seconds with 10 clusters found and 0.8576 of RI, and the execution time of
Average Linkage method is 1.7340 seconds with 14 clusters found and 0.9546 of
RI. The results of this research show an improved execution time of clustering
from previous research using K-means automatic iteration method (11.68
seconds) and bisecting K-means method (6.64 seconds).


Keywords : C code program, Detect Plagiarism, Hierarchical clustering.

PENGELOMPOKAN KODE PROGRAM C BERDASARKAN
KEMIRIPAN STRUKTUR MENGGUNAKAN METODE
HIERARCHICAL AGGLOMERATIVE CLUSTERING

RUSMAN TRIATMOJO

Skripsi
sebagai salah satu syarat untuk memperoleh gelar
Sarjana Komputer
pada
Departemen Ilmu Komputer

DEPARTEMEN ILMU KOMPUTER
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
BOGOR
2014


Penguji : 1 Aziz Kustiyo, SSi MKom
2 Dr Imas S Sitanggang, SSi MKom

Judul Skripsi : Pengelompokan Kode Program C Berdasarkan Kemiripan
Struktur Menggunakan Metode Hierarchical Agglomerative
Clustering
Nama
: Rusman Triatmojo
NIM
: G64100090

Disetujui oleh

Ahmad Ridha, SKom MS
Pembimbing

Diketahui oleh

Dr Ir Agus Buono, MSi MKom

Ketua Departemen

Tanggal Lulus:

PRAKATA
Puji dan syukur penulis panjatkan kepada Allah Subhanahu Wa Ta’ala atas
segala limpahan rahmat dan karunia-Nya sehingga karya ilmiah berjudul
Pengelompokan Kode Program C Berdasarkan Kemiripan Struktur Menggunakan
Metode Hierarchical Agglomerative Clustering ini dapat penulis selesaikan.
Shalawat dan salam tak lupa penulis curahkan kepada Nabi Besar Muhammad
Shallallahu 'Alaihi Wasallam beserta seluruh keluarga, sahabat, dan para
pengikutnya sampai akhir zaman.
Terima kasih penulis ucapkan kepada Bapak Ahmad Ridha, SKom MS
selaku pembimbing yang telah banyak memberikan arahan dalam penyusunan
skripsi ini, dan terima kasih kepada Bapak Aziz Kustiyo, SSi MKom dan Ibu Dr
Imas S Sitanggang, SSi MKom selaku penguji. Selain itu, ungkapan terima kasih
juga penulis sampaikan kepada teman-teman yang telah memberikan saran,
motivasi, dan dukungan bagi kelancaran penyusunan skripsi ini. Tak lupa pula
ungkapan terima kasih penulis sampaikan kepada ayah, ibu, serta seluruh keluarga,
atas segala doa dan kasih sayangnya. Semoga skripsi ini bermanfaat.


Bogor, Agustus 2014

Rusman Triatmojo

DAFTAR ISI
DAFTAR TABEL

viii

DAFTAR GAMBAR

viii

PENDAHULUAN

1

Latar Belakang


1

Perumusan Masalah

2

Tujuan Penelitian

2

Manfaat Penelitian

2

Ruang Lingkup Penelitian

2

METODE PENELITIAN


2

Pengambilan Data Penelitian

2

Pemilihan Sampel Tugas dan Pengelompokan Awal

3

Praproses data

3

Clustering

5

Penghentian Looping


6

Validasi Hasil Clustering

6

Perbandingan dengan Penelitian Sebelumnya

6

Lingkungan Implementasi

7

HASIL DAN PEMBAHASAN

7

Pengambilan dan Pemilihan Data


7

Pengelompokan Manual

7

Praproses Data

8

Hierarchical Agglomerative Clustering

9

Validasi Hasil Clustering

11

Perbandingan dengan Penelitian Sebelumnya


12

SIMPULAN DAN SARAN

13

Simpulan

13

Saran

13

DAFTAR PUSTAKA

13

RIWAYAT HIDUP

27

DAFTAR TABEL
Beberapa hasil konversi term dari kode program (Burrows 2004)
Term frequency
Set data awal
Set data setelah pengelompokan manual
Hasil percobaan Single Linkage clustering untuk DataSet1
Nilai RI, jumlah cluster, jumlah dokumen, dan waktu eksekusi
clustering setiap set data percobaan Single Linkage clustering
7 Hasil percobaan Complete Linkage clustering untuk DataSet1
8 Nilai RI, jumlah cluster, jumlah dokumen, dan waktu eksekusi
clustering setiap set data percobaan Complete Linkage clustering
9 Hasil percobaan Average Linkage clustering untuk DataSet1
10 Nilai RI, jumlah cluster, jumlah dokumen, dan waktu eksekusi
clustering setiap set data percobaan Average Linkage clustering
11 Perbandingan hasil clustering pada saat nilai i terbaik dengan
penelitian sebelumnya
1
2
3
4
5
6

4
5
7
8
9
9
10
10
10
11
12

DAFTAR GAMBAR
1
2
3
4
5

Tahapan praproses sebelum clustering
Ilustrasi dari ukuran kesamaan kosinus
Contoh program sebelum dilakukan tokenisasi
Contoh program setelah dilakukan tokenisasi
False positive dokumen D58 dan D59 pada DataSet2

3
5
8
8
11

DAFTAR LAMPIRAN
1 Tabel aturan konversi kode program menjadi token sederhana
(Burrows 2004)
2 Hasil pengelompokan manual untuk DataSet1
3 Hasil pengelompokan manual untuk DataSet3
4 Hasil pengelompokan manual untuk DataSet4
5 Hasil pengelompokan manual untuk DataSet1
6 Tabel Hasil percobaan Single Linkage clustering untuk DataSet1
7 Hasil percobaan Single Linkage clustering untuk DataSet2
8 Hasil percobaan Single Linkage clustering untuk DataSet3
9 Hasil percobaan Single Linkage clustering untuk DataSet4
10 Hasil percobaan Single Linkage clustering untuk DataSetAll
11 Hasil percobaan Complete Linkage clustering untuk DataSet1
12 Hasil percobaan Complete Linkage clustering untuk DataSet2
13 Hasil percobaan Complete Linkage clustering untuk DataSet3
14 Hasil percobaan Complete Linkage clustering untuk DataSet4
15 Hasil percobaan Complete Linkage clustering untuk DataSetAll
16 Hasil percobaan Average Linkage clustering untuk DataSet1
17 Hasil percobaan Average Linkage clustering untuk DataSet2
18 Hasil percobaan Average Linkage clustering untuk DataSet3
19 Hasil percobaan Average Linkage clustering untuk DataSet4
20 Hasil percobaan Average Linkage clustering untuk DataSetAll

14
15
16
17
18
19
19
20
20
21
21
22
22
23
23
24
24
25
25
26

PENDAHULUAN
Latar Belakang
Mata kuliah pemrograman komputer biasanya akan memberikan tugas
kepada mahasiswanya untuk melatih kemampuan pemrograman. Tugas
pemrograman yang diberikan umumnya berupa berkas elektronik. Tugas ini
biasanya sangat rentan sekali dengan terjadinya penjiplakan yang dilakukan oleh
mahasiswa. Penjiplakan yang dilakukan dapat bermacam-macam cara, misalnya
mengubah variabel yang ada. Untuk memeriksa terjadinya penjiplakan dilakukan
pemeriksaan kesamaan dari program yang dibuat. Namun pemeriksaan yang
dilakukan secara manual akan memakan waktu lama dan melelahkan. Oleh karena
itu proses pendeteksian secara cepat dan tepat sangatlah dibutuhkan.
Pemeriksaan kemiripan kode program yang dilakukan oleh Burrows (2004)
ialah dengan cara mencari kode program dari query yang diberikan dan
menghitung kemiripannya. Sistem yang digunakan oleh Burrows adalah
structure-oriented code-based system. Sistem berbasis kode dengan
berorientasikan pada struktur kode program ini membuat representasi yang lebih
ringkas dari kode program. Penelitian mengenai pendeteksian penjiplakan kode
program C sebelumnya dilakukan oleh Gumilang (2013) dan Notyasa (2013),
keduanya mengadopsi aturan penyederhanaan yang dilakukan Burrows (2004).
Gumilang (2013) dan Notyasa (2013) keduanya menerapkan pengelompokan
berdasarkan kesamaan strukturnya. Penelitian yang dilakukan Gumilang (2013)
mengelompokkan kode program secara otomatis dengan iterasi K-means otomatis.
Iterasi K-means otomatis yaitu melakukan clustering menggunakan K-means
dengan nilai K bertambah secara otomatis pada setiap iterasinya. Iterasi berhenti
apabila anggota-anggota cluster hasil sudah cukup dekat dengan centroid-nya.
Iterasi K-means otomatis ini membutuhkan waktu eksekusi yang lama. Hal ini
dikarenakan pada setiap iterasi dilakukan proses clustering dengan jumlah
dokumen yang sama dan jumlah centroid yang semakin bertambah. Sedangkan
penelitian yang dilakukan Notyasa (2013) dengan hierarchical divisive clustering.
Algoritme hierarchical divisive clustering yang digunakan adalah bisecting Kmeans. Bisecting K-means adalah algoritme hierarchical divisive clustering yang
menggunakan K-means untuk pemisahan setiap cluster-nya.
Pengelompokan kode program pada penelitian ini menggunakan tehnik
pengelompokan dalam kategori Hierarchical Agglomerative Clustering yaitu
metode Single Linkage, Complete Linkage, dan Average Linkage. Pemodelan
Single Linkage dapat digunakan untuk mengelompokkan dokumen yang
didasarkan pada jarak terkecil. Jika dua dokumen terpisah oleh jarak yang pendek
maka kedua dokumen tersebut akan digabung menjadi satu cluster dan demikian
seterusnya. Pemodelan Complete Linkage dapat digunakan untuk
mengelompokkan dokumen yang didasarkan pada jarak terbesar. Jika dua
dokumen terpisah oleh jarak yang besar maka kedua dokumen tersebut akan
digabung menjadi satu cluster dan demikian seterusnya. Pemodelan Average
Linkage dapat digunakan untuk mengelompokkan dokumen yang didasarkan
pada jarak rata-rata.

2

Perumusan Masalah
Berdasarkan latar belakang yang telah dijelaskan, dapat disimpulkan
bahwa:
1 Bagaimana mengimplementasikan algoritme hierarchical agglomerative
clustering dalam pendeteksian penjiplakan kode program C.
2 Apakah pengelompokan kode-kode program dengan menggunakan
hierarchical agglomerative clustering membutuhkan waktu eksekusi yang
lebih singkat dibandingkan dengan iterasi K-means otomatis dan bisecting Kmeans.
3 Apakah hierarchical agglomerative clustering dapat menghasilkan cluster
yang lebih baik dibandingkan dengan iterasi K-means otomatis dan bisecting
K-means.
Tujuan Penelitian
Tujuan dari penelitian ini ialah mengimplementasikan algoritme
hierarchical agglomerative clustering untuk membantu pendeteksian penjiplakan
pada kode program C secara otomatis.
Manfaat Penelitian
Hasil dari penelitian ini diharapkan dapat memudahkan pemeriksaan
penjiplakan kode program C, sehingga proses pemeriksaan menjadi lebih cepat
dan efisien.
Ruang Lingkup Penelitian
1 Data yang digunakan adalah 386 buah kode program tugas pemrograman
berbahasa C yang didapat dari data penelitian sebelumnya yang dilakukan
oleh Gumilang (2013) dan Notyasa (2013)
2 Penelitian ini mengasumsikan tidak adanya makro sehingga bagian
preprocessor directives dibuang semua.

METODE PENELITIAN
Secara umum terdapat 6 tahapan penelitian, yaitu pengambilan data
penelitian, pemilihan sampel tugas dan pengelompokan manual, praproses data,
clustering,validasi hasil, dan perbandingan dengan penelitian sebelumnya.
Pengambilan Data Penelitian
Tahap awal penelitian dimulai dengan pengambilan data, data yang
digunakan dalam penelitian ini adalah data penelitian sebelumnya yang dilakukan
oleh Gumilang (2013) dan Notyasa (2013) yang diperoleh dari mata kuliah
algoritme dan pemrograman Program Studi S1 Ilmu Komputer. Data penelitian ini
adalah kumpulan berkas elektronik tugas pemrograman yang berisi kode program
bahasa C.

3
Pemilihan Sampel Tugas dan Pengelompokan Awal
Pada tahap ini dilakukan pemilihan sampel tugas dan pengelompokan tugas
secara manual. Sampel yang dipilih pada penelitian ini memiliki tingkat kesulitan
tidak terlalu mudah dan tidak terlalu sulit. Hal ini dikarenakan tugas yang terlalu
mudah akan memiliki variasi algoritme pemecahan yang sedikit, sedangkan tugas
yang terlalu susah cenderung memiliki jumlah kode program yang sedikit karena
banyak mahasiswa yang tidak mengumpulkan tugas. Sampel yang dipilih
sebanyak 92 kode program. Sampel diperiksa satu per satu dan dikelompokkan
berdasarkan kemiripan algoritme dan struktur kode programnya. Pengelompokan
awal ini untuk dasar sebagai perbandingan dalam validasi clustering.
Praproses data
Praproses data dilakukan untuk mengubah data mentah kode program C ke
dalam format yang dapat diproses ke dalam tahapan clustering, hasil praproses
data yaitu berupa term frequency. Tahapan-tahapan dalam praproses dapat dilihat
pada Gambar 1.

Kumpulan
program
Tabel
term
frequency

Pembuangan
preprocessor
directives

Pembentukan
N-gram

Tokenisasi

Konversi Token

Gambar 1 Tahapan praproses sebelum clustering
Pembuangan preprocessor directives
Tahap pertama adalah pembuangan preprocessor directives. Preprocessor
directives adalah sejumlah baris di awal kode program yang diawali dengan
karakter “#”. Pembuangan ini dilakukan karena pada penelitian ini diasumsikan
tidak adanya penggunaan makro pada kode program.
Tokenisasi
Proses Tokenisasi dilakukan untuk mendapatkan keywords dan special
characters dari kode program. Pada proses tokenisasi, karakter whitespace
dibuang semua sehingga didapat term atau string uniknya saja (Manning et al.
2008). Baris komentar pada kode program dibuang karena tidak berpengaruh
terhadap output program. Karakter “;” juga dibuang karena merupakan karakter
umum yang selalu digunakan di setiap akhir baris kode program C.
Konversi Token
Selanjutnya pada proses konversi token, keywords dan special characters
kode program diubah menjadi token sederhana agar lebih ringkas dan mudah
dalam pembentukan term. Kode program yang telah diubah menjadi sebuah string
panjang token sederhana disebut dengan token stream (Burrows 2004). Beberapa

4
konversi kode program menjadi token sederhana dilakukan berdasarkan aturan
konversi seperti pada Tabel 1. Aturan konversi kode program menjadi token
sederhana lebih lengkapnya dapat dilihat pada Lampiran 1.
Tabel 1 Beberapa hasil konversi term dari kode program (Burrows 2004)
Term

Int
Main
For
Return
(
)
{

Token
sederhana
A
N
M
R
H
I
K

Term
}
=
<
+
,
ALPHANUM
STRING

Token
sederhana
L
O
M
A
J
N
5

Tabel 1 memperlihatkan perubahan penulisan kode menjadi token sederhana.
ALPHANUM adalah nama fungsi nama variabel atau nilai variabel. STRING
adalah sederetan karakter yang diapit oleh tanda petik (“ ”). Berikut adalah contoh
kode program yang diubah menjadi token stream:
#include
int main (){
int var;
for
(var=0;
var