Algoritma ini adalah salah satu algoritma yang digunakan untuk klasifikasi data. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Sebetulnya algoritma ini adalah algoritma buatan sendiri, sehingga tidak ada jurnal penelitian khusus untuk membahas algoritma ini. Itulah sebab mengapa algoritma ini disebut sebagai algoritma tanpa nama. Sistem klasifikasi data pada umumnya adalah pencarian nilai bobot / pencarian sejumlah aturan dari data yang sudah ada. Kemudian nilai tersebut akan diuji pada kumpulan data awal untuk mencari tingkat kebenaran. Setelah itu nilai bobot / aturan-aturan tersebut akan digunakan untuk menghitung data baru.
Algoritma ini menggunakan teknik dari beberapa algoritma lain yang sudah ada. Algoritma lain mengenai klasifikasi data secara keseluruhan adalah Algoritma Naive Bayes Inference Clustering dan Algoritma Winnow. Algoritma Naive Bayes Inference Clustering bekerja dengan cara mengelompokkan data sebagai penentu nilai output, sedangkan Algoritma Winnow menggunakan nilai bobot pada masing-masing kriteria untuk menentukan nilai output. Algoritma ini tidak menggunakan kedua teknik tersebut, tetapi menggunakan teknik pencarian aturan-aturan sebagai penentu nilai output, mirip seperti Algoritma AdaBoost (Adaptive Boosting). Pada akhirnya, nilai output tersebut akan digunakan untuk memprediksi semua nilai hasil pada data baru.
Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Diterima |
Pelanggan B | 52 | Perempuan | 4.71 | Diterima |
Pelanggan C | 60 | Perempuan | 6.56 | Ditolak |
Pelanggan D | 56 | Laki-laki | 6.8 | Ditolak |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Diterima |
Pelanggan H | 58 | Perempuan | 5.71 | Diterima |
Contoh data awal adalah sebagai berikut:
Dim data(11)() As String data(0) = New String() {44, "Laki-laki", 3.55, "Diterima"} data(1) = New String() {52, "Perempuan", 4.71, "Diterima"} data(2) = New String() {60, "Perempuan", 6.56, "Ditolak"} data(3) = New String() {56, "Laki-laki", 6.8, "Ditolak"} data(4) = New String() {51, "Laki-laki", 6.94, "Ditolak"} data(5) = New String() {46, "Perempuan", 6.52, "Ditolak"} data(6) = New String() {48, "Laki-laki", 4.25, "Diterima"} data(7) = New String() {58, "Perempuan", 5.71, "Diterima"}
Selanjutnya ada 4 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:
Pelanggan, Umur, Jenis Kelamin, Skor Kepribadian
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
Pelanggan K | 48 | Perempuan | 4.5 |
Pelanggan L | 42 | Laki-Laki | 5.5 |
Contoh data pelanggan baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah kosong
data(8) = New String() {47, "Perempuan", 6.05, ""} data(9) = New String() {52, "Laki-laki", 5, ""} data(10) = New String() {48, "Perempuan", 4.5, ""} data(11) = New String() {42, "Laki-laki", 5.5, ""}
Langkah-langkah penggunaan algoritma ini adalah
1. Tentukan Pengelompokan untuk masing-masing kriteria
Jumlah pengelompokan bebas tergantung keinginan
Contoh dalam kasus ini:
Kriteria umur hanya dikelompokan menjadi 3 bagian yaitu untuk umur dibawah 40, 41 sampai dengan 50, diatas 50
Kriteria jenis kelamin dikelompokan menjadi 2 bagian yaitu untuk laki-laki dan perempuan
Kriteria skor kepribadian dikelompokan menjadi 4 bagian yaitu untuk skor dibawah 4, 4 sampai dengan 5, 5 sampai dengan 6, diatas 6
Kriteria hasil dikelompokan menjadi 2 bagian yaitu untuk kelompok Diterima dan Ditolak
Dim kriteria() As String = {"Umur", "JK", "Skor", "Hasil"} Dim kelompokKriteria(kriteria.Length - 1)() As String kelompokKriteria(0) = New String() {"Dibawah 40", "41 s/d 50", "Diatas 50"} kelompokKriteria(1) = New String() {"Laki-laki", "Perempuan"} kelompokKriteria(2) = New String() {"Dibawah 4", "4 s/d 5", "5 s/d 6", "Diatas 6"} kelompokKriteria(3) = New String() {"Ditolak", "Diterima"}
2. Tentukan matriks data untuk data yang sudah mengalami pengelompokan data sesuai kriteria diatas
Dim baris As Integer = data.Length Dim kolom As Integer = data(0).Length Dim dataAwal(baris - 1)() As String For i = 0 To baris - 1 dataAwal(i) = New String(kolom - 1) {} Next i For i = 0 To data.Length - 1 For j = 0 To data(i).Length - 1 Dim v As String = "" For k = 0 To kelompokKriteria(j).Length - 1 If j = 0 Then If data(i)(j) < 40 Then v = kelompokKriteria(j)(0) ElseIf data(i)(j) < 50 Then v = kelompokKriteria(j)(1) ElseIf data(i)(j) >= 50 Then v = kelompokKriteria(j)(2) End If ElseIf j = 1 Then If data(i)(j) = kelompokKriteria(j)(k) Then v = kelompokKriteria(j)(k) End If ElseIf j = 2 Then If data(i)(j) < 4 Then v = kelompokKriteria(j)(0) ElseIf data(i)(j) < 5 Then v = kelompokKriteria(j)(1) ElseIf data(i)(j) < 6 Then v = kelompokKriteria(j)(2) ElseIf data(i)(j) >= 6 Then v = kelompokKriteria(j)(3) End If ElseIf j = 3 Then If data(i)(j) = kelompokKriteria(j)(k) Then v = kelompokKriteria(j)(k) End If End If Next k dataAwal(i)(j) = v Next j Next i Dim contohData(7)() As String For i = 0 To 7 contohData(i) = New String(dataAwal(0).Length - 1) {} For j = 0 To dataAwal(0).Length - 1 contohData(i)(j) = dataAwal(i)(j) Next Next Dim dataBaru(3)() As String For i = 0 To 3 dataBaru(i) = New String(dataAwal(0).Length - 1) {} For j = 0 To dataAwal(0).Length - 1 dataBaru(i)(j) = dataAwal(i + 8)(j) Next Next
3. Tentukan jumlah kondisi tiap aturan
DIasumsikan dalam kasus ini, jumlah kondisi tiap aturan ada 2
Artinya dalam setiap aturan akan terdapat 2 kriteria sebagai klausa sebab dan 1 kriteria hasil sebagai klausa akibat
Const jumlahKondisiTiapAturan As Integer = 2
4. Tentukan jumlah maksimum aturan yang dapat dibuat
DIasumsikan dalam kasus ini, jumlah maksimum aturan adalah 50 aturan
Const maksJumlahAturan As Integer = 50
5. Tentukan tingkat kebenaran minimal sebuah aturan terhadap semua data, agar aturan tersebut dapat termasuk dalam aturan yang valid
DIasumsikan dalam kasus ini, tingkat kebenaran minimal adalah 0.9
Artinya untuk setiap aturan yang valid harus memiliki kebenaran sebesar 90% dari semua data
Const persentaseKebenaran As Double = 0.7
6. Lakukan proses pembuatan aturan-aturan berdasarkan contoh data yang sudah tersedia
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini
Dim cc As New Classifier(jumlahKondisiTiapAturan, maksJumlahAturan) cc.prosesPembuatanAturan(contohData, persentaseKebenaran)
Berikut adalah penjelasan pada fungsi prosesPembuatanAturan (poin 6a – 6b7)
6a. Tentukan semua kelompok kriteria pada semua data, simpan ke dalam variabel stringToInteger dengan tipe Dictionary
Dim jumlahBaris As Integer = contohData.Length Dim jumlahKolom As Integer = contohData(0).Length Me.stringToInteger = New Dictionary(Of String, Integer)(jumlahKolom - 1) {} '1 dictionary untuk setiap kriteria, termasuk kriteria hasil For c As Integer = 0 To jumlahKolom - 1 stringToInteger(c) = New Dictionary(Of String, Integer) Dim idx As Integer = 0 For r As Integer = 0 To jumlahBaris - 1 Dim s As String = contohData(r)(c) If stringToInteger(c).ContainsKey(s) = False Then stringToInteger(c).Add(s, idx) idx += 1 End If Next r Next c
6b. Tentukan aturan-aturan yang didapatkan dari semua data
6b1. Cari kriteria acak sebanyak parameter jumlahKondisiTiapAturan, dalam kasus ini bernilai 2
Dim maksPercobaanKriteriaAcak As Integer = (jumlahKolom - 1) * 2 Dim daftarKriteria() As Integer = Nothing Dim hasil(jumlahKondisiTiapAturan - 1) As Integer Dim percobaan As Integer = 0 Do While percobaan < maksPercobaanKriteriaAcak '6b1a. Cari kriteria sebanyak variabel maksPercobaanKriteriaAcak 'Kriteria acak yang terpilih bisa saja terpilih lebih dari sekali For i As Integer = 0 To jumlahKondisiTiapAturan - 1 hasil(i) = rnd.Next(0, jumlahKolom - 1) Next i Array.Sort(hasil) '6b1b. Apabila ada kriteria yang dobel / muncul lebih dari 1 kali, maka ulangi percobaan ini 'Jika tidak ada kriteria yang dobel, maka ambil nilainya sebagai jawaban kriteria acak '----------- Dim HasDups As Boolean = False For i As Integer = 0 To hasil.Length - 2 If hasil(i) = hasil(i + 1) Then HasDups = True Exit For End If Next i If HasDups = False Then daftarKriteria = hasil Exit Do End If '----------- percobaan += 1 Loop
6b2. Apabila setelah perhitungan diatas, tidak ditemukan jawaban mengenai kriteria acak,
Maka lakukan pengambilan jawaban dengan cara pemilihan indeks secara acak dari kolom pertama sampai kolom ke variabel jumlahKolom
If daftarKriteria Is Nothing Then ReDim daftarKriteria(jumlahKondisiTiapAturan - 1) For i As Integer = 0 To jumlahKondisiTiapAturan - 1 daftarKriteria(i) = i Next i For t As Integer = jumlahKondisiTiapAturan To (jumlahKolom - 1) - 1 Dim m As Integer = rnd.Next(0, t + 1) If m < jumlahKondisiTiapAturan Then daftarKriteria(m) = t End If Next t Array.Sort(daftarKriteria) End If
6b3. Susun calon aturan dengan cara memasukkan kriteria acak pada baris acak
For i As Integer = 0 To jumlahKondisiTiapAturan - 1 Dim kriteriaI As Integer = daftarKriteria(i) Dim nilaiKriteriaI As String = contohData(barisAcak)(kriteriaI) Dim nilaiKelompokKriteriaI As Integer = Me.stringToInteger(kriteriaI)(nilaiKriteriaI) calonAturan(i * 2) = daftarKriteria(i) calonAturan(i * 2 + 1) = nilaiKelompokKriteriaI Next i
6b4. Tambahkan nilai hasil pada calon aturan tersebut
Dim nilaiKriteriaHasil As String = contohData(barisAcak)(jumlahKolom - 1) Dim indeksKriteriaHasil As Integer = stringToInteger(jumlahKolom - 1)(nilaiKriteriaHasil) calonAturan(jumlahKondisiTiapAturan * 2) = indeksKriteriaHasil
6b5. Tentukan apakah calon aturan ini sudah termasuk dalam daftar sebelumnya?
Jika sudah ada, maka ulangi pencarian calon aturan yang lain
Dim isAturanSudahAda As Boolean = False For i As Integer = 0 To daftarAturan.Count - 1 Dim aturanTerpilih() As Integer = daftarAturan(i) Dim isAturanSama As Boolean = True For j As Integer = 0 To calonAturan.Length - 1 If calonAturan(j) <> aturanTerpilih(j) Then isAturanSama = False Exit For End If Next j If isAturanSama Then isAturanSudahAda = True Exit For End If Next i If isAturanSudahAda Then Continue Do
6b6. Tentukan apakah calon aturan ini memenuhi syarat lebih dari xx% pada semua data
Dim tingkatKebenaranAturan As Double = 0 Dim jumlahBenar As Integer = 0 Dim jumlahSalah As Integer = 0 For i As Integer = 0 To jumlahBaris - 1 If isAturanBerlaku(calonAturan, contohData(i)) = False Then Continue For Dim nilaiHasilPadaCalonAturan As Integer = calonAturan(calonAturan.Length - 1) Dim nilaiHasilPadaContohData As String = contohData(i)(jumlahKolom - 1) Dim Y As Integer = Me.stringToInteger(jumlahKolom - 1)(nilaiHasilPadaContohData) If nilaiHasilPadaCalonAturan = Y Then jumlahBenar += 1 Else jumlahSalah += 1 End If Next i If jumlahBenar + jumlahSalah <> 0 Then tingkatKebenaranAturan = (jumlahBenar * 1.0) / (jumlahBenar + jumlahSalah) If tingkatKebenaranAturan < persentaseKebenaran Then Continue Do
6b7. Jika memenuhi syarat-syarat diatas, maka tambahkan calon aturan kedalam daftar aturan yang valid
Dim aturanBaru(calonAturan.Length - 1) As Integer Array.Copy(calonAturan, aturanBaru, calonAturan.Length) Me.daftarAturan.Add(aturanBaru)
7. Tentukan nilai output untuk masing-masing data baru berdasarkan aturan yang telah dibuat sebelumnya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini
Dim Y As Integer = cc.hitungOutput(dataBaru(i), True)
* Gunakan fungsi ini untuk menghitung apakah sebuah data memiliki hasil Diterima atau Ditolak
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini
Public Function hitungOutput(ByVal data() As String, Optional ByVal catatAturan As Boolean = False) As Integer Dim jumlahDitolak As Integer = 0 Dim jumlahDiterima As Integer = 0 For i As Integer = 0 To daftarAturan.Count - 1 Dim aturan() As Integer = daftarAturan(i) If isAturanBerlaku(aturan, data) = False Then Continue For If aturan(aturan.Length - 1) = 0 Then jumlahDiterima += 1 If catatAturan Then Console.WriteLine("Termasuk dalam aturan [" & (i + 1).ToString.PadRight(2) & "] dengan hasil Diterima") Else jumlahDitolak += 1 If catatAturan Then Console.WriteLine("Termasuk dalam aturan [" & (i + 1).ToString.PadRight(2) & "] dengan hasil Ditolak") End If Next i If jumlahDitolak > jumlahDiterima Then Return 0 ElseIf jumlahDiterima > jumlahDitolak Then Return 1 Else Return -1 End If End Function
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Classifier untuk menampung data seperti jumlah kondisi tiap aturan, maksimal jumlah aturan, dan aturan-aturan yang valid. Deklarasi Class Classifier adalah sebagai berikut:
Public Class Classifier Private jumlahKondisiTiapAturan As Integer 'Berapa banyak kriteria yang diperlukan dalam membuat sebuah aturan Private maksJumlahAturan As Integer 'Maksimal aturan yang dapat dibuat Public daftarAturan As List(Of Integer()) 'Sebagai contoh, [0 1 2 3 0] artinya jika kriteria3 bernilai 0 dan kriteria2 bernilai 3 maka hasilnya adalah 0 Public stringToInteger() As Dictionary(Of String, Integer) 'Untuk menyimpan data dengan format (indeks kelompok kriteria dalam sebuah kriteria)(nilai kelompok kriteria tersebut) Private Shared rnd As Random Public Sub New(ByVal jumlahKondisiTiapAturan As Integer, ByVal maksJumlahAturan As Integer) Me.jumlahKondisiTiapAturan = jumlahKondisiTiapAturan Me.maksJumlahAturan = maksJumlahAturan daftarAturan = New List(Of Integer())() rnd = New Random(0) End Sub . . . End Class
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.