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.
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
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 ...
dim(hepatitis)#> [1] 615 14
Data hepatitis memiliki 615 baris dan 14 kolom.
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 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
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.
Pada LBB ini saya akan menggunakan metode Naive Bayes dan Random Forrest untuk membuat model machine learning.
model_naive <- naiveBayes(sample_train %>% select(-Category),
sample_train$Category)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.
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%.
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.