Naive Bayes Classification in Python [Heart Diseases UCI data]

Halima Tusyakdiah
8 min readJan 5, 2020

--

https://iq.opengenus.org/text-classification-naive-bayes/

Introduced:

Algoritma Naive Bayes merupakan sebuah metoda klasifikasi menggunakan metode probabilitas dan statistik yg dikemukakan oleh ilmuwan Inggris Thomas Bayes. Algoritma Naive Bayes memprediksi peluang di masa depan berdasarkan pengalaman di masa sebelumnya sehingga dikenal sebagai Teorema Bayes. Ciri utama dr Naïve Bayes Classifier ini adalah asumsi yg sangat kuat (naïf) akan independensi dari masing-masing kondisi / kejadian.

Pada jurnal Xhemali, Daniela, Chris J. Hinde, and Roger G. Stone. “Naive Bayes vs. decision trees vs. neural networks in the classification of training web pages.” (2009), mengatakan bahwa “Naïve Bayes Classifier memiliki tingkat akurasi yg lebih baik dibanding model classifier lainnya”.

Keuntungan penggunan adalah bahwa metoda ini hanya membutuhkan jumlah data pelatihan (training data) yang kecil untuk menentukan estimasi parameter yg diperlukan dalam proses pengklasifikasian.

Tahapan dari proses algoritma Naive Bayes adalah:

  1. Menghitung jumlah kelas / label.
  2. Menghitung Jumlah Kasus Per Kelas
  3. Kalikan Semua Variable Kelas
  4. Bandingkan Hasil Per Kelas

(source: https://informatikalogi.com/algoritma-naive-bayes/)

Data:

Data yang digunakan adalah Heart Diseases UCI yaitu data pasien yang memiliki penyakit jantung atau tidak. Data dapat didownload link berikut:

https://www.kaggle.com/ronitf/heart-disease-uci

Keterangan variabel;
age: umur (tahun)
sex: jenis kelamin (1 = laki-laki; 0 = perempuan)
cp: tipe nyeri dada
trestbps: tekanan darah istirahat (dalam mm Hg saat masuk ke rumah sakit)
kol: serum kolestoral dalam mg / dl
fbs : gula darah puasa> 120 mg / dl → (1 = benar; 0 = salah)
restecg: hasil elektrokardiografi istirahat
thalach: detak jantung maksimum
exang: angina yang diinduksi olahraga (1 = ya; 0 = tidak)
oldpeak: ST depression induced by exercise relative to rest
slope: the slope of the peak exercise ST segment
ca: jumlah pembuluh darah utama (0–3) diwarnai dengan fluoroskopi
thal: 3 = normal; 6 = fixed defect; 7 = reversible defect
target: memiliki penyakit atau tidak (1 = ya, 0 = tidak)

Problem:

Apakah pasien masuk di kategori terkena penyakit jantung atau tidak?

Yuk langsung saja…

Langkah 1: Memasukkan Packages

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Langkah 2: Memasukkan Data

untuk memudahkan menemukan data pada direktori, letakan data satu folder dengan file .ipynb

heart = pd.read_csv("heart.csv") #data tentang penyakit jantung pada pasien
heart.head()

Melihat jenis data masing-masing kolom

heart.info()

Sebelum melakukan klasifikasi menggunakan naive bayes, mari kita lihat terlebih dahulu sekilas statistik deskriptif dari data penyakit jantung.

Kita akan melihat dari data berapa pasien yang mengidap penyakit jantung.

heart.target.value_counts()

Diketauhi pasien yang terkena penyakit jantung sebanyak 165 dari 303 pasien. Berikut untuk script visualisasinya.

f, ax = plt.subplots(figsize=(7, 5))
sns.countplot(y="target", data=heart, palette="mako_r");

kita lihat lagi visualisasi untuk pasien pengidap penyakit jantung berdasarkan jenis kelamin.

pd.crosstab(heart.sex,heart.target).plot(kind="bar",figsize=(15,6),color=['blue','#AA1111' ])
plt.title('Heart Disease Frequency for Sex')
plt.xlabel('Sex (0 = Female, 1 = Male)')
plt.xticks(rotation=0)
plt.legend(["Haven't Disease", "Have Disease"])
plt.ylabel('Frequency')
plt.show()

Dapat dilihat pasien berjenis perempuan paling banyak mengidap penyakit jantung.

Dari 2 barchat diatas dapat kita gabungkan menjadi 1 grafik. Kita dapat melihat berapa pengidap atau tidak dari masing-masing jenis kelamin.

sns.countplot(x='sex', data=heart, palette="bwr")
plt.xlabel("Sex (0 = female, 1= male)")
plt.show()

selanjutnya kita melihat pengidap penyakit jantung berdasarkan umur.

plt.figure(figsize=(15,6))
sns.countplot(x='age',data = heart, hue = 'target',palette='mako_r')
plt.show()

Maka diketahui pengidap terbanyak pada umur 54 tahun, dan telihat pola mulai dari umur>40 tahun pengidap penyakit jantung semakin banyak.

OKE, langsung saja kita melakukan klasifikasi menggunakan naive bayes

Langkah 3: Menentukan variabel dependen dan independen

Variabel independen yang digunakan yaitu: age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca,thal. Pemilihan variabel dapat menggunakan script berikut.

# Variabel independen
x = heart.drop(["target"], axis = 1)
x.head()

Selanjutnya, menentukan variabel dependen. disini variabel yang digunakan adalah variabel target, karena kita ingin melihat pasien itu dikalsifikasikan terkena penyakit jantung apa tidak.

# Variabel dependen
y = heart["target"]
y.head()

Langkah 4: Melakukan Training dan Testing

Klasifikasi Naive Bayes terdapat di dalam package Sklearn, maka kita harus menanggil packages tersebut.

from sklearn.model_selection import train_test_split

kemudian kita membagi data training dan testing:

→ data training=2%

→ data testing=98%

disini saya menggunakan andom state nya123. Nilai random state ini bebas tergantung peneliti, random state menunjukan berapa kali data dilakukan pengacakan. Tapi, untuk pelajaran kali ini disarankan untuk menggunakan 123 agar hasil random yang didapatkan sama.

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 123)

kemudian mengaktifkan/memanggil/membuat fungsi klasifikasi Naive bayes.

modelnb = GaussianNB()

Kemudian memasukkan data training pada fungsi klasifikasi Naive Bayes.

nbtrain = modelnb.fit(x_train, y_train)

menghitung kelas.

nbtrain.class_count_

kemudian menentukan hasil prediksi dati data testing.

# Menentukan hasil prediksi dari x_test
y_pred = nbtrain.predict(x_test)
y_pred
Hasil prediksi data testing

kemudian mari kita lihat lagi nilai sebenarnya sebelum diprediksi.

nbtrain.predict_proba(x_test)
Data testing

dapat dilihat bahwa ada 11 data yang berbeda prediksi.

Kita dapat melihat berapa probabilitas hasil prediksi dari data testing menggnunaan script berikut.

nbtrain.predict_proba(x_test)

berikut nilai prediksinya:

array([[5.82571613e-04, 9.99417428e-01],
[9.99240610e-01, 7.59390366e-04],
[9.99938869e-01, 6.11309321e-05],
[9.99992658e-01, 7.34177465e-06],
[3.63366729e-03, 9.96366333e-01],
[9.99951069e-01, 4.89308903e-05],
[8.58720034e-03, 9.91412800e-01],
[5.98819913e-01, 4.01180087e-01],
[5.96228807e-04, 9.99403771e-01],
[9.33511439e-01, 6.64885614e-02],
[9.97942318e-01, 2.05768198e-03],
[4.57117589e-01, 5.42882411e-01],
[9.99999986e-01, 1.36224796e-08],
[9.99995730e-01, 4.26988712e-06],
[5.16991611e-01, 4.83008389e-01],
[1.00000000e+00, 5.08353833e-11],
[9.10174530e-01, 8.98254697e-02],
[9.86808541e-01, 1.31914589e-02],
[5.72076923e-01, 4.27923077e-01],
[2.24348439e-01, 7.75651561e-01],
[1.35283843e-01, 8.64716157e-01],
[9.99163302e-01, 8.36698360e-04],
[4.11827050e-05, 9.99958817e-01],
[9.82142245e-01, 1.78577552e-02],
[9.87487847e-01, 1.25121528e-02],
[6.12756815e-01, 3.87243185e-01],
[9.98445679e-01, 1.55432096e-03],
[5.27229563e-01, 4.72770437e-01],
[9.99999798e-01, 2.01877057e-07],
[8.92625300e-01, 1.07374700e-01],
[9.99977531e-01, 2.24690154e-05],
[2.83019736e-01, 7.16980264e-01],
[6.30801388e-02, 9.36919861e-01],
[9.99898787e-01, 1.01213253e-04],
[3.84301563e-01, 6.15698437e-01],
[2.48969111e-04, 9.99751031e-01],
[3.27891000e-02, 9.67210900e-01],
[1.25745349e-01, 8.74254651e-01],
[2.46760601e-04, 9.99753239e-01],
[2.15045133e-02, 9.78495487e-01],
[6.63584159e-04, 9.99336416e-01],
[4.14585955e-01, 5.85414045e-01],
[9.99647022e-01, 3.52978207e-04],
[5.65078130e-04, 9.99434922e-01],
[9.19585446e-03, 9.90804146e-01],
[9.87381063e-01, 1.26189369e-02],
[9.99990910e-01, 9.09037606e-06],
[7.91427151e-01, 2.08572849e-01],
[1.38836067e-02, 9.86116393e-01],
[9.89442682e-03, 9.90105573e-01],
[9.96646980e-01, 3.35301971e-03],
[9.98756337e-01, 1.24366336e-03],
[6.90049722e-04, 9.99309950e-01],
[5.95604279e-01, 4.04395721e-01],
[8.21909495e-02, 9.17809050e-01],
[1.52842321e-01, 8.47157679e-01],
[9.95476149e-01, 4.52385096e-03],
[2.45417179e-02, 9.75458282e-01],
[9.92418418e-01, 7.58158236e-03],
[8.00379195e-02, 9.19962080e-01],
[9.97808961e-01, 2.19103887e-03]])

Langkah 6: Confussion Matrix

Confusion matrix merupakan matrik yang berisi ketepatan prediksi. Untuk melihat Confusion matrix diperlukan packages confusion matrix, maka dapat dipanggil menggunakan script berikut,

from sklearn.metrics import confusion_matrix

setelah dipanggil, sekarang kita menghitung nilai confusion matrixnya.

confusion_matrix(y_test, y_pred)
Hasil confusion matrix

Agar tampilannya confusion matrix lebih rapi dapat menggunakan cara berikut,

y_actual = pd.Series([1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0,
1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1,
1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1], name = "actual")
y_pred = pd.Series([1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0], name = "prediction")
df_confusion = pd.crosstab(y_actual, y_pred)
df_confusion
Hasil confusion matrix

Langkah 7: Nilai akurasi

kemudian menghitung nilai akurasi. Untuk melihat nilai akurasi cukup lengkap dapat menggunakan packages clasication_report, silahkan menggunakan script berikut,

from sklearn.metrics import classification_reportprint(classification_report(y_test, y_pred))

Didapatkan dari nilai micro avg, nilai akurasinya sebesar 0,84 atau 84%, yang artinya hasil prediksinya sudah sangat bagus.

jika ingin melihat secara overall statistik dalam satu kesatuan, dapat menggunkan bantuan package pycm. Silahkan gunakan script berikut,

! pip install pycm #memunculkan lebih detailfrom pycm import *

untuk melihat hasil perhitungannya gunakan scipt berikut,

print(ConfusionMatrix(y_actual1, y_pred1))

:

:

masih banyak lagi hasil yang belum dimunculkan, saya hanya menampilkan beberapa output saja.

bedasarakan hasil diatas nilai akurasi dapat dilihat dari nilai ACC Macro didapatkan akurasi sebesar 0,08367. Sedangkan untuk melihat kesalahan prediksi dapat melihat nilai Kappa.

Jeng.. kita telah berhasil melakukan klasifikasi pengidap jantung menggunakan Algoritma Naive Bayes

cukup sekian terimakasih :))

Referensi:

--

--

Halima Tusyakdiah
Halima Tusyakdiah

Written by Halima Tusyakdiah

Statistics student at Islamic University of Indonesian

No responses yet