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(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
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")
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)
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
colSums(is.na(diabetes))
## Pregnancies Glucose BloodPressure
## 0 0 0
## SkinThickness Insulin BMI
## 0 0 0
## DiabetesPedigreeFunction Age Outcome
## 0 0 0
prop.table(table(diabetes$Outcome))
##
## 0 1
## 0.658 0.342
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,]
prop.table(table(diabetes.train$Outcome))
##
## 0 1
## 0.665625 0.334375
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
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
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)
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