Pengunduhan Dataset

Dataset yang digunakan diunduh melalui kaggle (https://www.kaggle.com/shivarajmishra/heart-data) tentang penyakit jantung.

Import Library

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

Read Dataset

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)

Preprocessing Data

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.

STATISTIKA DESKRIPTIF

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.

Histogram

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

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

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

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

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”.

Split Data

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.

Modelling Regresi Logistik Biner

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.

Uji Asumsi Klasik

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

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.

Uji Simultan

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.

Uji Parsial

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.

Uji Kesesuaian Model

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.

Prediksi menggunakan Model Regresi Logistik

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.

Daftar Pustaka

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.