Machine Learning: Naive Bayes Classifier dengan R

Machine Learning, Supervised Learning, Naive Bayes Classification Model

Halo teman-teman, apa kabarnya? Sebelumnya saya mohon maaf ya karena beberapa waktu ini kita break sejenak belajar dan berbaginya. Di awal Bulan Mei ini, kita akan mencoba sedikit demi sedikit membahas dan belajar bersama mengenai Machine Learning (ML) yang akhir-akhir ini booming di kalangan analis data (data analyst) atau yang cakupannya lebih luas dan mendalam, yaitu sains data (data science).

Jadi, di dalam machine learning, intinya itu  kita mencoba membangun sebuah algoritma olah data dengan cara berinteraksi dengan mesin. Kita beri mesin tersebut sekumpulan data agar ia dapat memahami logika atau pola dari data yang kita berikan, kemudian kita lakukan pengujian hasil dari pembelajaran mesin tersebut terhadap secuplik data sebagai dasar pengambilan keputusan. Karena kita perlu menyiapkan sekumpulan data sebagai media pembelajaran mesinnya dan untuk pengujian, maka dalam bahasa kerennya muncul istilah train dataset dan test dataset. Train dataset digunakan sebagai media pembelajaran untuk mesin, sedangkan test dataset-nya untuk melakukan pengujian hasil pembelajaran mesin tersebut. Adapun pembagian porsi train dataset dan test dataset sendiri masih debatable, namun kita mencoba mengambil amannya saja di kisaran 70 persen sampai 80 persen untuk train dataset, sedangkan sisanya sebagai test dataset.

Baik, itu sekilas tentang Machine Learning. Kita lanjut ke intinya sekarang, yaitu membahas salah satu model Machine Learning yang termasuk ke dalam Supervised Learning, yaitu Naive Bayes Classifier (NBC). Algoritma dari NBC ini pada dasarnya menggunakan prinsip peluang bersyarat Naive Bayes. Adapun asumsi yang berlaku dalam NBC ini adalah independensi, bahwa ada atau tidaknya satu elemen atau event tidak memberikan pengaruh terhadap probabilitas (peluang) elemen atau event lainnya. Secara umum, kaidah Bayes digambarkan sebagai berikut:

"Peluang kejadian A saat kejadian B telah terjadi sama dengan peluang kejadian B saat kejadian A telah terjadi dan peluang kejadian A dibagi dengan peluang kejadian B"

Peluang kejadian B saat kejadian A telah terjadi diistilahkan sebagai Likelihood, mengikuti sebaran normal. Bila normal Gaussian maka disebut Gaussian Naive Bayes, bila mengikuti distribusi Bernoulli maka disebut Bernoulli Naive Bayes. Sedangkan peluang kejadian A kemudian diistilahkan sebagai prior probability, kemudian peluang kejadian B disebut sebagai Evidence/predictor probability, dan Peluang kejadian A saat kejadian B telah terjadi diistilahkan sebagai posterior probability.

Apa saja manfaat dari Naive Bayes Classifier (NBC) ini? Sebenarnya banyak sekali aplikasi atau manfaat dari NBC ini teman-teman, namun yang umum biasanya digunakan untuk mengklasifikasikan atau mendeteksi email sampah (spam email), analisis sentimen kata atau kalimat (sentiment analysis), dan sistem rekomendasi keputusan berdasarkan data-data tertentu.

Bagaimana cara mengimplementasikan NBC ini dengan R? Dalam kesempatan ini, kita akan langsung mempraktikkan Naive Bayes Classifier Algorithm dengan menggunakan data dummy yang telah saya siapkan pada tautan berikut. Dalam praktik kali ini, kita akan menggunakan sebuah data dengan variabel dependenya adalah keputusan untuk membeli komputer atau tidak. Adapun variabel independen yang kita gunakan meliputi umur, pendapatan, status seorang murid atau bukan, serta kondisi kredit yang dijalankan berkategori Baik atau Sedang.

Untuk menentukan probabilitas pada setiap keputusan pembelian komputer menurut variabel independennya, dapat kita lihat pada bagian tabel probabilitas. Setelah itu, kita hitung peluang Likelihoodnya untuk keputusan pembelian komputer masing-masing kategorinya, Ya dan Tidak membeli komputer. Berikut penghitungan secara manualnya agar mampu memperjelas pemahaman kita semua.



Kaidah Bayes untuk menentukan peluang

Itu tadi kalau kita mau hitung dan perkirakan secara manual. Selanjutnya, bila datanya sudah diunduh, kita lanjutkan dengan praktik menggunakan R menggunakan beberapa code berikut:

Code:

#Install dan aktivasi package
install.packages("e1070")
install.packages("caret")
library(e1071)
library(caret)

#Memanggil Data
library(readxl)
datareal <- read_excel("C:/Users/Joko Ade/Downloads/datareal.xlsx")

#Mengecek Struktur Data
str(datareal)

Hasil:

tibble [14 x 5] (S3: tbl_df/tbl/data.frame)
 $ umur         : chr [1:14] "<=30" "<=30" "31-40" ">40" ...
 $ pendapatan   : chr [1:14] "Tinggi" "Tinggi" "Tinggi" "Sedang" ...
 $ status_murid : chr [1:14] "Tidak" "Tidak" "Tidak" "Tidak" ...
 $ rating_kredit: chr [1:14] "Sedang" "Baik" "Sedang" "Sedang" ...
 $ beli_komputer: chr [1:14] "Tidak" "Tidak" "Ya" "Ya" ...

Code:

#mengubah tipe data
datareal$umur <- as.factor(datareal$umur)
datareal$pendapatan <- as.factor(datareal$pendapatan)
datareal$status_murid <- as.factor(datareal$status_murid)
datareal$rating_kredit <- as.factor(datareal$rating_kredit)
datareal$beli_komputer <- as.factor(datareal$beli_komputer)

#Partisi Data kita coba partisi train dataset 70%, 30% untuk test dataset
inTrain <- createDataPartition(y=datareal$beli_komputer, p = 0.70, list = F)
train <- datareal[inTrain,]
test <- datareal[-inTrain,]

#mengattach data
attach(train)

Hasil:

# A tibble: 11 x 5
   umur  pendapatan status_murid rating_kredit beli_komputer
   <fct> <fct>      <fct>        <fct>         <fct>        
 1 <=30  Tinggi     Tidak        Sedang        Tidak        
 2 <=30  Tinggi     Tidak        Baik          Tidak        
 3 31-40 Tinggi     Tidak        Sedang        Ya           
 4 >40   Sedang     Tidak        Sedang        Ya           
 5 >40   Rendah     Ya           Sedang        Ya           
 6 >40   Rendah     Ya           Baik          Tidak        
 7 <=30  Sedang     Tidak        Sedang        Tidak        
 8 <=30  Rendah     Ya           Sedang        Ya           
 9 >40   Sedang     Ya           Sedang        Ya           
10 <=30  Sedang     Ya           Baik          Ya           
11 31-40 Tinggi     Ya           Sedang        Ya

# A tibble: 3 x 5
  umur  pendapatan status_murid rating_kredit beli_komputer
  <fct> <fct>      <fct>        <fct>         <fct>        
1 31-40 Rendah     Ya           Baik          Ya           
2 31-40 Sedang     Tidak        Baik          Ya           
3 >40   Sedang     Tidak        Baik          Tidak

Code:

#Pemodelan Naive Bayes
nb <- naiveBayes(beli_komputer~umur+status_murid+pendapatan+rating_kredit,
                 data = train)
print(nb)

Hasil:

Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = X, y = Y, laplace = laplace)

A-priori probabilities:
Y
    Tidak        Ya
0.3636364 0.6363636

Conditional probabilities:
       umur
Y            <=30       >40     31-40
  Tidak 0.7500000 0.2500000 0.0000000
  Ya    0.2857143 0.4285714 0.2857143

       status_murid
Y           Tidak        Ya
  Tidak 0.7500000 0.2500000
  Ya    0.2857143 0.7142857

       pendapatan
Y          Rendah    Sedang    Tinggi
  Tidak 0.2500000 0.2500000 0.5000000
  Ya    0.2857143 0.4285714 0.2857143

       rating_kredit
Y            Baik    Sedang
  Tidak 0.5000000 0.5000000
  Ya    0.1428571 0.8571429

Code:

#Prediksi dari Model Train
p2 <- predict(nb, train)
head(train$beli_komputer)
head(p2)

#Akurasi Prediksi
confusionMatrix(p2, train$beli_komputer)

Hasil:

Confusion Matrix and Statistics

          Reference
Prediction Tidak Ya
     Tidak     3  1
     Ya        1  6
                                          
               Accuracy : 0.8182          
                 95% CI : (0.4822, 0.9772)

    No Information Rate : 0.6364          
    P-Value [Acc > NIR] : 0.175           
                                          
                  Kappa : 0.6071          
                                          
 Mcnemar's Test P-Value : 1.000           
                                          
            Sensitivity : 0.7500          
            Specificity : 0.8571          
         Pos Pred Value : 0.7500          
         Neg Pred Value : 0.8571          
             Prevalence : 0.3636          
         Detection Rate : 0.2727          
   Detection Prevalence : 0.3636          
      Balanced Accuracy : 0.8036          
                                          
       'Positive' Class : Tidak

Code:

#Prediksi dengan Test
predtest <- predict(nb, test)
head(test$beli_komputer)
head(predtest)

#Confusion Matriks Test
confusionMatrix(predtest, test$beli_komputer)

Hasil:

Confusion Matrix and Statistics

          Reference
Prediction Tidak Ya
     Tidak     1  0
     Ya        0  2

                                     
               Accuracy : 1          
                 95% CI : (0.2924, 1)

    No Information Rate : 0.6667     
    P-Value [Acc > NIR] : 0.2963     
                                     
                  Kappa : 1          
                                     
 Mcnemar's Test P-Value : NA         
                                     
            Sensitivity : 1.0000     
            Specificity : 1.0000     
         Pos Pred Value : 1.0000     
         Neg Pred Value : 1.0000     
             Prevalence : 0.3333     
         Detection Rate : 0.3333     
   Detection Prevalence : 0.3333     
      Balanced Accuracy : 1.0000     
                                     
       'Positive' Class : Tidak

Terlihat bahwa pada hasil pengujian menggunakan train dataset, model Naive Bayes Classifier (NBC) dihasilkan cukup akurat dengan accuracy sebesar 81,82 persen. Dan bila kita ujikan hasil pembelajaran mesin NBC terhadap test dataset kita mendapatkan accuracy sebesar 100 persen. Terbukti pada tabel Confusion Matix and Statistics bahwa hasil prediksi NBC tidak ada yang salah klasifikasi.

Baik, demikian sekilas pembahasan kita mengenai Machine Learning jenis Supervised Learning: Naive Bayes Classifier dengan menggunakan R. Jangan lupa share dan terus menyimak unggahan-unggahan berikutnya. Selamat mempraktikkan!

Add Comments


EmoticonEmoticon