Analisis ini bertujuan untuk membangun model klasifikasi menggunakan regresi logistik untuk memprediksi kemungkinan seseorang mengalami diabetes berdasarkan beberapa indikator kesehatan. Data yang digunakan adalah Pima Indians Diabetes Dataset yang terdiri dari 768 observasi dengan variabel seperti jumlah kehamilan (Pregnancies), kadar glukosa (Glucose), tekanan darah (BloodPressure), ketebalan kulit (SkinThickness), kadar insulin (Insulin), indeks massa tubuh (BMI), fungsi riwayat keluarga diabetes (DiabetesPedigreeFunction), dan usia (Age), dengan variabel respon berupa status diabetes (Outcome) yang bersifat biner. Analisis dilakukan melalui beberapa tahapan yaitu eksplorasi data, pembagian data menjadi training dan testing, pembangunan model regresi logistik, evaluasi kinerja model menggunakan confusion matrix dan beberapa metrik evaluasi, serta melakukan prediksi pada data baru untuk melihat probabilitas seseorang mengalami diabetes berdasarkan karakteristik kesehatan yang dimiliki.
# URL dataset
url <- "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
# Nama kolom
Variabel <- c("Pregnancies","Glucose","BloodPressure","SkinThickness",
"Insulin","BMI","DiabetesPedigreeFunction","Age","Outcome")
# Import data
data <- read.csv(url, header = FALSE)
# Menambahkan nama kolom
colnames(data) <- Variabel
# Melihat data
head(data)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35 0 33.6
## 2 1 85 66 29 0 26.6
## 3 8 183 64 0 0 23.3
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 6 5 116 74 0 0 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
# Melihat struktur data
str(data)
## 'data.frame': 768 obs. of 9 variables:
## $ Pregnancies : int 6 1 8 1 0 5 3 10 2 8 ...
## $ Glucose : int 148 85 183 89 137 116 78 115 197 125 ...
## $ BloodPressure : int 72 66 64 66 40 74 50 0 70 96 ...
## $ SkinThickness : int 35 29 0 23 35 0 32 0 45 0 ...
## $ Insulin : int 0 0 0 94 168 0 88 0 543 0 ...
## $ BMI : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
## $ DiabetesPedigreeFunction: num 0.627 0.351 0.672 0.167 2.288 ...
## $ Age : int 50 31 32 21 33 30 26 29 53 54 ...
## $ Outcome : int 1 0 1 0 1 0 1 0 1 1 ...
# Melihat ringkasan statistik data
summary(data)
## Pregnancies Glucose BloodPressure SkinThickness
## Min. : 0.000 Min. : 0.0 Min. : 0.00 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 62.00 1st Qu.: 0.00
## Median : 3.000 Median :117.0 Median : 72.00 Median :23.00
## Mean : 3.845 Mean :120.9 Mean : 69.11 Mean :20.54
## 3rd Qu.: 6.000 3rd Qu.:140.2 3rd Qu.: 80.00 3rd Qu.:32.00
## Max. :17.000 Max. :199.0 Max. :122.00 Max. :99.00
## Insulin BMI DiabetesPedigreeFunction Age
## Min. : 0.0 Min. : 0.00 Min. :0.0780 Min. :21.00
## 1st Qu.: 0.0 1st Qu.:27.30 1st Qu.:0.2437 1st Qu.:24.00
## Median : 30.5 Median :32.00 Median :0.3725 Median :29.00
## Mean : 79.8 Mean :31.99 Mean :0.4719 Mean :33.24
## 3rd Qu.:127.2 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :846.0 Max. :67.10 Max. :2.4200 Max. :81.00
## Outcome
## Min. :0.000
## 1st Qu.:0.000
## Median :0.000
## Mean :0.349
## 3rd Qu.:1.000
## Max. :1.000
Berdasarkan hasil eksplorasi data menggunakan fungsi str() dan summary(), diketahui bahwa dataset Pima Indians Diabetes terdiri dari 768 observasi dengan 9 variabel, yaitu 8 variabel independen (Pregnancies, Glucose, BloodPressure, SkinThickness, Insulin, BMI, DiabetesPedigreeFunction, dan Age) serta 1 variabel dependen yaitu Outcome yang menunjukkan status diabetes (0 = tidak diabetes, 1 = diabetes). Sebagian besar variabel bertipe numerik dengan rentang nilai yang bervariasi. Rata-rata kadar glukosa responden adalah 120,9, rata-rata BMI sebesar 31,99, dan rata-rata usia sebesar 33,24 tahun. Selain itu, nilai rata-rata Outcome sebesar 0,349 menunjukkan bahwa sekitar 34,9% responden dalam dataset mengalami diabetes. Secara umum, karakteristik data ini menunjukkan bahwa dataset memiliki variabel kesehatan yang relevan untuk digunakan dalam analisis regresi logistik guna memprediksi kemungkinan seseorang menderita diabetes.
# Memisahkan variabel independen (X) dan dependen (y)
X <- data[, !(names(data) %in% "Outcome")]
y <- data$Outcome
# Mengatur seed agar hasil split konsisten
set.seed(42)
# Menentukan indeks data training (80%)
train_index <- sample(seq_len(nrow(data)), size = 0.8 * nrow(data))
# Membuat data training dan testing
X_train <- X[train_index, ]
X_test <- X[-train_index, ]
y_train <- y[train_index]
y_test <- y[-train_index]
# Menampilkan dimensi data training dan testing
cat("Training set shape:", dim(X_train), "\n")
## Training set shape: 614 8
cat("Testing set shape:", dim(X_test), "\n")
## Testing set shape: 154 8
# Menggabungkan kembali X_train dan y_train menjadi satu dataset
train_data <- cbind(X_train, Outcome = y_train)
# Melatih model regresi logistik
model <- glm(Outcome ~ ., data = train_data, family = binomial)
# Menampilkan ringkasan model
summary(model)
##
## Call:
## glm(formula = Outcome ~ ., family = binomial, data = train_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.983216 0.836069 -10.745 < 2e-16 ***
## Pregnancies 0.140288 0.036561 3.837 0.000125 ***
## Glucose 0.037554 0.004300 8.734 < 2e-16 ***
## BloodPressure -0.008520 0.005920 -1.439 0.150086
## SkinThickness -0.001572 0.007629 -0.206 0.836726
## Insulin -0.001205 0.001011 -1.192 0.233104
## BMI 0.092629 0.017236 5.374 7.69e-08 ***
## DiabetesPedigreeFunction 0.794552 0.336365 2.362 0.018168 *
## Age 0.012124 0.010526 1.152 0.249384
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 792.69 on 613 degrees of freedom
## Residual deviance: 569.30 on 605 degrees of freedom
## AIC: 587.3
##
## Number of Fisher Scoring iterations: 5
Berdasarkan hasil estimasi model regresi logistik, diperoleh bahwa variabel Pregnancies, Glucose, BMI, dan DiabetesPedigreeFunction memiliki pengaruh yang signifikan terhadap kemungkinan seseorang menderita diabetes karena memiliki nilai p-value lebih kecil dari 0,05. Hal ini menunjukkan bahwa peningkatan jumlah kehamilan, kadar glukosa dalam darah, indeks massa tubuh (BMI), serta faktor keturunan diabetes dapat meningkatkan probabilitas seseorang mengalami diabetes. Sementara itu, variabel BloodPressure, SkinThickness, Insulin, dan Age tidak berpengaruh signifikan terhadap kejadian diabetes karena memiliki p-value lebih besar dari 0,05. Selain itu, nilai Residual Deviance (569.30) yang lebih kecil dibandingkan Null Deviance (792.69) menunjukkan bahwa model yang dibangun mampu menjelaskan data dengan lebih baik dibandingkan model tanpa variabel independen. Secara keseluruhan, model regresi logistik yang dihasilkan dapat digunakan untuk menganalisis dan memprediksi kemungkinan terjadinya diabetes berdasarkan beberapa faktor kesehatan yang signifikan.
# Menampilkan koefisien model
coef(model)
## (Intercept) Pregnancies Glucose
## -8.983216127 0.140287622 0.037554364
## BloodPressure SkinThickness Insulin
## -0.008519943 -0.001572228 -0.001204996
## BMI DiabetesPedigreeFunction Age
## 0.092629406 0.794551930 0.012123919
# Menampilkan intercept
coef(model)[1]
## (Intercept)
## -8.983216
Model regresi logistik yang diestimasi adalah sebagai berikut: \[ \ln\left(\frac{p}{1-p}\right) = -8.9832 + 0.1403\,Pregnancies + 0.0376\,Glucose - 0.0085\,BloodPressure - 0.0016\,SkinThickness - 0.0012\,Insulin + 0.0926\,BMI + 0.7946\,DiabetesPedigreeFunction + 0.0121\,Age \] Model regresi logistik di atas menunjukkan hubungan antara beberapa faktor kesehatan dengan probabilitas seseorang mengalami diabetes. Nilai koefisien pada setiap variabel menggambarkan arah pengaruh terhadap kemungkinan terjadinya diabetes. Koefisien yang bernilai positif, seperti pada variabel Pregnancies, Glucose, BMI, DiabetesPedigreeFunction, dan Age, menunjukkan bahwa peningkatan nilai variabel tersebut cenderung meningkatkan probabilitas seseorang menderita diabetes. Sebaliknya, koefisien negatif pada variabel BloodPressure, SkinThickness, dan Insulin menunjukkan bahwa peningkatan nilai variabel tersebut cenderung menurunkan probabilitas terjadinya diabetes. Dengan demikian, model regresi logistik ini dapat digunakan untuk memperkirakan peluang seseorang mengalami diabetes berdasarkan karakteristik kesehatan yang dimilikinya.
# Membuat prediksi probabilitas pada data testing
prob_pred <- predict(model, newdata = X_test, type = "response")
# Mengubah probabilitas menjadi klasifikasi (threshold = 0.5)
y_pred <- ifelse(prob_pred > 0.5, 1, 0)
# Menghitung akurasi
accuracy <- mean(y_pred == y_test)
cat("Accuracy:", round(accuracy * 100, 2), "%\n")
## Accuracy: 77.27 %
# Membuat confusion matrix
conf_matrix <- table(Predicted = y_pred, Actual = y_test)
cat("Confusion Matrix:\n")
## Confusion Matrix:
print(conf_matrix)
## Actual
## Predicted 0 1
## 0 87 23
## 1 12 32
# Menghitung Precision, Recall, dan F1-score
TP <- conf_matrix[2,2]
TN <- conf_matrix[1,1]
FP <- conf_matrix[2,1]
FN <- conf_matrix[1,2]
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
f1_score <- 2 * ((precision * recall) / (precision + recall))
cat("Precision:", round(precision, 3), "\n")
## Precision: 0.727
cat("Recall:", round(recall, 3), "\n")
## Recall: 0.582
cat("F1-score:", round(f1_score, 3), "\n")
## F1-score: 0.646
Berdasarkan hasil evaluasi model regresi logistik, diperoleh nilai akurasi sebesar 77,27%, yang menunjukkan bahwa model mampu mengklasifikasikan status diabetes dengan benar pada sekitar 77% data pengujian. Berdasarkan confusion matrix, model berhasil memprediksi dengan benar sebanyak 87 kasus tidak diabetes (true negative) dan 32 kasus diabetes (true positive). Namun, masih terdapat 12 kasus false positive, yaitu individu yang diprediksi diabetes tetapi sebenarnya tidak, serta 23 kasus false negative, yaitu individu yang sebenarnya diabetes tetapi diprediksi tidak diabetes. Selain itu, nilai precision sebesar 0,727 menunjukkan bahwa sekitar 72,7% dari seluruh prediksi diabetes yang dihasilkan model benar-benar merupakan kasus diabetes. Nilai recall sebesar 0,582 menunjukkan bahwa model mampu mengidentifikasi sekitar 58,2% dari seluruh kasus diabetes yang sebenarnya ada. Sementara itu, F1-score sebesar 0,646 menunjukkan bahwa kinerja model dalam menyeimbangkan precision dan recall berada pada tingkat yang cukup baik. Secara keseluruhan, model regresi logistik yang dibangun memiliki kemampuan klasifikasi yang cukup baik dalam memprediksi kemungkinan seseorang mengalami diabetes.
Terakhir,gunakan model regresi logistik yang telah dilatih untuk membuat prediksi pada data baru yang belum pernah dilihat sebelumnya.
# Membuat data baru (contoh satu observasi)
new_data <- data.frame(
Pregnancies = 6,
Glucose = 148,
BloodPressure = 72,
SkinThickness = 35,
Insulin = 0,
BMI = 33.6,
DiabetesPedigreeFunction = 0.627,
Age = 50
)
# Prediksi probabilitas diabetes
predicted_proba <- predict(model, newdata = new_data, type = "response")
# Mengubah probabilitas menjadi klasifikasi
predicted_outcome <- ifelse(predicted_proba > 0.5, 1, 0)
# Menampilkan hasil prediksi
if(predicted_outcome == 1){
cat("Predicted Outcome: Diabetic\n")
} else {
cat("Predicted Outcome: Not Diabetic\n")
}
## Predicted Outcome: Diabetic
# Menampilkan probabilitas diabetes
cat("Probability of being Diabetic:", round(predicted_proba * 100, 2), "%\n")
## Probability of being Diabetic: 72.41 %
Berdasarkan hasil prediksi menggunakan model regresi logistik pada data baru dengan karakteristik Pregnancies = 6, Glucose = 148, BloodPressure = 72, SkinThickness = 35, Insulin = 0, BMI = 33,6, DiabetesPedigreeFunction = 0,627, dan Age = 50, diperoleh probabilitas sebesar 72,41% bahwa individu tersebut mengalami diabetes. Karena nilai probabilitas tersebut lebih besar dari batas klasifikasi 0,5, maka model mengklasifikasikan individu tersebut ke dalam kategori diabetes. Hal ini menunjukkan bahwa berdasarkan faktor kesehatan yang dimiliki, individu tersebut memiliki peluang yang cukup tinggi untuk mengalami diabetes menurut model regresi logistik yang telah dibangun.