Pada kali ini, saya akan mencoba untuk melakukan prediksi terhadap pasien penyakit diabetes pada suatu rumah sakit yang akan diprediksi dalam kondisi sakit atau tidak. Algoritma yang digunakan yaitu logistic regission yang merupakan supervised learning.

Library

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(class)
library(tidyr)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(e1071)
library(caret)
library(ROCR)
library(partykit)
## Loading required package: grid
## Loading required package: libcoin
## Loading required package: mvtnorm
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
## The following object is masked from 'package:dplyr':
## 
##     combine

Data Import

Dataset yang digunakan yaitu data mengenai pasien yang terkena penyakit diabetes berdasarkan beberapa karakteristik yang menyertai yang dapat diunduh pada link berikut https://www.kaggle.com/vikasukani/diabetes-data-set .

diabetes <- read.csv("C:/Users/ASUS/Downloads/data/diabetes.csv")

Cek Struktur Data

glimpse(diabetes)
## Rows: 2,000
## Columns: 9
## $ Pregnancies              <int> 2, 0, 0, 0, 1, 0, 4, 8, 2, 2, 4, 4, 3, 6, 5, ~
## $ Glucose                  <int> 138, 84, 145, 135, 139, 173, 99, 194, 83, 89,~
## $ BloodPressure            <int> 62, 82, 0, 68, 62, 78, 72, 80, 65, 90, 68, 70~
## $ SkinThickness            <int> 35, 31, 0, 42, 41, 32, 17, 0, 28, 30, 38, 18,~
## $ Insulin                  <int> 0, 125, 0, 250, 480, 265, 0, 0, 66, 0, 0, 122~
## $ BMI                      <dbl> 33.6, 38.2, 44.2, 42.3, 40.7, 46.5, 25.6, 26.~
## $ DiabetesPedigreeFunction <dbl> 0.127, 0.233, 0.630, 0.365, 0.536, 1.159, 0.2~
## $ Age                      <int> 47, 23, 31, 24, 21, 58, 28, 67, 24, 42, 33, 4~
## $ Outcome                  <int> 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ~

Informasi penting yang terdapat didata:

Pregnancies : Kehamilan, Glucose : Jumlah Glukosa dalam tubuh pasien, BloodPressure : Tekanan Darah Pasien, SkinThickness : Ketebalan Kulit, Insulin : Jumlah Insulin,IBM : Indeks Massa Tubuh, DiabetesPedigreeFunction : Indikator riwayat diabetes keluarga, Age : Umur pasien, Outcome : (1=sakit, 0=tidak)

Gambaran Diabetes

head(diabetes)
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           2     138            62            35       0 33.6
## 2           0      84            82            31     125 38.2
## 3           0     145             0             0       0 44.2
## 4           0     135            68            42     250 42.3
## 5           1     139            62            41     480 40.7
## 6           0     173            78            32     265 46.5
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.127  47       1
## 2                    0.233  23       0
## 3                    0.630  31       1
## 4                    0.365  24       1
## 5                    0.536  21       0
## 6                    1.159  58       0

Check Missing Value

colSums(is.na(diabetes))
##              Pregnancies                  Glucose            BloodPressure 
##                        0                        0                        0 
##            SkinThickness                  Insulin                      BMI 
##                        0                        0                        0 
## DiabetesPedigreeFunction                      Age                  Outcome 
##                        0                        0                        0

Check Proporsi Target

prop.table(table(diabetes$Outcome))
## 
##     0     1 
## 0.658 0.342

Spliting Train-Test

Selanjutnya adalah melakukan splitting data menjadi data train dan data test. Splitting data train dan test ini bertujuan untuk membuat model yang digunakan yaitu data test dan data test tujuannya untuk menguji model terhadap unseen data. Splitting data train dan test ini saya menggunakan proporsi 80% untuk data train dan 20% untuk data test

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(406)

intrain <- sample(nrow(diabetes), nrow(diabetes)*0.8)

diabetes.train <- diabetes[intrain,]
diabetes.test <- diabetes[-intrain,]

Re-check Proporsi Target Terhadap Data Train

prop.table(table(diabetes.train$Outcome))
## 
##        0        1 
## 0.665625 0.334375

Membuat Model

Membuat model dengan menggunakan regresi logistik. Pemodelan menggunakan fungsi glm() dalam membuat model regresi logistik. Variabel yang digunakan adalah variabel yang dianggap mempengaruhi target variabel.

model_diabetes <- glm(formula = Outcome~Pregnancies+Glucose+BloodPressure+SkinThickness+Insulin+BMI+DiabetesPedigreeFunction+Age, family = "binomial", 
             data = diabetes.train)
summary(model_diabetes)
## 
## Call:
## glm(formula = Outcome ~ Pregnancies + Glucose + BloodPressure + 
##     SkinThickness + Insulin + BMI + DiabetesPedigreeFunction + 
##     Age, family = "binomial", data = diabetes.train)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.5917  -0.7180  -0.4227   0.7118   2.9671  
## 
## Coefficients:
##                            Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              -8.5059485  0.4995701 -17.027  < 2e-16 ***
## Pregnancies               0.1283277  0.0227413   5.643 1.67e-08 ***
## Glucose                   0.0352308  0.0025385  13.879  < 2e-16 ***
## BloodPressure            -0.0096374  0.0036503  -2.640  0.00829 ** 
## SkinThickness            -0.0017381  0.0047945  -0.363  0.71697    
## Insulin                  -0.0012993  0.0006641  -1.957  0.05040 .  
## BMI                       0.0857301  0.0103005   8.323  < 2e-16 ***
## DiabetesPedigreeFunction  1.0223376  0.2098423   4.872 1.11e-06 ***
## Age                       0.0116937  0.0064011   1.827  0.06773 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2039.1  on 1599  degrees of freedom
## Residual deviance: 1490.0  on 1591  degrees of freedom
## AIC: 1508
## 
## Number of Fisher Scoring iterations: 5

Stepwise Regression -> backward

backward_diabetes <- step(object = model_diabetes, direction = "backward", trace = F)

summary(backward_diabetes)
## 
## Call:
## glm(formula = Outcome ~ Pregnancies + Glucose + BloodPressure + 
##     Insulin + BMI + DiabetesPedigreeFunction + Age, family = "binomial", 
##     data = diabetes.train)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.5769  -0.7137  -0.4226   0.7091   2.9666  
## 
## Coefficients:
##                            Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              -8.5009412  0.4991204 -17.032  < 2e-16 ***
## Pregnancies               0.1282270  0.0227553   5.635 1.75e-08 ***
## Glucose                   0.0353600  0.0025159  14.055  < 2e-16 ***
## BloodPressure            -0.0098457  0.0036072  -2.729  0.00634 ** 
## Insulin                  -0.0014030  0.0005999  -2.339  0.01936 *  
## BMI                       0.0846082  0.0098083   8.626  < 2e-16 ***
## DiabetesPedigreeFunction  1.0155374  0.2088519   4.862 1.16e-06 ***
## Age                       0.0118660  0.0063872   1.858  0.06320 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2039.1  on 1599  degrees of freedom
## Residual deviance: 1490.2  on 1592  degrees of freedom
## AIC: 1506.2
## 
## Number of Fisher Scoring iterations: 5

Prediksi

Dengan menggunakan backward_diabetes hasil dari stepwise backward akan dihitung prediksi probability sakit atau tidak untuk diabates.test.

diabetes.test$pred.Risk <- predict(backward_diabetes, newdata = diabetes.test, type = "response")
head(diabetes.test)
##    Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1            2     138            62            35       0 33.6
## 6            0     173            78            32     265 46.5
## 8            8     194            80             0       0 26.1
## 12           4     125            70            18     122 28.9
## 20           3      84            72            32       0 37.2
## 21           6       0            68            41       0 39.0
##    DiabetesPedigreeFunction Age Outcome  pred.Risk
## 1                     0.127  47       1 0.39037619
## 6                     1.159  58       0 0.90687727
## 8                     0.551  67       0 0.89659151
## 12                    1.144  45       1 0.42862062
## 20                    0.267  28       0 0.10869987
## 21                    0.727  41       1 0.02030115

Sekarang dengan mengklasifikasikan diabetes.test berdasarkan pred.Risk dengan syarat lebih besar dari 0.5.

diabetes.test$pred.Label <- ifelse(diabetes.test$pred.Risk > 0.5, "Tidak Sehat","Sehat")
diabetes.test$pred.Label <- as.factor(diabetes.test$pred.Label)
# diabetes.test$pred.Label <- ifelse(diabetes.test$pred.Risk > 0.5, yes = "Tidak Sehat", no = "Sakit")
# 
# diabetes.test$pred.Label <- as.factor(diabetes.test$pred.Label)

Hasil Prediksi

Sekarang mari kita melihat hasil prediksi berdasarkan klasifikasi yang telah dibuat di atas.

diabetes.test %>%
  select(Outcome, pred.Label) %>%
  head(10)
##    Outcome  pred.Label
## 1        1       Sehat
## 6        0 Tidak Sehat
## 8        0 Tidak Sehat
## 12       1       Sehat
## 20       0       Sehat
## 21       1       Sehat
## 24       0       Sehat
## 27       0       Sehat
## 32       0       Sehat
## 38       1       Sehat

Daftar Pustaka

  1. https://www.kaggle.com/alakaaay/diabetes-uci-dataset
  2. Sistem prediksi penyakit diabetes melitus dengan Metode Logistic Regression pada cloud computing. Muhamad Ichsan Gunawan. 2020
  3. Prediksi Pasien Penyakit Jantung Menggunakan Logistic Regression. 2021