1 Problem Research

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.

2 Library

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)

3 Import Data

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")

3.1 Cek Struktur Data

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)

3.2 Gambaran Data

Tahap selanjutnya dengan melihat gambaran data, supaya tidak ada kesalahan pada saat proses klasifikasi dan proses data processing.

head(jantung)

3.3 Check Missing Value

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.

4 Pre-Processing Data

4.1 Check Proporsi Target

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

4.2 Data Manipulation

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 ...

4.3 EDA (Exploratory Data Analytics)

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")

5 Model Selection and Evaluation

Klasifikasi yang digunakan yaitu Naive Bayes, Random Forest dan Decision Tree.

5.1 Naive Bayes

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

5.2 Random Forest

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

5.3 Decision Tree

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

6 Gambaran Shiny Dashoard

Berikut ini adalah gambaran shiny yang akan saya buat.

knitr::include_graphics("gambaran shiny.jpeg")

  • Pada halaman pertama adalah halaman overview yang berisi overview dan grafik tentang target dan inputan user yang terdiri dari sex, oldpeak dll.
  • Pada halaman kedua yaitu predict pasien. Pada halaman ini, user dapat mengisi data yang sesuai dengan dialami lalu diprediksi apakah pasien tersebut mengalami penyakit jantung atau dalam keadaan sehat. Prediksi ini dapat menggunakan 3 metode klasifikasi yaitu Naive Bayes, Random Forest dan Decision Tree.
  • Halaman ketiga yaitu halaman yang berdasarkan inputan dari halaman kedua yang berupa tabel.
  • Halaman keempat yaitu halaman dataset yang digunakan.