Để xây dựng mô hình cây quyết định, ta làm các bước sau:
# Cài đặt gói
11brary (rpartE) 11brary(rpart.pleE)
# Xây dựng mồ hình cây quyết định
tree model <- rpart(Bridge Condition ~ Structure Length Average Daily Traffic + Number of Spans in Main Unit Bridge Age + Deck Condition Rating, data = data, method
"class")
# Xem kết quả mô hình summary (tree model)
Dé dé dang hình dung cây quyết định, ta có thể sử dụng hàm rpart.plot () để vẽ cây:
# Vẽ cây quyết định
rpart.plot(tree model, main = "Cay quyết định phân loại Bridge Condition",
extra = 101, box.palette = "RdylGn", cex = 0.8)
Cay quyét dinh phan loai Bridge Condition
ss | Gà hà —ơ
Deck_Condition_Rating >= 7{no |
k_Condition_Rating >=
Ta co nhan xét vé cau truc cay:
e Nut goc: Nut dau tién, kiém tra diéu kién "Deck Condition Rating >= 7".
o Nhanh "yes": Nếu điều kiện đúng, cây dự đoán Bridge Condition là 1 (có thê tương ứng với "Tốt").
o_ Nhánh "no": Nếu điều kiện sai, chuyển sang nút tiếp theo.
e Nut thir hai: Kiém tra điều kiện "Deck Condition Rating > 5".
o Nhanh "yes": Néu ding, du doan Bridge Condition là 2 (có thê tương ứng với
"Khá").
o Nhánh "no": Nếu sai, dự đoán Bridge Condition là 3 (có thể tương ứng với
"Kém").
Thông tin trong mỗi nút:
Mỗi nút chứa thông tin về:
e© Số lượng mẫu thuộc mỗi lớp: Ví dụ, nút gốc có LIe+3 (khoảng 11000) mẫu thuộc lớp 3, 3502 mẫu thuộc lớp 1, và 293 mẫu thuộc lớp 2.
e Ty 1é mau di qua nút: Ví dụ, 100% mẫu trong tập huấn luyện di qua nút gốc, 12%
đi qua nút thứ hai ở nhánh "no".
Kết luận từ cây quyết định:
e Deck Condition Rating la yếu tô dự đoán quan trọng cho Bridge Condition.
e Mat cau cang tét (Deck Condition Rating cao), tình trạng cầu càng có khả năng tot (Bridge Condition = 1). Cu thé, néu Deck Condition Rating >= 7, m6 hinh luén dy doan Bridge Condition la 1.
e© Ngược lai, mat cau càng kém, tình trạng cầu cảng có kha năng kém. Nếu Deck Condition Rating <= 5, m6 hinh dự đoán Bridge_Condition là 3.
e Có thể có sự mất cân bằng dữ liệu. Nhánh dự đoán Bridge Condition là 3 có tỷ lệ mẫu rất thấp (0%), cho thấy có thể có ít dữ liệu về cầu ở tình trạng kém trong tập huấn luyện.
3.6 So sánh 2 mô hình hồi quy Logistic và cây quyết định 1. Hồi quy Logistic
Ưu điểm:
e Dễ hiểu và diễn giải: Mô hình cung cấp các hệ số cho mỗi biến dự đoán, giúp dễ dàng hiệu được ảnh hưởng của từng biến đến xác suất của biến kết quả.
e- Hiệu quá với dữ liệu tuyến tính: Mô hình hoạt động tốt khi mối quan hệ giữa các biến dự đoán và biến kết quả là tuyên tính hoặc gần tuyến tính.
e© Cung cấp xác suất: Mô hình dự đoán xác suất của biến kết quả, cho phép đánh giá mức độ chắc chắn của dự đoán.
Nhược điểm:
e_ Giả định tuyến tính: Mô hình giả định mỗi quan hệ tuyến tính giữa các biến dự đoán và biến kết quả, có thê không phù hợp với dữ liệu phức tạp.
e Nhay cam voi dit ligu nhiễu: Mô hình có thể bị ảnh hưởng bởi các điểm dữ liệu
nhiều hoặc ngoại lai.
e©_ Khó xử lý các biến tương tác phức tạp: Mô hình có thể gặp khó khăn trong việc mô hình hóa các tương tác phức tạp giữa các biến dự đoán.
2. Cây quyết định:
Ưu điểm:
e Déhiéu và trực quan: Mô hình được biêu diễn dưới dạng cây, giúp dễ dàng hình dung và diễn giải quy trình ra quyết định.
e_ Xử lý tốt dữ liệu phi tuyến: Mô hình có thể mô hình hóa các mỗi quan hệ phi
tuyến giữa các biến dự đoán và biến kết quả.
e Tự động lựa chọn biến: Mô hình tự động chọn các biến dự đoán quan trọng nhất.
Nhược điểm:
¢ Dé bi overfitting: Mé hình có thê quá khớp với dữ liệu huấn luyện, dẫn đến hiệu
suất kém trên dữ liệu mới.
e©_ Không ôn định: Thay đổi nhỏ trong dữ liệu huấn luyện có thê dẫn đến cây quyết
định rất khác nhau.
e Kho xtrly dữ liệu liên tục: Mô hình có thê gặp khó khăn trong việc xử lý các biến
dự đoán liên tục.
Do đó, việc lựa chọn mô hình phù hợp phụ thuộc vào đặc điểm của dữ liệu và mục tiêu phân tích. Nếu dữ liệu có mối quan hệ tuyến tính và ta cần dự đoán xác suất, hồi quy logistic la mét lựa chọn tốt. Nếu dữ liệu phức tạp hơn và bạn cần một mô hình dễ hiểu,
cây quyết định có thê phù hợp hơn.
3.7. File code R
# Bước 1: Đọc và kiểm tra đữ liệu
data <- read.csv("D:/BÁCH KHOA/HK 241/Xác suất thống kê/BTL/Last Year All Field Bridges.csv", header = TRUE)
#Kiểm tra thông tin cơ bản
str(data) # Kiểu đữ liệu và thông tin cột summary(data) # Thống kê mô tả
#Bước 2: Tiền xử lý đữ liệu
†Làm sạch đữ liệu
new data <- data[,c("Average Daily Traffic",
"Number of Spans _in Main Unit","Structure Length", "Bridge _ Condition", "Bridge Age", "Deck Condition Rating") ]
#Tim sé gia tri khuyét thiéu
apply (is.na(new_data),2,sum)
# Tinh gia tri trung bình của cét Average Daily Traffic, loại bỏ NA
mean_ ADT <-
mean (new đata$Average Daily Traffic[new_data$Average Daily _Traffic != 0], na.rm = TRUE)
# Thay thé gia tri 0 bang gia tri trung binh
new _data$Average Daily Traffic[new_data$Average Daily Traf fic == 0] <- mean ADT
† Tính giá trị trung bình của các giá trị hợp lệ (không phải
W N" )
mean value <-
mean (as.numeric(new_ data$Deck Condition _Rating[new_data$De ck Condition Rating != "N"]), na.rm = TRUE)
# Thay thé "N" bang gia tri trung binh
new data$Deck Condition _Rating[new_ data$Deck_ Condition Rat ing == "N"] <- mean_value
# Kiểm tra số lượng giá trị thiếu của cột Bridge Condition sum(is.na(new_data$Bridge Condition) )
f# Mã hóa giá trị phân loại thành giá trị số
new data$Bridge Condition <- factor (new _data$Bridge Condition, levels = c("Poor", "Fair",
"Good"),labels = c(1, 2, 3))
# Kiểm tra đữ liệu sau khi mã hóa summarzy (new đata$Bridge_Condition)
‡' Kiểm tra kiểu đữ liệu của các cột str (new dđata)
# Mã hóa Bridge Condition thành số
new data$Bridge Condition <-
as.numeric(as.character(new_ data$Bridge Condition) )
# Chuyén Deck Condition Rating thanh sé
new data$Deck Condition Rating <-
as.numeric(new_data$Deck Condition Rating)
# Tính ma trận tuong quan cho 6 biến
correlation matrix <- cor(new_data[,
c("Average Daily Traffic", "Number of Spans_in Main Unit",
"Structure Length",
"Bridge Age",
"Bridge Condition", "Deck Condition Rating")], use =
"complete.obs")
# In ra ma tran tuong quan print (correlation_matrix)
† Vẽ heatmap ma trận tương quan 11brary (corrplotC)
corrplot(correlation_matrix, method = "circle", type =
W upper" ,
col = colorRampPalette(c("blue", "white",
"red")) (200),
addCoef.col = "black", tl.col = "black", tl.srt = 45, tl.srt = 45, tl.cex = 0.7, number.cex = 0.6)
# Kiểm tra kiểu dt 1iéu cta Bridge Condition str(data$Bridge Condition)
# Néu Bridge Condition khéng phai 1a factor, chuyển đổi
thanh factor
data$Bridge Condition <- as.factor(data$Bridge Condition)
# Kiểm tra sự khác biệt giữa các nhóm "Bridge Age' dya trên
"Bridge Condition'
anova_age <- aov(Bridge Age ~ Bridge Condition, data = data)
# Xem k&ét gua ANOVA
summary (anova_age)
# Kiểm tra sự khác biệt giữa các nhóm "Structure Length' dựa trên 'Bridge Condition'
anova_length <- aov(Structure_ Length ~ Bridge Condition, data = data)
# Xem k&ét gua ANOVA summary (anova_length)
# Kiém tra su khac biệt giữa các nhóm
"Average Daily Traffic' dựa trên 'Bridge Condition'
anova_traffic <- aov (Average Daily Traffic ~ Bridge Condition, data = data)
# Xem k&ét gua ANOVA summary (anova_traffic)
# Kiém tra su khac biệt giữa các nhóm
"Deck Condition Rating' dựa trên 'Bridge Condition'
anova_deck <- aov(Deck Condition Rating ~ Bridge Condition, data = data)
# Xem k&ét gua ANOVA summary (anova_deck)
# Kiém tra su khac biệt giữa các nhóm
"Number of Spans in Main Unit' dựa trên 'Bridge Condition' anova_spans <- aov(Number of Spans in Main Unit ~ Bridge Condition, data = data)
summary (anova_spans)
# Cài đặt ggolot2 néu chua cé
install.packages ("ggplot2")
# Nap thu vién ggplot2 library (ggplot2)
# Tao boxplot gitta Structure Length va Bridge Condition ggplot(data, aes(x = Bridge Condition, y = Structure Length, fill = Bridge Condition)) +
geom_boxplot() +
labs (title = "So sanh Structure Length theo
Bridge Condition",
x = "Bridge Condition", y = "Structure Length") + scale fill manual(values = c("red", "yellow", "green"))
# Violin plot giữa Average Daily Traffic va
Bridge Condition
ggplot (data, aes (x = Bridge Condition, V =
Average Daily Traffic, fill = Bridge Condition)) + geom violin() +
labs(title = "Phân phối Average Daily Traffic theo Bridge Condition",
x = "Bridge Condition", y = “Average Daily Traffic")
scale fill manual(values = c("red", "yellow", "green"))
# Tinh gia tri trung binh cua Number_of Spans in Main Unit theo Bridge Condition
mean spans <- aggregate(Number of Spans in Main Unit ~ Bridge Condition, data = data, FUN = mean)
# Bar plot
ggplot(mean_ spans, aes (x = Bridge Condition, y = Number of Spans _in Main Unit, fill = Bridge Condition)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Trung binh Number of Spans_in Main Unit theo Bridge Condition",
x = "Bridge Condition", y = "Mean Number of Spans")
scale fill manual(values = c("red", "yellow", "green"))
# Mã hóa lại lớp Bridge Condition thành giá trị số
data$Bridge Condition <- factor (data$Bridge Condition, levels = c("Good", "Fair", “Poor"), labels = c(1, 2, 3))
# Kiểm tra lại biến Bridge Condition 1evels (daca$Bridge_Condition)
# Tiền hành hồi quy 1ogistic
1ogisLic model <- g1m(Bridge Condition ~ Structure Length + Average Daily Traffic + Number_of Spans _in Main Unit + Bridge Age + Deck Condition Rating,
family = binomial, data = data)
# Xem kết quả mô hình
summary (logistic_model)
# Cài đặt gói 11brary (rpartE) 11brary(rpart.pleE)
# Xây dựng mồ hình cây quyết định
tree model <- rparL(Bridge Condition ~ Structure Length + Average Daily Traffic +
Number of Spans _in Main Unit + Bridge Age + Deck Condition Rating,
data = data, method = "class")
# Xem kết quả mô hình summary (tree model)
# Vẽ cây quyết định
rpart.plot(tree model, main = "Cay quyết định phân loại Bridge Condition",
extra = 101, box.palette = "RdylGn", cex = 0.8)