Setup dan Import Data

library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data_tb <- read_excel("D:/FINAL TA/SUMBER REFRENSI/TA.xlsx", sheet = 1)

head(data_tb)
## # A tibble: 6 × 11
##      NO `TANGGAL MASUK` `JENIS KELAMIN` `UMUR TAHUN` `KEADAAN KELUAR` PENYAKIT
##   <dbl> <chr>                     <dbl>        <dbl>            <dbl>    <dbl>
## 1     1 18/02/2024                    1          124                1        1
## 2     2 21/02/2024                    1           23                0        1
## 3     3 19/04/2024                    1           62                0        1
## 4     4 20/04/2024                    1           42                0        1
## 5     5 29/04/2024                    1           71                0        1
## 6     6 45478                         1           63                0        1
## # ℹ 5 more variables: `LAMA RAWAT INAP` <dbl>, `PENYAKIT PENYERTA` <dbl>,
## #   LEOKOSIT <dbl>, TROMBOSIT <chr>, HEMOGLOBIN <dbl>
str(data_tb)
## tibble [322 × 11] (S3: tbl_df/tbl/data.frame)
##  $ NO               : num [1:322] 1 2 3 4 5 6 7 8 9 10 ...
##  $ TANGGAL MASUK    : chr [1:322] "18/02/2024" "21/02/2024" "19/04/2024" "20/04/2024" ...
##  $ JENIS KELAMIN    : num [1:322] 1 1 1 1 1 1 0 0 0 1 ...
##  $ UMUR TAHUN       : num [1:322] 124 23 62 42 71 63 51 42 27 66 ...
##  $ KEADAAN KELUAR   : num [1:322] 1 0 0 0 0 0 0 0 0 0 ...
##  $ PENYAKIT         : num [1:322] 1 1 1 1 1 1 1 1 1 1 ...
##  $ LAMA RAWAT INAP  : num [1:322] 3 1 3 3 3 3 4 7 3 5 ...
##  $ PENYAKIT PENYERTA: num [1:322] 0 0 0 0 1 1 0 0 0 0 ...
##  $ LEOKOSIT         : num [1:322] 0 0 0 1 1 NA 1 1 0 1 ...
##  $ TROMBOSIT        : chr [1:322] "435" "314" "478" "538" ...
##  $ HEMOGLOBIN       : num [1:322] 1 0 1 1 1 NA 1 1 NA 0 ...
data_tb <- na.omit(data_tb)

colnames(data_tb) <- c(
  "NO",
  "TANGGAL_MASUK",
  "JENIS_KELAMIN",
  "UMUR_TAHUN",
  "KEADAAN_KELUAR",
  "PENYAKIT",
  "LAMA_RAWAT_INAP",
  "PENYAKIT_PENYERTA",
  "LEOKOSIT",
  "TROMBOSIT",
  "HEMOGLOBIN"
)

Tahap ini bertujuan untuk mempersiapkan data mentah sebelum dianalisis. Data yang memiliki nilai kosong dihapus agar tidak mengganggu proses pemodelan.

Transformasi Variabel

data_tb <- data_tb %>%
  mutate(KODE_TROMBOSIT = ifelse(TROMBOSIT >= 150 & TROMBOSIT <= 450, 0, 1))


data_tb <- data_tb %>%
  mutate(KODE_LAMA_RAWAT = ifelse(LAMA_RAWAT_INAP <= 5, 0, 1))

data_tb <- data_tb %>%
  mutate(KODE_PENYERTA = ifelse(PENYAKIT_PENYERTA == 0, 0, 1))

data_tb$KEADAAN_KELUAR <- factor(data_tb$KEADAAN_KELUAR,
                                 levels = c(0,1),
                                 labels = c("HIDUP","MENINGGAL"))

data_tb$PENYAKIT <- factor(data_tb$PENYAKIT,
                           levels = c(0,1,2),
                           labels = c("TB_PARU","TB_PLEURA","TB_LAINNYA"))

data_tb$JENIS_KELAMIN <- factor(data_tb$JENIS_KELAMIN,
                                levels = c(0,1),
                                labels = c("P","L"))

Statistik Deskriptif

summary(data_tb)
##        NO         TANGGAL_MASUK      JENIS_KELAMIN   UMUR_TAHUN    
##  Min.   :  1.00   Length:282         P: 94         Min.   :  1.00  
##  1st Qu.: 83.25   Class :character   L:188         1st Qu.: 42.00  
##  Median :156.50   Mode  :character                 Median : 54.00  
##  Mean   :161.31                                    Mean   : 51.93  
##  3rd Qu.:242.75                                    3rd Qu.: 64.00  
##  Max.   :321.00                                    Max.   :124.00  
##    KEADAAN_KELUAR       PENYAKIT   LAMA_RAWAT_INAP  PENYAKIT_PENYERTA
##  HIDUP    :253    TB_PARU   :235   Min.   : 1.000   Min.   :0.0000   
##  MENINGGAL: 29    TB_PLEURA : 33   1st Qu.: 3.000   1st Qu.:0.0000   
##                   TB_LAINNYA: 14   Median : 4.000   Median :0.0000   
##                                    Mean   : 4.429   Mean   :0.1844   
##                                    3rd Qu.: 5.000   3rd Qu.:0.0000   
##                                    Max.   :15.000   Max.   :1.0000   
##     LEOKOSIT       TROMBOSIT           HEMOGLOBIN    KODE_TROMBOSIT  
##  Min.   :0.0000   Length:282         Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   Class :character   1st Qu.:0.000   1st Qu.:0.0000  
##  Median :1.0000   Mode  :character   Median :1.000   Median :0.0000  
##  Mean   :0.5674                      Mean   :0.578   Mean   :0.3085  
##  3rd Qu.:1.0000                      3rd Qu.:1.000   3rd Qu.:1.0000  
##  Max.   :1.0000                      Max.   :1.000   Max.   :1.0000  
##  KODE_LAMA_RAWAT  KODE_PENYERTA   
##  Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.0000  
##  Mean   :0.1525   Mean   :0.1844  
##  3rd Qu.:0.0000   3rd Qu.:0.0000  
##  Max.   :1.0000   Max.   :1.0000
str(data_tb)
## tibble [282 × 14] (S3: tbl_df/tbl/data.frame)
##  $ NO               : num [1:282] 1 2 3 4 5 7 8 10 11 12 ...
##  $ TANGGAL_MASUK    : chr [1:282] "18/02/2024" "21/02/2024" "19/04/2024" "20/04/2024" ...
##  $ JENIS_KELAMIN    : Factor w/ 2 levels "P","L": 2 2 2 2 2 1 1 2 2 2 ...
##  $ UMUR_TAHUN       : num [1:282] 124 23 62 42 71 51 42 66 49 49 ...
##  $ KEADAAN_KELUAR   : Factor w/ 2 levels "HIDUP","MENINGGAL": 2 1 1 1 1 1 1 1 1 1 ...
##  $ PENYAKIT         : Factor w/ 3 levels "TB_PARU","TB_PLEURA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ LAMA_RAWAT_INAP  : num [1:282] 3 1 3 3 3 4 7 5 4 4 ...
##  $ PENYAKIT_PENYERTA: num [1:282] 0 0 0 0 1 0 0 0 1 0 ...
##  $ LEOKOSIT         : num [1:282] 0 0 0 1 1 1 1 1 0 1 ...
##  $ TROMBOSIT        : chr [1:282] "435" "314" "478" "538" ...
##  $ HEMOGLOBIN       : num [1:282] 1 0 1 1 1 1 1 0 1 0 ...
##  $ KODE_TROMBOSIT   : num [1:282] 0 0 1 1 0 1 1 0 1 0 ...
##  $ KODE_LAMA_RAWAT  : num [1:282] 0 0 0 0 0 0 1 0 0 0 ...
##  $ KODE_PENYERTA    : num [1:282] 0 0 0 0 1 0 0 0 1 0 ...
##  - attr(*, "na.action")= 'omit' Named int [1:40] 6 9 33 37 38 39 41 44 49 52 ...
##   ..- attr(*, "names")= chr [1:40] "6" "9" "33" "37" ...

Memastikan tidak ada missing value.

colSums(is.na(data_tb))
##                NO     TANGGAL_MASUK     JENIS_KELAMIN        UMUR_TAHUN 
##                 0                 0                 0                 0 
##    KEADAAN_KELUAR          PENYAKIT   LAMA_RAWAT_INAP PENYAKIT_PENYERTA 
##                 0                 0                 0                 0 
##          LEOKOSIT         TROMBOSIT        HEMOGLOBIN    KODE_TROMBOSIT 
##                 0                 0                 0                 0 
##   KODE_LAMA_RAWAT     KODE_PENYERTA 
##                 0                 0
View(data_tb)

Distribusi Jenis Penyakit

tb_freq <- table(data_tb$PENYAKIT)

tb_percent <- prop.table(tb_freq) * 100

tb_deskriptif <- data.frame(
  Jenis_TBC = names(tb_freq),
  N = as.vector(tb_freq),
  Persen = round(as.vector(tb_percent),2)
)

tb_deskriptif
##    Jenis_TBC   N Persen
## 1    TB_PARU 235  83.33
## 2  TB_PLEURA  33  11.70
## 3 TB_LAINNYA  14   4.96

Menghitung jumlah dan persentase tiap jenis TBC.

#Visualisasi distribusi data dalam bentuk diagram lingkaran.

pie(tb_freq,
    main = "Diagram Lingkaran Jenis TBC",
    col = c("orange","green","yellow"))

Fungsi Deskriptif

library(dplyr)

# buat kategori usia (hindari simbol aneh)
data_tb <- data_tb %>%
  mutate(
    USIA_KATEGORI = ifelse(UMUR_TAHUN <= 45, "<=45", ">45")
  )

# fungsi deskriptif (lebih aman)
deskriptif <- function(data, var){
  
  # pastikan character bersih
  x <- data[[var]]
  x <- iconv(x, "UTF-8", "ASCII", sub = "")  # cegah error encoding
  
  freq <- table(x)
  persen <- prop.table(freq) * 100
  
  hasil <- data.frame(
    Variabel = var,
    Kategori = names(freq),
    N = as.vector(freq),
    Persen = round(as.vector(persen), 2)
  )
  
  return(hasil)
}

# jalankan
d1 <- deskriptif(data_tb, "JENIS_KELAMIN")
d2 <- deskriptif(data_tb, "USIA_KATEGORI")
d3 <- deskriptif(data_tb, "LEOKOSIT")
d4 <- deskriptif(data_tb, "KODE_TROMBOSIT")
d5 <- deskriptif(data_tb, "HEMOGLOBIN")
d6 <- deskriptif(data_tb, "KODE_PENYERTA")
d7 <- deskriptif(data_tb, "KODE_LAMA_RAWAT")
d8 <- deskriptif(data_tb, "KEADAAN_KELUAR")

tabel_deskriptif <- bind_rows(d1, d2, d3, d4, d5, d6, d7, d8)

tabel_deskriptif
##           Variabel  Kategori   N Persen
## 1    JENIS_KELAMIN         L 188  66.67
## 2    JENIS_KELAMIN         P  94  33.33
## 3    USIA_KATEGORI      <=45  90  31.91
## 4    USIA_KATEGORI       >45 192  68.09
## 5         LEOKOSIT         0 122  43.26
## 6         LEOKOSIT         1 160  56.74
## 7   KODE_TROMBOSIT         0 195  69.15
## 8   KODE_TROMBOSIT         1  87  30.85
## 9       HEMOGLOBIN         0 119  42.20
## 10      HEMOGLOBIN         1 163  57.80
## 11   KODE_PENYERTA         0 230  81.56
## 12   KODE_PENYERTA         1  52  18.44
## 13 KODE_LAMA_RAWAT         0 239  84.75
## 14 KODE_LAMA_RAWAT         1  43  15.25
## 15  KEADAAN_KELUAR     HIDUP 253  89.72
## 16  KEADAAN_KELUAR MENINGGAL  29  10.28

Fungsi ini digunakan untuk menghitung frekuensi dan persentase setiap variabel dan Memilih variabel yang digunakan dalam model.

data_no_na <- na.omit(data_tb)
head(data_tb)
## # A tibble: 6 × 15
##      NO TANGGAL_MASUK JENIS_KELAMIN UMUR_TAHUN KEADAAN_KELUAR PENYAKIT 
##   <dbl> <chr>         <fct>              <dbl> <fct>          <fct>    
## 1     1 18/02/2024    L                    124 MENINGGAL      TB_PLEURA
## 2     2 21/02/2024    L                     23 HIDUP          TB_PLEURA
## 3     3 19/04/2024    L                     62 HIDUP          TB_PLEURA
## 4     4 20/04/2024    L                     42 HIDUP          TB_PLEURA
## 5     5 29/04/2024    L                     71 HIDUP          TB_PLEURA
## 6     7 18/06/2024    P                     51 HIDUP          TB_PLEURA
## # ℹ 9 more variables: LAMA_RAWAT_INAP <dbl>, PENYAKIT_PENYERTA <dbl>,
## #   LEOKOSIT <dbl>, TROMBOSIT <chr>, HEMOGLOBIN <dbl>, KODE_TROMBOSIT <dbl>,
## #   KODE_LAMA_RAWAT <dbl>, KODE_PENYERTA <dbl>, USIA_KATEGORI <chr>
str(data_tb)
## tibble [282 × 15] (S3: tbl_df/tbl/data.frame)
##  $ NO               : num [1:282] 1 2 3 4 5 7 8 10 11 12 ...
##  $ TANGGAL_MASUK    : chr [1:282] "18/02/2024" "21/02/2024" "19/04/2024" "20/04/2024" ...
##  $ JENIS_KELAMIN    : Factor w/ 2 levels "P","L": 2 2 2 2 2 1 1 2 2 2 ...
##  $ UMUR_TAHUN       : num [1:282] 124 23 62 42 71 51 42 66 49 49 ...
##  $ KEADAAN_KELUAR   : Factor w/ 2 levels "HIDUP","MENINGGAL": 2 1 1 1 1 1 1 1 1 1 ...
##  $ PENYAKIT         : Factor w/ 3 levels "TB_PARU","TB_PLEURA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ LAMA_RAWAT_INAP  : num [1:282] 3 1 3 3 3 4 7 5 4 4 ...
##  $ PENYAKIT_PENYERTA: num [1:282] 0 0 0 0 1 0 0 0 1 0 ...
##  $ LEOKOSIT         : num [1:282] 0 0 0 1 1 1 1 1 0 1 ...
##  $ TROMBOSIT        : chr [1:282] "435" "314" "478" "538" ...
##  $ HEMOGLOBIN       : num [1:282] 1 0 1 1 1 1 1 0 1 0 ...
##  $ KODE_TROMBOSIT   : num [1:282] 0 0 1 1 0 1 1 0 1 0 ...
##  $ KODE_LAMA_RAWAT  : num [1:282] 0 0 0 0 0 0 1 0 0 0 ...
##  $ KODE_PENYERTA    : num [1:282] 0 0 0 0 1 0 0 0 1 0 ...
##  $ USIA_KATEGORI    : chr [1:282] ">45" "<=45" ">45" "<=45" ...
##  - attr(*, "na.action")= 'omit' Named int [1:40] 6 9 33 37 38 39 41 44 49 52 ...
##   ..- attr(*, "names")= chr [1:40] "6" "9" "33" "37" ...
data_tb[data_tb == "-"] <- NA
nrow(data_tb)
## [1] 282
nrow(data_no_na)
## [1] 282

Persiapan Data Model

data_no_na <- na.omit(data_tb)

X <- data_no_na[,c(
"JENIS_KELAMIN",
"USIA_KATEGORI",
"LEOKOSIT",
"KODE_TROMBOSIT",
"HEMOGLOBIN",
"KODE_PENYERTA",
"KODE_LAMA_RAWAT",
"KEADAAN_KELUAR"
)]

X <- data.frame(lapply(X, function(x) as.numeric(as.factor(x))))
str(X)
## 'data.frame':    282 obs. of  8 variables:
##  $ JENIS_KELAMIN  : num  2 2 2 2 2 1 1 2 2 2 ...
##  $ USIA_KATEGORI  : num  2 1 2 1 2 2 1 2 2 2 ...
##  $ LEOKOSIT       : num  1 1 1 2 2 2 2 2 1 2 ...
##  $ KODE_TROMBOSIT : num  1 1 2 2 1 2 2 1 2 1 ...
##  $ HEMOGLOBIN     : num  2 1 2 2 2 2 2 1 2 1 ...
##  $ KODE_PENYERTA  : num  1 1 1 1 2 1 1 1 2 1 ...
##  $ KODE_LAMA_RAWAT: num  1 1 1 1 1 1 2 1 1 1 ...
##  $ KEADAAN_KELUAR : num  2 1 1 1 1 1 1 1 1 1 ...
View(data_no_na)
data_model_no_na <- data_no_na[, c(
"PENYAKIT",
"JENIS_KELAMIN",
"USIA_KATEGORI",
"LEOKOSIT",
"KODE_TROMBOSIT",
"HEMOGLOBIN",
"KODE_PENYERTA",
"KODE_LAMA_RAWAT",
"KEADAAN_KELUAR"
)]
data_model_no_na $PENYAKIT <- factor(data_model_no_na $PENYAKIT)
View(data_model_no_na)

Split Data Training & Testing

library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Loading required package: lattice
set.seed(1001)

train_index <- createDataPartition(data_model_no_na$PENYAKIT, p = 0.80, list = FALSE)

trainDataNO <- data_model_no_na[train_index, ]
testDataNO  <- data_model_no_na[-train_index, ]

Jumlah data training

n <- nrow(trainDataNO)
n
## [1] 227

Jumlah data training

n <- nrow(testDataNO)
n
## [1] 55

Cek Distribusi Data

trainDataNO %>% count(PENYAKIT)
## # A tibble: 3 × 2
##   PENYAKIT       n
##   <fct>      <int>
## 1 TB_PARU      188
## 2 TB_PLEURA     27
## 3 TB_LAINNYA    12
testDataNO %>% count(PENYAKIT)
## # A tibble: 3 × 2
##   PENYAKIT       n
##   <fct>      <int>
## 1 TB_PARU       47
## 2 TB_PLEURA      6
## 3 TB_LAINNYA     2

Naive Bayes dengan Balanced data (Undersampling)

set.seed(1001)

down_trainNO <- downSample(
  x = trainDataNO[, !colnames(trainDataNO) %in% "PENYAKIT"],
  y = trainDataNO$PENYAKIT
)

Mengurangi jumlah data pada kelas mayoritas agar seimbang.

names(down_trainNO)[names(down_trainNO) == "Class"] <- "PENYAKIT"
table(down_trainNO$PENYAKIT)
## 
##    TB_PARU  TB_PLEURA TB_LAINNYA 
##         12         12         12
down_trainNO %>%
  count(PENYAKIT)
##     PENYAKIT  n
## 1    TB_PARU 12
## 2  TB_PLEURA 12
## 3 TB_LAINNYA 12

Model Naive Bayes (Undersampling)

library(e1071)
## Warning: package 'e1071' was built under R version 4.4.3
## 
## Attaching package: 'e1071'
## The following object is masked from 'package:ggplot2':
## 
##     element
NBClassifier0 <- naiveBayes(PENYAKIT ~ ., data = down_trainNO)

NBClassifier0
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##    TB_PARU  TB_PLEURA TB_LAINNYA 
##  0.3333333  0.3333333  0.3333333 
## 
## Conditional probabilities:
##             JENIS_KELAMIN
## Y                    P         L
##   TB_PARU    0.2500000 0.7500000
##   TB_PLEURA  0.3333333 0.6666667
##   TB_LAINNYA 0.5833333 0.4166667
## 
##             USIA_KATEGORI
## Y                  <=45        >45
##   TB_PARU    0.25000000 0.75000000
##   TB_PLEURA  0.08333333 0.91666667
##   TB_LAINNYA 0.58333333 0.41666667
## 
##             LEOKOSIT
## Y                 [,1]      [,2]
##   TB_PARU    0.3333333 0.4923660
##   TB_PLEURA  0.7500000 0.4522670
##   TB_LAINNYA 0.1666667 0.3892495
## 
##             KODE_TROMBOSIT
## Y                  [,1]      [,2]
##   TB_PARU    0.08333333 0.2886751
##   TB_PLEURA  0.41666667 0.5149287
##   TB_LAINNYA 0.33333333 0.4923660
## 
##             HEMOGLOBIN
## Y                 [,1]     [,2]
##   TB_PARU    0.2500000 0.452267
##   TB_PLEURA  0.7500000 0.452267
##   TB_LAINNYA 0.6666667 0.492366
## 
##             KODE_PENYERTA
## Y                 [,1]     [,2]
##   TB_PARU    0.3333333 0.492366
##   TB_PLEURA  0.0000000 0.000000
##   TB_LAINNYA 0.3333333 0.492366
## 
##             KODE_LAMA_RAWAT
## Y                 [,1]      [,2]
##   TB_PARU    0.0000000 0.0000000
##   TB_PLEURA  0.0000000 0.0000000
##   TB_LAINNYA 0.4166667 0.5149287
## 
##             KEADAAN_KELUAR
## Y                 HIDUP  MENINGGAL
##   TB_PARU    0.83333333 0.16666667
##   TB_PLEURA  0.83333333 0.16666667
##   TB_LAINNYA 0.91666667 0.08333333

Membangun model klasifikasi Naive Bayes menggunakan data seimbang.

Prediksi dan Evaluasi

testDataNO$predicted <- predict(NBClassifier0, testDataNO)

testDataNO$actual <- testDataNO$PENYAKIT
library(caret)

confusionMatrix(
  factor(testDataNO$predicted),
  factor(testDataNO$actual)
)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   TB_PARU TB_PLEURA TB_LAINNYA
##   TB_PARU          6         1          2
##   TB_PLEURA       40         5          0
##   TB_LAINNYA       1         0          0
## 
## Overall Statistics
##                                           
##                Accuracy : 0.2             
##                  95% CI : (0.1043, 0.3297)
##     No Information Rate : 0.8545          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : -0.0386         
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: TB_PARU Class: TB_PLEURA Class: TB_LAINNYA
## Sensitivity                  0.1277          0.83333           0.00000
## Specificity                  0.6250          0.18367           0.98113
## Pos Pred Value               0.6667          0.11111           0.00000
## Neg Pred Value               0.1087          0.90000           0.96296
## Prevalence                   0.8545          0.10909           0.03636
## Detection Rate               0.1091          0.09091           0.00000
## Detection Prevalence         0.1636          0.81818           0.01818
## Balanced Accuracy            0.3763          0.50850           0.49057

Naive Bayes dengan Balanced data (Oversampling)

set.seed(1001)

up_trainNO <- upSample(
  x = trainDataNO[, !colnames(trainDataNO) %in% "PENYAKIT"],
  y = trainDataNO$PENYAKIT
)

Menambah data pada kelas minoritas agar seimbang.

names(up_trainNO)[names(up_trainNO) == "Class"] <- "PENYAKIT"
table(up_trainNO$PENYAKIT)
## 
##    TB_PARU  TB_PLEURA TB_LAINNYA 
##        188        188        188
up_trainNO %>%
  count(PENYAKIT)
##     PENYAKIT   n
## 1    TB_PARU 188
## 2  TB_PLEURA 188
## 3 TB_LAINNYA 188

Model Naive Bayes (Oversampling)

library(e1071)
NBClassifier1 <- naiveBayes(PENYAKIT ~ ., data = up_trainNO)

NBClassifier1
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##    TB_PARU  TB_PLEURA TB_LAINNYA 
##  0.3333333  0.3333333  0.3333333 
## 
## Conditional probabilities:
##             JENIS_KELAMIN
## Y                    P         L
##   TB_PARU    0.3563830 0.6436170
##   TB_PLEURA  0.2180851 0.7819149
##   TB_LAINNYA 0.5851064 0.4148936
## 
##             USIA_KATEGORI
## Y                 <=45       >45
##   TB_PARU    0.3031915 0.6968085
##   TB_PLEURA  0.2819149 0.7180851
##   TB_LAINNYA 0.5425532 0.4574468
## 
##             LEOKOSIT
## Y                 [,1]      [,2]
##   TB_PARU    0.5957447 0.4920578
##   TB_PLEURA  0.6223404 0.4860964
##   TB_LAINNYA 0.1702128 0.3768231
## 
##             KODE_TROMBOSIT
## Y                 [,1]      [,2]
##   TB_PARU    0.2819149 0.4511335
##   TB_PLEURA  0.4095745 0.4930683
##   TB_LAINNYA 0.3457447 0.4768804
## 
##             HEMOGLOBIN
## Y                 [,1]      [,2]
##   TB_PARU    0.5744681 0.4957436
##   TB_PLEURA  0.7393617 0.4401551
##   TB_LAINNYA 0.5957447 0.4920578
## 
##             KODE_PENYERTA
## Y                 [,1]      [,2]
##   TB_PARU    0.1861702 0.3902833
##   TB_PLEURA  0.1276596 0.3346014
##   TB_LAINNYA 0.3563830 0.4802091
## 
##             KODE_LAMA_RAWAT
## Y                 [,1]      [,2]
##   TB_PARU    0.1648936 0.3720754
##   TB_PLEURA  0.0212766 0.1446902
##   TB_LAINNYA 0.3829787 0.4874112
## 
##             KEADAAN_KELUAR
## Y                 HIDUP  MENINGGAL
##   TB_PARU    0.88829787 0.11170213
##   TB_PLEURA  0.90957447 0.09042553
##   TB_LAINNYA 0.92553191 0.07446809

Model dilatih menggunakan data hasil oversampling.

Prediksi dan Evaluasi

testDataNO$predicted <- predict(NBClassifier1, testDataNO)

testDataNO$actual <- testDataNO$PENYAKIT
library(caret)

confusionMatrix(
  factor(testDataNO$predicted),
  factor(testDataNO$actual)
)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   TB_PARU TB_PLEURA TB_LAINNYA
##   TB_PARU          7         0          2
##   TB_PLEURA       34         4          0
##   TB_LAINNYA       6         2          0
## 
## Overall Statistics
##                                           
##                Accuracy : 0.2             
##                  95% CI : (0.1043, 0.3297)
##     No Information Rate : 0.8545          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : -0.0263         
##                                           
##  Mcnemar's Test P-Value : 2.826e-08       
## 
## Statistics by Class:
## 
##                      Class: TB_PARU Class: TB_PLEURA Class: TB_LAINNYA
## Sensitivity                  0.1489          0.66667           0.00000
## Specificity                  0.7500          0.30612           0.84906
## Pos Pred Value               0.7778          0.10526           0.00000
## Neg Pred Value               0.1304          0.88235           0.95745
## Prevalence                   0.8545          0.10909           0.03636
## Detection Rate               0.1273          0.07273           0.00000
## Detection Prevalence         0.1636          0.69091           0.14545
## Balanced Accuracy            0.4495          0.48639           0.42453