การทำนายผู้ป่วยโรคหัวใจ ด้วยวิธี Logistic Regression ด้วยภาษา R

Cleveland Heart Disease Dataset

ColumnTypeDescription
agecontinuousage in years
sexdiscrete0=female 1=male
cpdiscretechest pain type: 1=typical angina, 2=atypical angina, 3=non-anginal pain, 4=asymptom
trestbpscontinuousresting blood pressure (in mm Hg)
cholcontinuousserum cholesterol in mg/dl
fbsdiscretefasting blood sugar>120 mg/dl: 1=true 0=False
restecgdiscreteresult of electrocardiogram while at rest are represented in 3 distinct values 0=Normal 1=having ST-T wave abnormality (T wave inversions and/or ST elevation or depression of > 0.05 mV) 2=showing probable or definite left ventricular hypertrophy Estes’ criteria (Nominal)
thalachcontinuousmaximum heart rate achieved
exangdiscreteexercise induced angina: 1=yes 0=no
oldpeakcontinuousdepression induced by exercise relative to rest
slopediscretethe slope of the peak exercise segment: 1=up sloping 2=flat, 3=down sloping
cacontinuousnumber of major vessels colored by fluoroscopy that ranged between 0 and 3
thaldiscrete3=normal 6=fixed defect 7=reversible defect
classdiscretediagnosis classes: 0=no presence 1=minor indicators for heart disease 2=>1 3=>2 4=major indicators for heart disease

เริ่มต้นด้วยการโหลด Packages ที่จำเป็นต่อการทำงาน

# Load the necessary packages
install.packages("Metrics")
library(tidyverse)
library(yardstick)
library(Metrics)

# Load the data
hd_data <- read.csv("Cleveland_hd.csv")

# Inspect the first five rows
head(hd_data, 5)

เพิ่มคอลัมเพื่อระบุว่าเป็นโรคหัวใจหรือไม่เป็นโรคหัวใจ

# Create a new freature to represent 
# a binary outcome for the current class variables
hd_data<- hd_data %>% 
	mutate(hd = ifelse(class > 0,1,0))

เปลี่ยนประเภทข้อมูลคอลัมน์ sex เป็น factor

# convert the sex freature to a factor with 
# levels 0 and 1 and labels with "Male" and "Female"
hd_data <- hd_data %>% 	
      mutate(sex = factor(sex, levels = 0:1,
                           labels = c("Female", "Male")))

เริ่มทำการทดสอบเพื่อหาตัวแปรที่ส่งผลต่อการเกิดโรคหัวใจ

# Use statistical tests to check 
# which freatures impact heart disease
# Check the sex variable
hd_sex <- chisq.test(hd_data$sex, hd_data$hd)
print(hd_sex)

# Check the age vairiable
hd_age <- t.test(hd_data$age ~ hd_data$hd)
print(hd_age)

# Check the thalach variable
hd_heartrate <- t.test(hd_data$thalach ~ hd_data$hd)
print(hd_heartrate)

# Save the highly significant freatures to a list
highly_significant <- list("age","sex","thalach")

สร้างโมเดลเพื่อทำนายผลการเกิดโรคหัวใจ โดยใช้ตัวแปรที่มีความสำคัญเป็นตัวทำนาย

# Build a Model to predict heart disease 
# using significant freature as a predictor
model <- glm(data = hd_data, 
                        hd ~ age + sex + thalach, 
                        family = "binomial")

# Extract the model summary
summary(model)

หลังจากที่เราได้โมเดลแล้ว จากนั้นนำมาทำนายผลกับข้อมูลที่มี พร้อมกับสรุปผล Accuracy และ Confusion Matrix

# Predict the probability of heart disease
pred_prob <- predict(model, hd_data, type = "response")

# Create a decision rule using probability 0.5 as cutoff 
hd_data$pred_hd <- ifelse(pred_prob >= 0.5, 1 , 0)

# Calculate and Print the accuracy score
accuracy <- accuracy(hd_data$hd, hd_data$pred_hd)
print(accuracy)

# Calculate and Print the confusion matrix
confusion <- conf_mat(table(hd_data$hd, hd_data$pred_hd))
confusion

สรุปผลการทำนายการเกิดโรคหัวใจ

ตัวแปรที่นำมาทำนายมีสามตัวแปรคือ 1.เพศ 2.อายุ 3.อัตราการเต้นสูงสุดของหัวใจ โดยเรามีการทดสอบสมมุติฐานทางสถิติด้วยการใช้ Chi-squared Test และ T-Test เพื่อทดสอบว่าตัวแปรนี้มีความสำคัญทางสถิติอย่างมีนัยยะสำคัญเกี่ยวข้องกับการทำนายผลการเกิดโรคหัวใจหรือไม่

จากนั้นนำไปสร้างโมเดลการทำนายการเกิดโรคหัวใจด้วย General Linear Model ใช้รูปแบบ Binomial เพื่อทำนายค่าสองคำตอบคือ 1 = เป็น และ 0 = ไม่เป็น เมื่อได้โมเดลออกมาแล้ว นำมาทำนายชุดข้อมูลที่มีเพื่อสรุปผล

ได้กำหนดเกณฑ์ของการตัดสินว่าเป็นโรคหัวใจมีความน่าจะเป็นอยู่ที่ 0.5 หรือ 50%

ประสิทธิภาพของโมเดลนี้มี Accuracy ของโมเดลนี้มีค่าอยู่ที่ 0.709 หรือ 70%