Làm quen với những package sau đây: lattice , ggplot2, girdExtra

Task 1: Biểu đồ phân bố vớ 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

Task 2: Biểu đồ phân bố với lattice

Library 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

Task 3: Biểu đồ hộp boxplot

par(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"))

Task 4: Biểu đồ tương quan với plot (hàm mặc định)

Tìm hiểu mối liên quan giữa MathScience

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

Sư dụng biểu đồ chất lượng cao ggplot2

Task 5: Biểu đồ tương quan

ob = 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'

Task 6: Vẽ vài biểu đồ tương quan, ở đây là weightpcfat dùng ggplot2

library(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

Biểu đồ tương quan đa biến với package GGally : cái nhìn tổng quát để chọn biến quan tâm

library(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`.

  • Thêm màu cho dễ quan sát ( màu ở đây sẽ col theo gender )
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ỹ

Task 7: Vẽ biểu đồ phân bố histogram

Đọ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).

Task 8: Vẽ biểu đồ hộp (boxplot)

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 )

p = 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
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).