Làm quen với những package sau đây: lattice , ggplot2, girdExtra
hist()Đọc dữ liệuPISA Data Vietnam 2015.csv và gọi đối tượng là pisa. Thử nghiệm với hist()
pisa = read.csv("C:/Users/Dell/Desktop/Time series/Dataset/PISA Data Vietnam 2015.csv")
#Đọc dữ liệu PISA Data Vietnam 2015.csv và gọi đối tượng là pisa
head(pisa)
## School SchoolSize ClassSize STratio SchoolType Area Region Age
## 1 70400001 883 18 22.075 3 URBAN SOUTH 15.58
## 2 70400001 883 18 22.075 3 URBAN SOUTH 15.92
## 3 70400001 883 18 22.075 3 URBAN SOUTH 15.42
## 4 70400001 883 18 22.075 3 URBAN SOUTH 15.58
## 5 70400001 883 18 22.075 3 URBAN SOUTH 15.92
## 6 70400001 883 18 22.075 3 URBAN SOUTH 16.25
## Gender PARED HISCED WEALTH INSTSCIE JOYSCIE ICTRES Math Read
## 1 Boys 9 2 -2.0697 0.9798 2.1635 -1.5244 439.923 412.290
## 2 Boys 12 4 -1.7903 1.7359 2.1635 -1.9305 406.251 409.598
## 3 Girls 9 2 -2.1942 -0.2063 -0.1808 -1.6093 414.369 384.307
## 4 Girls 5 1 -2.0301 -0.3115 -0.4318 -1.6250 468.801 459.104
## 5 Girls 9 2 -1.0522 0.7648 1.3031 -0.5305 355.432 402.435
## 6 Girls 5 1 -3.0570 0.3708 0.5094 -2.5873 458.955 483.885
## Science
## 1 475.612
## 2 450.320
## 3 405.787
## 4 462.968
## 5 453.736
## 6 529.866
hist(pisa$Math, col = "green")
#hist() là hàm base, col="x" -> x đây sẽ là mã hóa màu trong R
Muốn ghi Tiếng Việt lên biểu đồ, nhấp vào link
hist(pisa$Read, col = "orange", border = "white", xlab = " Read Score", ylab = " Frequency ", main = "Ph\u00E2n b\u1ED1 \u0111i\u1EC3m \u0111\u1ECDc")
Bảng mã màu, có thể xem và tải qua link
hist(pisa$Science, col = "blue", border = "white", main = "Distribution of Science score", prob = T)
# prob = T, T ở đây là True, có thể để F là False, nếu True thì chuyển hết và tỉ lệ với mốc cao nhất là 1 tương ứng cột có số lượng nhiều nhất
lines(density(pisa$Science), col = "red", )
#Distribution for both sex
p1 = hist(pisa$Science[pisa$Gender=="Boys"], plot =F) #plot = F thì trả về sẽ chỉ là các dữ liệu số, không vẽ ra hình liền khi chạy trên workpace, plot = T thì sẽ vẽ hình liền
p2 = hist(pisa$Science[pisa$Gender=="Girls"], plot=F)
plot(p1, col="light blue", border="white")
plot(p2,add = T, col=scales::alpha("green", 0.6), border = 'white') # scales::alpha('color', number) là hàm tự chỉnh màu theo ý thích
#Phần add = T, T ở đây là True, ý nghĩa vẽ biểu đồ thứ 2 chồng lên biểu đồ đầu
latticeLibrary latice() mặc dù là biểu đồ chất lượng cao nhưng không bằng ggplot, nhưng vẫn hơn hàm base,nó còn có thể phân nhóm
Thử nghiệm với hàm densityplot thay cho desnity() mặc định
library(lattice) # gọi thư viện lattice
densityplot(~Science,data = pisa, groups = Gender)
densityplot(~Science, groups = Gender, data = pisa, auto.key = list(space = "top" ))
#Thêm chú thích với hàm densityplot là auto.key =
densityplot(~Science|Gender, data = pisa)
#Biểu đồ ngay trên thì trong 1 biểu đồ chồng lấn cả 2 biểu đồ con là Boys, Girl -> khó nhìn
#Trong densityplot có syntax để chia làm biểu đồ với 2 phần là các các biểu đồ của Boys và Girls tươn ứng
densityplot(~Science, group = Gender, data = pisa)
densityplot(~Science, group = Area, data = pisa, , auto.key = list(space = "top"))
Biểu đồ trên chỉ cho 1 đánh giá sơ qua xu thế chung của số liệu, chứ không cho 1 kết luận cụ thể nào Ví dụ như hình trên, urban khá normal distribution, còn remote hay rural khá lệch
p1 = densityplot(~Science, groups=Area, data=pisa,
auto.key=list(space="top"))
p2 = densityplot(~Math, groups=Area, data=pisa)
p3 = densityplot(~Read, groups=Area, data=pisa)
library(gridExtra)
grid.arrange(p1, p2, p3, ncol=3)
#Col: xếp theo cột, ncol = x, x là số cột, dòng
grid.arrange(p1, p2, p3, nrow = 3)#Xếp theo hàng
boxplotpar(mfrow = c(1,3))#Chia thành 1 dòng, 3 cột
#sử dufjnng hàm boxplot mặc định
boxplot(pisa$Science, col = "purple")
boxplot(pisa$Science ~ pisa$Gender, col=c("blue", "red"))
boxplot(pisa$Science ~ pisa$Region, col=c("blue", "red", "yellow"))
plot (hàm mặc định)Tìm hiểu mối liên quan giữa Math và Science
plot(pisa$Math ~ pisa$Science, col ="blue")#Muốn chỉnh màu với hàm mặc định R, cú pháp lúc này cũng col =
Nhận xét: - Có lẽ điểm toàn và khoa học có mối tương quan với nhau, ở đây là dạng đường thẳng - kiểu hồi quy tuyến tính linear regression - Tuy nhiên dù điểm toán hay khoa học đều có bất định, ví dụ điểm môn Toán với những em được 400 điểm, đa số sẽ có điểm khoa học trên 400, tuy nhiên vẫn có những em toán 400 nhưng khoa học chỉ 200, 300 -> dùng điểm toán để tiên lượng điểm khoa học không hoàn toàn chính xác
plot(pisa$Math ~ pisa$Science, col ="purple")
abline(lm(pisa$Math ~ pisa$Science), col = "red")
#abline là vẽ đường trong R basic
Như biểu đồ trên, có những outlier, điểm Toán chỉ 200 mà khoa học tận gần 400
ggplot2ob = read.csv("C:/Users/Dell/Desktop/Time series/Dataset/Obesity data.csv")
head(ob)
## id gender height weight bmi age bmc bmd fat lean pcfat
## 1 1 F 150 49 21.8 53 1312 0.88 17802 28600 37.3
## 2 2 M 165 52 19.1 65 1309 0.84 8381 40229 16.8
## 3 3 F 157 57 23.1 64 1230 0.84 19221 36057 34.0
## 4 4 F 156 53 21.8 56 1171 0.80 17472 33094 33.8
## 5 5 M 160 51 19.9 54 1681 0.98 7336 40621 14.8
## 6 6 F 153 47 20.1 52 1358 0.91 14904 30068 32.2
ob$OB[ob$bmi < 18.5 ] = "Underweight"
ob$OB[ob$bmi >= 18.5 & ob$bmi < 25] = "Normal"
ob$OB[ob$bmi >= 25 & ob$bmi < 30] = "Overweight"
ob$OB[ob$bmi >= 30] = "Obese"
#Sắp xếp lại bằng hàm factor
ob$OB = factor(ob$OB, levels=c("Underweight", "Normal",
"Overweight", "Obese"))
table(ob$OB)
##
## Underweight Normal Overweight Obese
## 107 865 230 15
Tìm hiểu phân bố của OB
library(ggplot2)
p = ggplot(data=ob, aes(OB, fill = OB)) + geom_bar() #fill = , là điền vào của cả dữ liệu mẹ
p = p + xlab("C\u00E2n n\u1EB7ng") + ylab("S\u1ED1 l\u01B0\u1EE3ng\r\n")
p = p + ggtitle("Bi\u1EC3u \u0111\u1ED3 s\u1ED1 l\u01B0\u1EE3ng theo c\u00E2n n\u1EB7ng\r\n")
p + theme(legend.position="none") #legend.position = 'top, bottom, right, left, none'
weight và pcfat dùng ggplot2library(ggplot2); #Gọi thư viện ggplot2
p = ggplot(data=ob, aes(x=weight, y=pcfat))
p = p + geom_point() + geom_smooth()
#geom_point(): đối tượng được biểu hiện dạng điểm
#geom_smooth(): yêu cầu vẽ ra vùng giá trị giá trung bình và khoảng xung quanh (không ghi method ="" đồng nghĩa với medthod = "loess" , loess sẽ là dựa vào chính dữ liệu ban đầu), ví dụ có thể ghi geom_smooth(method ="lm")
#ngoài ra còn có thể ghi geom_smooth(formula: pcfat ~ weight) ép vẽ đám mấy theo hồi quy tuyến tính
p = p + xlab("Weight") + ylab("Percent body fat") +
ggtitle("Weight and Percent Body Fat")
p = p + theme(plot.title=element_text(hjust=0.5))
p
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
p = ggplot(data=ob, aes(x=weight, y=pcfat, fill = gender,
))
p = p + geom_point() + geom_smooth()
p = p + xlab("Weight") + ylab("Percent body fat") +
ggtitle("Weight and Percent Body Fat for men and women
separately")
p = p + theme(plot.title=element_text(hjust=0.5))
p
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Hình trên, mặc dù trung bình và vùng khoảng tin cậy có màu, nhưng các điểm points (biểu hiện dữ liệu) của cả 2 nhóm Female, Male chỉ có màu đen -> khá chán
Thêm chút cho đẹp hơn, với col =
p = ggplot(data=ob, aes(x=weight, y=pcfat, fill = gender, col = gender
)) #Them col = gender -> đẹp hơn nè
#fill = gender có tác dụng chia dữ liệu lớn thành các dứ liệu (biểu đồ) con
#col = gender đổ màu vào từng dữ liệu con
p = p + geom_point() + geom_smooth()
p = p + xlab("Weight") + ylab("Percent body fat") +
ggtitle("Weight and Percent Body Fat for men and women
separately")
p = p + theme(plot.title=element_text(hjust=0.5))
p
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Thử theme economist trong package ggthemes
library(ggthemes) #Gọi thư viện ggthemes
p + theme_economist()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Có thể thử theme_tufte(), theme_few(), theme_wsj(), theme_clean(), theme_hc()
Biểu đồ tương quan; kết hợp khả năng phân bố của package ggExtra
p = ggplot(data = ob, aes(x = weight, y = pcfat, fill = gender, col = gender)) #Định nghĩa biến, dữ liệu
p = p + geom_point() + geom_smooth()#Định nghĩa hình thức biểu đồ, vẽ mean + vùng mây khoảng tin cậy
library(ggExtra) #Gọi thư viện ggExtra
p1 = ggMarginal(p, type = "density", groupColour = T, groupFill = T)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
#Type = "", có thể là histogram, violin, boxplot,....
p1
p2 = ggMarginal(p, type = "histogram", groupColour = T, groupFill = T)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
p2
GGally : cái nhìn tổng quát để chọn biến quan tâmlibrary(GGally)# Gọi thư viện GGally
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
dat = ob[, c("gender", "age", "bmi", "weight", "height","pcfat")]
ggpairs(dat)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggpairs(data=dat, mapping = aes(color = gender))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Từ đó rút gọn được các biến khả dĩ
ggpairs(data=ob, mapping = aes(color = gender), columns = c("age", "weight", "bmi", "pcfat"))
#columns = c("x","y",..), x và y ở đây phải ghi đúng tên trong tập dữ liệu, cũng chính là biến mà ta đã chọn được từ biểu đồ phía trước
-Biểu đồ này có lợi thế là chỉ toàn biến liên tục với nhau, lại ít biến -> dễ nhìn hơi hẳn -Còn 2 biểu đồ trước thì gồm cả gender vào ( tức là biến phân loại ) -> biểu đồ tương quan vừa phân loại, vừa liên tục -> khó nhìn và mất thẩm mỹ
Đọc dữ liệu PISA Data Vietnam 2015.csv và gọi là đối tượng pisa
library(gridExtra)
p = ggplot(data=pisa, aes(x=Science))
p1 = p + geom_histogram(color="white", fill="blue")
p = ggplot(data=pisa, aes(x=Science))
#Vì lúc này đã object p1 đã có biều đồ mong muốn, nên ta có thể tạo đè object p mà không cần lo lắng quá
p2 = p + geom_histogram(aes(y=..density..), color="white", fill="blue")
p2 = p2 + geom_density(col="red")
grid.arrange(p1, p2, ncol=2)#Sắp xếp biểu đồ p1, p2 vào trong 2 biểu đồ có 2 cột tương ứng
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Thử nghiệm Biểu đồ phân bố môn khoa học theo Area
p = ggplot(data=pisa, aes(x=Science, fill=Area))
p1 = p + geom_histogram(position="dodge")
p2 = ggplot(data=pisa, aes(x=Science, fill=Area, color=Area)) +geom_density(alpha = 0.1) #alpha chỉ để chỉnh độ dày của đường biểu diễn density thôi
grid.arrange(p1, p2, nrow=2) #Bây giờ thì xếp p1,p2 theo dòng (row) qua cú pháp nrow =, còn cột là ncol =
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Histogram với xác suất tích lũy
p = ggplot(data=pisa, aes(HISCED))#Đang dùng thư viện ggplot2 nhé, aes(HISCED) dữ liệu là biến HISCED
p = p + stat_ecdf(color="red", lwd=1)#Stat_ecdf() vẽ đường xác suất tích lũy
#lwd ở đây cũng là để chỉnh đồ dày của đường biểu diễn, công dụng khá giống cái alpha ở biểu đồ trước,
#trong biểu đồ này thì là đường được chỉnh độ dày tận 1 là đường xác suất tích lũy ấy
p = p + geom_bar(aes(y = (..count..)/sum(..count..)),fill="blue", colour='yellow')
p
## Warning: Removed 14 rows containing non-finite values (stat_ecdf).
## Warning: Removed 14 rows containing non-finite values (stat_count).
boxplot có thể vẽ bằng bộ hàm mặc định R hoặc ggplot2 ( đẹp hơn, nhiều tùy biến hơn )
Areap = ggplot(data=pisa, aes(x=Area, y=Science, col=Area,
fill=Area))
p1 = p + geom_boxplot(col="black")
p2 = p + geom_boxplot(col="black") + geom_jitter(alpha=0.05)
#geom_jiter có tác dụng hiện cụ thể các dữ liệu lên biểu đồ luôn, trong boxplot thường chỉ hiện các outlier thôi
grid.arrange(p1, p2, ncol=2)
#Gộp 2 biểu đồ lại thành 1 biểu đồ, với mỗi biểu độ thành phần nằm 1 cột, số cột là 2
PARED (đều đang dùng dữ liệu pisa)p = ggplot(data=pisa, aes(x=PARED, y=Science, fill=PARED))
p1 = p + geom_boxplot(col="black") + geom_jitter(alpha=0.02)#alpha = 0.02 kích thước điểm nhỏ nè
p = ggplot(data=na.omit(pisa), aes(x=factor(PARED), y = Science, fill=factor(PARED), color=factor(PARED)))
p2 = p + geom_boxplot(col="black") + geom_jitter(alpha=0.05)#Kích thước điểm lớn hơn nè
grid.arrange(p1, p2, ncol=2)
## Warning: Continuous x aesthetic -- did you forget aes(group=...)?
## Warning: Removed 14 rows containing missing values (stat_boxplot).
## Warning: Removed 14 rows containing missing values (geom_point).