Thursday, October 1, 2015

Biểu đồ thanh với số trung bình

Biểu đồ thanh (barplot) cũng có thể sử dụng để mô tả một biến số liên tục. Chẳng hạn như số liệu dưới đây (trích từ dữ liệu PISA) về điểm môn toán (PV1MATH) của mỗi học sinh phân theo vùng và địa phương (Group). Mục tiêu là vẽ biểu đồ điểm trung bình cho từng vùng & địa phương. Bài này sẽ hướng dẫn cách vẽ bằng cách dùng ggplot2.



Group          PV1MATH 
Central/Urban  604.775
Central/Urban  565.127
Central/Rural  536.073
Central/Urban  622.846
Central/Rural  544.641
Central/Urban  472.2 
...
Central/Urban  471.888
North/Urban    415.493
North/Urban    373.353
North/Urban    481.547
North/Rural    428.657
...
South/Urban    688.433
South/Rural    516.677
South/Urban    713.125
South/Urban    613.966
South/Rural     713.047
South/Urban    647.617
South/Urban    569.022
...


Trước hết, chúng ta cần đọc dữ liệu vào R và gọi tên data frame là “pisa”.

Vẽ điểm trung bình cho từng vùng:

library(ggplot2)
p = ggplot(pisa, aes(x=Group, y=PV1MATH, fill=Group))
p = p + stat_summary(fun.y="mean", geom="bar")
p



Trục hoành rất khó đọc. Chúng ta cần xoay trục bằng các dùng coord_flip() :

p = ggplot(pisa, aes(x=Group, y=PV1MATH, fill=Group))
p = p + stat_summary(fun.y="mean", geom="bar")
p = p + coord_flip() + theme(legend.position="none")
p = p + theme(axis.text.x=element_text(angle=0, color="black"), axis.text.y=element_text(size=15, color="black"))
p + xlab("") + ylab("")


Thỉnh thoảng, thêm sai số chuẩn cũng cung cấp thêm thông tin:

p = ggplot(pisa, aes(x=Group, y=PV1MATH, fill=Group))
p = p + stat_summary(fun.y="mean", geom="bar")
p = p + stat_summary(fun.data="mean_cl_normal", geom="errorbar", conf.int=0.95, width=0.35, colour="grey")
p = p + coord_flip() + theme(legend.position="none")
p = p + theme(axis.text.x=element_text(angle=0, color="black"), axis.text.y=element_text(size=15, color="black"))
p



Thêm kết quả trung bình cho từng nhóm:

# tính trung bình cho từng nhóm
means = aggregate(pisa$PV1MATH, by=list(pisa$Group), FUN=mean)
colnames(means) = c("Group", "Mean")

# Kế tiếp là dùng ggplot 
p = ggplot(means, aes(x=Group, y=Mean, fill=Group))
p = p + geom_bar(stat="identity", width=1, color="white", position=position_dodge())
p = p + theme(legend.position="none") + xlab("") + ylab("")
p = p + theme(axis.text.x=element_text(color="black"), axis.text.y=element_text(color="black"))
p + geom_text(aes(y=Mean, ymax=Mean, label=round(Mean, 0)), position= position_dodge(width=1), size=3, vjust=-0.5, hjust=1, size=1, color="black") + coord_flip()


 Nhưng vẫn chưa tốt mấy! Chúng ta cần sắp xếp theo thứ tự trung bình:

# tính trung bình cho từng nhóm
means = aggregate(pisa$PV1MATH, by=list(pisa$Group), FUN=mean)
colnames(means) = c("Group", "Mean")

# sort theo thứ tự, dùng transform 
means = transform(means, Group= reorder(Group, Mean))

p = ggplot(means, aes(x=Group, y=Mean, fill=Group))
p = p + geom_bar(stat="identity", width=1, color="white", position=position_dodge())
p = p + theme(legend.position="none") + xlab("") + ylab("")
p = p + theme(axis.text.x=element_text(color="black"), axis.text.y=element_text(color="black"))
p + geom_text(aes(y=Mean, ymax=Mean, label=round(Mean, 0)), position= position_dodge(width=1), size=3, vjust=-0.5, hjust=1, size=1, color="black") + coord_flip()









No comments:

Post a Comment