Halo, dalam LBB ini saya menggunakan data dari kaggle https://www.kaggle.com/fedesoriano/hepatitis-c-dataset dan bertujuan untuk memprediksi apakah pasien itu punya penyakit hepar (hati) atau tidak dan dapat menjadi blood donor.

Preparation

library(tidyverse)
library(e1071)
library(caret)
library(partykit)
library(rsample)
hepatitis <- read.csv("HepatitisCdata.csv", stringsAsFactors = T)
head(hepatitis)

All attributes except Category and Sex are numerical.
Attributes 1 to 4 refer to the data of the patient:
- X (Patient ID/No.)
- Category (diagnosis) (values: ‘0=Blood Donor’, ‘0s=suspect Blood Donor’, ‘1=Hepatitis’, ‘2=Fibrosis’, ‘3=Cirrhosis’)
- Age (in years)
- Sex (f,m)
Attributes 5 to 14 refer to laboratory data:
- ALB = Albumin Blood Test
- ALP = Alkaline phosphatase
- ALT = Alanine Transaminase
- AST = Aspartate Transaminase
- BIL = Bilirubin
- CHE = Acetylcholinesterase
- CHOL = Cholestrol
- CREA = Creatinine
- GGT = Gamma-Glutamyl Transferase
- PROT = Proteins

EDA dan Data Wrangling

Cek Tipe Data

str(hepatitis)
#> 'data.frame':    615 obs. of  14 variables:
#>  $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
#>  $ Category: Factor w/ 5 levels "0=Blood Donor",..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ Age     : int  32 32 32 32 32 32 32 32 32 32 ...
#>  $ Sex     : Factor w/ 2 levels "f","m": 2 2 2 2 2 2 2 2 2 2 ...
#>  $ ALB     : num  38.5 38.5 46.9 43.2 39.2 41.6 46.3 42.2 50.9 42.4 ...
#>  $ ALP     : num  52.5 70.3 74.7 52 74.1 43.3 41.3 41.9 65.5 86.3 ...
#>  $ ALT     : num  7.7 18 36.2 30.6 32.6 18.5 17.5 35.8 23.2 20.3 ...
#>  $ AST     : num  22.1 24.7 52.6 22.6 24.8 19.7 17.8 31.1 21.2 20 ...
#>  $ BIL     : num  7.5 3.9 6.1 18.9 9.6 12.3 8.5 16.1 6.9 35.2 ...
#>  $ CHE     : num  6.93 11.17 8.84 7.33 9.15 ...
#>  $ CHOL    : num  3.23 4.8 5.2 4.74 4.32 6.05 4.79 4.6 4.1 4.45 ...
#>  $ CREA    : num  106 74 86 80 76 111 70 109 83 81 ...
#>  $ GGT     : num  12.1 15.6 33.2 33.8 29.9 91 16.9 21.5 13.7 15.9 ...
#>  $ PROT    : num  69 76.5 79.3 75.7 68.7 74 74.5 67.1 71.3 69.9 ...


Cek Dimensi Data

dim(hepatitis)
#> [1] 615  14

Data hepatitis memiliki 615 baris dan 14 kolom.

Cek Missing Values


Mari kita cek apakah ada kolom yang kosong dari dataset hepatitis.

colSums(is.na(hepatitis))
#>        X Category      Age      Sex      ALB      ALP      ALT      AST 
#>        0        0        0        0        1       18        1        0 
#>      BIL      CHE     CHOL     CREA      GGT     PROT 
#>        0        0       10        0        0        1


Terdapat beberapa kolom yang barisnya tidak memiliki nilai (NA). Karena kolom tersebut penting untuk prediksi, maka saya akan hapus baris yang mengandung NA tersebut dengan menggunakan fungsi na.omit() karena dikhawatirkan akan mempengaruhi hasil prediksi.

hepatitis_c <- hepatitis %>% 
  select(-X) %>% #kolom X tidak akan digunakan
  na.omit()
dim(hepatitis_c)
#> [1] 589  13
prop.table(table(hepatitis_c$Category))
#> 
#>          0=Blood Donor 0s=suspect Blood Donor            1=Hepatitis 
#>             0.89303905             0.01188455             0.03395586 
#>             2=Fibrosis            3=Cirrhosis 
#>             0.02037351             0.04074703

Dimensi data telah berubah menjadi 589 baris dan 13 kolom. Sekarang mari kita masuk ke tahap selanjutnya.
Sebelum masuk ke modelling, saya ingin mengelompokkan 5 kategori di kolom Category menjadi 2: Blood Donor vs Hepatitis Hepatitis sendiri berisi Cirrochis, Fibrochis, dan Hepatitis, hal ini saya lakukan karena Hepatitis tipe C yang terlambat ditangani dapat berujung pada penyakit sirosis dan fibrosis. Blood Donor dan SUspect Blood Donor saya masukkan ke kategori Blood Donor.

hepatitis_c <- hepatitis_c %>% 
  mutate(Category = sapply(X = as.character(Category),
                           switch,
                           "3=Cirrhosis" = "Hepatitis",
                           "2=Fibrosis" = "Hepatitis",
                           "1=Hepatitis" = "Hepatitis",
                           "0=Blood Donor" = "Blood Donor",
                           "0s=suspect Blood Donor" ="Blood Donor"))
hepatitis_c$Category <- as.factor(hepatitis_c$Category)



Data Preprocessing


Splitting Data


Data yang sudah bersih tadi mari kita split menjadi data train dan data test.

set.seed(123)
splitter <- initial_split(hepatitis_c, 0.80, strata = "Category")
data_train <- training(splitter)
data_test <- testing(splitter)


Sekarang mari kita cek proporsi data

prop.table(table(data_train$Category))
#> 
#> Blood Donor   Hepatitis 
#>  0.90254237  0.09745763


Downsampling

Berdasar proporsi data target kita, maka hasil yang akan ditampilkan nanti berupa 2 variabel tersebut. Suspect Blood Donor karena hanya sedikit kasusnya maka saya masukkan ke dalam kategori Blood Donor dengan asumsi mereka layak dijadikan sebagai Blood Donor. Dilihat dari proporsi data yang belum seimbang, mari kita lakukan metode downsampling supaya proporsi data seimbang.

sample_train <- downSample(x = data_train %>% 
                             select(-Category),
                           y = data_train$Category,
                           yname = "Category")
prop.table(table(sample_train$Category))
#> 
#> Blood Donor   Hepatitis 
#>         0.5         0.5

Data train yang akan kita gunakan sudah balance, sekarang saatnya masuk ke modelling.

Modelling and Evaluation


Pada LBB ini saya akan menggunakan metode Naive Bayes dan Random Forrest untuk membuat model machine learning.

Model Naive Bayes

model_naive <- naiveBayes(sample_train %>% select(-Category),
                          sample_train$Category)


Model Random Forrest

model_tree <- ctree(Category ~ ., data = sample_train)
plot(model_tree)

Dari model random forrest di atas, terlihat bahwa variabel yang memberi pengaruh paling besar bagi model adalah GGT dan ALT.

Prediction

predict1 <- predict(object = model_tree,
                    newdata = data_test)

confusionMatrix(predict1,
                reference = data_test$Category,
                positive = "Hepatitis")
#> Confusion Matrix and Statistics
#> 
#>              Reference
#> Prediction    Blood Donor Hepatitis
#>   Blood Donor         106         2
#>   Hepatitis             1         8
#>                                           
#>                Accuracy : 0.9744          
#>                  95% CI : (0.9269, 0.9947)
#>     No Information Rate : 0.9145          
#>     P-Value [Acc > NIR] : 0.008181        
#>                                           
#>                   Kappa : 0.8282          
#>                                           
#>  Mcnemar's Test P-Value : 1.000000        
#>                                           
#>             Sensitivity : 0.80000         
#>             Specificity : 0.99065         
#>          Pos Pred Value : 0.88889         
#>          Neg Pred Value : 0.98148         
#>              Prevalence : 0.08547         
#>          Detection Rate : 0.06838         
#>    Detection Prevalence : 0.07692         
#>       Balanced Accuracy : 0.89533         
#>                                           
#>        'Positive' Class : Hepatitis       
#> 
predict2 <- predict(model_naive,
                    newdata = data_test)

confusionMatrix(predict2,
                reference = data_test$Category,
                positive = "Hepatitis")
#> Confusion Matrix and Statistics
#> 
#>              Reference
#> Prediction    Blood Donor Hepatitis
#>   Blood Donor         102         4
#>   Hepatitis             5         6
#>                                          
#>                Accuracy : 0.9231         
#>                  95% CI : (0.859, 0.9642)
#>     No Information Rate : 0.9145         
#>     P-Value [Acc > NIR] : 0.4523         
#>                                          
#>                   Kappa : 0.5293         
#>                                          
#>  Mcnemar's Test P-Value : 1.0000         
#>                                          
#>             Sensitivity : 0.60000        
#>             Specificity : 0.95327        
#>          Pos Pred Value : 0.54545        
#>          Neg Pred Value : 0.96226        
#>              Prevalence : 0.08547        
#>          Detection Rate : 0.05128        
#>    Detection Prevalence : 0.09402        
#>       Balanced Accuracy : 0.77664        
#>                                          
#>        'Positive' Class : Hepatitis      
#> 

Dari hasil confusionMatrix di atas, terlihat bahwa model random forrest dalam kasus ini lebih baik dalam memprediksi data_test dengan nilai akurasi sebesar 97.44%, sensitifity sebesar 80%, dan precission sebesar 88.89%.
Sementara model naive bayes hanya mampu menangkap akurasi sebesar 92.31%, sensitivity sebesar 60%, dan precission sebesar 54.54%.

Conclusion


Setelah keluar hasil dari confusionMatrix, terlihat bahwa model Machine Learning Random Forrest dapat digunakan untuk membantu kita dalam memprediksi penyakit dengan catatan penyakit hepatitis yang telah terprediksi perlu dilakukan tes laboratorium (Tes Fungsi Hati) lebih lanjut oleh analis kesehatan supaya terlihat secara valid kondisi hati (hepar) pasien.

Model Machine Learning ini diharapkan mampu membantu ahli kesehatan dan rumah sakit dalam campaign tindakan preventif bagi pasien yang masih sehat supaya tidak sampai jatuh ke dalam penyakit Hepatitis C yang di Indonesia sendiri cenderung terlambat diketahui sehingga terjadi komplikasi sampai ke sirosis dan fibrosis. Dengan model machine learning ini diharapkan juga mampu meningkatkan kualitas dan angka harapan hidup seseorang dengan melakukan pencegahan lebih dini terhadap penyakit Hepatitis C.