# untuk persiapan data
library(dplyr)
library(rsample)
# untuk keperluan machine learning
library(e1071)
Pada materi kali ini kita akan membahas Algoritma lainnya yang bisa digunakan untuk keperluan Klasifikasi. Pendekatan Algoritma yang akan kita bahas, harapannya dapat menghasilkan prediksi yang lebih akurat dan melengkapi kita semua dengan berbagai macam variasi permodelan untuk kasus-kasus lainnya.
Pada material Klasifikasi sebelumnya, kita sudah mengetahui bahwa metode Klasifikasi memanfaatkan konsep probability dalam menentukan sebuah data masuk ke kelas yang mana.
Pada konsep Algoritma Naive Bayes juga memanfaatkan Teorema Bayes, dengan teori tersebut bisa dibilang juga memanfaatkan konsep probability, akan tetapi yang menjadi pembedanya adalah konsep matematika di belakangnya.
Tidak semua menyukai matematika, tapi matematika nantinya bisa membantu kita sedikit banyak untuk lebih memahami konsep Algoritma yang digunakan. Maka dari itu, hal pertama yang akan kita bahas adalah bagaimana menggunakan Naive Bayes di R terlebih dahulu.
Contoh Study Case: Customer Behaviour
Agar lebih memahami bagaimana Naive Bayes bekerja, kita akan menggunakan kasus customer behavior. Peluang customer untuk membeli produk akan dihitung berdasarkan karakteristik pada nasabah.
## Rows: 400
## Columns: 4
## $ Gender <fct> Male, Male, Female, Female, Male, Male, Female, Female, Male…
## $ Age <fct> < 30, 30-50, < 30, < 30, < 30, < 30, < 30, 30-50, < 30, 30-5…
## $ Salary <fct> Low, Low, Medium, Medium, Medium, Medium, Medium, High, Low,…
## $ Purchased <fct> No, No, No, No, No, No, No, Yes, No, No, No, No, No, No, No,…
🗒️Deskripsi Data
Kita dapat membuat model Naive Bayes menggunakan fungsi
naiveBayes()
dari pacakge e1071
.
Menggunakan argumen naiveBayes(formula, data)
formula
: y ~ x
,
y
: target variabelx
: prediktor variabeldata
: data yang digunakan untuk target dan prediktor
variabelMelanjutkan contoh yang sebelumnya, mari kita gunakan gender sebagai prediktor, untuk menjawab pertanyaan Berapa peluang seorang membeli barang bila diketahui ia seorang Pria?
# Membuat model dengan 1 prediktor
nb_gender <- naiveBayes(formula = Purchased ~ Gender,
data = customer)
# output model 1 prediktor
nb_gender
##
## Naive Bayes Classifier for Discrete Predictors
##
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
##
## A-priori probabilities:
## Y
## No Yes
## 0.6425 0.3575
##
## Conditional probabilities:
## Gender
## Y Female Male
## No 0.4941634 0.5058366
## Yes 0.5384615 0.4615385
Jika pada model regresi logistik kita mendapatkan nilai koefisien setiap variabel, maka pada model naive bayes kita akan mendapatkan dua elemen:
Output ini menunjukkan peluang setiap kelas tanpa adanya prediktor.
[OPTIONAL] Math Behind
Metode perhitungannya hanya menghitung peluang customer membeli atau tidak berdasarkan jumlah kemunculannya tanpa mempertimbangkan informasi lainnya. Berikut cara perhitungan manualnya:
##
## No Yes
## 257 143
## [1] 0.3575
## [1] 0.6425
Peluang seseorang membeli barang tanpa mengetahui kondisi lainnya sebesar … %
Pada contoh di atas, sering juga disebut dengan metode menghitung Prior Probability.
Output ini menunjukkan peluang prediktor jika diketahui variabel targetnya. + Peluang(Gender = Male | Purchased = Yes) = 0.4615385 + Peluang(Gender = Male | Purchased = No) = 0.5058366
[OPTIONAL] Math Behind
Konsep perhitungan yang digunakan adalah Dependent Event, atau konsep perhitungan peluang ketika diketahui kondisi-kondisi lainnya.
Peluang karyawan pulang menggunakan Taxi dibandingkan menggunakan Ojek Jika Diketahui cuaca mendung pada sore hari.
##
## Female Male
## No 127 130
## Yes 77 66
## [1] 0.4615385
Question: Berapa peluang seorang membeli barang bila diketahui ia seorang Pria?
P(Purchased = Yes | Gender = Male)
Menggunakan fungsi
predict(object = ..., newdata = ..., type = ...)
Parameter type
:
type = "raw"
mengembalikan nilai peluang untuk
masing-masing kelastype = "class"
mengembalikan label kelasnya (default
threshold 0.5)## [1] No
## Levels: No Yes
## No Yes
## [1,] 0.6632653 0.3367347
[OPTIONAL] Math Behind
Untuk melakukan perhitungannya kita akan menggunakan rumus ini (Rumus Bayes Theorem).
\[P(A|B) = \frac{P(B|A) P(A)}{P(B)}\] Keterangan
Kejadian A sering disebut sebagai hypothesis (target variable)
Penerapan
\[P(Purchased = Yes | Gender = Male) = \frac{P(Gender = Male|Purchased = Yes) P(Purchased = Yes)}{P(Gender = Male)}\]
##
## No Yes
## 257 143
## [1] 0.3575
##
## Female Male
## 204 196
## [1] 0.49
##
## Female Male
## No 127 130
## Yes 77 66
## [1] 0.4615385
# 4. Hitung P(Purchased = Yes | Gender = Male)
p_yes_male <- (p_male_yes * p_yes) / p_male
p_yes_male
## [1] 0.3367347
Naive Bayes melakukan klasifikasi berdasarkan peluang dependent antara prediktor dengan target variable (Bayes’ Theorem).
Asumsi Naive Bayes:
Kelebihan:
Kekurangan: sangat terpengaruh oleh data yang memiliki skewness pada frekuensi data
Pada kasus tertentu, dapat terjadi scarcity (kelangkaan), yaitu kondisi dimana suatu prediktor tidak hadir sama sekali di salah satu kelas.
Misalkan pada data Customer_Behaviour
sebelumnya,
terdapat kondisi dimana tidak ada customer Male yang
melakukan Purchased. Sehingga tabel frekuensinya
menjadi seperti ini.
new_table <- matrix(c(130, 143, 127, 0), nrow = 2, dimnames = list(c("Female", "Male"), c("No", "Yes")))
new_table
## No Yes
## Female 130 127
## Male 143 0
## No Yes
## Female 0.4761905 1
## Male 0.5238095 0
Dari tabel di atas, kita peroleh: \(P(Male\ |\ Purchase) = 0\). Jika Irfan adalah seorang Pria, berapakah peluang Irfan untuk Purchased?
\[P(Purchased|Male) = \frac{P(Male|Purchased) P(Purchased)}{P(Male)}=\frac{0 * P(Purchased)}{P(Male)} = 0\]
Untuk menghadapinya, kita bisa menggunakan konsep Laplace Smoothing.
# Menambahkan nilai 1 untuk setiap nilai
new_table_lp <- matrix(c(130, 143, 127, 0) + 1,
nrow = 2,
dimnames = list(c("Female", "Male"), c("No", "Yes")))
new_table_lp
## No Yes
## Female 131 128
## Male 144 1
## No Yes
## Female 0.4763636 0.992248062
## Male 0.5236364 0.007751938
Setelah ditambahkan laplace smooting = 1, maka P(Male|Purchased) bukan lagi 0 dan peluang/proporsi dari variabel lainnya tidak berubah jauh dari proporsi/peluang sebelumnya.
Bagaimana penerapannya pada code di R? Dengan menggunakan function
naiveBayes()
, kita cukup menambahkan parameter
laplace = 1
:
# train
nb_all_lp <- naiveBayes(formula = Purchased ~ . ,
data = customer,
laplace = 1)
# New Data
new_cust <- data.frame(Gender = "Female",
Age = "< 30",
Salary = "Medium")
# predict
predict(nb_all_lp, newdata = new_cust, type = "raw")
## No Yes
## [1,] 0.9840288 0.01597116