Dataset yang digunakan diunduh melalui kaggle (https://www.kaggle.com/shivarajmishra/heart-data) tentang penyakit jantung.
library(dplyr) #data manipulation
##
## 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(ggplot2) #data visualisations
library(funModeling) #EDA
## Loading required package: Hmisc
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
## funModeling v.1.9.4 :)
## Examples and tutorials at livebook.datascienceheroes.com
## / Now in Spanish: librovivodecienciadedatos.ai
library(ggcorrplot) #correlation matrix
library(caret) #klasifikasi dan regresi training
##
## Attaching package: 'caret'
## The following object is masked from 'package:survival':
##
## cluster
library(pscl) #goodness-of-fit measures for GLMs
## Classes and Methods for R developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University
## Simon Jackman
## hurdle and zeroinfl functions by Achim Zeileis
library(ResourceSelection) #uji hoslem
## ResourceSelection 0.3-5 2019-07-22
library(PerformanceAnalytics) #ekonometriks-uji multikolinearitas
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
data <- read.csv("D:/STATISTIKA UNS/STAT SMT 5/Komputasi Statistika/data.csv")
head(data)
## age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal
## 1 70 1 4 130 322 0 2 109 0 2.4 2 3 3
## 2 67 0 3 115 564 0 2 160 0 1.6 2 0 7
## 3 57 1 2 124 261 0 0 141 0 0.3 1 0 7
## 4 64 1 4 128 263 0 0 105 1 0.2 2 1 7
## 5 74 0 2 120 269 0 2 121 1 0.2 1 1 3
## 6 65 1 4 120 177 0 0 140 0 0.4 1 0 7
## target
## 1 2
## 2 1
## 3 2
## 4 1
## 5 1
## 6 1
Identifikasi variabel
| Variable | Definition |
|---|---|
| age | Umur pasien dalam tahun |
| sex | Jenis kelamin pasien (1=laki-laki; 0=perempuan) |
| cp | Jenis nyeri dada (0=typical angina; 1=atypical angina; 2=non-anginal pain; 3=asymptomatic) |
| trestbps | Tekanan darah (dalam mm Hg)) |
| chol | Kolesterol serum (dalam mg/dl) |
| fbs | Gula darah ketika puasa >120mg/dl (1=benar; 0=salah) |
| restecg | Hasil resting elektrokardiografi (0=normal; 1=ST-T abnormal; 2=hipertrofi ventrikel kiri) |
| thalach | Detak jantung maksimum |
| exang | Olahraga untuk induksi angina (1=ya; 2=tidak) |
| oldpeak | Depresi ST yang diakibatkan oleh latihan relative terhadap saat istirahat |
| slope | Perubahan kemampuan bicara (1=naik; 2=netral; 3=menurun) |
| ca | Pembuluh darah (0=normal; 1=arteri coroner; 2=aneurisma; 3=arteri perifer) |
| thal | Thalassemia (3=normal; 6=cacat tetap; 7=cacat sementara) |
| target | Penyakit jantung (1=tidak terkena serangan jantung; 2=terkena serangan jantung/Ya) |
Mengecek missing value
sum(is.na(data))
## [1] 0
Mengecek duplikat data
cat("The number of duplicated rows are", nrow(data) - nrow(unique(data)))
## The number of duplicated rows are 0
Menggunakan fungsi mutate() pada library dplyr untuk mendefinisikan data kategorik (membuat beberapa perubahan pada beberapa variabel yang bersifat kategorik serta mengubah beberapa variabel numerik menjadi factor).
Data yang berisi perubahan-perubahan diberi nama “data2” dan “data2” inilah yang digunakan untuk analisis statistika deskriptif. Perubahan tipe data pada variabel didasarkan pada deskripsi data di Tabel sebelumnya.
data2 <- data %>%
mutate(sex = if_else(sex == 1, "Laki-laki", "Perempuan"),
fbs = if_else(fbs == 1, ">120", "<=120"),
exang = if_else(exang == 1, "Ya" ,"Tidak"),
cp = if_else(cp == 0, "typical angina",
if_else(cp == 1, "atypical angina",
if_else(cp==2, "non-anginal pain", "asymptomatic"))),
restecg = if_else(restecg == 0, "normal",
if_else(restecg == 1, "abnormal", "probable or definite")),
slope = as.factor(slope),
ca = as.factor(ca),
thal = as.factor(thal),
target = if_else(target == 2, "Ya", "Tidak")) %>%
mutate_if(is.character, as.factor) %>%
dplyr::select(target, sex, fbs, exang, cp, restecg, slope, ca, thal, everything())
Operator pipe: %>% digunakan untuk mengambil output dari satu fungsi dan meneruskannya ke fungsi lain sebagai argumen. Hal ini memungkinkan untuk menghubungkan urutan langkah-langkah analisis. if_else() digunakan untuk mendefinisikan variabel kategorik. as.factor() digunakan untuk mengubah nilai numerik menjadi factor.
glimpse(data2)
## Rows: 270
## Columns: 14
## $ target <fct> Ya, Tidak, Ya, Tidak, Tidak, Tidak, Ya, Ya, Ya, Ya, Tidak, Ti~
## $ sex <fct> Laki-laki, Perempuan, Laki-laki, Laki-laki, Perempuan, Laki-l~
## $ fbs <fct> <=120, <=120, <=120, <=120, <=120, <=120, >120, <=120, <=120,~
## $ exang <fct> Tidak, Tidak, Tidak, Ya, Ya, Tidak, Ya, Ya, Tidak, Tidak, Tid~
## $ cp <fct> asymptomatic, asymptomatic, non-anginal pain, asymptomatic, n~
## $ restecg <fct> probable or definite, probable or definite, normal, normal, p~
## $ slope <fct> 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 2, 2, 3, 2, 1, 2~
## $ ca <fct> 3, 0, 0, 1, 1, 0, 1, 1, 2, 3, 0, 0, 0, 2, 1, 0, 2, 0, 0, 0, 2~
## $ thal <fct> 3, 7, 7, 7, 3, 7, 6, 7, 7, 7, 7, 7, 3, 3, 3, 3, 7, 7, 3, 7, 7~
## $ age <int> 70, 67, 57, 64, 74, 65, 56, 59, 60, 63, 59, 53, 44, 61, 57, 7~
## $ trestbps <int> 130, 115, 124, 128, 120, 120, 130, 110, 140, 150, 135, 142, 1~
## $ chol <int> 322, 564, 261, 263, 269, 177, 256, 239, 293, 407, 234, 226, 2~
## $ thalach <int> 109, 160, 141, 105, 121, 140, 142, 142, 170, 154, 161, 111, 1~
## $ oldpeak <dbl> 2.4, 1.6, 0.3, 0.2, 0.2, 0.4, 0.6, 1.2, 1.2, 4.0, 0.5, 0.0, 0~
Fungsi glimpse() merupakan bagian dari package dplyr yang dapat digunakan untuk melihat kolom dari “data2” dan menampilkan beberapa bagian data sehubungan dengan setiap atribut yang dapat ditampung dalam satu baris.
Berikut ringkasan “data2” dengan menggunakan fungsi summary().
summary(data2)
## target sex fbs exang cp
## Tidak:150 Laki-laki:183 <=120:230 Tidak:181 asymptomatic :208
## Ya :120 Perempuan: 87 >120 : 40 Ya : 89 atypical angina : 20
## non-anginal pain: 42
##
##
##
## restecg slope ca thal age
## abnormal : 2 1:130 0:160 3:152 Min. :29.00
## normal :131 2:122 1: 58 6: 14 1st Qu.:48.00
## probable or definite:137 3: 18 2: 33 7:104 Median :55.00
## 3: 19 Mean :54.43
## 3rd Qu.:61.00
## Max. :77.00
## trestbps chol thalach oldpeak
## Min. : 94.0 Min. :126.0 Min. : 71.0 Min. :0.00
## 1st Qu.:120.0 1st Qu.:213.0 1st Qu.:133.0 1st Qu.:0.00
## Median :130.0 Median :245.0 Median :153.5 Median :0.80
## Mean :131.3 Mean :249.7 Mean :149.7 Mean :1.05
## 3rd Qu.:140.0 3rd Qu.:280.0 3rd Qu.:166.0 3rd Qu.:1.60
## Max. :200.0 Max. :564.0 Max. :202.0 Max. :6.20
Diketahui bahwa pasien yang kemungkinan kecil atau tidak terkena serangan jantung sebanyak 150 orang, sedangkan pasien yang kemungkinan besar atau terkena serangan jantung sebanyak 120 orang. Jumlah pasien laki-laki sebanyak 183 orang, sedangkan jumlah pasien perempuan sebanyak 87, dengan umur rata-rata yaitu 54.43 tahun, dst.
Berikut persebaran data untuk tiap variabel numerik
#Histogram age
ggplot(data2, aes(x=age)) + geom_histogram(bins =50, colour="black", fill="#FEE1E8") +
labs(x="Umur (tahun)", y="Frekuensi",
title="Distribusi populasi berdasarkan umur" )
#Histogram trestbps
ggplot(data2, aes(x=trestbps)) + geom_histogram(bins =50, colour="black", fill="#ABDEE6") +
labs(x="Tekanan Darah (mm Hg)", y="Frekuensi",
title="Distribusi populasi berdasarkan tekanan darah")
#Histogram chol
ggplot(data2, aes(x=chol)) + geom_histogram(bins =50, colour="black", fill="#FED7C3") +
labs(x="Kolesterol Serum (mg/dl)", y="Frekuensi",
title="Distribusi populasi berdasarkan kolesterol serum")
#Histogram thalach
ggplot(data2, aes(x=thalach)) + geom_histogram(bins =50, colour="black", fill="#ECD5E3") +
labs(x="Detak Jantung Maksimum", y="Frekuensi",
title="Distribusi populasi berdasarkan detak jantung maksimum")
#Histogram oldpeak
ggplot(data2, aes(x=oldpeak)) + geom_histogram(bins =50, colour="black", fill="#CCE2CB") +
labs(x="Depresi ST", y="Frekuensi",
title="Distribusi populasi berdasarkan depresi ST")
Fungsi geom_histogram() digunakan untuk membuat histogram dengan bins=50 menunjukkan jumlah barnya, semakin besar jumlah bins maka semakin terlihat persebaran datanya. Colour di dalam geom_histogram() menunjukkan warna garis luar barnya, sedangkan fill merupakan warna dalam barnya. Pemberian warna bebas bisa menggunakan istilah atau kode warna sesuai yang diinginkan. Fungi labs() digunakan untuk memberi label pada sumbu x dan y, serta title untuk judul histogramnya.
Selain menggunakan library ggplot2, histogram dapat dibuat dengan library funModeling
plot_num(data2)
Berdasarkan output histogram terlihat bahwa persebaran data numerik beragam. Dari histogram juga dapat dilihat kecondongan grafik sebuah data (skewness) dan diperoleh untuk variabel “age” dan “thalach” memiliki kecondongan ke kanan sedangkan “trestbps”, “chol”, dan “oldpeak” condong ke kiri.
Boxplot menggambarkan secara grafik dari data numerik melalui ukuran atau ringkasan lima angka (min, Q1, median, Q3, max). Dalam boxplot juga ditunjukkan, jika ada, nilai outlier dari observasi.
Berikut tampilan beberapa boxplot sekaligus
boxplot(data2[,10:14], col=c("#FEE1E8", "#ABDEE6", "#FED7C3", "#ECD5E3", "#CCE2CB"),
main = "Multiple boxplots for comparision")
data2[,10:14] menunjukkan bahwa hanya variabel ke 10 hingga 14 saja yang dibuat boxplotnya.
Dari multiple boxplot di atas tidak terlihat persebaran masing-masing variabel karena rentang yang berbeda antar variabel, maka dibuatlah boxplot tiap variabelnya.
boxplot(data2$age, ylab = "age", col = "#FEE1E8", main="Boxplot of age")
boxplot(data2$trestbps, ylab = "trestbps", col = "#ABDEE6", main="Boxplot of trestbps")
boxplot(data2$chol, ylab = "chol", col = "#FED7C3", main="Boxplot of chol")
boxplot(data2$thalach, ylab = "thalach", col = "#ECD5E3", main="Boxplot of thalach")
boxplot(data2$oldpeak, ylab = "oldpeak", col = "#CCE2CB", main="Boxplot of oldpeak")
Dari masing-masing boxplot terlihat pusat data, distribusi, dan ringkasan lima angka untuk tiap variabel numerik, Variabel “trestbps”, “chol”, “thalach”, dan “oldpeak” terdapat outlier atau data yang menyimpang jauh dari data yang lainnya.
Bar chart atau bar plot dapat digunakan untuk merepresentasikan data kategorik yaitu pada variabel “target”, “sex”, “fbs”, “exang”, “cp”, “restecg”, “slope”, “ca”, dan “thal”.
freq(data2)
## target frequency percentage cumulative_perc
## 1 Tidak 150 55.56 55.56
## 2 Ya 120 44.44 100.00
## sex frequency percentage cumulative_perc
## 1 Laki-laki 183 67.78 67.78
## 2 Perempuan 87 32.22 100.00
## fbs frequency percentage cumulative_perc
## 1 <=120 230 85.19 85.19
## 2 >120 40 14.81 100.00
## exang frequency percentage cumulative_perc
## 1 Tidak 181 67.04 67.04
## 2 Ya 89 32.96 100.00
## cp frequency percentage cumulative_perc
## 1 asymptomatic 208 77.04 77.04
## 2 non-anginal pain 42 15.56 92.60
## 3 atypical angina 20 7.41 100.00
## restecg frequency percentage cumulative_perc
## 1 probable or definite 137 50.74 50.74
## 2 normal 131 48.52 99.26
## 3 abnormal 2 0.74 100.00
## slope frequency percentage cumulative_perc
## 1 1 130 48.15 48.15
## 2 2 122 45.19 93.34
## 3 3 18 6.67 100.00
## ca frequency percentage cumulative_perc
## 1 0 160 59.26 59.26
## 2 1 58 21.48 80.74
## 3 2 33 12.22 92.96
## 4 3 19 7.04 100.00
## thal frequency percentage cumulative_perc
## 1 3 152 56.30 56.30
## 2 7 104 38.52 94.82
## 3 6 14 5.19 100.00
## [1] "Variables processed: target, sex, fbs, exang, cp, restecg, slope, ca, thal"
Fungsi freq() pada library funModeling digunakan untuk menampilkan tabel frekuensi dan persentase dari variabel kategorik.
Selain untuk tiap variabel kategorik, bar plot juga dapat digunakan untuk melihat “target” atau pasien yang terkena jantung/tidak berdasarkan variabel lain.
Berikut merupakan syntax untuk mengetahui jumlah pasien yang terkena penyakit jantung berdasarkan variabel “sex”
ggplot(data2, aes(x=sex, fill=target))+geom_bar(position="dodge")+
labs(title = "Jumlah Pasien Penyakit Jantung Berdasarkan Jenis Kelamin")+
scale_fill_discrete(name = "Penyakit Jantung")
Dari plot di atas, dapat dilihat bahwa laki-laki memiliki kemungkinan yang lebih tinggi mengalami penyakit jantung.
Correlation Matrix merupakan grafik yang berupa tabel yang menampilkan besarnya nilai koefisien korelasi antara berbagai variabel yang berbeda.
cor_heart <- cor(data2[,10:14])
cor_heart
## age trestbps chol thalach oldpeak
## age 1.0000000 0.27305280 0.22005631 -0.40221545 0.19423394
## trestbps 0.2730528 1.00000000 0.17301918 -0.03913566 0.22279983
## chol 0.2200563 0.17301918 1.00000000 -0.01873919 0.02770915
## thalach -0.4022154 -0.03913566 -0.01873919 1.00000000 -0.34904540
## oldpeak 0.1942339 0.22279983 0.02770915 -0.34904540 1.00000000
Fungsi cor() digunakan untuk menghitung korelasi antara dua variabel numerik. Sedangkan fungsi ggcorrplot() untuk tampilan grafis matriks korelasi, dengan lab=T atau TRUE untuk menampilkan koefisien korelasi pada plot.
ggcorrplot(cor_heart,lab = T, title = "Korelasi antar variabel numerik")
Berdasarkan Correlation Matrix diatas, dapat dilihat bahwa terdapat variabel yang memiliki nilai koefisien korelasi yang rendah satu sama lain yaitu variabel “chol” dan “oldpeak. Namun, terdapat pula variabel yang memiliki nilai koefisien korelasi yang cukup kuat satu sama lain yaitu antara variabel “thalach” dan “age” atau dengan kata lain terdapat hubungan antara detak jantung maksimum dengan umur pasien.
Statistika inferensial yang digunakan adalah regresi logistik biner.
Langkah awal yang dilakukan yaitu mengubah nilai kategorik pada variabel “target”. Perubahan ini didasarkan karena pada regresi logistik biner, y atau variabel terikat (dependent variable) harus bernilai 0≤y≤1. Sedangkan pada keterangan variabel di tabel, variabel “target” bernilai 1 =tidak terkena serangan jantung dan bernilai 2=terkena serangan jantung. Maka, perlu mengubah nilai 2 menjadi 0 pada “data”.
#variabel "target" dengan dummy (2 dan 1)
head(data$target)
## [1] 2 1 2 1 1 1
#variabel "target" dengan dummy (0 dan 1)
data$target[data$target==2] = 0
head(data$target)
## [1] 0 1 0 1 1 1
Berdasarkan output di atas, nilai dummy 2 sudah berubah menjadi 0, di mana nilai dummy 0= kemungkinan besar terkena serangan jantung.
Variabel independen (x) yang akan digunakan dalam analisis regresi logistic biner ini adalah variabel numerik yaitu “age”, “trestbps”, “chol”, “thalach”, dan “oldpeak”, dengan variabel dependen (y) adalah “target”.
Data pada variablel “target” dibagi menjadi data training (membangun model) dan data testing (menguji kebaikan model) dengan perbandingan 80% data training dan 20% data testing dengan bantuan fungsi createDataPartition().
split<- createDataPartition(data$target , p=0.8 , list = FALSE )
train <- data[split, ]
test <- data[-split,]
nrow(train)
## [1] 216
nrow(test)
## [1] 54
Diperoleh sebesar 216 data training dan 54 data testing yang selanjutnya digunakan untuk pembentukan dan pengujian model.
Membangun model dengan fungsi glm() atau fitting generalized linear models. Formula model yang hendak dibentuk yaitu model antara variabel “target” dengan “age”, “trestbps”, “chol”, “thalach”, dan “oldpeak”. Family merupakan distibusi yang digunakan. Untuk regresi logistik digunakan argumen family=binomial.
model=glm(target~age+trestbps+chol+thalach+oldpeak, data=train, family='binomial')
Selanjutnya dari model tersebut, diuji asumsi klasik dan signifikansi parameter.
Menurut Fadhilah & Notobroto (2016), uji normalitas tidak dilakukan karena model regresi logistik tidak memerlukan uji asumsi klasik tersebut, melainkan memerlukan uji independensi untuk mendeteksi non multikolinearitas. Sehingga, hanya dilakukan uji asumsi klasik yaitu uji non-multikolinearitas.
Jika korelasi antar variabel independen > 0.6, maka terdapat multikolinearitas. Korelasi antar variabel dapat dilihat melalui correlation matrix atau fungsi chart.Correlation() pada library PerformanceAnalytics.
# Uji Non-Multikolinearitas
chart.Correlation(data[c(1,4,5,8,10)])
Diperoleh semua nilai korelasi antar variabel <0.6, berarti bahwa tidak terdapat multikolinearitas atau uji asumsi non-multikolinearitas terpenuhi.
Uji signifikansi parameter terdiri dari uji serentak dan parsial. Uji simultan bertujuan untuk mengetahui apakah variabel independen berpengaruh secara bersama terhadap variabel dependen. Sedangkan uji parsial digunakan untuk mengetahui variabel apa yang signifikan mempengaruhi variabel dependen.
Hipotesis H0: Tidak ada variabel independen yang signifikan mempengaruhi variabel dependen.
H1: Minimal ada satu variabel independen yang signifikan mempengaruhi variabel dependen.
Tingkat signifikansi α = 0.05
Daerah kritis : H0 ditolak jika nilai G2 > chi-square tabel = 11.0705
Statitik Uji
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -112.4397997 -148.7925375 72.7054756 0.2443183 0.2858051 0.3821719
Diperoleh nilai G2=73.1722832, di mana fungsi pR2() digunakan untuk menampilkan perhitungan berbagai ukuran pseudo-R2 untuk berbagai GLM (Generalized Linear Models).
Kesimpulan Berdasarkan hasil pengujian serentak, menunjukkan bahwa nilai G2=73.1722832 > chisquare tabel = 11.0705. Maka H0 ditolak yang berarti bahwa minimal ada satu variabel independen yang signifikan mempengaruhi variabel dependen.
Hipotesis H0: Tidak ada pengaruh variabel independen(“age”/“trestbps”/ “chol”/“thalach”/”oldpeak”) terhadap variabel dependen.
H1: Ada pengaruh variabel independen(“age”/“trestbps”/ “chol”/“thalach”/”oldpeak”) terhadap variabel dependen.
Tingkat signifikansi α = 0.05
Daerah kritis : H0 ditolak jika p-value < α = 0.05
Statitik Uji
summary(model)
##
## Call:
## glm(formula = target ~ age + trestbps + chol + thalach + oldpeak,
## family = "binomial", data = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.2080 -0.8140 0.4198 0.8515 2.1756
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.755e+00 2.136e+00 -1.289 0.197245
## age -5.718e-05 2.141e-02 -0.003 0.997869
## trestbps -1.808e-03 1.017e-02 -0.178 0.858975
## chol -9.231e-03 3.912e-03 -2.360 0.018296 *
## thalach 4.109e-02 9.163e-03 4.484 7.33e-06 ***
## oldpeak -6.317e-01 1.652e-01 -3.824 0.000131 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 297.59 on 215 degrees of freedom
## Residual deviance: 224.88 on 210 degrees of freedom
## AIC: 236.88
##
## Number of Fisher Scoring iterations: 4
Kesimpulan Berdasarkan hasil pengujian parsial, menunjukkan bahwa H0 gagal ditolak untuk variabel “age”, “trestbps”, dan “chol” karena memiliki nilai p-value > α = 0.05 yang berari bahwa variabel “age”, “trestbps”, “chol” tidak ada pengaruh parsial yang signifikan terhadap variabel dependen. Sedangkan H0 ditolak untuk variabel “thalach”, ”oldpeak” karena memiliki nilai p-value < α = 0.05, yang berarti bahwa variabel “thalach”, ”oldpeak” terdapat pengaruh parsial yang signifikan terhadap variabel dependen.
Pengujian kesesuaian model menggunakan uji Hosmer-Lemeshow Goodness of Fit Test
Hipotesis H0 : Model fit dengan data observasi
H1 : Model tidak fit dengan data observasi Tingkat signifikansi α = 0.05 * Daerah kritis : H0 ditolak jika p-value < α = 0.05 * Statistik uji
hoslem.test(model$y, fitted(model))
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: model$y, fitted(model)
## X-squared = 10.934, df = 8, p-value = 0.2055
Diperoleh nilai p-value=0.1692
*Kesimpulan Berdasarkan hasil pengujian hoslem, diperoleh nilai p-value=0.1692 maka H0 gagal ditolak yang berarti bahwa model fit dengan data observasi.
Untuk mengukur kebaikan model juga dapat dilakukan dengan melihat nilai koefisien determinansi.
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -112.4397997 -148.7925375 72.7054756 0.2443183 0.2858051 0.3821719
Diperoleh nilai McFadden Pseudo R-squared sebesar 0.2458869 yang berarti bahwa variabel independen dapat menjelaskan variabel dependen sebesar 0.2458869 x 100%=24.59 dan terdapat 75.41.3% (100%-24.59%) faktor lain diluar model yang menjelaskan variabel dependen.
Untuk menguji ketepatan model yang telah dibangun maka dilakukan prediksi pada data testing.
Fungsi set.seed() digunakan agar hasil prediksi tidak berubah setiap di run. Fungsi predict() untuk memprediksi probabilitas variabel “target” berdasarkan nilai prediktornya. Opsi type=”response” untuk menghasilkan probabilitas dari bentuk P(Y=1|X) atau probabilitas dihitung untuk data testing yang digunakan agar sesuai dengan model regresi logistic.
set.seed(112)
probs <- predict(model,test[-14],type='response')
results <- ifelse(probs > 0.5, 1, 0)
df<- data.frame(results, test$target)
head(df)
## results test.target
## 2 0 1
## 4 0 1
## 5 0 1
## 6 1 1
## 10 0 0
## 14 0 0
Dari data frame yang dibentuk, dapat dihitung confusion matrix nya.
confusionMatrix(factor(df$results), factor(df$test.target),positive = '1')
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 14 10
## 1 8 22
##
## Accuracy : 0.6667
## 95% CI : (0.5253, 0.7891)
## No Information Rate : 0.5926
## P-Value [Acc > NIR] : 0.1663
##
## Kappa : 0.3193
##
## Mcnemar's Test P-Value : 0.8137
##
## Sensitivity : 0.6875
## Specificity : 0.6364
## Pos Pred Value : 0.7333
## Neg Pred Value : 0.5833
## Prevalence : 0.5926
## Detection Rate : 0.4074
## Detection Prevalence : 0.5556
## Balanced Accuracy : 0.6619
##
## 'Positive' Class : 1
##
Berdasarakan confusion matrix di atas, diperoleh akurasi model regresi logistik biner sebesar 72.22% variabel “target” terklasifikasi dengan benar. Model regresi logistik biner dapat mengklasifikasikan dengan tepat variabel “target” dengan nilai dummy 0 atau pasien yang kemungkinan besar terkena serangan jantung sebanyak 15 orang, dan nilai dummy 1 atau pasien yang kemungkinan kecil/tidak terkena serangan jantung sebanyak 24 orang. Namun, model ini mengklasifikasikan dengan tidak tepat pasien yang kemungkinan besar terkena serangan jantung sebanyak 8 orang, dan pasien yang kemungkinan kecil/tidak terkena serangan jantung sebanyak 7 orang.
Bahtera, Galih. 2021. Eksplorasi Data dan Prediksi Pemodelan dari Kasus Serangan Jantung. Diakses pada 9 Desember 2021, dari https://galihbahtera.medium.com/eksplorasi-data-dan-prediksi-pemodelan-dari-kasus-serangan-jantung-b31b184e5cc
Banapon, Alfazrin. 2017. Analisis Regresi Logistik Biner. Diakses pada 9 Desember 2021, dari https://rpubs.com/alfazrinb/regresi-dan-klasifikasi-logistik-biner
Fadhilah, A. dan Notobroto, H. 2016. Analisis Regresi Logistik Biner pada Kejadian Transient Ischemic Attack (Tia) di RSUD Dr. Soetomo Surabaya. Jurnal Biometrika dan Kependudukan. Vol.5(2). pp.157-165.
Mishra, Shiva R. 2021. Heart Disease Data. Diakses pada 7 Desember 2021, dari https://www.kaggle.com/shivarajmishra/heart-data
Muchson. 2017. Statistik Deskriptif. Jawa Barat: Guepedia.
Verzani, John. 2014. Using R for Introductory Statistics Second Edition. New York: CRC Press.