Praktikum TPG Pertemuan 11

Author

Yehezki Novandri Liman

Published

November 18, 2025

Load Libraries

library(dplyr)
library(readxl)
library(MASS)

Import Data

data <- read_excel("C:\\Users\\Yehezki\\Downloads\\Data Indikasi Tumor.xlsx")
data <- data %>% mutate(`Jenis Tumor` = as.factor(`Jenis Tumor`))
data
# A tibble: 6 × 4
  Observasi `Ukuran Tumor (mm)` `Tekstur (skor)` `Jenis Tumor`
      <dbl>               <dbl>            <dbl> <fct>        
1         1                   6             10   Jinak        
2         2                   1              9   Jinak        
3         3                   2              4.8 Jinak        
4         4                   0              4.9 Ganas        
5         5                   1              4.7 Ganas        
6         6                   3              2.4 Ganas        

Memisahkan Data Per Kelompok

jinak <- subset(data, `Jenis Tumor`=="Jinak")[,2:3]
ganas <- subset(data, `Jenis Tumor`=="Ganas")[,2:3]
jinak; ganas
# A tibble: 3 × 2
  `Ukuran Tumor (mm)` `Tekstur (skor)`
                <dbl>            <dbl>
1                   6             10  
2                   1              9  
3                   2              4.8
# A tibble: 3 × 2
  `Ukuran Tumor (mm)` `Tekstur (skor)`
                <dbl>            <dbl>
1                   0              4.9
2                   1              4.7
3                   3              2.4

Menghitung Mean per Kelompok

mean_jinak <- colMeans(jinak)
mean_ganas <- colMeans(ganas)
mean_jinak; mean_ganas
Ukuran Tumor (mm)    Tekstur (skor) 
         3.000000          7.933333 
Ukuran Tumor (mm)    Tekstur (skor) 
         1.333333          4.000000 

Menghitung Covariance per Kelompok

S_jinak <- cov(jinak)
S_ganas <- cov(ganas)
S_jinak; S_ganas
                  Ukuran Tumor (mm) Tekstur (skor)
Ukuran Tumor (mm)               7.0       3.600000
Tekstur (skor)                  3.6       7.613333
                  Ukuran Tumor (mm) Tekstur (skor)
Ukuran Tumor (mm)          2.333333          -2.05
Tekstur (skor)            -2.050000           1.93

Menghitung Covariance Gabungan

n1 <- nrow(jinak)
n2 <- nrow(ganas)
S_pooled <- ((n1-1)*S_jinak + (n2-1)*S_ganas) / (n1+n2-2)
S_pooled
                  Ukuran Tumor (mm) Tekstur (skor)
Ukuran Tumor (mm)          4.666667       0.775000
Tekstur (skor)             0.775000       4.771667

Invers Matriks Covariance Gabungan

S_inv <- solve(S_pooled)
S_inv
                  Ukuran Tumor (mm) Tekstur (skor)
Ukuran Tumor (mm)        0.22022583    -0.03576843
Tekstur (skor)          -0.03576843     0.21537978

Menghitung Koefisien a (Fisher LDA)

a <- S_inv %*% (mean_jinak - mean_ganas)
a
                       [,1]
Ukuran Tumor (mm) 0.2263539
Tekstur (skor)    0.7875464

Menghitung Nilai h

h <- 0.5 * t(a) %*% (mean_jinak + mean_ganas)
h
        [,1]
[1,] 5.18946

Menghitung Skor Fisher

X <- as.matrix(data[,2:3])
data$Skor <- X %*% a
head(data)
# A tibble: 6 × 5
  Observasi `Ukuran Tumor (mm)` `Tekstur (skor)` `Jenis Tumor` Skor[,1]
      <dbl>               <dbl>            <dbl> <fct>            <dbl>
1         1                   6             10   Jinak             9.23
2         2                   1              9   Jinak             7.31
3         3                   2              4.8 Jinak             4.23
4         4                   0              4.9 Ganas             3.86
5         5                   1              4.7 Ganas             3.93
6         6                   3              2.4 Ganas             2.57

Klasifikasi

h <- as.numeric(h)

data$Pred_Manual <- ifelse(data$Skor >= h, "Jinak", "Ganas")
data
# A tibble: 6 × 6
  Observasi `Ukuran Tumor (mm)` `Tekstur (skor)` `Jenis Tumor` Skor[,1]
      <dbl>               <dbl>            <dbl> <fct>            <dbl>
1         1                   6             10   Jinak             9.23
2         2                   1              9   Jinak             7.31
3         3                   2              4.8 Jinak             4.23
4         4                   0              4.9 Ganas             3.86
5         5                   1              4.7 Ganas             3.93
6         6                   3              2.4 Ganas             2.57
# ℹ 1 more variable: Pred_Manual <chr[,1]>

Confusion Matrix

table(Actual=data$`Jenis Tumor`, Pred=data$Pred_Manual)
       Pred
Actual  Ganas Jinak
  Ganas     3     0
  Jinak     1     2

Error Rate

cm <- table(Actual=data$`Jenis Tumor`, Pred=data$Pred_Manual)
cm
       Pred
Actual  Ganas Jinak
  Ganas     3     0
  Jinak     1     2
cm["Jinak","Ganas"]
[1] 1
cm["Ganas","Jinak"]
[1] 0
# Error Jinak = Jinak predicted as Ganas
err_jinak <- cm["Jinak","Ganas"] / sum(data$`Jenis Tumor`=="Jinak")

# Error Ganas = Ganas predicted as Jinak
err_ganas <- cm["Ganas","Jinak"] / sum(data$`Jenis Tumor`=="Ganas")

err_jinak; err_ganas
[1] 0.3333333
[1] 0

LDA menggunakan Library MASS

model <- lda(`Jenis Tumor` ~ `Ukuran Tumor (mm)` + `Tekstur (skor)`, data=data)
model
Call:
lda(`Jenis Tumor` ~ `Ukuran Tumor (mm)` + `Tekstur (skor)`, data = data)

Prior probabilities of groups:
Ganas Jinak 
  0.5   0.5 

Group means:
      `Ukuran Tumor (mm)` `Tekstur (skor)`
Ganas            1.333333         4.000000
Jinak            3.000000         7.933333

Coefficients of linear discriminants:
                          LD1
`Ukuran Tumor (mm)` 0.1214268
`Tekstur (skor)`    0.4224765

Prediksi dengan Library MASS

pred <- predict(model)$class
table(Actual=data$`Jenis Tumor`, Pred=pred)
       Pred
Actual  Ganas Jinak
  Ganas     3     0
  Jinak     1     2

Fungsi Diskriminan per Kelompok

mu_jinak <- as.numeric(model$means["Jinak", ])
mu_ganas <- as.numeric(model$means["Ganas", ])

b_jinak <- S_inv %*% mu_jinak
b_ganas <- S_inv %*% mu_ganas

prior <- model$prior


c_jinak <- -0.5 * t(mu_jinak) %*% S_inv %*% mu_jinak + log(prior["Jinak"])
c_ganas <- -0.5 * t(mu_ganas) %*% S_inv %*% mu_ganas + log(prior["Ganas"])
a_jinak <- c(c_jinak, b_jinak)
a_ganas <- c(c_ganas, b_ganas)
a_jinak; a_ganas
[1] -7.6106373  0.3769146  1.6013743
[1] -2.4211768  0.1505607  0.8138279