Thư viện ggplot2 trực quan dữ liệu theo nguyên tắc xếp chồng các lớp(layers) trực quan lên nhau.
# lấy dữ liệu từ gói mosaicData
data(CPS85, package = "mosaicData")
head(CPS85)
## wage educ race sex hispanic south married exper union age sector
## 1 9.0 10 W M NH NS Married 27 Not 43 const
## 2 5.5 12 W M NH NS Married 20 Not 38 sales
## 3 3.8 12 W F NH NS Single 4 Not 22 sales
## 4 10.5 12 W F NH NS Married 29 Not 47 clerical
## 5 15.0 12 W M NH NS Married 40 Union 58 const
## 6 9.0 16 W F NH NS Married 27 Not 49 clerical
Lớp đầu tiên trong trực quan là hàm ggplot. hàm này cho phép:
+) Xác định tập dữ liệu cần trực quan
+) Ánh xạ xác biên trong tập dữ liệu vào đối tượng trực quan. Hàm ánh xạ được viết qua hàm aes(aesthetics)
Khi lớp đầu tiên được gọi, biểu đồ sẽ trống và chưa xuất hiện vì chúng ta mới chỉ ánh xạ biến ban đầu vào tới các trục của hệ trục tọa độ trực quan, giả sử chúng ta muốn ánh xạ biến wage và biến exper
library(ggplot2)
ggplot(data = CPS85, mapping = aes(x = exper, y = wage))
Geoms là các đối tượng hình học (điểm, đường, cột,…) có thể sử dụng để trực quan dữ liệu. Chúng được thêm vào sau lớp ggplot khi sử dụng hàm geom_.
Lưu ý: để các lớp có thể xếp lên nhau, trong gglot2 chúng ta sử dụng dấu + để sắp xếp các lớp
# sử dụng hàm geom_point() để tạo ra biểu đồ phân tán (scatter plot)
ggplot(data = CPS85, mapping = aes(x = exper, y = wage))+
geom_point()
Chúng ta có thể thấy trên biểu đồ trực quan xuất hiện một điểm bất thường. một cá nhân có số nam kinh nghiệm rất ít mà có thu nhập rất cao, trong phân tích dữ liệu thông thường chúng ta sẽ loại bỏ điểm này:
# loại bỏ dữ liệu ngoại lại
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
plotdata <- filter(CPS85, wage < 40)
# trực quan dữ liệu mới
ggplot(data = plotdata, mapping = aes(x = exper, y = wage))+
geom_point()
Thêm các tùy chọn như color, alpha, size
ggplot(data = plotdata, mapping = aes(x = exper, y = wage))+
geom_point(color = "cornflowerblue", alpha = 0.7, size = 2)
sử dụng hàm geom_smooth() để thêm đường hồi quy tuyến tính
# sử dụng method = "lm - mô hình hồi quy tuyến tính
# lm : linear model
ggplot(plotdata, mapping = aes(x = exper, y = wage))+
geom_point(color = "cornflowerblue", alpha = 0.7, size = 2)+
geom_smooth(method = "lm", formula = y ~ x)
Ngoài việc ánh xạ các biến số dạng số vào các trục tọa độ hàm ggplot còn có thể thêm phương thức trực quan theo nhóm (trực quan theo dữ liệu biến phân loại)
# 1. sử dụng color parameter trong aes
# trực quan 2 biến exper và wage dựa trên biến phân loại sex
ggplot(plotdata, mapping = aes(x = exper, y = wage, color = sex))+
geom_point(alpha= 0.7, size = 2)+
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, size = 1.5)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# 2. sử dụng group parameter trong aes
ggplot(plotdata, mapping = aes(x = exper, y = wage, group = sex))+
geom_point(aes(color = sex), alpha = 0.7, size = 2)+
geom_smooth(method = "lm", formula = y ~ x, se = F, linewidth = 1.5)
Phương pháp thay đổi các đơn vị đo và độ dài của các trục cho phép dữ liệu được trực quan tường minh hơn.
ggplot(plotdata, mapping = aes(x = exper, y = wage, color = sex))+
geom_point(alpha = 0.7, size = 2)+
geom_smooth(method = "lm", formula = y~x, se = F, size = 1.5)+
scale_x_continuous(breaks = seq(0,60,10))+
scale_y_continuous(breaks = seq(0,30,5), label = scales::dollar)+
scale_color_manual(values = c("indianred", "cornflowerblue"))+
labs(color = "Giới tính")
Phương pháp này cho phép trực quan dữ liệu với tổ hợp biến số của tập dữ liệu.
ggplot(plotdata, mapping = aes(x = exper, y = wage, color = sex))+
geom_point(alpha= 0.7, size = 2)+
geom_smooth(method = "lm", formula = y~x, se = F, size = 1.5)+
scale_x_continuous(breaks = seq(0,60,10))+
scale_y_continuous(breaks = seq(0,30,5), label = scales::dollar)+
scale_color_manual(values = c("indianred", "cornflowerblue"))+
facet_wrap(~sector)+
labs(title = "Quan hệ giữa tiền lương và số năm làm việc",
subtitle = "Khảo sát về tình trạng dân số",
x = "Số năm làm việc",
y = "Lương theo giờ (USD",
caption = "http://duongductuong...",
color = "Giới tính")+
theme_minimal()
Việc sử dụng hàm ggplot cho phép chúng ta ánh xạ các giá trị ở dạng biến số vào các trục tương ứng, đồng thời cho phép ánh xạ xác biến số phan loại
ggplot(plotdata, mapping = aes(x = exper, y = wage, color = sex))+
geom_point(alpha = 0.7, size = 2)+
geom_smooth(method = "lm", formula = y~ poly(x,2), se = F, size = 1.5)
Trong trường hợp này chúng ta thấy có 2 đường hồi quy theo biến giới tính, như vậy khi ánh xạ biến phân loại vào trong hàm ggplot thì giá trị dữ liệu và các hàm geom cũng sẽ được ánh xạ tương ứng theo
ggplot(plotdata, mapping = aes(x = exper, y = wage))+
geom_point(aes(color = sex), alpha= 0.7, size = 2)+
geom_smooth(method = "lm", formula = y~poly(x,2), se = F, size =1.5)
Chúng ta thấy chỉ có duy nhất một đường hồi quy tuyến tính vì trong trường hợp này biến giới tính đã được ánh xạ ngoại hàm ggplot mà cụ thể trong hàm geom_point(). do đó đường hồi quy tuyến tính sẽ tạo ra cho toàn bộ quan sát.