Friday, October 2, 2015

Biểu đồ phân bố (histogram)

Biểu đồ phân bố là một cách mô tả các biến liên tục (continuous variables) rất hữu hiệu. Trong R có nhiều hàm để vẽ biểu đồ phân bố, và bài này sẽ trình bày các hàm phổ biến.


Quay lại với dữ liệu dùng trong biểu đồ hộp, chúng ta có những biến sau đây:

ID: Mã số của cá nhân
Gender: Giới tính (giá trị Male, Female)
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)

Chúng ta muốn mô tả phân bố của biến FN, và muốn biết phân bố của FN có khác biệt giữa người có bệnh và người không có bệnh (biến Disease).

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)

Hàm đơn giản nhất là hist:

hist(FN, breaks=20, col="blue", border="white")


Chúng ta có thể thêm đường biểu diễn, nhưng chú ý trong hàm hist() phải thể hiện bằng xác suất, tức prob=T:

hist(FN, breaks=20, col="blue", border="white", prob=T)

lines(density(na.omit(FN)), col="red", lwd=3)


Chúng ta cũng có thể dùng ggplot2 để vẽ biểu đồ phân bố:

library(ggplot2); library(gridExtra)

p = ggplot(dat, aes(x=FN))

p = p + geom_histogram(aes(y=..density..), color="white", fill="blue") + geom_density(alpha=0.5, col="red")



Nhưng chúng ta muốn so sánh phân bố FN giữa nhóm mắc bệnh và nhóm không mắc bệnh, cần đến biến Disease.

p = ggplot(dat, aes(x=FN, fill=Disease)) + geom_density(alpha=.3)
p


Chúng ta có thể vẽ phân bố với trung bình:

# Trước hết tính trung bình dùng package plyr
library(plyr)
means = ddply(dat, "Disease", summarise, average=mean(FN))
means
p = ggplot(dat, aes(x=FN, fill=Disease))
p = p + geom_histogram(position="identity")
p = p + geom_vline(data=means, aes(xintercept=average, colour=Disease), linetype="dashed", size=1)

Chúng ta cũng có thể tách 2 nhóm riêng lẻ bằng cách dùng hàm facet_grid:

p = ggplot(dat, aes(x=FN, fill=Disease))
p = p + geom_histogram(aes(y=..density..), color="white", fill="blue") + geom_density(alpha=0.5, col="red") + facet_grid(Disease ~.)

p + theme_bw()



No comments:

Post a Comment