Friday, October 2, 2015

Biểu đồ hộp

Dưới đây là dữ liệu trích từ một nghiên cứu (n = 1500 cá nhân). Chúng ta sẽ sử dụng dữ liệu này để minh hoạ một số biểu đồ phổ biến trong khoa học. Bài này sẽ hướng dẫn cách vẽ biểu đồ hộp (box plot) để trả lời một số câu hỏi nghiên cứu mang tính mô tả.


Dữ liệu gồm các biến sau đây:

ID: Mã số của cá nhân
Gender: Giới tính (giá trị Male, Female)
Age: Độ tuổi  (biến liên tục)
Height: Chiều cao (biến liên tục)
Weight: Trọng lượng cơ thể (biến liên tục)
BMI: Body mass index (tỉ trọng cơ thể)
FN: Xương đùi (biến liên tục) 
LS: Xương cột sống  (biến liên tục)
Disease: Bệnh (yes, no)
TimeDis: Thời gian từ lúc vào nghiên cứu đến lúc ngã bệnh
Fall: Té ngã (yes, no)
PAI: Chỉ số luyện tập thể lực
Smoking: Hút thuốc lá (yes, no)
PriorDis: Tiền sử mắc bệnh (yes, no)
Diabetes: Bệnh tiểu đường (yes, no)

Câu hỏi nghiên cứu là:
·       Tính chung, có sự khác biệt về FN giữa nam và nữ? 
·       Ở mỗi độ tuổi, có sự khác biệt giữa nam và nữ?

Trước hết, đọc dữ liệu vào R, và kiểm tra vài dòng:

dat = read.csv("~/Google Drive/_QA Book (Vietnamese)/Data/ex-data.csv", header=T)

head(dat)


Vì biến Age là biến liên tục, chúng ta cần chia nhóm để dễ cảm nhận hơn. Biến mới sẽ là AgeGroup:

dat$AgeGroup[dat$Age>=60 & dat$Age<=69] <- "60-69"
dat$AgeGroup[dat$Age>=70 & dat$Age<=79] <- "70-79"
dat$AgeGroup[dat$Age>=80 & dat$Age<=99] <- "80-99"

Các lệnh trên có nghĩa là (ví dụ dòng 1), nếu Age bằng hoặc cao hơn 60 và Age bằng hoặc thấp hơn 69 thì tạo ra một biến AgeGroup với giá trị "60-69". Nói cách khác, AgeGroup là biến phân nhóm.

attach(dat)

Bây giờ thì AgeGroup đã trở thành một biến của dat, và chúng ta sẵn sàng phân tích bằng ggplot2:

library(ggplot2)

và vẽ biểu đồ mô tả biến FN theo giới tính:

p = ggplot(data=dat, aes(x = Gender, y = FN))
p = p + geom_boxplot(fill="yellow", color="black")
p




Thêm số trung bình:

p = p + stat_summary(fun.y=mean, colour="darkred", geom="point",  shape=18, size=3)

p




Thay đổi màu theo giới tính:

p = ggplot(data=dat, aes(x = Gender, y = FN, color=Gender))

p = p + geom_boxplot()

p = p + stat_summary(fun.y=mean, colour="darkred", geom="point",  shape=18, size=3)

p


Hoàn chỉnh với trục tung, trục hoành và nhãn ( và bỏ phần legend):


p = ggplot(data=dat, aes(x = Gender, y = FN, color=Gender))

p = p + geom_boxplot()

p = p + stat_summary(fun.y=mean, colour="darkred", geom="point",  shape=18, size=3)

p = p + xlab("Gender") + ylab("Femoral Neck") + theme_bw() + theme(legend.position="none")

p




Để trả lời câu hỏi thứ 2 (khác biệt giữa nam và nữ theo từng độ tuổi), chúng ta vẫn dùng ggplot2, nhưng thêm một số options như sau:

# Định nghĩa biến cần vẽ, chú ý fill=Gender để vẽ theo giới tính

p = ggplot(data=dat, aes(x = AgeGroup, y = FN, fill=Gender))

# Báo cho R biết sẽ dùng biểu đồ hộp. Ngoài ra, các giá trị ngoại vi (outlier) sẽ có màu đỏ  

p = p + geom_boxplot(notch=T, outlier.colour="red", outlier.shape=16, outlier.size=3, position=position_dodge(width=1))

# Tính trung bình

p = p + stat_summary(fun.y=mean, colour="darkred", geom="point",  shape=18, size=3)

# Thêm nhãn và legend

p = p + xlab("Gender") + ylab("Femoral Neck") + theme_bw() + theme(legend.position="bottom")

p
  
 




No comments:

Post a Comment