1. PENDAHULUAN

1.1 Polycystic Ovary Syndrome

Polycystic Ovary Syndrome (PCOS) atau sindrom ovarium polikistik adalah kondisi gangguan fungsi ovarium pada wanita usia produktif di mana terjadi ketidakseimbangan hormon yang dihasilkan oleh endokrin dalam tubuh. Endokrin merupakan sistem kelenjar yang menghasilkan dan menyalurkan hormon melalui aliran darah. PCOS merupakan gangguan endokrin yang paling banyak dijumpai pada wanita usia produktif (Eleawi dkk., 2015).

Tanda dan gejala PCOS terkait dengan gangguan endokrin mencakup peningkatan hormon androgen, ketidakmampuan ovulasi secara teratur yang mengakibatkan haid tidak teratur, dan pola ovarium yang menunjukkan gambaran morfologi polikistik. Secara visual, gejala yang umum terlihat pada penampilan wanita dengan PCOS meliputi obesitas, pertumbuhan rambut berlebihan ( hirsutisme), jerawat, dan kebotakan ( alopecia) (Masulili, 2023).

Jumlah wanita dengan kasus PCOS semakin bertambah setiap tahunnya. Melalui laman resmi WHO yang dipublikasikan pada tahun 2023, PCOS mempengaruhi sekitar 8-13% wanita usia produktif. Sebanyak 70% wanita yang merasakan gejala PCOS masih belum terdiagnosis di seluruh dunia. Secara global, prevalensi PCOS diperkirakan mencapai 3,4%. Peningkatan kasus PCOS di dunia tentunya dapat juga mengindikasikan peningkatan kasus PCOS di Indonesia.

1.2 Naive Bayes

Naïve Bayes adalah metode klasifikasi berbasis probabilistik yang menghitung berbagai probabilitas dengan menjumlahkan frekuensi dan kombinasi nilai dalam suatu dataset. Metode ini digunakan untuk memprediksi peluang masa depan berdasarkan data masa lalu. Salah satu keunggulan Naïve Bayes adalah hanya membutuhkan sedikit data testing untuk mengestimasi parameter yang dibutuhkan dalam proses klasifikasi. Metode ini juga mengasumsikan bahwa semua atribut bersifat independen satu sama lain.

1.3 Regresi Logistik

Regresi logistik adalah metode yang digunakan untuk memperkirakan kemungkinan terjadinya suatu peristiwa berdasarkan variabel-variabel faktor resiko yang dimasukkan ke dalam model (Hosmer dan Lemeshow, 2000). Analisis regresi logistik digunakan untuk memprediksi kemungkinan seseorang menderita PCOS berdasarkan variabel prediktor yang terdapat dalam model. Variabel prediktor yang digunakan dapat berupa gabungan variabel kontinu, diskrit, dan biner(Kuncoro dalam Wahyuni, 2017).

1.4 Variabel yang Digunakan

\[ \begin{align*} X_1 &= \text{Indeks Massa Tubuh} \\ X_2 &= \text{Pertumbuhan Rambut Tubuh yang Berlebihan} \\ X_3 &= \text{Penggelapan Kulit} \\ X_4 &= \text{Rambut Rontok} \\ X_5 &= \text{Wajah Berjerawat} \\ X_6 &= \text{Aktivitas Fisik Minimal 3 Kali Seminggu} \\ X_7 &= \text{Perubahan Suasana Hati} \\ X_8 &= \text{Kelancaran Siklus Menstruasi} \end{align*} \]

2. SOURCE CODE DAN PEMBAHASAN

2.1 Library

library(car)
## Loading required package: carData
library(knitr)
library(e1071)
library(ggplot2)

2.2 Data

2.2.1 Impor Data

setwd("C:/Users/ASUS/Documents/Non Akademik/Semester 4/Satria Data/Dataset")
data <- read.csv("Data PCOS.csv", header = TRUE, sep = ",")
head(data)

Data yang digunakan untuk membuat model prediksi PCOS bersumber dari data yang diambil oleh tiga mahasiswa Terna Engineering College, Nerul, Navi Mumbai, Maharashtra, India pada tahun 2023. Data tersebut merupakan data hasil kuesioner terkait tanda dan gejala PCOS pada wanita yang terdiri dari 465 record dengan 8 atribut. Data yang digunakan sudah melalui proses data cleaning sehingga sudah tidak terdapat nilai yang hilang, data duplikat, maupun anomali yang dapat mempengaruhi analisis.

2.2.2 Ubah ke Data Frame

dt <- data.frame(
  Y = as.factor(data$Y),
  X1 = as.factor(data$X1),
  X2 = as.factor(data$X2),
  X3 = as.factor(data$X3),
  X4 = as.factor(data$X4),
  X5 = as.factor(data$X5),
  X6 = as.factor(data$X6),
  X7 = as.factor(data$X7),
  X8 = as.factor(data$X8)
)
head(dt)

2.2.3 Pemeriksaan Multikolinearitas

dt_numeric <- data.frame(lapply(dt, as.numeric))
model <- lm(Y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8, data = dt_numeric)
vif_values <- vif(model)
print(vif_values)
##       X1       X2       X3       X4       X5       X6       X7       X8 
## 1.055984 1.169871 1.198511 1.121562 1.115230 1.026941 1.074712 1.100850

Analisis regresi logistik harus memenuhi asumsi non multikolineritas, yaitu kebebasan antar variabel prediktor. Asumsi non multikolineritas diperiksa melalui nilai VIF setiap variabel. Nilai VIF setiap variabel harus di antara 1-10 agar asumsi non multikolineritas terpenuhi. Berdasarkan output di atas, nilai VIF setiap variabel tidak berada di luar rentang 1-10. Oleh karena itu, dapat diketahui bahwa asumsi non multikolineritas terpenuhi sehingga setiap variabel dapat digunakan dalam analisis regresi logistik.

2.3 Data Testing dan Data Training

set.seed(123) 
Index <- sample(1:nrow(dt), size = round(0.7 * nrow(dt)), replace = FALSE)
train <- dt[Index, ]
test <- dt[-Index, ]

Data dibagi menjadi data training (pelatihan) dan data testing (pengujian) dengan proporsi 70% untuk data training dan 30% untuk data testing.

2.4 Model dengan Data Training

2.4.1 Naive Bayes

nb <- naiveBayes(Y ~ ., data = train)
print(nb)
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##         0         1 
## 0.7791411 0.2208589 
## 
## Conditional probabilities:
##    X1
## Y            1          2          3
##   0 0.71653543 0.22834646 0.05511811
##   1 0.52777778 0.30555556 0.16666667
## 
##    X2
## Y           0         1
##   0 0.8149606 0.1850394
##   1 0.4027778 0.5972222
## 
##    X3
## Y           0         1
##   0 0.7165354 0.2834646
##   1 0.4305556 0.5694444
## 
##    X4
## Y           0         1
##   0 0.4015748 0.5984252
##   1 0.2777778 0.7222222
## 
##    X5
## Y           0         1
##   0 0.6377953 0.3622047
##   1 0.4722222 0.5277778
## 
##    X6
## Y           0         1
##   0 0.6968504 0.3031496
##   1 0.7083333 0.2916667
## 
##    X7
## Y           0         1
##   0 0.2716535 0.7283465
##   1 0.1250000 0.8750000
## 
##    X8
## Y           0         1
##   0 0.0984252 0.9015748
##   1 0.6805556 0.3194444

2.4.2 Regresi Logistik

rl<-glm(Y~X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8, family=binomial, data = train)
summary(rl)
## 
## Call:
## glm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8, family = binomial, 
##     data = train)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.68738    0.57187  -1.202 0.229370    
## X12          0.36049    0.40330   0.894 0.371406    
## X13          0.97104    0.65861   1.474 0.140377    
## X21          1.47300    0.38550   3.821 0.000133 ***
## X31          0.31982    0.38658   0.827 0.408061    
## X41         -0.04748    0.40664  -0.117 0.907049    
## X51          0.09287    0.36786   0.252 0.800687    
## X61         -0.20091    0.39843  -0.504 0.614084    
## X71          0.47411    0.48290   0.982 0.326199    
## X81         -2.69997    0.35882  -7.525 5.29e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 344.25  on 325  degrees of freedom
## Residual deviance: 220.56  on 316  degrees of freedom
## AIC: 240.56
## 
## Number of Fisher Scoring iterations: 5

2.5 Model prediksi

2.5.1 Model Naive Bayes

Menghitung probabilitas pada data pelatihan

train_prob_nb <- predict(nb, train, type = "raw")
print(head(train_prob_nb))

Source Code berikut berfungsi mengubah data testing menjadi data frame dengan semua variabel sebagai faktor (kecuali kolom Y yang kosong)

data_testing_nb <- data.frame(
  Y=as.factor(test$Y),
  X1 = as.factor(test$X1),
  X2 = as.factor(test$X2),
  X3 = as.factor(test$X3),
  X4 = as.factor(test$X4),
  X5 = as.factor(test$X5),
  X6 = as.factor(test$X6),
  X7 = as.factor(test$X7),
  X8 = as.factor(test$X8)
)

Melakukan prediksi pada data pengujian

predict_result_testing_nb <- predict(nb, data_testing_nb)
head(predict_result_testing_nb)
## [1] 0 0 1 0 0 0
## Levels: 0 1
data_testing_nb$predicted_Y <- predict_result_testing_nb

Menampilkan hasil prediksi

dta_nb<-data.frame(data_testing_nb)
head(dta_nb)

2.5.2 Model Regresi Logistik

Menghitung probabilitas pada data pelatihan

train_prob_rl <- predict(rl, train, type = "response")
print(head(train_prob_rl))

Source Code berikut berfungsi mengubah data testing menjadi data frame dengan semua variabel sebagai faktor (kecuali kolom Y yang kosong)

data_testing_rl <- data.frame(
  Y=as.factor(test$Y),
  X1 = as.factor(test$X1),
  X2 = as.factor(test$X2),
  X3 = as.factor(test$X3),
  X4 = as.factor(test$X4),
  X5 = as.factor(test$X5),
  X6 = as.factor(test$X6),
  X7 = as.factor(test$X7),
  X8 = as.factor(test$X8)
)

Melakukan prediksi pada data pengujian

predict_result_testing_rl <- predict(rl, data_testing_rl, type="response")
head(predict_result_testing_rl)
##          1          2          3          4          5          6 
## 0.05150341 0.05623384 0.77989036 0.05623384 0.53673966 0.04063594
data_testing_rl$predicted_Y <- predict_result_testing_rl
data_testing_rl$predicted_Y <- ifelse(data_testing_rl$predicted_Y > 0.5, 1, 0)

Menampilkan hasil prediksi

dta_rl<-data.frame(data_testing_rl)
head(dta_rl)

2.6 Confusion Matriks

2.6.1 Model Naive Bayes

Menghitung confusion matrix

confusion_matrix_nb <- table(data_testing_nb$Y, data_testing_nb$predicted_Y)

Menampilkan confusion matrix

print(confusion_matrix_nb)
##    
##       0   1
##   0 103   6
##   1  19  11

Simpan hasil prediksi dalam data frame baru, kemudian hitung frekuensi kemunculan

dta_nb <- data.frame(Reference = data_testing_nb$Y, Prediction = data_testing_nb$predicted_Y)
dta_nb$Freq <- 1

Agregasi data untuk mendapatkan jumlah prediksi untuk setiap kategori referensi dan menampilkan tabel agregat

dta_nb <- aggregate(dta_nb$Freq, by = list(Reference = dta_nb$Reference, Prediction = dta_nb$Prediction), FUN = sum)
head(dta_nb)

Plot Confusion Matriks

p_nb <- ggplot(data = dta_nb, aes(x = Reference, y = Prediction)) +
  geom_tile(aes(fill = log(x)), colour = "black") +
  scale_fill_gradientn(colours = c("grey", "lightblue","skyblue", "steelblue")) +
  geom_text(aes(label = x), color = "black") +
  labs(title = "Confusion Matrix") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_nb)

2.6.2 Model Regresi Logistik

Menghitung confusion matrix

confusion_matrix_rl <- table(data_testing_rl$Y, data_testing_rl$predicted_Y)

Menampilkan confusion matrix

print(confusion_matrix_rl)
##    
##       0   1
##   0 103   6
##   1  18  12

Simpan hasil prediksi dalam data frame baru, kemudian hitung frekuensi kemunculan

dta_rl <- data.frame(Reference = data_testing_rl$Y, Prediction = data_testing_rl$predicted_Y)
dta_rl$Freq <- 1

Agregasi data untuk mendapatkan jumlah prediksi untuk setiap kategori referensi dan menampilkan tabel agregat.

dta_rl <- aggregate(dta_rl$Freq, by = list(Reference = dta_rl$Reference, Prediction = dta_rl$Prediction), FUN = sum)
head(dta_rl)

Plot Confusion Matriks

p_rl <- ggplot(data = dta_rl, aes(x = Reference, y = Prediction)) +
  geom_tile(aes(fill = log(x)), colour = "black") +
  scale_fill_gradientn(colours = c("grey", "lightblue","skyblue", "steelblue")) +
  geom_text(aes(label = x), color = "black") +
  labs(title = "Confusion Matrix") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_rl)

2.7 Metrik Evaluasi

2.7.1 Naive Bayes

Menghitung metrik evaluasi: akurasi, presisi, recall, dan F1-score

accuracy_nb <- sum(diag(confusion_matrix_nb)) / sum(confusion_matrix_nb)
precision_nb <- confusion_matrix_nb[2,2] / sum(confusion_matrix_nb[,2])
recall_nb <- confusion_matrix_nb[2,2] / sum(confusion_matrix_nb[2,])
f1_score_nb <- 2 * (precision_nb * recall_nb) / (precision_nb + recall_nb)

Menampilkan metrik evaluasi

print(paste("Accuracy: ", round(accuracy_nb, 2)))
## [1] "Accuracy:  0.82"
print(paste("Precision: ", round(precision_nb, 2)))
## [1] "Precision:  0.65"
print(paste("Recall: ", round(recall_nb, 2)))
## [1] "Recall:  0.37"
print(paste("F1 Score: ", round(f1_score_nb, 2)))
## [1] "F1 Score:  0.47"

Membuat data frame untuk menampilkan metrik evaluasi

evaluation_metrics_nb <- data.frame(
  Metric = c("Accuracy", "Precision", "Recall", "F1 Score"),
  Value = c(round(accuracy_nb, 2), round(precision_nb, 2), round(recall_nb, 2), round(f1_score_nb, 2))
)

Menampilkan tabel

kable(evaluation_metrics_nb, caption = "Metrik Evaluasi untuk Model Naive Bayes")
Metrik Evaluasi untuk Model Naive Bayes
Metric Value
Accuracy 0.82
Precision 0.65
Recall 0.37
F1 Score 0.47

2.7.2 Regresi Logistik

Menghitung metrik evaluasi: akurasi, presisi, recall, dan F1-score

accuracy_rl <- sum(diag(confusion_matrix_rl)) / sum(confusion_matrix_rl)
precision_rl <- confusion_matrix_rl[2,2] / sum(confusion_matrix_rl[,2])
recall_rl <- confusion_matrix_rl[2,2] / sum(confusion_matrix_rl[2,])
f1_score_rl <- 2 * (precision_rl * recall_rl) / (precision_rl + recall_rl)

Menampilkan metrik evaluasi

print(paste("Accuracy: ", round(accuracy_rl, 2)))
## [1] "Accuracy:  0.83"
print(paste("Precision: ", round(precision_rl, 2)))
## [1] "Precision:  0.67"
print(paste("Recall: ", round(recall_rl, 2)))
## [1] "Recall:  0.4"
print(paste("F1 Score: ", round(f1_score_rl, 2)))
## [1] "F1 Score:  0.5"

Membuat data frame untuk menampilkan metrik evaluasi

evaluation_metrics_rl <- data.frame(
  Metric = c("Accuracy", "Precision", "Recall", "F1 Score"),
  Value = c(round(accuracy_rl, 2), round(precision_rl, 2), round(recall_rl, 2), round(f1_score_rl, 2))
)

Menampilkan tabel

kable(evaluation_metrics_rl, caption = "Metrik Evaluasi untuk Model Regresi Logistik")
Metrik Evaluasi untuk Model Regresi Logistik
Metric Value
Accuracy 0.83
Precision 0.67
Recall 0.40
F1 Score 0.50

3. HASIL DAN KESIMPULAN AKHIR

Table : Perbandingan Metrik Evaluasi NB dan RL

Indikator Naive Bayes Regresi Logistik
Akurasi 0.82 0.83
Presisi 0.65 0.67
Recall 0.37 0.40
F1 Score 0.47 0.50

Beradasarkan tabel perbandingan metrik evaluasi dengan metode Naive Bayes dan Regresi Logistik, didapati bahwa model Naive Bayes memiliki nilai akurasi sebesar 0.82, sedangkan model regresi logistik memiliki nilai akurasi sebesar 0.83. Oleh karena itu, dapat disimpulkan bahwa regresi logistik menghasilkan model yang lebih baik dalam memprediksi PCOS pada wanita dibanding Naive Bayes.

Model regresi logistik memiliki nilai akurasi sebesar 83% yang berarti model dapat membuat prediksi benar sebanyak 83% dari seluruh data yang diuji. Nilai presisi sebesar 65% yang berarti terdapat 67% prediksi yang benar dari seluruh prediksi positif (terdiagnosis PCOS). Sementara itu, recall mengukur seberapa baik model memperediksi record positif yang sebenarnya. Pada model tersebut, model berhasil memprediksi 40% record terdiagnosis PCOS dari keseluruhan record yang kondisi aslinya memang terdiagnosis PCOS. Nilai F1 sebesar 50% menunjukkan keseimbangan antara presisi dan recall.

4. DAFTAR PUSTAKA

Eleawi, H. R., Abdul-Karim, E. T., dan AL-Salihi, A. R. (2015). Study of Occurrence of Polycystic Ovarian Syndrome among Infertile Women. The Iraqi Postgraduate Medical Journal, 14(3), 329-336.

Hosmer D. W. dan Lemeshow S. (2000). Applied Logistic Regression. Second Edition. Wiley-Interscience

Masulili, N. A. (2023). Faktor-faktor yang berhubungan dengan Polycystic Ovarian Syndrome (PCOS) pada Wanita Usia Subur Dengan Gangguan Menstruasi dan infertilitas di RSUP Fatmawati. Skripsi. UIN Syarif Hidayatullah Jakarta.

Wahyuni, Mira (2017). Determinan Pengembalian Pembiayaan Mikro Pada Bank BRI Syariah KCP Cimahi. Tesis. Universitas Pendidikan Indonesia.