Seiring berjalannya waktu kebiasaan masyarakat dalam mengkonsumsi makanan sangat menghawatirkan. Dengan menjamurnya makanan yang siap saji dengan komposisi bahan yang tidak sehat menjadi pilihan utama bagi masyarakat yang ingin mengkonsumsi makanan secara praktis. Kebiasaan tersebut dapat menyebabkan beberapa penyakit salah satunya penyakit jantung. Penyakit jantung tidak bisa dianggap ringan. Untuk penyembuhan penyakit jantung ini dapat membutuhkan dana yang sangat banyak, jika pasien memiliki penyakit jantung dan penyakit lainnya yang akan membuat komplikasi. Sehingga penyakit jantung ini, jika terkena pada masyarakat yang berada didaerah yang belum memiliki teknologi, sangat sulit untuk mendapatkan penyembuhan dari penyakit ini. Tujuan dari projek ini adalah untuk membantu memperediksi peluang pasien yang menderita penyakit jantung secara dini terutama didaerah yang belum memiliki teknologi.
Pertama sebelum melakukan Data Preprocessing dan Klasifikasi adalah mengimport library yang dibutuhkan terlebih dahulu. Library yaitu dplyr, class, tidyr, caret, e1071, ROCR, partykit, parsnip, plotly, tidyverse, glue, scales, ggpubr, rpart, rSample dan yardstick.
library(dplyr)
library(class)
library(tidyr)
library(caret)
library(e1071)
library(ROCR)
library(partykit)
library(parsnip)
library(plotly)
library(tidyverse)
library(glue)
library(scales)
library(ggpubr)
library(rsample)
library(rpart)
library(yardstick)
Langkah selanjutnya yaitu dengan import data. Data ini berasal dari https://www.kaggle.com/ronitf/heart-disease-uci. Data tersebut adalah data untuk pasien yang mengalami penyakit jantung.
jantung <- read.csv("dataset/heart.csv")
Langkah selanjutnya dengan melihat struktur datanya terlebih dahulu. Untuk memastikan data sesuai dengan kebutuhan proses klasifikasi.
glimpse(jantung)
## Rows: 303
## Columns: 14
## $ ï..age <int> 63, 37, 41, 56, 57, 57, 56, 44, 52, 57, 54, 48, 49, 64, 58...
## $ sex <int> 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0...
## $ cp <int> 3, 2, 1, 1, 0, 0, 1, 1, 2, 2, 0, 2, 1, 3, 3, 2, 2, 3, 0, 3...
## $ trestbps <int> 145, 130, 130, 120, 120, 140, 140, 120, 172, 150, 140, 130...
## $ chol <int> 233, 250, 204, 236, 354, 192, 294, 263, 199, 168, 239, 275...
## $ fbs <int> 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0...
## $ restecg <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1...
## $ thalach <int> 150, 187, 172, 178, 163, 148, 153, 173, 162, 174, 160, 139...
## $ exang <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0...
## $ oldpeak <dbl> 2.3, 3.5, 1.4, 0.8, 0.6, 0.4, 1.3, 0.0, 0.5, 1.6, 1.2, 0.2...
## $ slope <int> 0, 0, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 0, 2, 2...
## $ ca <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2...
## $ thal <int> 1, 2, 2, 2, 2, 1, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2...
## $ target <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
Dari data yang diatas maka informasi yang didapatkan dibawah ini.
Informasi penting yang terdapat didata:
i..age : umur data tahun sex : jenis kelamin (1 = laki-laki, 0 = perempuan) cp : tipe nyeri yang paling parah trestbps : melacak tekanan darah (dalam mm Hg saat masuk kerumah sakit) chol : Kolesterol dalam mg / dl fbs : gula darah dalam keadaan puasa >120 mg / dl (1 = benar, 0 = salah) restecg : mengembalikan hasil elektokardiografi thalach : denyut jantung maksimum tercapai exang : exercise included angina (1 = ya, 0 = tidak) oldpeak : ST depresi yang disebabkan oleh olahraga slope : Kemiringan segmen ST latihan puncak ca : Jumlah pembuluh darah utama (0-3) diwarnai dengan fluoroskopi thal : (3 = normal, 6 = cacat tetap, 7 = cacat yang dapat dibalik) target : (1 = sakit, 0 = tidak)
Tahap selanjutnya dengan melihat gambaran data, supaya tidak ada kesalahan pada saat proses klasifikasi dan proses data processing.
head(jantung)
Langkah selanjutnya sebelum melakukan data preprocessing adalah memastikan bahwa data tidak ada missing value. Jika ada missing value maka akan dilakukan pelengkapan data sehingga tidak ada data yang missing value.
colSums(is.na(jantung))
## ï..age sex cp trestbps chol fbs restecg thalach
## 0 0 0 0 0 0 0 0
## exang oldpeak slope ca thal target
## 0 0 0 0 0 0
Dari data yang tersebut maka tidak ada data yang missing value.
Langkah selanjutnya yaitu dengan melihat proporsi target yang akan digunakan. Yang menjadi target yaitu pasien yang menderita penyakit jantung atau tidak sehat dan pasien yang tidak menderita penyakit jantung atau sehat.
prop.table(table(jantung$target))
##
## 0 1
## 0.4554455 0.5445545
Tahap kedua dari preprocessing yaitu Data Manipulation. Pada proses Data Manipuation terdapat beberapa variabel yang belum memiliki tipe data yang sesuai.
jantung <- jantung %>%
select(-ï..age) %>%
mutate_if(is.integer, as.factor) %>%
mutate(sex = factor(sex, levels = c(0,1), labels = c("Female", "Male")),
fbs =factor(fbs, levels = c(0,1), labels = c("False", "True")),
exang = factor(exang, levels = c(0,1), labels = c("Tidak", "Iya")),
target = factor(target, levels = c(0,1),
labels = c("Sehat", "Tidak Sehat")))
Langkah selanjutnya yaitu dengan melihat struktur data serta memastikan lagi data sudah sesuai untuk kebutuhan proses klasifikasi.
glimpse(jantung)
## Rows: 303
## Columns: 13
## $ sex <fct> Male, Male, Female, Male, Female, Male, Female, Male, Male...
## $ cp <fct> 3, 2, 1, 1, 0, 0, 1, 1, 2, 2, 0, 2, 1, 3, 3, 2, 2, 3, 0, 3...
## $ trestbps <fct> 145, 130, 130, 120, 120, 140, 140, 120, 172, 150, 140, 130...
## $ chol <fct> 233, 250, 204, 236, 354, 192, 294, 263, 199, 168, 239, 275...
## $ fbs <fct> True, False, False, False, False, False, False, False, Tru...
## $ restecg <fct> 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1...
## $ thalach <fct> 150, 187, 172, 178, 163, 148, 153, 173, 162, 174, 160, 139...
## $ exang <fct> Tidak, Tidak, Tidak, Tidak, Iya, Tidak, Tidak, Tidak, Tida...
## $ oldpeak <dbl> 2.3, 3.5, 1.4, 0.8, 0.6, 0.4, 1.3, 0.0, 0.5, 1.6, 1.2, 0.2...
## $ slope <fct> 0, 0, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 0, 2, 2...
## $ ca <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2...
## $ thal <fct> 1, 2, 2, 2, 2, 1, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2...
## $ target <fct> Tidak Sehat, Tidak Sehat, Tidak Sehat, Tidak Sehat, Tidak ...
Tahap selanjutnya yaitu tahap EDA (Exploratory Data Analytics). Pada tahap ini melakukan visualisasi dari data yang digunakan yaitu pasien yang menderita penyakit jantung atau tidak sehat, pasien yang tidak menderita penyakit jantung atau sehat dan data oldpeak. Tahap EDA ini menggunakan ggplot, geom_jitter dan ggplotly dari data tersebut.
theme_biasa <- theme(legend.key = element_rect(fill="black"),
legend.background = element_rect(color="white", fill="#263238"),
plot.subtitle = element_text(size=6, color="white"),
panel.background = element_rect(fill="#dddddd"),
panel.border = element_rect(fill=NA),
panel.grid.minor.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(color="darkgrey", linetype=2),
panel.grid.minor.y = element_blank(),
plot.background = element_rect(fill="#fa7781"),
text = element_text(color="white"),
axis.text = element_text(color="white")
)
data_kanker_1 <- jantung %>%
mutate(kol = jantung) %>%
group_by(target)
plot_jantung <- data_kanker_1 %>%
ggplot(aes(x = oldpeak, y = target, text = glue("Keadaan Pasien: {target}
Kadar Oldpeak Pasien: {oldpeak}")))+
geom_jitter() +
labs( x = NULL,
y = NULL,
title = "Pasien Kanker atau Tidak") +
theme(legend.position = "none") +
theme_biasa
ggplotly(plot_jantung, tooltip = "text")
Klasifikasi yang digunakan yaitu Naive Bayes, Random Forest dan Decision Tree.
Pada klasifikasi pertama yaitu Naive Bayes. Tahap pertama untuk klasifikasi Naive Bayes melakukan cross validation sebanyak 80% untuk training data dan 20% untuk testing data.
set.seed(100)
splitter <- initial_split(data = jantung, prop = 0.8, strata = "target")
train <- training(splitter)
test <- testing(splitter)
jantung_naive <- naiveBayes(x = train %>%
select(-target),
y = train$target,
laplace = 1)
Tahap selanjutnya yaitu mengelompokkan hasil prediksi dari hasil klasifikasi menjadi 2 kelompok yaitu target dan prediksi kelas yang dihasilkan pada proses klasifikasi.
jantung_predClass <- select(test, target) %>%
bind_cols(pred_class = predict(object = jantung_naive,
newdata = test,
type = "class"))
jantung_predClass
Tahap terakhir yaitu dengan mengelompokkan hasil dari akurasi, sensitivity, specificity dan precision.
jantung_perfor_bayes <- jantung_predClass %>%
summarise(accuracy = accuracy_vec(target, pred_class),
sensitivity = sens_vec(target, pred_class),
specificity = spec_vec(target, pred_class),
precision = precision_vec(target, pred_class))
jantung_perfor_bayes
Klasifikasi kedua yang menggunakan yaitu Random Forest. Tahap pertama pada klasifikasi Random Forest yaitu dengan menggunakan trees sebanyak 500, mtry = 1 dan terhadap target data yang ingin diteliti.
model_rf <- rand_forest(trees = 500,
mtry = 1,
mode = "classification",
min_n = 1) %>%
set_engine("ranger") %>%
fit(target ~ ., data = train)
Tahap selanjutnya yaitu mengelompokkan hasil prediksi dari hasil klasifikasi menjadi 2 kelompok yaitu target dan prediksi kelas yang dihasilkan pada proses klasifikasi.
jantung_rf_predClass <- select(test, target) %>%
bind_cols(pred_class = predict(model_rf, new_data = test %>%
select(-target),
type = "class"))
jantung_rf_predClass
Tahap terakhir yaitu dengan mengelompokkan hasil dari akurasi, sensitivity, specificity dan precision.
jantung_perfor_rf <- jantung_rf_predClass %>%
summarise(accuracy = accuracy_vec(target, .pred_class),
sensitivity = sens_vec(target, .pred_class),
specificity = spec_vec(target, .pred_class),
precision = precision_vec(target, .pred_class))
jantung_perfor_rf
Klasifikasi yang ketiga menggunakan yaitu Decision Tree. Pada klasifikasi terakhir ini, menggunakan dari library rpart terhadap target data yang ingin ditelusuri. Target tersebut yaitu pasien yang menderita penyakit jantung atau tidak sehat dan pasien yang tidak menderita penyakit jantung atau sehat.
set.seed(100)
control <- rpart.control(minsplit = 1)
jantung_dc <- rpart(target ~ ., data = train,
method = "class", control = control)
Tahap selanjutnya yaitu mengelompokkan hasil prediksi dari hasil klasifikasi menjadi 2 kelompok yaitu target dan prediksi kelas yang dihasilkan pada proses klasifikasi.
jantung_dc_predClass <- select(test, target) %>%
bind_cols(pred_class = predict(jantung_dc,
newdata = test %>%
select(-target),
type = "class"))
jantung_dc_predClass
Tahap terakhir yaitu dengan mengelompokkan hasil dari akurasi, sensitivity, specificity dan precision.
jantung_perfor_dc <- jantung_dc_predClass %>%
summarise(accuracy = accuracy_vec(target, pred_class),
sensitivity = sens_vec(target, pred_class),
specificity = spec_vec(target, pred_class),
precision = precision_vec(target, pred_class))
jantung_perfor_dc
jantung_perfor_bayes
jantung_perfor_rf
jantung_perfor_dc
Berikut ini adalah gambaran shiny yang akan saya buat.
knitr::include_graphics("gambaran shiny.jpeg")
Naive Bayes, Random Forest dan Decision Tree.