library(readr)
dataset <- read.csv2("C:/Users/Lenovo/Downloads/Maternal Health Risk Data Set(Machine Learning) (1).csv")
head(dataset)
##   Age SystolicBP DiastolicBP   BS BodyTemp HeartRate RiskLevel
## 1  25        130          80 15.0       98        86 high risk
## 2  35        140          90 13.0       98        70 high risk
## 3  29         90          70  8.0      100        80 high risk
## 4  30        140          85  7.0       98        70 high risk
## 5  35        120          60  6.1       98        76  low risk
## 6  23        140          80  7.0       98        70 high risk
dataset$RiskLevel[dataset$RiskLevel == "high risk"] <- 3
dataset$RiskLevel[dataset$RiskLevel == "mid risk"] <- 2
dataset$RiskLevel[dataset$RiskLevel == "low risk"]<-1
head(dataset)
##   Age SystolicBP DiastolicBP   BS BodyTemp HeartRate RiskLevel
## 1  25        130          80 15.0       98        86         3
## 2  35        140          90 13.0       98        70         3
## 3  29         90          70  8.0      100        80         3
## 4  30        140          85  7.0       98        70         3
## 5  35        120          60  6.1       98        76         1
## 6  23        140          80  7.0       98        70         3
dataset[, 7]<-as.factor(dataset[, 7])
summary(dataset)
##       Age          SystolicBP     DiastolicBP           BS        
##  Min.   :10.00   Min.   : 70.0   Min.   : 49.00   Min.   : 6.000  
##  1st Qu.:19.00   1st Qu.:100.0   1st Qu.: 65.00   1st Qu.: 6.900  
##  Median :26.00   Median :120.0   Median : 80.00   Median : 7.500  
##  Mean   :29.87   Mean   :113.2   Mean   : 76.46   Mean   : 8.726  
##  3rd Qu.:39.00   3rd Qu.:120.0   3rd Qu.: 90.00   3rd Qu.: 8.000  
##  Max.   :70.00   Max.   :160.0   Max.   :100.00   Max.   :19.000  
##    BodyTemp           HeartRate    RiskLevel
##  Length:1014        Min.   : 7.0   1:406    
##  Class :character   1st Qu.:70.0   2:336    
##  Mode  :character   Median :76.0   3:272    
##                     Mean   :74.3            
##                     3rd Qu.:80.0            
##                     Max.   :90.0

#data training dan testing

library(caTools)
set.seed(123)
split = sample.split(dataset$RiskLevel, SplitRatio = 0.8)
train.data = subset(dataset, split == TRUE)
test.data = subset(dataset, split == FALSE)
nrow(train.data)
## [1] 812
nrow(test.data)
## [1] 202

#model SVM

library(e1071)
plot(train.data)

modelsvm <- svm(RiskLevel~., data = train.data)
modelsvm
## 
## Call:
## svm(formula = RiskLevel ~ ., data = train.data)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
## 
## Number of Support Vectors:  579

#menghitung metrik evaluasi

Actual1 = test.data$RiskLevel
Prediksi1 <- predict(modelsvm, test.data)
Actual2 = train.data$RiskLevel
Prediksi2 <- predict(modelsvm, train.data)
cm <- table(Actual1, Prediksi1)
cm
##        Prediksi1
## Actual1  1  2  3
##       1 64 17  0
##       2 36 25  6
##       3  6 10 38
accuracy <- (sum(diag(cm)))/sum(cm)
accuracy
## [1] 0.6287129
cm2 <- table(Actual2, Prediksi2)
cm2
##        Prediksi2
## Actual2   1   2   3
##       1 287  34   4
##       2 129 117  23
##       3  19  29 170
accuracy2 <- (sum(diag(cm2)))/sum(cm2)
accuracy2
## [1] 0.7068966

Menghitung true positive (TP), false positive (FP), true negative (TN), dan false negative (FN)

TP <- cm[2, 2]  # Jumlah true positives
FP <- cm[1, 2]  # Jumlah false positives
TN <- cm[1, 1]  # Jumlah true negatives
FN <- cm[2, 1]  # Jumlah false negatives
TP2 <- cm2[2, 2]  # Jumlah true positives
FP2 <- cm2[1, 2]  # Jumlah false positives
TN2 <- cm2[1, 1]  # Jumlah true negatives
FN2 <- cm2[2, 1]  # Jumlah false negatives

Menghitung sensitivitas (true positive rate)

sensitivity <- TP / (TP + FN)
sensitivity2 <- TP2 / (TP2 + FN2)

Menghitung spesifisitas (true negative rate)

specificity <- TN / (TN + FP)
specificity2 <- TN2 / (TN2 + FP2)

Menampilkan hasil

print(paste("Sensitivitas:", sensitivity))
## [1] "Sensitivitas: 0.409836065573771"
print(paste("Spesifisitas:", specificity))
## [1] "Spesifisitas: 0.790123456790123"
print(paste("Sensitivitas2:", sensitivity2))
## [1] "Sensitivitas2: 0.475609756097561"
print(paste("Spesifisitas2:", specificity2))
## [1] "Spesifisitas2: 0.894080996884735"

Menghitung recall (true positive rate)

recall <- TP / (TP + FN)
recall2 <- TP2 / (TP2 + FN2)

Menampilkan hasil

print(paste("Recall:", recall))
## [1] "Recall: 0.409836065573771"
print(paste("Recall2:", recall2))
## [1] "Recall2: 0.475609756097561"

Menghitung precision

precision <- TP / (TP + FP)
precision2 <- TP2 / (TP2 + FP2)

Menampilkan hasil

print(paste("Precision:", precision))
## [1] "Precision: 0.595238095238095"
print(paste("Precision2:", precision2))
## [1] "Precision2: 0.774834437086093"

Menghitung F1-score

f1_score <- 2 * (precision * recall) / (precision + recall)
f1_score2 <- 2 * (precision2 * recall2) / (precision2 + recall2)

Menampilkan hasil

print(paste("F1-score:", f1_score))
## [1] "F1-score: 0.485436893203884"
print(paste("F1-score2:", f1_score2))
## [1] "F1-score2: 0.589420654911839"