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.