library(dplyr)
library(readxl)
library(MASS)Praktikum TPG Pertemuan 11
Load Libraries
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_ganasUkuran 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)
modelCall:
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