Metode Naïve Bayes Classifier (NBC) merupakan salah satu algoritma dalam teknik data mining yang menerapkan teori Bayes dalam klasifikasi (Santosa 2007
). Ciri utama dari Naïve Bayes Classifier ini adalah asumsi yg sangat kuat (naïf) akan independensi dari masing-masing kondisi / kejadian
[
author : cahya dsn
,
published on : April 13, 2018
updated on : October 17, 2019
]
Naïve Bayes merupakan sebuah pengklasifikasian probabilistik sederhana yang menghitung sekumpulan probabilitas dengan menjumlahkan frekuensi dan kombinasi nilai dari dataset yang diberikan. Algoritma mengunakan teorema Bayes dan mengasumsikan semua atribut independen atau tidak saling ketergantungan yang diberikan oleh nilai pada variabel kelas(Patil and Sherekar 2013
).
Definisi lain mengatakan Naïve Bayes merupakan pengklasifikasian dengan metode probabilitas dan statistik yang dikemukan oleh ilmuwan Inggris Thomas Bayes, yaitu memprediksi peluang di masa depan berdasarkan pengalaman di masa sebelumnya (Bustami 2013
).
Naïve Bayes didasarkan pada asumsi penyederhanaan bahwa nilai atribut secara kondisional saling bebas jika diberikan nilai output. Dengan kata lain, diberikan nilai output, probabilitas mengamati secara bersama adalah produk dari probabilitas individu (Ridwan 2013
). Keuntungan penggunaan Naive Bayes adalah bahwa metode ini hanya membutuhkan jumlah data pelatihan (Training Data) yang kecil untuk menentukan estimasi paremeter yang diperlukan dalam proses pengklasifikasian. Naive Bayes sering bekerja jauh lebih baik dalam kebanyakan situasi dunia nyata yang kompleks dari pada yang diharapkan (Pattekari and Parveen 2012
)
Naive Bayes Classifier dinilai bekerja sangat baik dibanding dengan model classifier lainnya, yaitu Naïve Bayes Classifier memiliki tingkat akurasi yg lebih baik dibanding model classifier lainnya(Xhemali 2009
).
Sebelum menjelaskan Naïve Bayes Classifier ini, akan dijelaskan terlebih dahulu Teorema Bayes yang menjadi dasar dari metoda tersebut. Pada Teorema Bayes, bila terdapat dua kejadian yang terpisah (misalkan X
dan H
), maka Teorema Bayes dirumuskan sebagai berikut (Bustami 2013
).:
Teorema Bayes sering pula dikembangkan mengingat berlakunya hukum probabilitas total, menjadi seperti berikut:
H1 U H2 U H3 ... U Hn = S
H
Untuk menjelaskan Teorema Naïve Bayes, perlu diketahui bahwa proses klasifikasi memerlukan sejumlah petunjuk untuk menentukan kelas apa yang cocok bagi sampel yang dianalisis tersebut. Karena itu, Teorema Bayes di atas disesuaikan sebagai berikut:
Di mana Variabel C
merepresentasikan kelas, sementara variabel F1 ... Fn
merepresentasikan karakteristik petunjuk yang dibutuhkan untuk melakukan klasifikasi. Maka rumus tersebut menjelaskan bahwa peluang masuknya sampel karakteristik tertentu dalam kelas C
(Posterior) adalah peluang munculnya kelas C
(sebelum masuknya sampel tersebut, seringkali disebut prior), dikali dengan peluang kemunculan karakteristik-karakteristik sampel pada kelas C
(disebut juga likelihood), dibagi dengan peluang kemunculan karakteristik-karakteristik sampel secara global (disebut juga evidence). Karena itu, rumus di atas dapat pula ditulis secara sederhana sebagai berikut:
Nilai Evidence selalu tetap untuk setiap kelas pada satu sampel. Nilai dari posterior tersebut nantinya akan dibandingkan dengan nilai-nilai posterior kelas lainnya untuk menentukan ke kelas apa suatu sampel akan diklasifikasikan. Penjabaran lebih lanjut rumus Bayes tersebut dilakukan dengan menjabarkan (C,F1, ... , Fn)
menggunakan aturan perkalian sebagai berikut:
Dapat dilihat bahwa hasil penjabaran tersebut menyebabkan semakin banyak dan semakin kompleksnya faktor - faktor syarat yang mempengaruhi nilai probabilitas, yang hampir mustahil untuk dianalisa satu persatu. Akibatnya, perhitungan tersebut menjadi sulit untuk dilakukan. Disinilah digunakan asumsi independensi yang sangat tinggi (naif), bahwa masing-masing petunjuk (F1,F2 , ..., Fn
) saling bebas (independen) satu sama lain. Dengan asumsi tersebut, maka berlaku suatu kesamaan sebagai berikut:
Untuk i≠j
, sehingga
Atau dapat dituliskan dalam notasi
yang dapat dijabarkan sebagai berikut
Persamaan di atas merupakan model dari teorema Naïve Bayes yang selanjutnya akan digunakan dalam proses klasifikasi.
Untuk klasifikasi dengan data kontinyu digunakan rumus Densitas Gauss :
Alur dari metode Naive Bayes dapat dilihat pada Gambar 1 (Saleh 2015
)sebagai berikut:
Adapun keterangan dari gambar di atas adalah sebagai berikut:
atau
Teorema Naïve Bayes memiliki beberapa kelebihan dan kekurangan yaitu sebagai berikut
Teori Bayesian, mempunyai beberapa kelebihan (Grainner 1998
), yaitu:
Sedangkan kekurangan dari Teorema ini adalah :
Laplace Correction (Laplacian Estimator) atau additive smoothing
adalah suatu cara untuk menangani nilai probabilitas 0 (nol) (Manning 2009
). Dari sekian banyak data di training set, pada setiap perhitungan datanya ditambah 1 (satu) dan tidak akan membuat perbedaan yang berarti pada estimasi probabilitas sehingga bisa menghindari kasus nilai probabilitas 0 (nol). Laplace Correction ini dapat dinyatakan dalam persamaan seperti pada persamaan [NBC-12] berikut ini
Sebagai contoh, asumsikan ada class Penggunaan Listrik=sedang di suatu training set, memiliki 11 sampel, ada 3 sampel dengan Perlengkapan=sedikit, 0 sampel dengan Perlengkapan=sedang, dan 8 sampel dengan Perlengkapan=banyak.
Probabilitas dari kejadian ini tanpa Laplacian Correction adalah
P(Perlengkapan=sedikit|Penggunaan Listrik=sedang)=0.272 (dari 3/11),
P(Perlengkapan=sedang|Penggunaan Listrik=sedang)=0, dan
P(Perlengkapan=banyak|Penggunaan Listrik=sedang)=0.727 (dari 8/11).
Menggunakan Laplacian Correction dari tiga kejadian diatas, diasumsikan ada 1 sampel lagi untuk masing – masing nilai Penggunaan Listrik=sedang. Dengan cara ini, didapatkanlah probabilitas sebagai berikut (dibulatkan menjadi 3 angka dibelakang koma):
P(Perlengkapan=sedikit|Penggunaan Listrik=sedang)=0.285 (dari 4/14),
P(Perlengkapan=sedang|Penggunaan Listrik=sedang)=0.071 (dari 1/14), dan
P(Perlengkapan=banyak|Penggunaan Listrik=sedang)=0.642 (dari 9/14)
Probabilitas yang "dibenarkan" hasilnya tidak berbeda jauh dengan hasil probabilitas sebelumnya sehingga nilai probabilitas 0 (nol) dapat dihindari.
Penerapan Metode Naïve Bayes diharapkan mampu untuk memprediksi besarnya penggunaan listrik tiap rumah tangga agar lebih mudah mengatur penggunaan listrik.
Peranan listrik sangat penting bagi setiap lapisan masyarakat bahkan listrik juga sangat dibutuhkan sebagai sarana produksi dan untuk kehidupan sehari-hari, begitu pentingnya peranan listrik tentu saja berdampak pada permintaan listrik yang semakin besar tapi hal ini kiranya tidak linier dengan persediaan listrik yang belum mampu memenuhi permintaan listrik yang begitu besar tersebut. Untuk mengatasi hal ini perlu adanya campur tangan pemerintah dan masyarakat dalam menggunakan listrik dengan bijak sehingga kebutuhan listrik tidak menjadi lebih besar dari persediaan listrik. Oleh karena itu setiap rumah tangga haruslah paham penggunaan listrik yang efektif.
Untuk menentukan data yang nantinya akan dianalisis dengan Metode Naïve Bayes maka langkah pertama yang dilakukan adalah membaca data training. Pada contoh kasus ini ada sejumlah 51 data training/sampel. Adapun data training yang digunakan dapat dilihat pada tabel 1 berikut(Nasari 2014
):
No | Jumlah Tanggungan Keluarga | Luas Rumah | Pendapatan/ bulan | Daya Listrik | Perlengkapan Yang Dimiliki | Penggunaan Listrik |
---|---|---|---|---|---|---|
1 | banyak | standar | besar | tinggi | tinggi | tinggi |
2 | banyak | besar | besar | tinggi | tinggi | sedang |
3 | banyak | standar | besar | tinggi | rendah | sedang |
4 | sedikit | kecil | besar | tinggi | tinggi | sedang |
5 | sedang | standar | besar | sedang | tinggi | rendah |
6 | banyak | besar | sedang | tinggi | rendah | sedang |
7 | sedikit | besar | besar | rendah | tinggi | sedang |
8 | banyak | standar | besar | tinggi | tinggi | tinggi |
9 | sedang | standar | kecil | tinggi | tinggi | sedang |
10 | banyak | besar | besar | tinggi | tinggi | rendah |
11 | sedang | besar | besar | rendah | rendah | tinggi |
12 | banyak | kecil | besar | tinggi | rendah | tinggi |
13 | sedang | besar | besar | rendah | tinggi | rendah |
14 | banyak | standar | sedang | tinggi | tinggi | rendah |
15 | banyak | standar | besar | tinggi | tinggi | tinggi |
16 | sedang | standar | besar | sedang | tinggi | tinggi |
17 | sedang | standar | besar | sedang | tinggi | tinggi |
18 | banyak | standar | besar | tinggi | tinggi | tinggi |
19 | banyak | besar | besar | sedang | tinggi | tinggi |
20 | sedang | kecil | sedang | tinggi | tinggi | rendah |
21 | sedang | besar | besar | tinggi | tinggi | tinggi |
22 | banyak | besar | besar | tinggi | tinggi | tinggi |
23 | banyak | standar | kecil | tinggi | tinggi | tinggi |
24 | banyak | besar | sedang | tinggi | sedang | tinggi |
25 | banyak | besar | sedang | tinggi | tinggi | sedang |
26 | sedang | kecil | besar | sedang | rendah | rendah |
27 | banyak | besar | besar | tinggi | tinggi | tinggi |
28 | banyak | besar | sedang | tinggi | tinggi | tinggi |
29 | sedang | standar | besar | tinggi | tinggi | tinggi |
30 | banyak | besar | besar | tinggi | tinggi | sedang |
31 | sedikit | standar | besar | tinggi | tinggi | tinggi |
32 | sedang | kecil | besar | tinggi | sedang | tinggi |
33 | sedang | standar | besar | tinggi | tinggi | tinggi |
34 | banyak | besar | besar | tinggi | tinggi | tinggi |
35 | sedikit | standar | besar | tinggi | tinggi | sedang |
36 | sedikit | besar | sedang | rendah | tinggi | tinggi |
37 | banyak | standar | kecil | tinggi | tinggi | rendah |
38 | banyak | standar | sedang | sedang | sedang | tinggi |
39 | sedang | besar | sedang | sedang | rendah | tinggi |
40 | banyak | besar | besar | tinggi | tinggi | rendah |
41 | sedang | standar | sedang | tinggi | tinggi | tinggi |
42 | banyak | besar | besar | sedang | rendah | sedang |
43 | banyak | standar | sedang | sedang | tinggi | tinggi |
44 | sedang | standar | kecil | tinggi | rendah | tinggi |
45 | sedang | besar | kecil | sedang | tinggi | sedang |
46 | sedang | besar | besar | sedang | tinggi | rendah |
47 | sedang | kecil | besar | sedang | tinggi | tinggi |
48 | banyak | standar | kecil | sedang | sedang | rendah |
49 | sedikit | besar | besar | tinggi | tinggi | rendah |
50 | sedang | besar | sedang | tinggi | rendah | rendah |
51 | sedang | kecil | besar | tinggi | sedang | tinggi |
Pada bagian ini akan dijelaskan mengenai perhitungan peluang/probabilitas dari data training yang diberikan. Penjelasannya sendiri disajikan secara langkah per langkah agar mudah dipahami.
Terdapat dua jenis peluang (probability) yang perlu dihitung dari dataset untuk model Naive Bayes :
Dataset Penggunaan Listrik memiliki 3 kelas masalah, sehingga dapat diketahui probabilitas (P) masing-masing kelas dengan cara membagi nilai frekuensi/jumlah data untuk masing-masing kelas masalah, dengan jumlah total nilai frekuensi/jumlah data pada kelas tersebut, seperti yang ditunjukkan dalam perhitungan berikut ini :
P(penggunaan=rendah) = jumlahpenggunaan=rendah / (jumlahpenggunaan=rendah + jumlahpenggunaan=sedang + jumlahpenggunaan=tinggi)Class Probabilities ini adalah nilai peluang/probabilitas dari masing-masing kelas masalah dari tujuan yang akan diharapkan/diprediksi. Sehingga dari perhitungan -- berdasarkan data training yang diberikan -- tersebut diperoleh peluang untuk penggunaan=rendah adalah 0.235, penggunaan=sedang adalah 0.215, penggunaan=tinggi adalah 0.549,
Langkah selanjutnya adalah menghitung Conditional Probabilities, yaitu probililitas setiap nilai input terhadap nilai class Penggunaan Listrik.
Dalam perhitungannya terdapat dua macam perhitungannya
Sebagai contoh di sini adalah perhitungan untuk masing-masing peluang untuk kriteria/atribut Jumlah Tanggungan terhadap nilai class Penggunaan Listrik. Perhitungan detailnya adalah sebagai berikut:
P(tanggungan=sedikit|penggunaan=rendah) = jumlahtanggungan=sedikit dan penggunaan=rendah / jumlahpenggunaan=rendahSebagai contoh di sini adalah perhitungan mean dan standart deviasi untuk kriteria/atribut Luas Tanah terhadap nilai class Penggunaan Listrik. Perhitungan detailnya adalah sebagai berikut:
Dengan perhitungan yang sama, dapat dihitung Conditional Probabilities untuk masing-masing kriteria yang lainnya (hasil selengkapnya dapat dilihat dibagian Kriteria dan Probabilitas berikut ini).
Adapun nilai probabilitas dari data training pada tabel 1 untuk setiap kriteria dengan perhitungan sesuai perhitungan manual sebelumnya dapat dirangkum sebagai berikut:
Berdasarkan tabel 1 dapat diketahui dari 51 data terdapat : 12 data rumah tangga dengan penggunaan listrik rendah , 11 data rumah tangga dengan penggunaan listrik sedang , 28 data rumah tangga dengan penggunaan listrik tinggi.
Probabilitas kriteria penggunaan listrik dapat dilihat pada tabel 2
Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi |
12 | 11 | 28 | 0.235 | 0.215 | 0.549 |
Pada kriteria jumlah tanggungan dapat diketahui dari 51 data terdapat : 1 data rumah tangga dengan jumlah tanggungan sedikit dan penggunaan listrik rendah , 3 data rumah tangga dengan jumlah tanggungan sedikit dan penggunaan listrik sedang , 2 data rumah tangga dengan jumlah tanggungan sedikit dan penggunaan listrik tinggi , 6 data rumah tangga dengan jumlah tanggungan sedang dan penggunaan listrik rendah , 2 data rumah tangga dengan jumlah tanggungan sedang dan penggunaan listrik sedang , 12 data rumah tangga dengan jumlah tanggungan sedang dan penggunaan listrik tinggi , 5 data rumah tangga dengan jumlah tanggungan banyak dan penggunaan listrik rendah , 6 data rumah tangga dengan jumlah tanggungan banyak dan penggunaan listrik sedang , 14 data rumah tangga dengan jumlah tanggungan banyak dan penggunaan listrik tinggi.
Probabilitas kriteria jumlah tanggungan dapat dilihat pada tabel 3
Jumlah Tanggungan | Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi | |
sedikit | 1 | 3 | 2 | 1/12=0.083 | 3/11=0.272 | 2/28=0.071 |
sedang | 6 | 2 | 12 | 6/12=0.500 | 2/11=0.181 | 12/28=0.428 |
banyak | 5 | 6 | 14 | 5/12=0.416 | 6/11=0.545 | 14/28=0.500 |
Pada kriteria luas tanah dapat diketahui dari 51 data terdapat : 2 data rumah tangga dengan luas tanah kecil dan penggunaan listrik rendah , 1 data rumah tangga dengan luas tanah kecil dan penggunaan listrik sedang , 4 data rumah tangga dengan luas tanah kecil dan penggunaan listrik tinggi , 4 data rumah tangga dengan luas tanah standar dan penggunaan listrik rendah , 3 data rumah tangga dengan luas tanah standar dan penggunaan listrik sedang , 14 data rumah tangga dengan luas tanah standar dan penggunaan listrik tinggi , 6 data rumah tangga dengan luas tanah besar dan penggunaan listrik rendah , 7 data rumah tangga dengan luas tanah besar dan penggunaan listrik sedang , 10 data rumah tangga dengan luas tanah besar dan penggunaan listrik tinggi.
Probabilitas kriteria luas tanah dapat dilihat pada tabel 4
Luas Tanah | Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi | |
kecil | 2 | 1 | 4 | 2/12=0.166 | 1/11=0.090 | 4/28=0.142 |
standar | 4 | 3 | 14 | 4/12=0.333 | 3/11=0.272 | 14/28=0.500 |
besar | 6 | 7 | 10 | 6/12=0.500 | 7/11=0.636 | 10/28=0.357 |
Pada kriteria pendapatan dapat diketahui dari 51 data terdapat : 2 data rumah tangga dengan pendapatan kecil dan penggunaan listrik rendah , 2 data rumah tangga dengan pendapatan kecil dan penggunaan listrik sedang , 2 data rumah tangga dengan pendapatan kecil dan penggunaan listrik tinggi , 3 data rumah tangga dengan pendapatan sedang dan penggunaan listrik rendah , 2 data rumah tangga dengan pendapatan sedang dan penggunaan listrik sedang , 7 data rumah tangga dengan pendapatan sedang dan penggunaan listrik tinggi , 7 data rumah tangga dengan pendapatan besar dan penggunaan listrik rendah , 7 data rumah tangga dengan pendapatan besar dan penggunaan listrik sedang , 19 data rumah tangga dengan pendapatan besar dan penggunaan listrik tinggi.
Probabilitas kriteria pendapatan dapat dilihat pada tabel 5
Pendapatan | Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi | |
kecil | 2 | 2 | 2 | 2/12=0.166 | 2/11=0.181 | 2/28=0.071 |
sedang | 3 | 2 | 7 | 3/12=0.250 | 2/11=0.181 | 7/28=0.250 |
besar | 7 | 7 | 19 | 7/12=0.583 | 7/11=0.636 | 19/28=0.678 |
Pada kriteria daya listrik dapat diketahui dari 51 data terdapat : 1 data rumah tangga dengan daya listrik rendah dan penggunaan listrik rendah , 1 data rumah tangga dengan daya listrik rendah dan penggunaan listrik sedang , 2 data rumah tangga dengan daya listrik rendah dan penggunaan listrik tinggi , 4 data rumah tangga dengan daya listrik sedang dan penggunaan listrik rendah , 2 data rumah tangga dengan daya listrik sedang dan penggunaan listrik sedang , 7 data rumah tangga dengan daya listrik sedang dan penggunaan listrik tinggi , 7 data rumah tangga dengan daya listrik tinggi dan penggunaan listrik rendah , 8 data rumah tangga dengan daya listrik tinggi dan penggunaan listrik sedang , 19 data rumah tangga dengan daya listrik tinggi dan penggunaan listrik tinggi.
Probabilitas kriteria daya listrik dapat dilihat pada tabel 6
Daya Listrik | Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi | |
rendah | 1 | 1 | 2 | 1/12=0.083 | 1/11=0.090 | 2/28=0.071 |
sedang | 4 | 2 | 7 | 4/12=0.333 | 2/11=0.181 | 7/28=0.250 |
tinggi | 7 | 8 | 19 | 7/12=0.583 | 8/11=0.727 | 19/28=0.678 |
Pada kriteria perlengkapan dapat diketahui dari 51 data terdapat : 2 data rumah tangga dengan perlengkapan sedikit dan penggunaan listrik rendah , 3 data rumah tangga dengan perlengkapan sedikit dan penggunaan listrik sedang , 4 data rumah tangga dengan perlengkapan sedikit dan penggunaan listrik tinggi , 1 data rumah tangga dengan perlengkapan sedang dan penggunaan listrik rendah , tidak ada data rumah tangga dengan perlengkapan sedang dan penggunaan listrik sedang , 4 data rumah tangga dengan perlengkapan sedang dan penggunaan listrik tinggi , 9 data rumah tangga dengan perlengkapan banyak dan penggunaan listrik rendah , 8 data rumah tangga dengan perlengkapan banyak dan penggunaan listrik sedang , 20 data rumah tangga dengan perlengkapan banyak dan penggunaan listrik tinggi.
Probabilitas kriteria perlengkapan dapat dilihat pada tabel 7
Perlengkapan | Jumlah Kejadian 'Penggunaan Listrik' | Probabilitas | ||||
---|---|---|---|---|---|---|
Rendah | Sedang | Tinggi | Rendah | Sedang | Tinggi | |
sedikit | 2 | 3 | 4 | 2/12=0.166 | 4/14=0.285 | 4/28=0.142 |
sedang | 1 | 0 | 4 | 1/12=0.083 | 1/14=0.071 | 4/28=0.142 |
banyak | 9 | 8 | 20 | 9/12=0.750 | 9/14=0.642 | 20/28=0.714 |
Dari nilai probabilitas di atas akan diuji data sebanyak 51 data dan dihasilkan hasil klasifikasi penggunaan listrik seperti terlihat pada TABEL 8. Untuk memudahkan pemahaman perhitungan prediksinya dicontohkan dalam perhitungan berikut:
Pada data ke-43; untuk Jumlah Tanggungan=banyak , Luas Tanah=standar , Pendapatan=sedang , Daya Listrik=sedang , Perlengkapan=banyak bisa dihitung nilai prediksi probabilitas dari masing-masing nilai kelasnya (berdasarkan persamaan NBC-08 atau NBC-09) sebagai berikut :
P(penggunaan=rendah|X)=(P(jumlah tanggungan=banyak|penggunaan=rendah)*P(luas tanah=standar|penggunaan=rendah)*P(pendapatan=sedang|penggunaan=rendah)*P(daya listrik=sedang|penggunaan=rendah)*P(perlengkapan=banyak|penggunaan=rendah)) * P(penggunaan=rendah)
P(penggunaan=rendah|X)=(0.416 * 0.333 * 0.250 * 0.333 * 0.750) * 0.235
P(penggunaan=rendah|X)=0.0020424836601307
P(penggunaan=sedang|X)=(P(jumlah tanggungan=banyak|penggunaan=sedang)*P(luas tanah=standar|penggunaan=sedang)*P(pendapatan=sedang|penggunaan=sedang)*P(daya listrik=sedang|penggunaan=sedang)*P(perlengkapan=banyak|penggunaan=sedang)) * P(penggunaan=sedang)
P(penggunaan=sedang|X)=(0.545 * 0.272 * 0.181 * 0.181 * 0.642) * 0.215
P(penggunaan=sedang|X)=0.00068186553359135
P(penggunaan=tinggi|X)=(P(jumlah tanggungan=banyak|penggunaan=tinggi)*P(luas tanah=standar|penggunaan=tinggi)*P(pendapatan=sedang|penggunaan=tinggi)*P(daya listrik=sedang|penggunaan=tinggi)*P(perlengkapan=banyak|penggunaan=tinggi)) * P(penggunaan=tinggi)
P(penggunaan=tinggi|X)=(0.500 * 0.500 * 0.250 * 0.250 * 0.714) * 0.549
P(penggunaan=tinggi|X)=0.0061274509803922
Dari perhitungan tersebut diperoleh nilai probabilitas P(penggunaan=tinggi|X) adalah yang tertinggi (0.0061274509803922), sehingga prediksinya adalah Penggunaan Listriknya Tinggi
No | Class | Input Kategorikal | Probabilitas | Prediction | ||||||
---|---|---|---|---|---|---|---|---|---|---|
X1 | X2 | X3 | X4 | X5 | rendah | sedang | tinggi | |||
1 | tinggi | banyak | standar | besar | tinggi | banyak | 0.0083401416122004 | 0.0095461174702789 | 0.045143057222889 | tinggi |
2 | sedang | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
3 | sedang | banyak | standar | besar | tinggi | sedikit | 0.0018533648027112 | 0.0042427188756795 | 0.0090286114445778 | tinggi |
4 | sedang | sedikit | kecil | besar | tinggi | banyak | 0.00083401416122004 | 0.0015910195783798 | 0.0018425737641996 | tinggi |
5 | rendah | sedang | standar | besar | sedang | banyak | 0.005718954248366 | 0.00079550978918991 | 0.014255702280912 | tinggi |
6 | sedang | banyak | besar | sedang | tinggi | sedikit | 0.0011914488017429 | 0.002828479250453 | 0.0023759503801521 | sedang |
7 | sedang | sedikit | besar | besar | rendah | banyak | 0.00035743464052288 | 0.0013921421310823 | 0.00048488783268409 | sedang |
8 | tinggi | banyak | standar | besar | tinggi | banyak | 0.0083401416122004 | 0.0095461174702789 | 0.045143057222889 | tinggi |
9 | sedang | sedang | standar | kecil | tinggi | banyak | 0.002859477124183 | 0.00090915404478846 | 0.0040730577945464 | tinggi |
10 | rendah | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
11 | tinggi | sedang | besar | besar | rendah | sedikit | 0.00047657952069717 | 0.00041248655735773 | 0.00058186539922091 | tinggi |
12 | tinggi | banyak | kecil | besar | tinggi | sedikit | 0.0009266824013556 | 0.0014142396252265 | 0.0025796032698794 | tinggi |
13 | rendah | sedang | besar | besar | rendah | banyak | 0.0021446078431373 | 0.00092809475405489 | 0.0029093269961046 | tinggi |
14 | rendah | banyak | standar | sedang | tinggi | banyak | 0.0035743464052288 | 0.0027274621343654 | 0.016631652661064 | tinggi |
15 | tinggi | banyak | standar | besar | tinggi | banyak | 0.0083401416122004 | 0.0095461174702789 | 0.045143057222889 | tinggi |
16 | tinggi | sedang | standar | besar | sedang | banyak | 0.005718954248366 | 0.00079550978918991 | 0.014255702280912 | tinggi |
17 | tinggi | sedang | standar | besar | sedang | banyak | 0.005718954248366 | 0.00079550978918991 | 0.014255702280912 | tinggi |
18 | tinggi | banyak | standar | besar | tinggi | banyak | 0.0083401416122004 | 0.0095461174702789 | 0.045143057222889 | tinggi |
19 | tinggi | banyak | besar | besar | sedang | banyak | 0.0071486928104575 | 0.0055685685243293 | 0.01187975190076 | tinggi |
20 | rendah | sedang | kecil | sedang | tinggi | banyak | 0.0021446078431373 | 0.00030305134826282 | 0.0040730577945464 | tinggi |
21 | tinggi | sedang | besar | besar | tinggi | banyak | 0.015012254901961 | 0.0074247580324391 | 0.027638606462993 | tinggi |
22 | tinggi | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
23 | tinggi | banyak | standar | kecil | tinggi | banyak | 0.0023828976034858 | 0.0027274621343654 | 0.0047519007603041 | tinggi |
24 | tinggi | banyak | besar | sedang | tinggi | sedang | 0.00059572440087146 | 0.00070711981261325 | 0.0023759503801521 | tinggi |
25 | sedang | banyak | besar | sedang | tinggi | banyak | 0.0053615196078431 | 0.0063640783135192 | 0.01187975190076 | tinggi |
26 | rendah | sedang | kecil | besar | sedang | sedikit | 0.00063543936092956 | 0.00011785330210221 | 0.00081461155890928 | tinggi |
27 | tinggi | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
28 | tinggi | banyak | besar | sedang | tinggi | banyak | 0.0053615196078431 | 0.0063640783135192 | 0.01187975190076 | tinggi |
29 | tinggi | sedang | standar | besar | tinggi | banyak | 0.010008169934641 | 0.0031820391567596 | 0.038694049048191 | tinggi |
30 | sedang | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
31 | tinggi | sedikit | standar | besar | tinggi | banyak | 0.0016680283224401 | 0.0047730587351394 | 0.0064490081746985 | tinggi |
32 | tinggi | sedang | kecil | besar | tinggi | sedang | 0.00055600944081336 | 0.00011785330210221 | 0.0022110885170395 | tinggi |
33 | tinggi | sedang | standar | besar | tinggi | banyak | 0.010008169934641 | 0.0031820391567596 | 0.038694049048191 | tinggi |
34 | tinggi | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
35 | sedang | sedikit | standar | besar | tinggi | banyak | 0.0016680283224401 | 0.0047730587351394 | 0.0064490081746985 | tinggi |
36 | tinggi | sedikit | besar | sedang | rendah | banyak | 0.0001531862745098 | 0.00039775489459495 | 0.00017864288572572 | sedang |
37 | rendah | banyak | standar | kecil | tinggi | banyak | 0.0023828976034858 | 0.0027274621343654 | 0.0047519007603041 | tinggi |
38 | tinggi | banyak | standar | sedang | sedang | sedang | 0.00022694262890341 | 7.5762837065705E-5 | 0.0012254901960784 | tinggi |
39 | tinggi | sedang | besar | sedang | sedang | sedikit | 0.00081699346405229 | 0.00023570660420442 | 0.00075030012004802 | rendah |
40 | rendah | banyak | besar | besar | tinggi | banyak | 0.012510212418301 | 0.022274274097317 | 0.032245040873492 | tinggi |
41 | tinggi | sedang | standar | sedang | tinggi | banyak | 0.0042892156862745 | 0.00090915404478846 | 0.014255702280912 | tinggi |
42 | sedang | banyak | besar | besar | sedang | sedikit | 0.0015885984023239 | 0.0024749193441464 | 0.0023759503801521 | sedang |
43 | tinggi | banyak | standar | sedang | sedang | banyak | 0.0020424836601307 | 0.00068186553359135 | 0.0061274509803922 | tinggi |
44 | tinggi | sedang | standar | kecil | tinggi | sedikit | 0.00063543936092956 | 0.00040406846435043 | 0.00081461155890928 | tinggi |
45 | sedang | sedang | besar | kecil | sedang | banyak | 0.0024509803921569 | 0.00053033985945994 | 0.0010718573143543 | rendah |
46 | rendah | sedang | besar | besar | sedang | banyak | 0.008578431372549 | 0.0018561895081098 | 0.010182644486366 | tinggi |
47 | tinggi | sedang | kecil | besar | sedang | banyak | 0.002859477124183 | 0.00026516992972997 | 0.0040730577945464 | tinggi |
48 | rendah | banyak | standar | kecil | sedang | sedang | 0.00015129508593561 | 7.5762837065705E-5 | 0.00035014005602241 | tinggi |
49 | rendah | sedikit | besar | besar | tinggi | banyak | 0.0025020424836601 | 0.011137137048659 | 0.0046064344104989 | sedang |
50 | rendah | sedang | besar | sedang | tinggi | sedikit | 0.0014297385620915 | 0.00094282641681767 | 0.0020365288972732 | tinggi |
51 | tinggi | sedang | kecil | besar | tinggi | sedang | 0.00055600944081336 | 0.00011785330210221 | 0.0022110885170395 | tinggi |
Berdasarkan TABEL 8 di atas dapat dilihat persentase untuk Correctly Classified Instance adalah sebesar 56.862 % sementara persentase untuk Incorrectly Classified Instance adalah sebesar 43.137 %. Di mana dari 51 data penggunaan listrik rumah tangga, ada sebanyak 29 data penggunaan listrik rumah tangga berhasil diklasifikasikan dengan benar dan sebanyak 22 data penggunaan listrik rumah tangga tidak berhasil diklasifikasikan dengan benar.
Sebagai pelengkap artikel Metode Klasifikasi Naïve Bayes / Naïve Bayes Classifier; pada bagian ini akan dibahas langkah-langkah dalam implementasinya dengan bahasa pemrograman PHP dan database MySQL/MariaDB.
Sebagai bahan pembelajaran Metode Naïve Bayes Classifier ini; dibuat database (dalam hal ini menggunakan MySQL/MariaDB Database server) sebagai berikut:
CREATE DATABASE IF NOT EXISTS db_dm; USE db_dm;
Awalnya membuat dulu database dengan nama db_dm
jika belum ada database dengan nama tersebut, kemudian gunakan database tersebut dengan memakai sintak USE db_dm;
nbc_atribut
Dari data pada fakta di atas, dapat di representasikan kriteria/atribut dan parameter yang berperan dalam permasalahan ini dalam bentuk tabel database, yaitu tabel nbc_atribut
sebagai berikut:
DROP TABLE IF EXISTS nbc_atribut; CREATE TABLE IF NOT EXISTS nbc_atribut( id_atribut TINYINT(3) UNSIGNED AUTO_INCREMENT, atribut VARCHAR(100) NOT NULL, PRIMARY KEY(id_atribut) )ENGINE=MyISAM; INSERT INTO nbc_atribut(id_atribut,atribut) VALUES (1,'Penggunaan Listrik'), (2,'Jumlah Tanggungan Keluarga'), (3,'Luas Tanah'), (4,'Pendapatan /bulan'), (5,'Daya Listrik'), (6,'Perlengkapan yang dimiliki');
Record pertama dalam tabel nbc_atribut
ini (Penggunaan Listrik1) adalah merupakan class atribut, yang merupakan atribut tujuan.
nbc_parameter
Berikutnya adalah data mengenai parameter-parameter/nilai dari tiap kriteria/atribut yang akan diperhitungkan -- sesuai dengan contoh kasus di atas -- dengan dibuatkan satu tabel baru bernama nbc_parameter
.
DROP TABLE IF EXISTS nbc_parameter; CREATE TABLE IF NOT EXISTS nbc_parameter( id_parameter TINYINT(3) UNSIGNED AUTO_INCREMENT, id_atribut TINYINT(3) UNSIGNED NOT NULL, nilai TINYINT(3) UNSIGNED NOT NULL, parameter VARCHAR(100) NOT NULL, PRIMARY KEY(id_parameter) )ENGINE=MyISAM; INSERT INTO nbc_parameter(id_atribut,nilai,parameter) VALUES (1,0,'rendah'),(1,1,'sedang'),(1,2,'tinggi'), (2,0,'sedikit'),(2,1,'sedang'),(2,2,'banyak'), (3,0,'kecil'),(3,1,'standar'),(3,2,'besar'), (4,0,'kecil'),(4,1,'sedang'),(4,2,'besar'), (5,0,'rendah'),(5,1,'sedang'),(5,2,'tinggi'), (6,0,'sedikit'),(6,1,'sedang'),(6,2,'banyak');
nbc_responden
Tabel nbc_responden
bersifat optional, tabel ini digunakan untuk menyimpan data detail dari responder dan bisa ditambahkan field/kolom lain jika diperlukan
DROP TABLE IF EXISTS nbc_responden; CREATE TABLE IF NOT EXISTS nbc_responden( id_responden TINYINT(3) UNSIGNED AUTO_INCREMENT, responden VARCHAR(50), PRIMARY KEY(id_responden) )ENGINE=MyISAM; INSERT INTO nbc_responden(id_responden,responden) VALUES (1,'Responden 1'),(2,'Responden 2'),(3,'Responden 3'),(4,'Responden 4'),(5,'Responden 5'), (6,'Responden 6'),(7,'Responden 7'),(8,'Responden 8'),(9,'Responden 9'),(10,'Responden 10'), (11,'Responden 11'),(12,'Responden 12'),(13,'Responden 13'),(14,'Responden 14'),(15,'Responden 15'), (16,'Responden 16'),(17,'Responden 17'),(18,'Responden 18'),(19,'Responden 19'),(20,'Responden 20'), (21,'Responden 21'),(22,'Responden 22'),(23,'Responden 23'),(24,'Responden 24'),(25,'Responden 25'), (26,'Responden 26'),(27,'Responden 27'),(28,'Responden 28'),(29,'Responden 29'),(30,'Responden 30'), (31,'Responden 31'),(32,'Responden 32'),(33,'Responden 33'),(34,'Responden 34'),(35,'Responden 35'), (36,'Responden 36'),(37,'Responden 37'),(38,'Responden 38'),(39,'Responden 39'),(40,'Responden 40'), (41,'Responden 41'),(42,'Responden 42'),(43,'Responden 43'),(44,'Responden 44'),(45,'Responden 45'), (46,'Responden 46'),(47,'Responden 47'),(48,'Responden 48'),(49,'Responden 49'),(50,'Responden 50'), (51,'Responden 51');
nbc_data
Data-data training, yaitu data-data sample yang akan diperhitungkan -- sesuai dengan contoh kasus di atas -- disimpan pada satu tabel baru bernama nbc_data
sebagai berikut.
DROP TABLE IF EXISTS nbc_data; CREATE TABLE IF NOT EXISTS nbc_data( id_data INT(11) UNSIGNED AUTO_INCREMENT, id_responden TINYINT(3) UNSIGNED NOT NULL, id_atribut TINYINT(3) UNSIGNED NOT NULL, id_parameter TINYINT(3) UNSIGNED NOT NULL, PRIMARY KEY(id_data) )ENGINE=MyISAM; INSERT INTO nbc_data(id_responden,id_atribut,id_parameter) VALUES (1,1,2),(1,2,2),(1,3,1),(1,4,2),(1,5,2),(1,6,2), (2,1,1),(2,2,2),(2,3,2),(2,4,2),(2,5,2),(2,6,2), (3,1,1),(3,2,2),(3,3,1),(3,4,2),(3,5,2),(3,6,0), (4,1,1),(4,2,0),(4,3,0),(4,4,2),(4,5,2),(4,6,2), (5,1,0),(5,2,1),(5,3,1),(5,4,2),(5,5,1),(5,6,2), (6,1,1),(6,2,2),(6,3,2),(6,4,1),(6,5,2),(6,6,0), (7,1,1),(7,2,0),(7,3,2),(7,4,2),(7,5,0),(7,6,2), (8,1,2),(8,2,2),(8,3,1),(8,4,2),(8,5,2),(8,6,2), (9,1,1),(9,2,1),(9,3,1),(9,4,0),(9,5,2),(9,6,2), (10,1,0),(10,2,2),(10,3,2),(10,4,2),(10,5,2),(10,6,2), (11,1,2),(11,2,1),(11,3,2),(11,4,2),(11,5,0),(11,6,0), (12,1,2),(12,2,2),(12,3,0),(12,4,2),(12,5,2),(12,6,0), (13,1,0),(13,2,1),(13,3,2),(13,4,2),(13,5,0),(13,6,2), (14,1,0),(14,2,2),(14,3,1),(14,4,1),(14,5,2),(14,6,2), (15,1,2),(15,2,2),(15,3,1),(15,4,2),(15,5,2),(15,6,2), (16,1,2),(16,2,1),(16,3,1),(16,4,2),(16,5,1),(16,6,2), (17,1,2),(17,2,1),(17,3,1),(17,4,2),(17,5,1),(17,6,2), (18,1,2),(18,2,2),(18,3,1),(18,4,2),(18,5,2),(18,6,2), (19,1,2),(19,2,2),(19,3,2),(19,4,2),(19,5,1),(19,6,2), (20,1,0),(20,2,1),(20,3,0),(20,4,1),(20,5,2),(20,6,2), (21,1,2),(21,2,1),(21,3,2),(21,4,2),(21,5,2),(21,6,2), (22,1,2),(22,2,2),(22,3,2),(22,4,2),(22,5,2),(22,6,2), (23,1,2),(23,2,2),(23,3,1),(23,4,0),(23,5,2),(23,6,2), (24,1,2),(24,2,2),(24,3,2),(24,4,1),(24,5,2),(24,6,1), (25,1,1),(25,2,2),(25,3,2),(25,4,1),(25,5,2),(25,6,2), (26,1,0),(26,2,1),(26,3,0),(26,4,2),(26,5,1),(26,6,0), (27,1,2),(27,2,2),(27,3,2),(27,4,2),(27,5,2),(27,6,2), (28,1,2),(28,2,2),(28,3,2),(28,4,1),(28,5,2),(28,6,2), (29,1,2),(29,2,1),(29,3,1),(29,4,2),(29,5,2),(29,6,2), (30,1,1),(30,2,2),(30,3,2),(30,4,2),(30,5,2),(30,6,2), (31,1,2),(31,2,0),(31,3,1),(31,4,2),(31,5,2),(31,6,2), (32,1,2),(32,2,1),(32,3,0),(32,4,2),(32,5,2),(32,6,1), (33,1,2),(33,2,1),(33,3,1),(33,4,2),(33,5,2),(33,6,2), (34,1,2),(34,2,2),(34,3,2),(34,4,2),(34,5,2),(34,6,2), (35,1,1),(35,2,0),(35,3,1),(35,4,2),(35,5,2),(35,6,2), (36,1,2),(36,2,0),(36,3,2),(36,4,1),(36,5,0),(36,6,2), (37,1,0),(37,2,2),(37,3,1),(37,4,0),(37,5,2),(37,6,2), (38,1,2),(38,2,2),(38,3,1),(38,4,1),(38,5,1),(38,6,1), (39,1,2),(39,2,1),(39,3,2),(39,4,1),(39,5,1),(39,6,0), (40,1,0),(40,2,2),(40,3,2),(40,4,2),(40,5,2),(40,6,2), (41,1,2),(41,2,1),(41,3,1),(41,4,1),(41,5,2),(41,6,2), (42,1,1),(42,2,2),(42,3,2),(42,4,2),(42,5,1),(42,6,0), (43,1,2),(43,2,2),(43,3,1),(43,4,1),(43,5,1),(43,6,2), (44,1,2),(44,2,1),(44,3,1),(44,4,0),(44,5,2),(44,6,0), (45,1,1),(45,2,1),(45,3,2),(45,4,0),(45,5,1),(45,6,2), (46,1,0),(46,2,1),(46,3,2),(46,4,2),(46,5,1),(46,6,2), (47,1,2),(47,2,1),(47,3,0),(47,4,2),(47,5,1),(47,6,2), (48,1,0),(48,2,2),(48,3,1),(48,4,0),(48,5,1),(48,6,1), (49,1,0),(49,2,0),(49,3,2),(49,4,2),(49,5,2),(49,6,2), (50,1,0),(50,2,1),(50,3,2),(50,4,1),(50,5,2),(50,6,0), (51,1,2),(51,2,1),(51,3,0),(51,4,2),(51,5,2),(51,6,1);
Sebelum dilakukan perhitungan-perhitungan menggunakan metoda Naive Bayes Classifier dengan menggunakan PHP, maka terlebih dahulu kita menyiapkan data yang akan diolah dengan mengambil (fetching) data dari database, dan disimpan (assign) ke dalam variabel-variabel PHP.
Data-data yang diambil tersebut meliputi data-data primer -- yaitu data kriteria dan parameternya -- serta data-data sekunder yaitu data training (nilai)
Sebelum melalukan operasi dengan data dari database, perlu dibuat script untuk koneksi ke database terlebih dahulu. Dari database yang sudah dibuat, kita bisa membuat script php untuk membuat koneksi ke database server dengan extension mysqli sebagai berikut:
<?php
//-- konfigurasi database
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'db_dm';
//-- koneksi ke database server dengan extension mysqli
$db = new mysqli($dbhost,$dbuser,$dbpass,$dbname);
//-- hentikan program dan tampilkan pesan kesalahan jika koneksi gagal
if ($db->connect_error) {
die('Connect Error ('.$db->connect_errno.')'.$db->connect_error);
}
?>
Sesuaikan nilai-nilai $dbhost,$dbuser,$dbpass
dan $dbname
dengan konfigurasi database yg digunakan.
Data atribut yang akan digunakan dalam perhitungan metode Naïve Bayes Classifier ini diambil dari tabel nbc_atribut
dan dimasukkan ke dalam variabel $atribut
yang berupa array multidimensi. Variabel $atribut
ini mempunyai index berupa id_atribut
dan berisi item data nama atribut dari masing-masing atribut tersebut.
<?php
//-- query untuk mendapatkan semua data atribut di tabel nbc_atribut
$sql = 'SELECT * FROM nbc_atribut';
$result = $db->query($sql);
//-- menyiapkan variable penampung berupa array
$atribut=array();
//-- melakukan iterasi pengisian array untuk tiap record data yang didapat
foreach ($result as $row) {
$atribut[$row['id_atribut']]=$row['atribut'];
}
?>
Data nilai parameter yang akan digunakan dalam perhitungan berikutnya, diambil dari tabel nbc_parameter
dan dimasukkan ke dalam variabel array multidimensi $parameter
.
<?php
//-- query untuk mendapatkan semua data atribut di tabel nbc_atribut
$sql = 'SELECT * FROM nbc_parameter ORDER BY id_atribut,id_parameter';
$result = $db->query($sql);
//-- menyiapkan variable penampung berupa array
$parameter=array();
$id_atribut=0;
//-- melakukan iterasi pengisian array untuk tiap record data yang didapat
foreach ($result as $row) {
if($id_atribut!=$row['id_atribut']){
$parameter[$row['id_atribut']]=array();
$id_atribut=$row['id_atribut'];
}
$parameter[$row['id_atribut']][$row['nilai']]=$row['parameter'];
}
?>
Sebagai contoh adalah, dari record yang pertama didapat data array $parameter[1][0]='rendah'
. Indeks pertama dari variabel $parameter
tersebut adalah nilai dari id_atribut
, dan indeks keduanya adalah nilai
-nya (numerik), dan isinya berupa data literal (string) dari parameter tersebut.
Nilai data training yang tersimpan dalam tabel nbc_data
dan nbc_responder
diambil dan dimasukkan dalam variabel $data
untuk diolah pada perhitungan berikutnya. Pengambilan nilai data training tersebut dapat dituliskan dalam script PHP sebagai berikut:
<?php
//-- query untuk mendapatkan semua data training di tabel nbc_responden dan nbc_data
$sql = 'SELECT * FROM nbc_data a JOIN nbc_responden b USING(id_responden) ORDER BY a.id_data';
$result = $db->query($sql);
//-- menyiapkan variable penampung berupa array
$data=array();
$responden=array();
$id_responden=0;
//-- melakukan iterasi pengisian array untuk tiap record data yang didapat
foreach ($result as $row) {
if($id_responden!=$row['id_responden']){
$responden[$row['id_responden']]=$row['responden'];
$data[$row['id_responden']]=array();
$id_responden=$row['id_responden'];
}
$data[$row['id_responden']][$row['id_atribut']]=$row['id_parameter'];
}
//-- menampilkan data training dalam bentuk tabel
?>
<table border='1'>
<caption>TABEL 1 : Data Training</caption>
<tr><th>Responden</th>
<?php
//-- menampilkan header table
for($i=2;$i<=$jml_atribut;$i++){
echo "<th>{$atribut[$i]}</th>";
}
?>
<th><?php echo $atribut[1];?></th></tr>
<?php
//-- menampilkan data secara literal
foreach($data as $id_responden=>$dt_atribut){
echo "<tr><td>{$responden[$id_responden]}</td>";
for($i=2;$i<=$jml_atribut;$i++){
echo "<td>{$parameter[$i][$dt_atribut[$i]]}</td>";
}
echo "<td>{$parameter[1][$dt_atribut[1]]}</td></tr>";
}
?>
</table>
Dari script tersebut didapatkan nilai data training , semisal untuk data dari record pertama, yaitu $data[1][1]=2
; yang maksudnya adalah Nilai data training dari responder #
1 untuk atribut #1 (Penggunaan Listrik1) adalah = 2 (tinggi)
Pada bagian ini dihitung probabilitas dari tiap-tiap nilai atribut dan kelas dari data training yang diberikan
Perhitungan yang dilakukan meliputi penghitungan jumlah data/frekuensi untuk setiap nilai atribut dan kelas, penghitungan nilai probabilitas tiap nilai kelas (Class Probabilities), serta penghitungan nilai probabilitas tiap nilai atribut (Conditional Probabilities)
Sebelum menghitung nilai probabilitas/peluang untuk setiap nilai atribut dan kelas dari data training, maka dihitung terlebih dahulu frekuensi/jumlah data untuk maasing-masing nilai atribut dan kelasnya sebagai berikut:
<?php
//-- menyiapkan variable penampung utk freq tiap atribut berupa array $freq
$freq=array();
//-- inisialisasi data awal $freq
for($i=2;$i<=$jml_atribut;$i++){
for($j=0;$j<3;$j++){
for($k=0;$k<3;$k++){
$freq[$i][$j][$k]=0;
}
}
}
//-- menyiapkan variable penampung utk freq prior berupa array $prior_freq
$prior_freq=array();
//-- iterasi tiap data training
foreach($data as $i=>$v){
//-- hitung freq tiap atribut
for($j=2;$j<=$jml_atribut;$j++){
$freq[$j][$v[$j]][$v[1]]+=1;
}
//-- hitung feq prior/kelas
if(!isset($prior_freq[$v[1]])) $prior_freq[$v[1]]=0;
$prior_freq[$v[1]]+=1;
}
ksort($prior_freq);
//-- menampilkan tabel frekuensi/jumlah data kelas
?>
<table border='1'>
<caption>TABEL 2 : Jumlah Data Kelas <?php echo $atribut[1];?></caption>
<tr><?php foreach($parameter[1] as $nilai=>$param){ echo "<th>{$param}</th>"; }?></tr>
<tr><?php foreach($prior_freq as $nilai=>$nfreq){ echo "<td>{$nfreq}</td>"; }?></tr>
</table>
<?php
//-- menampilkan tabel frekuensi/jumlah data tiap atribut
for($i=2;$i<=$jml_atribut;$i++){
echo "<table border='1'>";
//-- caption tabel utk masing-masing atribut
echo "<caption>TABEL ".($i+1)." : Jumlah Data Atribut {$atribut[$i]}</caption>";
echo "<tr><th rowspan='2'>{$atribut[1]}</th><th colspan='3'>{$atribut[$i]}</th></tr><tr>";
//-- item nilai literal tiap atribut
foreach($parameter[$i] as $nilai=>$param){
echo "<th>{$param}</th>";
}
echo "</tr>";
//-- iterasi utk tiap nilai kelas
foreach($parameter[1] as $n=>$p){
echo "<tr><td>{$p}</td>";
//-- iterasi jumlah data/freq tiap nilai atribut
for($j=0;$j<=2;$j++){
echo "<td>{$freq[$i][$j][$n]}</td>";
}
echo "</tr>";
}
echo "</table>";
}
?>
Perhitungan Class Probabilities adalah jumlah/frekuensi data untuk setiap nilai kelas dibagi dengan total jumlah/frekuensi data training
<?php
//-- menyiapkan variable penampung untuk class probabilities $prior
$prior=array();
//-- hitung nilai masing2 class probabilities
foreach($prior_freq as $p=>$v){
$prior[$p]=$v/array_sum($prior_freq);
}
ksort($prior);
?>
<table border='1'>
<caption>TABEL 8 : Probabilitas Kelas <?php echo $atribut[1];?></caption>
<tr><?php foreach($parameter[1] as $nilai=>$param){ echo "<th>{$param}</th>"; }?></tr>
<tr><?php foreach($prior as $nilai=>$nprior){ echo "<td>{$nprior}</td>"; }?></tr>
</table>
Perhitungan Conditional Probabilities di sini adalah jumlah/frekuensi data untuk setiap nilai atribut terhadap nilai kelas dibagi dengan jumlah/frekuensi data nilai kelas tersebut. Pada perhitungan ini dimasukkan juga routine untuk mengecek apakah ada jumlah/frekuensi data yang 0(nol) pada nilai kelas yang diperhitungkan tersebut. Jika ditemukan nilai 0(nol) maka akan dilakukan Laplace Correction pada perhitungan probabilitas tersebut.
<?php
//-- menyiapkan variable penampung utk conditional probabilities $likehood
$likehood=array();
//-- iterasi mulai atribut ke-2 sampai terakhir
for($i=2;$i<=$jml_atribut;$i++){
//-- iterasi nilai atribut
for($j=0;$j<3;$j++){
//-- iterasi nilai kelas
for($k=0;$k<3;$k++){
//-- tes kondisi jika terdapat freq yang 0(nol) utk kelas=$k
$t_nol=($freq[$i][0][$k]==0 || $freq[$i][1][$k]==0 || $freq[$i][2][$k]==0);
//-- lakukan laplace correction jika ditemukan freq 0(nol) $t_nol=true
$likehood[$i][$j][$k]=($freq[$i][$j][$k]+($t_nol?1:0))/($prior_freq[$k]+($t_nol?count($prior_freq):0));
}
}
}
//-- menampilkan tabel probabilitas tiap atribut
for($i=2;$i<=$jml_atribut;$i++){
echo "<table border='1'>";
//-- caption tabel utk masing-masing atribut
echo "<caption>TABEL ".($i+7)." : Probabilitas Atribut {$atribut[$i]}</caption>";
echo "<tr><th rowspan='2'>{$atribut[1]}</th><th colspan='3'>{$atribut[$i]}</th></tr><tr>";
//-- item nilai literal tiap atribut
foreach($parameter[$i] as $nilai=>$param){
echo "<th>{$param}</th>";
}
echo "</tr>";
//-- iterasi utk tiap nilai kelas
foreach($parameter[1] as $n=>$p){
echo "<tr><td>{$p}</td>";
//-- iterasi probabilitas tiap nilai atribut
for($j=0;$j<=2;$j++){
echo "<td>{$likehood[$i][$j][$n]}</td>";
}
echo "</tr>";
}
echo "</table>";
}
?>
Pengujian terhadap data training dibandingkan dengan hasil prediksi, dan memprediksi nilai kelas terhadap inputan sembarang
Pengujian data yang pertama dilakukan terhadap data training dengan membandingkan nilai kelas pada data training dengan hasil prediksi dari perhitungan probabilitas dengan metode Naïve Bayes. Hasil yang diperoleh berupa prosentase perbandingan prediksi yang benar (Correctly Classified Instance) dan prosentase prediksi yang tidak benar (Incorrectly Classified Instance)
<?php
//-- menyiapkan variabel penampung probabilitas per data training thd kelas
$prob=array();
//-- inisialisasi jumlah kumulatif prediksi benar dari data training
$right=0;
//-- iterasi utk setiap data training
foreach($data as $n=>$v){
$m=array();
//-- iterasi utk setiap nilai kelas
for($i=0;$i<3;$i++){
//-- inisialisasi probabilitas awal
$m[$i]=1;
//-- perkalian nilai probabilitas tiap atribut
for($j=2;$j<=$jml_atribut;$j++){
$m[$i]*=$likehood[$j][$v[$j]][$i];
}
//-- kalikan dengan prior probabilitasnya
$m[$i]*=$prior[$i];
}
//-- menentukan nilai prediksi kelas per data training
$predict[$n]=array_search(max($m),$m);
$prob[$n]=$m;
//-- hitung kumulatif prediksi yang benar
$right+=($predict[$n]==$v[1]?1:0);
}
//-- menampilkan prosentase data training yg diprediksi benar
echo "Correctly Classified Instance = ".($right/count($data)*100)."% <br>";
//-- menampilkan prosentase data training yg diprediksi tidak benar
echo "Incorrectly Classified Instance = ".((1-$right/count($data))*100)."% <br>";
?>
Hasil perhitungan probabilitas dari data training yang diberikan bisa dijadikan patokan untuk memprediksi nilai kelas dari suatu set nilai atribut inputan. Pada contoh script berikut ini, nilai inputan disimulasikan dari hasil data random.
<?php
//-- menyiapkan variabel penampung data inputan
$input=array();
//-- membuat data input simulasi dengan fungsi random untuk masing2 atribut
for($i=2;$i<=$jml_atribut;$i++){
$input[$i]=rand(0,2);
}
$m=array();
//-- iterasi utk setiap nilai kelas
for($i=0;$i<3;$i++){
//-- inisialisasi probabilitas awal
$m[$i]=1;
//-- perkalian nilai probabilitas tiap atribut
for($j=2;$j<=$jml_atribut;$j++){
$m[$i]*=$likehood[$j][$input[$j]][$i];
}
//-- kalikan dengan prior probabilitasnya
$m[$i]*=$prior[$i];
}
//-- menentukan prediksi nilai kelas, berdasar probabilitas terbesar
$result=array_search(max($m),$m);
//-- menampilkan hasil prediksi nilai kelas
$s_list=array();
foreach($input as $i=>$n){
$s_list[]="<b>{$atribut[$i]}</b>=<i>{$parameter[$i][$n]}</i>";
}
echo "Untuk ".implode(' , ',$s_list)." masuk ke kelas <b>{$atribut[1]}</b>=<i>{$parameter[1][$result]}</i> ";
echo "dengan probabilitas sebesar <b>{$m[$result]}</b> ";
?>
Berikut simpulan yang dapat diambil dari contoh kasus dengan metode Naïve Bayes tersebut