Cleveland Heart Disease Dataset
Column | Type | Description |
age | continuous | age in years |
sex | discrete | 0=female 1=male |
cp | discrete | chest pain type: 1=typical angina, 2=atypical angina, 3=non-anginal pain, 4=asymptom |
trestbps | continuous | resting blood pressure (in mm Hg) |
chol | continuous | serum cholesterol in mg/dl |
fbs | discrete | fasting blood sugar>120 mg/dl: 1=true 0=False |
restecg | discrete | result 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) |
thalach | continuous | maximum heart rate achieved |
exang | discrete | exercise induced angina: 1=yes 0=no |
oldpeak | continuous | depression induced by exercise relative to rest |
slope | discrete | the slope of the peak exercise segment: 1=up sloping 2=flat, 3=down sloping |
ca | continuous | number of major vessels colored by fluoroscopy that ranged between 0 and 3 |
thal | discrete | 3=normal 6=fixed defect 7=reversible defect |
class | discrete | diagnosis 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%