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
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
sensitivity <- TP / (TP + FN)
sensitivity2 <- TP2 / (TP2 + FN2)
specificity <- TN / (TN + FP)
specificity2 <- TN2 / (TN2 + FP2)
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"
recall <- TP / (TP + FN)
recall2 <- TP2 / (TP2 + FN2)
print(paste("Recall:", recall))
## [1] "Recall: 0.409836065573771"
print(paste("Recall2:", recall2))
## [1] "Recall2: 0.475609756097561"
precision <- TP / (TP + FP)
precision2 <- TP2 / (TP2 + FP2)
print(paste("Precision:", precision))
## [1] "Precision: 0.595238095238095"
print(paste("Precision2:", precision2))
## [1] "Precision2: 0.774834437086093"
f1_score <- 2 * (precision * recall) / (precision + recall)
f1_score2 <- 2 * (precision2 * recall2) / (precision2 + recall2)
print(paste("F1-score:", f1_score))
## [1] "F1-score: 0.485436893203884"
print(paste("F1-score2:", f1_score2))
## [1] "F1-score2: 0.589420654911839"