Proyek ini bertujuan untuk membangun model prediksi penyakit jantung. Model ini diharapkan dapat membantu tenaga medis dalam mendiagnosis penyakit jantung secara lebih akurat dan efisien.
Membantu tenaga medis dalam mendiagnosis penyakit jantung dengan menggunakan beberapa variabel-variabel.
Penyakit jantung adalah salah satu penyebab kematian tertinggi di dunia. Penting untuk dapat memprediksi siapa yang berisiko terkena penyakit jantung sehingga dapat dilakukan tindakan pencegahan.
Tujuan dari proyek ini adalah untuk membantu tenaga medis dalam:
- Mendiagnosis penyakit jantung dengan menggunakan beberapa variabel
- Upaya pencegahan yang dapat dilakukan sedini mungkin dengan hasil prediksi
- Menganalisis faktor-faktor yang paling berpengaruh pada penyakit jantung sehingga dapat melakukan tindakan preventif
- Memprediksi penyakit jantung dengan menggunakan datasets dari kaggle dan membuat model prediksi dengan menggunakan algoritma
Logistic Regression
Dataset "Diabetes, Hypertension and Stroke Prediction" adalah data yang saya dapatkan dari platform kaggle. Dataset ini merupakan hasil dari 70,692 respon survei BRFSS 2015. Data yang saya gunakan adalah data hypertension tetapi sumber datanya menyebutkan itu adalah data heart disease.
Diabetes, Hypertension and Stroke Prediction
- age : Umur pasien (dalam tahun)
float64
- sex : Jenis Kelamin [0: Perempuan, 1: Laki-laki]
float64
- cp : Tipe penyakit dada [0: asymptomatic 1: typical angina 2: atypical angina 3: non-anginal pain]
int64
- trestbps : Tekanan darah mmHg
int64
- chol : Serum kolesterol mm/dl
int64
- fbs : Jika kadar gula darah puasa > 120 mg/dL [0: Tidak: 1: Ya]
int64
- restecg : Elektrokardiografi (EKG) istirahat [0: Normal , 1: ST-T Abnormal , 2: Left ventricular ]
int64
- thalach : Denyut jantung maksimum
int64
- exang : Angina akibat olahraga [0: Tidak, 1: Ya]
int64
- oldpeak : Depresi ST disebabkan oleh olahraga
float64
- slope : Slope dari segmen ST yang terjadi selama puncak olahraga [0: Upsloping, 1: Flat, 2: Downsloping]
int64
- ca : Jumlah pembuluh darah selama prosedur flouroskopi
int64
- thal : Thalamesia [1: Normal , 2: Fixed defect , 3: Reversable]
int64
- target : Apakah pasien terkena heart disease [0: Tidak , 1: Ya]
int64
Pada tahap ini saya melakukan data preparataion dengan metode Exploratory Data Analysis (EDA).
Karena saya menggunakan Google Colaboratory, pertama saya akan mengunggah file kaggle.json
yang dimana ini akan digunakan untuk mengunduh datasets dari kaggle.
from google.colab import files
files.upload()
Setelah file kaggle.json
diunggah, saya akan membuat direktori ~/.kaggle
dan menyalin file kaggle.json
ke direktori tersebut lalu mengubah file permission nya menjadi 600
!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json
!ls ~/.kaggle
Setelah persiapan Kaggle selesai, saya mengunduhh datasets dengan perintah :
!kaggle datasets download -d prosperchuks/health-dataset
Untuk mendapatkan file datasets, saya mengekstrak file zip
hasil unduhan diatas dan menyimpannya kedalam direktori health-dataset
.
!mkdir health-dataset
!unzip health-dataset.zip -d health-dataset
!ls health-dataset
Setelah didapatkan file hypertension_data.csv
, kita siap menggunakan datasetsnya.
Selanjutnya saya mengimport library yang akan digunakan.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
Saya menginisialisi data frame dengan perintah berikut :
df = pd.read_csv("health-dataset/hypertension_data.csv")
Kemudian saya menampilkan 5 sampel data teratas.
df.head()
Untuk melihat tipe data pada setiap kolom dapat menggunakan perintah berikut :
df.info()
Pada tahap ini saya akan membersikan data yang tidak diperlukan ataupun yang akan mengganggu pada tahap berikutnya. Pertama saya akan memeriksa data null pada setiap kolom
df.isnull().sum()
Kemudian saya menghapus data null tersebut dengan perintah :
df = df.replace([np.inf, -np.inf], np.nan)
df = df.dropna()
df = df.reset_index(drop=True)
Selanjutnya saya akan memeriksa data duplikat
df[df.duplicated()].value_counts()
Lalu menghapusnya dengan perintah berikut:
df.drop_duplicates(inplace=True)
Setelah proses cleansing selesai selanjutnya saya akan memastikan dataframe tidak memiliki nilai null
sns.heatmap(df.isnull())
Baik terlihat aman, Selanjutnya saya akan melihat matriks korelasi antara kolom satu dengan yang lainnya
sns.heatmap(df.corr(), annot=True)
Dapat dilihat pada heatmap diatas cp, restecg, thalach, slope memiliki korelisi yang lebih tinggi dengan target dibandingkan dengan kolom lain.
Selanjutnya saya melihat visualisasi data yang terkena heart disease dan tidak dari beberapa faktor.
Yang pertama jenis sakit dada dengan heart disease
sns.countplot(x="cp", data=temp_df,hue="target")
plt.show()
Selanjutnya exang (angina akibat olahraga)
sns.countplot(x="exang", data=temp_df,hue="target")
plt.show()
Selanjutnya restecg (Elektrokardiografi (EKG) istirahat)
Selanjutnya slope (Slope dari segmen ST yang terjadi selama puncak olahraga)
dan Terakhir thal (Thalamesia)
Pada tahap ini saya akan membuat feature dari semua kolom kecuali kolom target
yang dimana akan dijadikan sebagai label dengan perintah berikut :
X = df.drop(columns="target", axis=1)
Y = df["target"]
Selanjutnya saya akan membagi datasets menjadi dua subset, yaitu train set dan test set, sebanyak 20% akan dimasukan kedalam test set, sedangkan sisanya kedalam train set. Penggunaan stratified split memastikan bahwa distribusi label di antara train set dan test set tetap sama.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, stratify=Y, random_state=2)
Kemudian saya akan membuat model dengan algoritma LogisticRegression
dengan jumlah iterasi maksimum 1000 untuk menghindari ConvergenceWarning
.
model = LogisticRegression(max_iter=1000)
Setelah itu memasukan X.train
dan Y.train
kedalam model.
model.fit(X_train, Y_train)
Selanjutnya saya akan mencoba prediksi dengan sampel data teratas
input_data = np.array([57.0,1.0,3,145,233,1,0,150,0,2.3,0,0,1])
input_data_reshaped = input_data.reshape(1,-1)
prediction = model.predict(input_data_reshaped)
print(prediction)
if (prediction[0] == 0) :
print("Pasien tidak terkena penyakit jantung")
else :
print("Pasien terkena penyakit jantungi")
Hasilnya adalah "Pasien terkena penyakit jantungi" yang berarti prediksi berhasil, selanjutnyaa saya perlu export model menjadi file .sav
untuk digunakan pada aplikasi streamlit
import pickle
filename = 'heart_disease.sav'
pickle.dump(model, open(filename, 'wb'))
Pada tahap ini saya menggunakan accuracy_score
sebagai metrik evaluasinya.
Metrik akurasi adalah ukuran yang digunakan untuk mengukur sejauh mana model klasifikasi berhasil dalam mengklasifikasikan data dengan benar. Metrik ini mengukur jumlah prediksi yang benar dibagi dengan jumlah total prediksi. Secara matematis, akurasi dinyatakan sebagai berikut:
akurasi = (jumlah prediksi benar / jumlah total prediksi)
Lalu saya menerapkannya kedalam model saya, karena diatas saya sudah membuat variabelnya, saya dapat menggunakannya sebagai berikut:
X_test_prediction = model.predict(X_test)
test_data_accuracy = accuracy_score(Y_test, X_test_prediction)
print("Akurasi data test : ", test_data_accuracy)
Akurasi yang saya dapatkan dari kode diatas adalah 86.10897% yang menunjukkan bahwa model ini cukup baik untuk memprediksi penyakit jantung.