Investing.com là một nền tảng cung cấp dữ liệu, bảng báo giá theo thời gian thực, biểu đồ, công cụ tài chính, tin nóng và các bài phân tích trên 250 sàn giao dịch trên khắp thế giới với 44 phiên bản ngôn ngữ. Với hơn 21 triệu người dùng hàng tháng và hơn 180 triệu phiên giao dịch, Investing.com là một trong ba trang web tài chính hàng đầu thế giới theo SimilarWeb và Alexa.
Ta gọi các package cần sử dụng
library(rvest) #Package để scrape web
library(tidyverse) # Hệ sinh thái các gói hỗ trợ biến đổi (dplyr) và trực quan hóa dữ liệu (ggplot2)
Ta tiến hành đọc dữ liệu của trang web và bảng dữ liệu giá chứng khoán Singapore sẽ được lưu như một data
singaporestock <- read_html('https://vn.investing.com/equities/singapore') #Đọc dữ liệu từ web
singaporestock <- singaporestock %>% html_table(fill = TRUE) #đọc dữ liệu dạng bảng
ss = singaporestock [[1]] #chọn bảng 1 trong singaporestock
print(ss)
## # A tibble: 100 × 8
## Tên `Lần cuối` Cao Thấp T.đổi `% T.đổi` KL `Thời gian`
## <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 KPLM Keppel Corp 6.84 6.84 6.72 0.02 +0.29% 2.72M 16:07:00
## 2 HKLD HK Land Holdin… 3.83 3.87 3.82 -0.02 -0.52% 672.… 16:04:00
## 3 JCYC Jardine C&C 34.2 34.6 34.0 -0.39 -1.13% 259.… 16:07:00
## 4 CTDM City Developme… 6.98 7.01 6.92 0.03 +0.43% 903.… 16:11:00
## 5 SCIL Semb Corp 5.39 5.39 5.31 0.08 +1.51% 2.32M 16:06:00
## 6 SIAL Singapore Airl… 7.42 7.42 7.36 0.01 +0.13% 3.31M 16:07:00
## 7 WLIL Wilmar 3.78 3.83 3.78 -0.03 -0.79% 3.34M 16:04:00
## 8 CMDG ComfortDelGro 1.22 1.23 1.21 -0.01 -0.81% 8.57M 16:09:00
## 9 FRNM F & N 1.05 1.07 1.05 -0.01 -0.94% 56.8K 13:39:00
## 10 OCBC OCBC Bank 12.4 12.4 12.3 0.08 +0.65% 3.02M 16:07:00
## # ℹ 90 more rows
Giải thích dữ liệu:
Tên: tên các mã chứng khoán
Lần cuối: giá tham chiếu. Giá tham chiếu là mức giá đóng cửa tại phiên giao dịch gần nhất trước đó.
Cao: Là giá khớp ở mốc cao nhất trong phiên
Thấp: Là giá khớp ở mốc thấp nhất trong phiên
Đặt tên cho các biến trong tập dữ liệu
names(ss) <- c('n','lt' , 'h' , 'l' , 'c' , '%c' , 'kl' , 't')
Lấy 10 quan sát đầu tiên để phân tích giá chứng khoán thị trường Singapore
ss1 <- head(ss, 10)
Vì tên các mã chứng khoán khá dài nên ta chỉ lấy 4 kí tự đầu trong chuỗi kí tự để có thể dễ quan sát
ss1$n <- substr(ss1$n, 1,4)
Dùng ggplot để vẽ đồ thị giá của 10 mã chứng khoán đầu tiên
ggplot(ss1, aes(x= n, y=lt))+
geom_col(fill = 'lightgreen')+
geom_text(aes(label = ss1$lt), color = 'darkgreen' )+
labs(x = 'Tên', y = 'Giá tham chiếu', title = 'Giá tham chiếu một số mã chứng khoán của Singapore')
## Warning: Use of `ss1$lt` is discouraged.
## ℹ Use `lt` instead.
Ở phần này, ta sử dụng gói WDI để gọi ra cacs indicator ta muốn tìm hiểu. Ngoài ra, nếu ta muốn tìm dữ liệu liên quan đến vấn đề nào đó, ta có thể sử dụng hàm WDIsearch(‘gõ các từ khóa muốn tìm kiếm’) để nhận được dữ liệu mong muốn
library(WDI)
## Warning: package 'WDI' was built under R version 4.3.1
library(tidyverse)
tl <- WDIsearch('GDP') # Tìm kiếm dữ liệu về GDP
head(tl)
## indicator name
## 712 5.51.01.10.gdp Per capita GDP growth
## 714 6.0.GDP_current GDP (current $)
## 715 6.0.GDP_growth GDP growth (annual %)
## 716 6.0.GDP_usd GDP (constant 2005 $)
## 717 6.0.GDPpc_constant GDP per capita, PPP (constant 2011 international $)
## 1557 BG.GSR.NFSV.GD.ZS Trade in services (% of GDP)
Indicator VY.GDP.PCAP.PP.CD là indicator về GDP trên đầu người của các nước trong giai đoạn từ 1960 đến 2022
gdp <- WDI(indicator = 'NY.GDP.PCAP.PP.CD')
Sử dụng pivot_wider để chuyển định dạng dữ liệu từ dọc sang ngang, giúp quan sát dữ liệu dễ hơn.
gdp1 <- gdp %>% pivot_wider(names_from = year , id_cols = country , values_from = NY.GDP.PCAP.PP.CD)
Nếu ta chỉ muốn nhận dữ liệu GDP của duy nhất một nước nào đó thì ta có thể sử dụng country = . Ở đây ta lấy dữ liệu của nước Mỹ.
gdpusa <- WDI(indicator= 'NY.GDP.PCAP.PP.CD', country = 'US', extra = FALSE)
#Loại bỏ giá trị NA
gdpusa <- na.omit(gdpusa)
gdpusa
## country iso2c iso3c year NY.GDP.PCAP.PP.CD
## 1 United States US USA 2022 76398.59
## 2 United States US USA 2021 70219.47
## 3 United States US USA 2020 63528.63
## 4 United States US USA 2019 65120.39
## 5 United States US USA 2018 62823.31
## 6 United States US USA 2017 59907.75
## 7 United States US USA 2016 57866.74
## 8 United States US USA 2015 56762.73
## 9 United States US USA 2014 55123.85
## 10 United States US USA 2013 53291.13
## 11 United States US USA 2012 51784.42
## 12 United States US USA 2011 50065.97
## 13 United States US USA 2010 48650.64
## 14 United States US USA 2009 47194.94
## 15 United States US USA 2008 48570.05
## 16 United States US USA 2007 48050.22
## 17 United States US USA 2006 46302.00
## 18 United States US USA 2005 44123.41
## 19 United States US USA 2004 41724.63
## 20 United States US USA 2003 39490.27
## 21 United States US USA 2002 37997.76
## 22 United States US USA 2001 37133.62
## 23 United States US USA 2000 36329.96
## 24 United States US USA 1999 34515.39
## 25 United States US USA 1998 32853.68
## 26 United States US USA 1997 31459.14
## 27 United States US USA 1996 29967.71
## 28 United States US USA 1995 28690.88
## 29 United States US USA 1994 27694.85
## 30 United States US USA 1993 26387.29
## 31 United States US USA 1992 25418.99
## 32 United States US USA 1991 24342.26
## 33 United States US USA 1990 23888.60
# Vẽ đồ thị
ggplot(gdpusa, aes(x=year, y= NY.GDP.PCAP.PP.CD))+
geom_line(na.rm = T, color = 'darkgreen', linewidth = 1)+
scale_x_continuous(breaks = seq(from = 1990, to = 2022 , by = 5))+
labs(x= 'Năm', y='GDP', title = 'GDP của Mỹ từ năm 1990 đến 2022')
Nhìn vào đồ thị ta thấy GDP Mỹ tăng trưởng mạnh mẽ qua từng năm.
SH.DTH.INJR.ZS là indicator liên quan đến sức khỏe. Nó nói về số người tử vong được tính bằng tỷ lệ của tất cả các nguyên nhân tử vong ở mọi lứa tuổi. Thương tích gây tử vong bao gồm thương tích vô ý và cố ý.
di<- WDI(country = 'VNM', indicator = 'SH.DTH.INJR.ZS')
head(di)
## country iso2c iso3c year SH.DTH.INJR.ZS
## 1 Vietnam VN VNM 2022 NA
## 2 Vietnam VN VNM 2021 NA
## 3 Vietnam VN VNM 2020 NA
## 4 Vietnam VN VNM 2019 9.328489
## 5 Vietnam VN VNM 2018 NA
## 6 Vietnam VN VNM 2017 NA
di<- na.omit(di)
di
## country iso2c iso3c year SH.DTH.INJR.ZS
## 4 Vietnam VN VNM 2019 9.328489
## 8 Vietnam VN VNM 2015 8.836912
## 13 Vietnam VN VNM 2010 8.736824
## 23 Vietnam VN VNM 2000 8.964914
ggplot(di, aes(x= year, y= SH.DTH.INJR.ZS))+
geom_col(fill = 'pink')+
geom_text(aes(label=substr(di$SH.DTH.INJR.ZS, 1,4), vjust = -0.3))+
labs(x = 'Năm', y='Tỷ lệ người tử vong', title = 'Tỷ lệ người tử vong ở Việt Nam')
Tỷ lệ tử vong ở Việt Nam có sự biến đổi qua từng năm. Ở năm 2000, Việt Nam nằm ở mức 8.96%, đến năm 2010 thì giảm còn 8.73%(giảm 0.23%). Sang năm 2015 thì tăng lên đến 8.83% và gần đây nhất là năm 2019 thì lại tỷ lệ tử vong này tiếp tục tăng đến 9.32%.
CM.MKT.LCAP.CD đề cập vốn hóa thị trường (hay còn gọi là giá trị thị trường) của các công ty đã niêm yết của các nước. Vốn hóa thị trường được tính bằng cách lấy giá cổ phiếu nhân cho số lượng cổ phiếu đang lưu hành. Dữ liệu được lấy vào cuối năm được chuyển đổi sang đô la Mỹ bằng cách sử dụng tỷ giá hối đoái cuối năm tương ứng
mc <- WDI(country= 'VNM',indicator = 'CM.MKT.LCAP.CD', start = 2008, end = 2020)
mc
## country iso2c iso3c year CM.MKT.LCAP.CD
## 1 Vietnam VN VNM 2020 186008530000
## 2 Vietnam VN VNM 2019 149817280000
## 3 Vietnam VN VNM 2018 132652999577
## 4 Vietnam VN VNM 2017 125310026857
## 5 Vietnam VN VNM 2016 73222197645
## 6 Vietnam VN VNM 2015 58734029972
## 7 Vietnam VN VNM 2014 52426688090
## 8 Vietnam VN VNM 2013 45127428285
## 9 Vietnam VN VNM 2012 36705648755
## 10 Vietnam VN VNM 2011 25961620804
## 11 Vietnam VN VNM 2010 36854988298
## 12 Vietnam VN VNM 2009 33307101456
## 13 Vietnam VN VNM 2008 12365840731
ggplot(mc, aes(x= year, y = CM.MKT.LCAP.CD))+
geom_line(color = 'lightblue', linewidth =2)+
labs(x = 'Năm', y='Vốn hóa thị trường', title = 'Vốn hóa thị trường của các công ty Việt Nam từ 2008 đến 2020' )
Nhìn vào đồ thị, ta có thể vốn hóa thị trường của các công ty Việt Nam có sự tăng trưởng qua từng năm.
Indicator AG.LND.FRST.K2 nói về diện tích rừng qua ở các nước qua từng năm.
f <- WDI(country = 'DE', indicator = 'AG.LND.FRST.K2', start = 1990, end = 2020)
f
## country iso2c iso3c year AG.LND.FRST.K2
## 1 Germany DE DEU 2020 114190
## 2 Germany DE DEU 2019 114190
## 3 Germany DE DEU 2018 114190
## 4 Germany DE DEU 2017 114190
## 5 Germany DE DEU 2016 114190
## 6 Germany DE DEU 2015 114190
## 7 Germany DE DEU 2014 114170
## 8 Germany DE DEU 2013 114150
## 9 Germany DE DEU 2012 114130
## 10 Germany DE DEU 2011 114110
## 11 Germany DE DEU 2010 114090
## 12 Germany DE DEU 2009 114035
## 13 Germany DE DEU 2008 113980
## 14 Germany DE DEU 2007 113925
## 15 Germany DE DEU 2006 113870
## 16 Germany DE DEU 2005 113815
## 17 Germany DE DEU 2004 113760
## 18 Germany DE DEU 2003 113705
## 19 Germany DE DEU 2002 113650
## 20 Germany DE DEU 2001 113595
## 21 Germany DE DEU 2000 113540
## 22 Germany DE DEU 1999 113486
## 23 Germany DE DEU 1998 113432
## 24 Germany DE DEU 1997 113378
## 25 Germany DE DEU 1996 113324
## 26 Germany DE DEU 1995 113270
## 27 Germany DE DEU 1994 113216
## 28 Germany DE DEU 1993 113162
## 29 Germany DE DEU 1992 113108
## 30 Germany DE DEU 1991 113054
## 31 Germany DE DEU 1990 113000
ggplot(f, aes(x= year, y = AG.LND.FRST.K2))+
geom_line(color='lightblue', linewidth = 2)+
scale_x_continuous(breaks = seq(from= 1990, to=2020, by=5))+
labs(x= 'Năm', y='Diện tích rừng', title = 'Diện tích rừng ở Đức trong giai đoạn từ 1990 đến 2020')
Diện tích rừng ở Đức có sự tăng trưởng mạnh mẽ từ năm 1990 cho đến 2010 và từ năm 2010 trở đi, diện tích rừng ở Đức có tăng nhưng ít và gần như bão hòa.
Indicator SH.HIV.0014 đề cập đến trẻ em mắc HIV trong giai đoạn dưới 14 tuổi.
hiv14 <- WDI(country = 'WLD',indicator = 'SH.HIV.0014')
hiv14 <- na.omit(hiv14)
hiv14
## country iso2c iso3c year SH.HIV.0014
## 2 World 1W WLD 2021 1700000
## 3 World 1W WLD 2020 1800000
## 4 World 1W WLD 2019 1800000
## 5 World 1W WLD 2018 1900000
## 6 World 1W WLD 2017 2000000
## 7 World 1W WLD 2016 2100000
## 8 World 1W WLD 2015 2100000
## 9 World 1W WLD 2014 2200000
## 10 World 1W WLD 2013 2300000
## 11 World 1W WLD 2012 2400000
## 12 World 1W WLD 2011 2400000
## 13 World 1W WLD 2010 2500000
## 14 World 1W WLD 2009 2500000
## 15 World 1W WLD 2008 2600000
## 16 World 1W WLD 2007 2600000
## 17 World 1W WLD 2006 2600000
## 18 World 1W WLD 2005 2600000
## 19 World 1W WLD 2004 2500000
## 20 World 1W WLD 2003 2500000
## 21 World 1W WLD 2002 2400000
## 22 World 1W WLD 2001 2300000
## 23 World 1W WLD 2000 2100000
## 24 World 1W WLD 1999 2000000
## 25 World 1W WLD 1998 1800000
## 26 World 1W WLD 1997 1700000
## 27 World 1W WLD 1996 1500000
## 28 World 1W WLD 1995 1300000
## 29 World 1W WLD 1994 1200000
## 30 World 1W WLD 1993 990000
## 31 World 1W WLD 1992 830000
## 32 World 1W WLD 1991 670000
## 33 World 1W WLD 1990 540000
ggplot(hiv14, aes(x= year, y= SH.HIV.0014))+
geom_line(color = 'orange',linewidth = 1)+
scale_x_continuous(breaks = seq(from=1990, to=2021, by = 2 ))+
labs(x= 'Năm', y= 'Số lượng', title = 'Số lượng trẻ em dưới 14 tuổi mắc HIV trên thế giới từ 1990 đến 2021')
Dựa vào kết quả đồ thị, ta thấy từ số lượng trẻ em mắc HIV dưới 24 tuổi từ năm 1990 đến 2005 có sự tăng đều, số lượng trẻ trong 3 năm liên tiếp kể từ năm 2005 không có sự thay đổi. Nhưng từ năm 2008 trở đi thò đã có sự giảm trong số lượng trẻ mắc HIV.
Indicator này nói về chỉ số lạm phát của các nước. Chỉ số lạm phát được đo bằng chỉ số giá tiêu dùng, chỉ số tính theo phần trăm để phản ánh mức thay đổi tương đối của giá hàng tiêu dùng theo thời gian.
inflation <- WDI(country = 'VNM',indicator = 'FP.CPI.TOTL.ZG', start = 2012, end= 2022)
ggplot(inflation, aes(x= year, y =FP.CPI.TOTL.ZG))+
geom_line(color = 'darkgreen', linewidth = 1)+
geom_text(aes(label = substr(inflation$FP.CPI.TOTL.ZG, 1,4), vjust = -0.5))+
scale_x_continuous(breaks = seq(from= 2012, to = 2022, by =1))+
labs(x= 'Năm', y= 'Chỉ số lạm phát(%)', title = 'Tình trạng lạm phát ở Việt Nam từ 2012 đến 2022')
Dựa vào đồ thị, ta thấy CPI (chỉ số lạm phát) năm 2012 là khá cao, nhưng ở các năm tiếp theo đã có sự giảm, thấp nhất là năm 2015 với 0.63%. Ở các năm tiếp theo kể từ 2015 chỉ số lạm phát có sự biến đổi cũng như giảm nhưng không nhiều lắm.
Indicator SE.ADT.LITR.FE.ZS đề cập đến tỷ lệ phụ nữ từ 15 tuổi trở lên có trình độ học vấn, người có thể đọc và viết.
Tỷ lệ này được tính bằng cách lấy số phụ nữ có trình độ học vấn chia cho tổng số phụ nữ của từng năm.
lr <- WDI(country = 'SAS', indicator = 'SE.ADT.LITR.FE.ZS', start = 2010, end = 2020)
lr
## country iso2c iso3c year SE.ADT.LITR.FE.ZS
## 1 South Asia 8S SAS 2020 65.20503
## 2 South Asia 8S SAS 2019 64.48424
## 3 South Asia 8S SAS 2018 63.58429
## 4 South Asia 8S SAS 2017 63.05147
## 5 South Asia 8S SAS 2016 62.13645
## 6 South Asia 8S SAS 2015 60.55344
## 7 South Asia 8S SAS 2014 59.46123
## 8 South Asia 8S SAS 2013 58.45127
## 9 South Asia 8S SAS 2012 57.46402
## 10 South Asia 8S SAS 2011 56.83431
## 11 South Asia 8S SAS 2010 55.72141
ggplot(lr, aes(x= year, y = SE.ADT.LITR.FE.ZS))+
geom_line()+
scale_x_continuous(breaks = seq(from= 2010, to=2020, by =1 ))+
labs (x= 'Năm', y='Số người(%)', title ='Trình độ học vấn của nữ giới ở các nước Nam Á từ 2010 đến 2020')
Nhìn vào đồ thị, ta thấy số phụ nữ có trình độ học vấn qua mỗi năm đều tăng, và năm gần đây nhất là năm 2020, tỷ lệ phụ nữ có trình độ học vấn là 65.2% tổng dân số nữ.
Indicator GC.TAX.TOTL.GD.ZS đề cập đến thu nhập thuế. Thu nhập thuế được hiểu là số tiền người dân phải nộp cho chính phủ để thực hiện các mục đích cộng đồng. Và thu nhập thuế đến chủ yếu từ việc người dân đóng các khoản thuế.
ngr <- WDI(country = 'DE', indicator = 'GC.TAX.TOTL.GD.ZS', start = 2010, end=2021 )
ngr
## country iso2c iso3c year GC.TAX.TOTL.GD.ZS
## 1 Germany DE DEU 2021 11.22529
## 2 Germany DE DEU 2020 10.56231
## 3 Germany DE DEU 2019 11.40856
## 4 Germany DE DEU 2018 11.45698
## 5 Germany DE DEU 2017 11.41912
## 6 Germany DE DEU 2016 11.29612
## 7 Germany DE DEU 2015 11.47873
## 8 Germany DE DEU 2014 11.48256
## 9 Germany DE DEU 2013 11.61150
## 10 Germany DE DEU 2012 11.62299
## 11 Germany DE DEU 2011 11.48139
## 12 Germany DE DEU 2010 11.19030
ggplot(ngr, aes(x= year, y= GC.TAX.TOTL.GD.ZS))+
geom_line()+
scale_x_continuous(breaks = seq(from= 2011, to=2021, by =1 ))+
labs (x= 'Năm', y='Tiền thu thuế', title ='Thu nhập thuế của Đức trong các năm 2010 đến 2021')
Ta thấy thu nhập thuế ở Đức có sự biến đổi qua từng năm. Khoản thu cao nhất là vài năm 2012 và thấp nhất là năm 2020, khi dịch bệnh đang diễn ra.
Indicator đề cập đến % dân số trên thế giới đã được sử dụng điện. Dữ liệu này được thu thập từ các cuộc khảo sát xã hội và các nguồn internet.
e <- WDI(country = 'VNM', indicator = 'EG.ELC.ACCS.ZS', start = 2011, end = 2021)
e
## country iso2c iso3c year EG.ELC.ACCS.ZS
## 1 Vietnam VN VNM 2021 100.00000
## 2 Vietnam VN VNM 2020 99.80000
## 3 Vietnam VN VNM 2019 99.40000
## 4 Vietnam VN VNM 2018 100.00000
## 5 Vietnam VN VNM 2017 100.00000
## 6 Vietnam VN VNM 2016 99.20000
## 7 Vietnam VN VNM 2015 99.25421
## 8 Vietnam VN VNM 2014 99.20000
## 9 Vietnam VN VNM 2013 98.52827
## 10 Vietnam VN VNM 2012 97.89000
## 11 Vietnam VN VNM 2011 99.00000
ggplot(e, aes(x= year, y = EG.ELC.ACCS.ZS))+
geom_line(color = 'darkred')+
geom_text(aes(label = substr(e$EG.ELC.ACCS.ZS,1,4)))+
scale_x_continuous(breaks = seq(from=2011, to = 2121, by=1))+
labs(x= 'Năm', y= 'Tỷ lệ dân số', title= 'Tỷ lệ dân số Việt Nam được sử dụng điện')
Nhìn vào đồ thị, ta thấy hầu hết dân số Việt Nam đều được sử dụng điện, tuy nhiên có sự thay đổi tỷ lệ. Năm 2012 là đạt tỷ lệ thấp nhất với 97.8%, có những năm toàn bộ dân số Việt Nam đều có điện để sử dụng như là 2017, 2018 và 2021.
Indicator này đề cập đến tỉ lệ thất nghiệp, lực lượng lao động không có việc làm nhưng vẫn đang tìm kiếm công việc.
ue <- WDI(country = 'VNM', indicator = 'SL.UEM.TOTL.ZS', start = 2012, end = 2022)
ue
## country iso2c iso3c year SL.UEM.TOTL.ZS
## 1 Vietnam VN VNM 2022 1.923
## 2 Vietnam VN VNM 2021 2.380
## 3 Vietnam VN VNM 2020 2.100
## 4 Vietnam VN VNM 2019 1.680
## 5 Vietnam VN VNM 2018 1.160
## 6 Vietnam VN VNM 2017 1.870
## 7 Vietnam VN VNM 2016 1.850
## 8 Vietnam VN VNM 2015 1.850
## 9 Vietnam VN VNM 2014 1.260
## 10 Vietnam VN VNM 2013 1.320
## 11 Vietnam VN VNM 2012 1.030
ggplot(ue, aes(x= year, y = SL.UEM.TOTL.ZS))+
geom_line(color = 'lightblue', linewidth = 1)+
geom_text(aes(label = substr(ue$SL.UEM.TOTL.ZS,1,4), vjust = -0.5))+
scale_x_continuous(breaks = seq(from = 2012, to = 2022, by =1))+
labs(x= 'Năm', y= 'Tỷ lệ thất nghiệp(%)', title = 'Tỷ lệ thất nghiệp ở Việt Nam từ 2012 đến 2022')
Dựa vào đồ thị, ta thấy tỷ lệ thất nghiệp ở Việt Nam 10 năm gần đây có sự biến động. Tỷ lệ thấp nhất là 1.03% vào năm 2012. Ta thấy từ năm 2018, tỷ lệ thất nghiệp đang tăng dần do dịch bệnh diễn ra làm nhiều người mất việc. Cao nhất là năm 2021 với 2.38%, đây là năm xảy dịch COVID-19 nặng và kéo dài lâu nhất. Tuy nhiên, năm 2022 thì tỷ lệ này đã được giảm xuống còn 1.92%, cho thấy số người thất nghiệp đang giảm dần do kiểm soát tốt tình hình dịch bệnh.
Ở phần này, ta sẽ tạo ra một function có thể lấy dữ liệu giá chứng khoán từ web investing.com.
get_data_stock <- function(stock){
library(rvest) #Package để scrape dữ liệu
library(tidyverse)
# Tạo đường link để lấy giá chứng khoán, đặt ,stock, để thay đổi thị trường tùy ý
ff <- paste0('https://www.investing.com/equities/',stock,'')
# Lấy dữ liệu
ff1 <- read_html(ff)
# Lấy dữ liệu dạng bảng
data <- ff1 %>% html_table (fill = TRUE)
data = data[[1]]
# Chọn 5 phân tử đầu trong dữ liệu
data1 <- head(data,5)
# In dữ liệu ra
print(data1)
# Vẽ đồ thị giá chứng khoán
return(ggplot(data1, aes(x= Name, y = Last))+
geom_col()+
geom_text(label = data1$Last, color = 'red', vjust=-0.3)+
labs(x= 'Tên', y = 'Giá'))}
Như vậy, sau khi đã tạo function xong thì ta chỉ cần gõ tên thị trường thì ta sẽ nhận được giá và đồ thị giá của các mã chứng khoán của nước đó.
get_data_stock(stock = 'germany')
## # A tibble: 5 × 10
## `` Name Last High Low Chg. `Chg. %` Vol. Time ``
## <lgl> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr> <lgl>
## 1 NA BASF 45.2 45.4 44.8 -0.14 -0.31% 903.03K 11:19:11 NA
## 2 NA Bayer 50.2 50.6 50.2 -0.09 -0.18% 524.54K 11:19:08 NA
## 3 NA Allianz 210. 211. 209. 0.03 +0.01% 365.67K 11:19:23 NA
## 4 NA Adidas 173. 174. 171. -0.66 -0.38% 174.03K 11:19:09 NA
## 5 NA Siemens AG 150. 150. 148. -0.61 -0.41% 382.08K 11:19:11 NA
get_data_stock(stock = 'vietnam')
## # A tibble: 5 × 10
## `` Name Last High Low Chg. `Chg. %` Vol. Time ``
## <lgl> <chr> <chr> <chr> <chr> <dbl> <chr> <chr> <chr> <lgl>
## 1 NA Bim Son Cement JSC 14,5… 14,7… 14,3… 0 0.00% 809.… 03:4… NA
## 2 NA Baoviet Securities C… 25,9… 26,6… 25,8… -100 -0.38% 405.… 03:4… NA
## 3 NA Alpha Seven JSC 5,80… 6,00… 5,60… 200 +3.57% 2.29M 03:4… NA
## 4 NA Doan Xa Port JSC 12,5… 12,7… 12,4… -100 -0.79% 100.… 03:4… NA
## 5 NA HUD - TASCO 20,6… 21,2… 20,4… 100 +0.49% 4.32M 03:4… NA
Gọi tập dữ liệu PhDPublications nằm trong package AER. Sau đó, gán toàn bộ tập dữ liệu này vào biến p.
library(AER)
data("PhDPublications")
p<-PhDPublications
Đặt tên cho các biến trong tập dữ liệu bằng hàm names()
a: articles (số bài báo cáo được đăng trong 3 năm gần đây)
g: gender (giới tính của nghiên cứu sinh)
ma: married (tình trạng hôn nhân của nghiên cứu sinh)
k: kids (số con dưới 6 tuổi của nghiên cứu sinh)
pr: prestige (chất lượng của chương trình đào tạo)
m: mentor (số bài báo cáo được đăng của người hướng dẫn nghiên cứu sinh)
names(p) <- c('a','g','ma','k','pr','m')
Nhìn tổng quan tập dữ liệu
summary(p)
## a g ma k pr
## Min. : 0.000 male :494 no :309 Min. :0.0000 Min. :0.755
## 1st Qu.: 0.000 female:421 yes:606 1st Qu.:0.0000 1st Qu.:2.260
## Median : 1.000 Median :0.0000 Median :3.150
## Mean : 1.693 Mean :0.4951 Mean :3.103
## 3rd Qu.: 2.000 3rd Qu.:1.0000 3rd Qu.:3.920
## Max. :19.000 Max. :3.0000 Max. :4.620
## m
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 6.000
## Mean : 8.767
## 3rd Qu.:12.000
## Max. :77.000
Nhìn những quan sát đầu của tập dữ liệu
head(p)
## a g ma k pr m
## 1 0 male yes 0 2.52 7
## 2 0 female no 0 2.05 6
## 3 0 female no 0 3.75 6
## 4 0 male yes 1 1.18 3
## 5 0 female no 0 3.75 26
## 6 0 female yes 2 3.59 2
Nhìn những quan sát cuối của tập dữ liệu
tail(p)
## a g ma k pr m
## 910 10 female yes 0 3.59 18
## 911 11 male yes 2 2.86 7
## 912 12 male yes 1 4.29 35
## 913 12 male yes 1 1.86 5
## 914 16 male yes 0 1.74 21
## 915 19 male yes 0 1.86 42
Nhìn tổng quan toàn bộ biến a bằng hàm summary().
summary(p$a)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 1.000 1.693 2.000 19.000
Từ kết quả, ta biết được:
Số bài báo cáo ít nhất là 0 bài, nhiều nhất là 19 bài.
Trung bình 1 nghiên cứu sinh làm được khoảng 2 bài báo cáo.
Trung vị là 1 cho biết có 50% số nghiên cứu sinh có số bài báo cáo ít hơn 1.
Tứ phân vị thứ nhất là 0 cho biết có 75% dữ liệu có số bài báo cáo nhiều hơn mức này.
Tứ phân vị thứ ba là 2 cho biết có 75% dữ liệu có số bài báo cáo thấp hơn mức này và 25% dữ liệu có số bài báo cáo cao hơn mức này.
Bên cạnh đó, nếu ta chỉ muốn biết một trong số giá trị thống kê thì ta có thể làm như sau
# Trung bình
mean(p$a)
## [1] 1.692896
# Trung vị
median(p$a)
## [1] 1
# Độ lệch chuẩn
sd(p$a)
## [1] 1.926069
# Phương sai
var(p$a)
## [1] 3.709742
Sử dụng hàm cut() để chia biến a thành 3 tổ có khoảng cách đều nhau. Sau đó dùng hàm table() để lập bảng tần số và prop.table() để lập bảng tần suất.
table(cut(p$a,3))
##
## (-0.019,6.33] (6.33,12.7] (12.7,19]
## 894 19 2
prop.table(table(cut(p$a,3)))
##
## (-0.019,6.33] (6.33,12.7] (12.7,19]
## 0.977049180 0.020765027 0.002185792
Từ kết quả ta thấy được tổ có dưới 6 bài báo cáo có số lượng người cao nhất với 894 người(chiếm 97.7%). Tổ có từ 6 đến dưới 13 bài báo cáo có 19 người (chiếm 2%). Tổ từ 13 đến 19 bài có số lượng nghiên cứu sinh ít nhất là 2 người (chiếm 0.3%).
p[p$a>5 & p$a <10,]
## a g ma k pr m
## 878 6 male yes 1 4.62 8
## 879 6 female yes 0 2.10 36
## 880 6 female yes 2 1.86 38
## 881 6 male yes 0 4.34 9
## 882 6 female yes 0 4.29 24
## 883 6 male yes 2 2.51 11
## 884 6 male yes 1 2.96 13
## 885 6 male no 0 4.29 18
## 886 6 male no 0 3.40 14
## 887 6 female no 0 4.54 12
## 888 6 male yes 1 3.85 16
## 889 6 female no 0 3.15 9
## 890 6 female no 0 4.54 15
## 891 6 male no 0 3.47 6
## 892 6 female yes 0 4.29 1
## 893 6 male no 0 1.97 4
## 894 6 female no 0 3.32 6
## 895 7 male yes 0 3.59 1
## 896 7 male no 0 2.54 6
## 897 7 male no 0 3.41 20
## 898 7 male yes 1 1.97 0
## 899 7 female no 0 3.15 9
## 900 7 male no 0 4.62 15
## 901 7 male no 0 4.54 42
## 902 7 male yes 0 3.69 9
## 903 7 male no 0 4.34 19
## 904 7 male no 0 4.29 19
## 905 7 male yes 1 3.59 27
## 906 7 male no 0 3.69 19
## 907 8 male yes 0 2.51 11
## 908 9 male yes 1 2.96 23
## 909 9 male yes 1 1.86 47
table(p$k)
##
## 0 1 2 3
## 599 195 105 16
prop.table(table(p$k))
##
## 0 1 2 3
## 0.65464481 0.21311475 0.11475410 0.01748634
Từ bảng tần số và tần suất, ta thấy số lượng nghiên cứu sinh không có con chiếm nhiều nhất với 599 người (chiếm 65%). Có 195 nghiên cứu sinh đã có 1 con (chiếm 21%) và 105 người đã có 2 con (chiếm 12%). Ít nhất là những nghiên cứu sinh đã có 3 con, chỉ có 16 người (chiếm 2%).
table(cut(p$a,3),p$k)
##
## 0 1 2 3
## (-0.019,6.33] 585 189 104 16
## (6.33,12.7] 12 6 1 0
## (12.7,19] 2 0 0 0
Ta thấy, số lượng nghiên cứu sinh không có con chiếm nhiều nhất (599 người), số lượng nghiên cứu sinh có 3 con chiếm ít nhất (16 người). Tổ có số lượng nhiều nhất là tổ những nghiên cứu sinh có dưới 6 bài báo cáo và không có con với 585 người.
Tuy nhiên, để có thể dễ dang quan sát và phân tích hơn thì ta có thể làm như sau:
library(tidyverse)
p <- p %>% mutate(k1 = case_when(p$k == '0'~'Không có con',
p$k == '1'~ 'Có con',
p$k == '2'~ 'Có con',
p$k == '3'~ 'Có con'))
Số 0 được xem như là không có bài báo cáo nào.
Khoảng từ 1 bài đến 6 bài được xem là ít.
Khoảng từ 6 đến 12 bài được xem là số lượng trung bình.
Khoảng từ 12 đến 29 bài được xem là nhiều.
p$a1 <- cut(p$a, breaks = c(-2,0,6,12,19), labels=c('không có bài nào','ít','trung bình','nhiều'))
table(p$a1,p$k1)
##
## Có con Không có con
## không có bài nào 101 174
## ít 208 411
## trung bình 7 12
## nhiều 0 2
prop.table(table(p$a1,p$k1))
##
## Có con Không có con
## không có bài nào 0.110382514 0.190163934
## ít 0.227322404 0.449180328
## trung bình 0.007650273 0.013114754
## nhiều 0.000000000 0.002185792
Đưa kết quả này vào ggplot để dễ quan sát hơn
p %>% ggplot(aes(x = a1, y = after_stat(count))) +
geom_bar(fill = 'pink') +
geom_text(aes(label = scales::percent(after_stat(count/sum(count)))) , stat = 'count' , color = 'blue', vjust = - .1) +
facet_grid(.~k1) +
labs(x = 'Số bài báo cáo' , y = 'Số nghiên cứu sinh')
Từ bảng tần số, tần suất và đồ thị, ta thấy số lượng nghiên cứu sinh không có con nhiều hơn những người có con. Những nghiên cứu sinh không có con có 599 người, trong khi những người có con chỉ có 316 người. Cụ thể, ở mức số bài báo cáo ít, thì có 208 nghiên cứu sinh đã có con (chiếm 22.73%), thấp hớn số lượng nghiên cứu sinh không có con (411 người, 44.92%), đây cũng là mức chiếm số lượng nhiều nhất. Ở mức có số lượng bài báo cáo trung bình, thì có 7 người đã có con (0.77%) và 12 người không có con(1.31%). Còn ở mức nhiều thì chỉ có 2 nghiên cứu sinh không có con (0.22%), những nghiên cứu sinh đã có con thì không có ai đạt ở mức này. Còn lại là nhóm không có bài báo cáo nào, thì có 101 người đã có con (11.04%) và 174 người không có con (chiếm 19.02%).
lm_result <- lm(formula = a~k,data = p)
summary(lm_result)
##
## Call:
## lm(formula = a ~ k, data = p)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.7493 -1.6354 -0.6354 0.4784 17.2507
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.74926 0.07582 23.070 <2e-16 ***
## k -0.11386 0.08325 -1.368 0.172
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.925 on 913 degrees of freedom
## Multiple R-squared: 0.002044, Adjusted R-squared: 0.0009513
## F-statistic: 1.87 on 1 and 913 DF, p-value: 0.1718
Từ kết quả hồi quy, ta thấy hệ số hồi quy âm cho biết 2 biến này có quan hệ nghịch. Như vậy, nghiên cứu sinh có càng nhiều con thì số lượng bài báo cáo họ làm được càng ít.
Đưa kết quả hồi quy vào ggplot
ggplot(p,aes(x= k, y=a))+
geom_point(color = 'lightblue')+
geom_smooth(formula=y~x, method = 'lm', na.rm =T)+
labs(x= 'Số con', y= 'Số bài báo cáo')
Từ đồ thị, ta thấy đường hồi quy là đường dốc xuống cho thấy số bài báo cáo mà nghiên cứu sinh làm được có mối quan hệ nghịch với số con mà họ có. Tuy nhiên, đường thẳng này khá thoải cho thấy 2 biến này có tương quan yếu. Như vậy, biến số bài báo cáo không chỉ bị ảnh hưởng bởi số con mà còn bị ảnh hưởng đến nhiều yếu tố khác.
table(p$g)
##
## male female
## 494 421
prop.table(table(p$g))
##
## male female
## 0.5398907 0.4601093
Theo kết quả, ta thấy số lượng nam nghiên cứu sinh nhiều hơn nữ nghiên cứu sinh tuy nhiên không có sự chênh lệch nhiều. Nam có 494 người (chiếm 54%) trong khi nữ có 421 người (chiếm 46%).
table(p$a1, p$g)
##
## male female
## không có bài nào 136 139
## ít 339 280
## trung bình 17 2
## nhiều 2 0
prop.table(table(p$a1, p$g))
##
## male female
## không có bài nào 0.148633880 0.151912568
## ít 0.370491803 0.306010929
## trung bình 0.018579235 0.002185792
## nhiều 0.002185792 0.000000000
Ta thấy số lượng nam nghiên cứu sinh ở các mức ít, trung bình, nhiều đều chiếm nhiều hơn nữ. Cụ thể, ở mức ít, nam có 339 người (chiếm 37%), nữ có 280 người (chiếm 30.6%). Ở mức số lượng trung bình, nam có 17 người còn nữ chỉ có 2 và ở mức nhiều thì nam chỉ có 2 người trong khi nữa không có người nữ nào. Tuy nhiên, ở những nghiên cứu sinh không có bài báo cáo nào thì nữ lại nhiều hơn nam cho thấy trung bình các nam nghiên cứu sinh làm được nhiều bài cáo hơn nữ.
nam5 <- p[p$g =='male' & p$a >= 5,]
data.frame(nam5)
## a g ma k pr m k1 a1
## 853 5 male yes 2 3.85 15 Có con ít
## 854 5 male yes 1 3.15 5 Có con ít
## 855 5 male yes 1 3.15 27 Có con ít
## 856 5 male yes 0 4.34 6 Không có con ít
## 857 5 male yes 0 4.25 12 Không có con ít
## 858 5 male no 0 3.36 11 Không có con ít
## 860 5 male yes 1 2.58 25 Có con ít
## 861 5 male yes 1 3.59 21 Có con ít
## 862 5 male yes 1 2.96 4 Có con ít
## 863 5 male yes 0 4.54 13 Không có con ít
## 864 5 male yes 0 4.29 30 Không có con ít
## 868 5 male yes 0 2.50 4 Không có con ít
## 869 5 male yes 1 3.47 0 Có con ít
## 872 5 male yes 1 4.54 53 Có con ít
## 873 5 male yes 0 1.25 2 Không có con ít
## 875 5 male yes 1 1.76 11 Có con ít
## 878 6 male yes 1 4.62 8 Có con ít
## 881 6 male yes 0 4.34 9 Không có con ít
## 883 6 male yes 2 2.51 11 Có con ít
## 884 6 male yes 1 2.96 13 Có con ít
## 885 6 male no 0 4.29 18 Không có con ít
## 886 6 male no 0 3.40 14 Không có con ít
## 888 6 male yes 1 3.85 16 Có con ít
## 891 6 male no 0 3.47 6 Không có con ít
## 893 6 male no 0 1.97 4 Không có con ít
## 895 7 male yes 0 3.59 1 Không có con trung bình
## 896 7 male no 0 2.54 6 Không có con trung bình
## 897 7 male no 0 3.41 20 Không có con trung bình
## 898 7 male yes 1 1.97 0 Có con trung bình
## 900 7 male no 0 4.62 15 Không có con trung bình
## 901 7 male no 0 4.54 42 Không có con trung bình
## 902 7 male yes 0 3.69 9 Không có con trung bình
## 903 7 male no 0 4.34 19 Không có con trung bình
## 904 7 male no 0 4.29 19 Không có con trung bình
## 905 7 male yes 1 3.59 27 Có con trung bình
## 906 7 male no 0 3.69 19 Không có con trung bình
## 907 8 male yes 0 2.51 11 Không có con trung bình
## 908 9 male yes 1 2.96 23 Có con trung bình
## 909 9 male yes 1 1.86 47 Có con trung bình
## 911 11 male yes 2 2.86 7 Có con trung bình
## 912 12 male yes 1 4.29 35 Có con trung bình
## 913 12 male yes 1 1.86 5 Có con trung bình
## 914 16 male yes 0 1.74 21 Không có con nhiều
## 915 19 male yes 0 1.86 42 Không có con nhiều
Ta thấy có 44 quan sát thỏa mãn điều kiện.
nu5 <- p[p$g=='female' & p$a >=5,]
data.frame(nu5)
## a g ma k pr m k1 a1
## 851 5 female yes 0 2.26 16 Không có con ít
## 852 5 female no 0 3.75 13 Không có con ít
## 859 5 female no 0 3.59 14 Không có con ít
## 865 5 female no 0 2.87 12 Không có con ít
## 866 5 female yes 0 4.54 15 Không có con ít
## 867 5 female yes 1 3.85 1 Có con ít
## 870 5 female yes 0 2.86 24 Không có con ít
## 871 5 female yes 0 4.62 0 Không có con ít
## 874 5 female yes 0 3.21 19 Không có con ít
## 876 5 female no 0 2.58 6 Không có con ít
## 877 5 female no 0 3.62 3 Không có con ít
## 879 6 female yes 0 2.10 36 Không có con ít
## 880 6 female yes 2 1.86 38 Có con ít
## 882 6 female yes 0 4.29 24 Không có con ít
## 887 6 female no 0 4.54 12 Không có con ít
## 889 6 female no 0 3.15 9 Không có con ít
## 890 6 female no 0 4.54 15 Không có con ít
## 892 6 female yes 0 4.29 1 Không có con ít
## 894 6 female no 0 3.32 6 Không có con ít
## 899 7 female no 0 3.15 9 Không có con trung bình
## 910 10 female yes 0 3.59 18 Không có con trung bình
Ta thấy có 21 quan sát thỏa điều kiện trên. Ở cùng mức số lượng từ 5 bài báo cáo trở lên thì nữ ít hơn nam 23 người.
Dùng hàm group_by để phân chia dữ liệu theo biến g và tính trung bình số bài báo cáo mà mỗi giới tính thực hiện được.
p1 <- group_by(p,g) %>% summarise(n=mean(a))
p1
## # A tibble: 2 × 2
## g n
## <fct> <dbl>
## 1 male 1.88
## 2 female 1.47
Đưa kết quả vào ggplot
p1 %>% ggplot(aes(x=g,y=n))+
geom_col(fill = 'lightgreen')+
geom_text(aes(label = round(n,3)))+
labs(x= 'Giới tính', y = 'Trung bình số bài báo cáo', title = 'Trung bình số bài báo cáo của nghiên cứu sinh theo giới tính')
Dựa vào kết quả, ta thấy trung bình nam nghiên cứu sinh làm nhiều hơn nữ. Những nam nghiên cứu sinh trung bình làm khoảng 2 bài báo cáo. Còn những nữ nghiên cứu sinh trung bình làm được 1 bài báo cáo.
Ở tuần 4 này, ta sử dụng lại bộ dữ liệu cũ ở tuần 1 là tập dữ liệu PhDPublications, nói về số bài báo cáo được đăng của các nghiên cứu sinh.
Dữ liệu gồm 915 quan sát và có 6 biến:
articles: số bài báo cáo được đăng trong 3 năm gần đây
gender: giới tính của nghiên cứu sinh
married: tình trạng hôn nhân của nghiên cứu sinh
kids: số con dưới 6 tuổi của nghiên cứu sinh
prestige: chất lượng của chương trình đào tạo
mentor: số bài báo cáo được đăng của người hướng dẫn nghiên cứu sinh
Đầu tiên, ta sẽ gọi các package cần dùng.
library(tidyverse)
library(ggplot2)
library(scales)
library(AER)
Chọn tập dữ liệu PhDPublications trong package AER và gán tập dữ liệu này vào biến p . Sau đó, đặt tên cho các biến trong tập dữ liệu bằng hàm names().
data(PhDPublications)
p <- PhDPublications
names(p) <- c('a','g','ma','k','pr','m')
Nhìn tổng quan tập dữ liệu
summary(p)
## a g ma k pr
## Min. : 0.000 male :494 no :309 Min. :0.0000 Min. :0.755
## 1st Qu.: 0.000 female:421 yes:606 1st Qu.:0.0000 1st Qu.:2.260
## Median : 1.000 Median :0.0000 Median :3.150
## Mean : 1.693 Mean :0.4951 Mean :3.103
## 3rd Qu.: 2.000 3rd Qu.:1.0000 3rd Qu.:3.920
## Max. :19.000 Max. :3.0000 Max. :4.620
## m
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 6.000
## Mean : 8.767
## 3rd Qu.:12.000
## Max. :77.000
ggplot(p,aes(x=pr, y=a)) +
geom_point(color= 'darkgreen')+
labs(x='Chất lượng đào tạo', y='Số bài báo cáo')
Dựa vào đồ thị, ta thấy đa phần chất lượng đào tạo của các nghiên cứu sinh nằm ở mức 1 và 2 tuy nhiên , nhiều nghiên cứu sinh nằm ở mức này có số bài báo cáo rất ít, thậm chí là không có bài nào được đăng . Trái lại , số lượng người có chất lượng đào tạo nằm ở mức 3 và 4 thì khá ít nhưng số bài báo cáo của họ nhiều hơn, có thể thấy từ mức 3 trở lên thì có khá ít người không có bài báo cáo nào được đăng và số người có hơn 5 bài báo cáo thì nhiều hơn.
Để đánh giá đúng hơn về sự tương quan giữa 2 biến này thì ta còn có thể phân biệt các nghiên cứu sinh theo giới tính bằng màu sắc.
ggplot(p, aes(x= pr,y=a, color = g))+
geom_point(na.rm =T)+
labs(x='Chất lượng đào tạo', y='Số bài báo cáo', color = ' Giới tính')
Ngoài phân biệt bằng màu sắc thì ta còn có thể phân biệt bằng hình dạng
ggplot(p, aes(x= pr,y=a))+
geom_point(aes(shape=g),size = 2.5, na.rm =T)+
labs(x='Chất lượng đào tạo', y='Số bài báo cáo', shape = ' Giới tính')
Nhìn vào 2 đồ thị trên, ta có thể thấy số lượng nghiên cứu sinh nam , nữ tuy có sự chênh lệch nhưng không nhiều lắm nhưng có thể thấy những người có số bài báo cáo nhiều hơn 5 bài thì đa số là nam.
Ta muốn lọc những người có chất lượng đào tạo trên 3.5 thì có thể sử dụng hàm filter để làm nổi bật những quan sát đó.
ggplot(p,aes(x= pr,y = a, shape = g))+
geom_point(color = 'pink' , size = 2.5, na.rm = T)+
geom_point(data = p %>% filter(pr >'3.5'), color = 'black', size = 2.5) +
labs(x = 'Chất lượng đào tạo' , y = 'Số bài báo cáo', shape = 'Giới tính')
Sử dụng hàm lm() để thực hiện hồi quy tuyến tính và đánh giá mối quan hệ giữa biến a (số bài báo cáo) và biến giải thích pr (chất lượng đào tạo).
Sau đó tóm tắt kết quả của mô hình bằng hàm summary() để xem các hệ số (ước tính), P-value, phần dư và các đo lường khác.
lm_result <- lm(a~pr, data = p)
summary(lm_result)
##
## Call:
## lm(formula = a ~ pr, data = p)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.9106 -1.5489 -0.5561 0.5042 17.4855
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.24755 0.21026 5.933 4.21e-09 ***
## pr 0.14352 0.06459 2.222 0.0265 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.922 on 913 degrees of freedom
## Multiple R-squared: 0.005379, Adjusted R-squared: 0.004289
## F-statistic: 4.937 on 1 and 913 DF, p-value: 0.02653
Sau đó ta đưa kết quả hồi quy này vào ggplot để có thể quan sát dễ hơn.
ggplot(p, aes(x= pr, y=a)) +
geom_point(na.rm =T)+
geom_smooth(formula = y ~ x, method = 'lm', na.rm = T)+
labs(x = 'Chất lượng đào tạo', y='Số bài báo cáo')
Nhìn vào kết quả, ta thấy đường hồi quy là đường dốc lên cho thấy chất lượng đào tạo có mối quan hệ thuận với số bài báo cáo của các nghiên cứu sinh. Tuy nhiên, đường thẳng này khá thoải cho thấy 2 biến này có tương quan yếu, cụ thể khi chất lượng đào tạo tăng 1 bậc thì số bài báo cáo mà các nghiên cứu sinh làm thêm được chỉ tăng 0,14 bài . Như vậy , biến số bài báo cáo không chỉ bị ảnh hưởng bởi chất lượng đào tạo mà còn bị ảnh hưởng bởi nhiều yếu tố khác.
Ta còn có thể vẽ nhiều đường hồi quy tương ứng với từng giới tính.
ggplot(p, aes(x= pr, y=a, color =g)) +
geom_point(na.rm =T)+
geom_smooth(aes(color = g), formula = y ~ x, method = 'lm', na.rm = T)
# Dùng facet_grid() để phân chia thành 2 đồ thị tương ứng với giới tính nam và nữ để dễ quan sát.
ggplot(p, aes(x= pr, y=a, color =g)) +
geom_point(na.rm =T)+
geom_smooth(aes(color = g), formula = y ~ x, method = 'lm', na.rm = T)+
facet_grid(.~g)+
labs(x= 'Chất lượng đào tạo', y='Số bài báo cáo', color ='giới tính')
Cả 2 đường hồi quy ở 2 đồ thị đều rất thoải cho thấy sự tương quan yếu của 2 biến chất lượng đào tạo và số bài báo cáo.
ggplot(p, aes(x= a))+
geom_bar(fill= 'pink')+
labs(title = 'Số bài báo cáo của nghiên cứu sinh', x='Số bài báo cáo', y = 'Số người')
Để quan sát rõ hơn , ta còn có thể điều chỉnh các giá trị hiển thị trong cột x theo ý mình bằng lệnh scale_x_continuous . Ta sử dụng breaks() với ‘from’ là số bắt đầu , ‘to’ là số kết thúc , ‘by’ là khoảng cách để ngắt các khoảng giá trị trong cột này.
summary(p$a)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 1.000 1.693 2.000 19.000
Ta quan sát thấy số lượng bài báo cáo ít nhất là 0 bài, nhiều nhất là 19 bài nên số bắt đầu sẽ là 0, số kết thúc là 19 và khoảng cách là 1 để tất cả các giá trị trong khoảng này đều hiển thị trên cột x.
ggplot(p, aes(x= a))+
geom_bar(fill= 'pink')+
labs(title = 'Số bài báo cáo của nghiên cứu sinh', x='Số bài báo cáo', y = 'Số nghiên cứu sinh')+
scale_x_continuous(breaks = seq(from = 0, to = 19 , by = 1))
Từ biểu đồ, ta thấy số lượng nghiên cứu sinh không có bài báo cáo nào chiếm nhiều nhất và chiếm ít nhất là 19 bài . Vậy biến số bài báo cáo và biến số nghiên cứu sinh có mối quan hệ nghịch, khi số bài báo cáo càng tăng thì số lượng người càng giảm.
Để có cái nhìn tổng quan hơn về số lượng bài báo cáo của các nghiên cứu sinh, ta có thể chia nó thành 3 tổ khác nhau và tạo thành một cột mới tên a1:
Tổ có số bài báo cáo từ 1 đến 6 bài , được xem là ‘ít’.
Tổ có số bài báo cáo từ 6 đến 12 bài , được xem là ‘trung bình’.
Tổ có số bài báo cáo từ 12 đến 19 bài , được xem là ‘nhiều’.
p$a1 <- cut(p$a, breaks = c(0,6,12,19), labels = c('ít', 'trung bình', 'nhiều'))
Tiếp theo, ta vẽ biểu đồ với cột a1 mới vừa tạo.
ggplot(p, aes(x= a1))+
geom_bar(fill= 'pink')+
labs(title = 'Số bài báo cáo của nghiên cứu sinh', x='Số bài báo cáo', y = 'Số nghiên cứu sinh') +
scale_y_continuous(breaks = seq(from = 0, to = 600, by= 100))
Dựa vào biểu đồ , ta thấy số lượng nghiên cứu sinh có ít bài báo cáo
chiếm nhiều nhất (hơn 600 người) và có độ lệch rất lớn so với 3 mức còn
lại . Những nghiên cứu sinh có số lượng bài báo cáo trung bình chiếm khá
ít và ở mức nhiều là rất ít . Nhóm không có bài báo cáo nào được đăng
chiếm khá nhiều(gần 300 người).
Bên cạnh việc trình bày bằng số đếm thì ta còn có thể trình bày bằng tỷ lệ %.
Đầu tiên , ta chia tập dữ liệu p theo cột a1 (cột phân chia số bài báo cáo ra các mức : ít , trung bình , nhiều , không có bài nào) bằng hàm group_by() và sử dụng summarise() để đếm số lần xuất hiện của từng mức.
Sau đó , ta tạo một cột mới tên pera chứa các giá trị là tần suất của các mức đó.
Cuối cùng , ta sử dụng ggplot() để vẽ biểu đồ thể hiện số bài báo cáo các nghiên cứu sinh theo tỷ lệ %.
p %>% group_by(a1) %>%
summarise (n = n()) %>%
mutate(pera = percent(n/sum(n), accuracy = ,01)) %>%
ggplot(aes(x= a1, y= pera))+
geom_col(fill = 'pink')+
labs(title = 'Tỷ lệ số bài báo cáo của nghiên cứu sinh', x='Số bài báo cáo', y = 'Số nghiên cứu sinh theo tỷ lệ')
Để có thể biết chính xác giá trị tỷ lệ % của mỗi mức là bao nhiêu , ta sẽ cho hiển thị giá trị % chính xác của mỗi mức trên đỉnh cột bằng geom_text.
p %>% ggplot(aes(x = a1, y = after_stat(count))) +
geom_bar(fill = 'pink') +
geom_text(aes(label = scales::percent(after_stat(count/sum(count)))),stat = 'count' , color = 'blue', vjust = -.1)+
labs(x = 'Số bài báo cáo', y = 'Số nghiên cứu sinh theo tỷ lệ', )
Dựa vào kết quả biểu đồ, ta biết được số lượng nghiên cứu sinh có ít bài báo cáo chiếm nhiều nhất với hơn 600 người (67,7%) . Các nghiên cứu sinh có số lượng bài báo cáo ở mức trung bình chiếm 2.1% . Chiếm ít nhất là các nghiên cứu sinh có nhiều bài báo cáo với 0,2% và số lượng nghiên cứu sinh không có bài báo cáo nào được đăng cũng chiếm một phần khá nhiều với 30.1%.
Bên cạnh việc đếm số người và tính tỷ lệ % theo số lượng bài báo cáo , ta còn có thể phân chia đồ thị theo nhiều biến khác để phân tích . Ở đây , ta sẽ phân chia đồ thị theo biến g (giới tính).
p %>% ggplot(aes(x = a1 )) +
geom_bar(fill = 'pink')+
geom_text(aes(label = after_stat(count)) , stat = 'count' , color = 'blue' , vjust = -.1) +
facet_grid(.~g) +
labs(x= 'Số bài báo cáo', y = 'Số nghiên cứu sinh')
p %>% ggplot(aes(x = a1, y = after_stat(count))) +
geom_bar(fill = 'pink') +
geom_text(aes(label = scales::percent(after_stat(count/sum(count)))) , stat = 'count' , color = 'blue', vjust = - .1) +
facet_grid(.~g) +
labs(x = 'Số bài báo cáo' , y = 'Số nghiên cứu sinh theo tỷ lệ')
Kết hợp quan sát hai đồ thị , ta thấy ở ba mức ít , trung bình , nhiều thì số lượng nam nghiên cứu sinh đều nhiều hơn nữ . Cụ thể:
Có 339 nam nghiên cứu sinh có số bài báo cáo đạt mức ít (chiếm 37.05%) , cao hơn nữ rất nhiều (280 người , chiếm 30.6%).
Ở mức trung bình , nam có 17 người (chiếm 1.86%) , nữ chỉ có 2 người (chiếm 0.22%).
Ở mức nhiều , nam có 2 người (chiếm 0.22%) trong khi nữ không có người nào đạt mức có nhiều bài báo cáo.
Tuy nhiên , về số lượng nghiên cứu sinh không có bài báo cáo nào thì nam lại ít hơn nữ nhưng cách biệt này lại không quá lớn . Nam có 136 người không có bài báo cáo nào (chiếm 14.86%) , nữ có 139 người không có bài bài cáo nào (chiếm 15.19%).
Ngoài việc đếm số lượng nghiên cứu sinh có bao nhiêu bài báo cáo thì ta còn có thể tính trung bình số bài báo cáo.
p %>% group_by(a1) %>%
summarise(n = mean(a)) %>%
ggplot(aes(x = a1, y = n)) +
geom_col(fill = 'pink')+
geom_text(aes(label = round(n,3)), vjust = .05 , color ='blue', size = 4) +
labs(x= 'Số bài báo cáo',y='Số bài báo cáo trung bình')
Ở mức ít thì các nghiên cứu sinh trung bình làm 2 bài báo cáo, ở mức trung bình thì trung bình các nghiên cứu sinh làm được 8 bài báo cáo còn ở mức nhiều thì trung bình các nghiên cứu sinh làm được khoảng 18 bài báo cáo.
Đầu tiên , ta gán bảng tần số của biến ma (tình trạng hôn nhân của các nghiên cứu sinh) vào ma1.
Sau đó, ta sử dụng hàm pie() để vẽ đồ thị tròn với ma1.
Tiếp theo , ta có thể tạo bảng chú thích với màu tương ứng trên đồ thị bằng legend().
ma1 <- table(p$ma)
pie(ma1, labels = table(p$ma), main = 'Tình trạng hôn nhân của nghiên cứu sinh', col = rainbow(length(ma1)))
legend('topright', c('không kết hôn','đã kết hôn'), cex = 1 , fill = rainbow(length(ma1)))
pie(ma1, labels = prop.table(ma1)*100, main = 'Tình trạng hôn nhân của nghiên cứu sinh theo tỷ lệ %', col = rainbow(length(ma1)))
legend ('bottomright' , c('không kết hôn','đã kết hôn'), cex = 1 , fill = rainbow(length(ma1)))
Dựa vào kết quả 2 đồ thị , ta thấy số lượng nghiên cứu sinh đã kết hôn nhiều hơn những nghiên cứu sinh không kết hôn rất nhiều , gần như là gấp đôi . Có tới 606 người đã kết hôn (chiếm khoảng 66%) trong khi chỉ có 309 người không kết hôn (chiếm 34%).
Ở tuần 3, ta sử dựng một tập dữ liệu mới tên NaturalGas trong package AER.
Tập dữ liệu Natural Gas (khí gas) được lấy từ 6 tiểu bang của Hoa Kỳ trong giai đoạn 1967 – 1989.
Dữ liệu có 10 biến:
state : tên viết tắt của tiểu bang
statecode : mã số của tiểu bang (NY:35, FL:10, MI:23, TX:44, UT:45, CA:5)
year : năm thu thập dữ liệu
consumption : lượng tiêu thụ khí gas
price : giá khí gas
eprice : giá điện
oprice : giá của dầu nhiên liệu chưng cất
lprice : giá của khí dầu mỏ hóa lỏng
heating : nhiệt độ
income : thu nhập bình quân đầu người
Đầu tiên , ta gọi package AER xuất hiện bằng hàm library() và chọn tập dữ liệu NaturalGas nằm trong package này.
Tiếp theo , ta gán toàn bộ tập dữ liệu này vào biến n và xem tổng quan tập dữ liệu bằng hàm summary().
library(AER)
data('NaturalGas')
n <- NaturalGas
summary(n)
## state statecode year consumption price
## CA:23 5 :23 1967 : 6 Min. : 9430 Min. :0.680
## FL:23 10:23 1968 : 6 1st Qu.: 49104 1st Qu.:1.380
## MI:23 23:23 1969 : 6 Median :300836 Median :2.775
## NY:23 35:23 1970 : 6 Mean :252902 Mean :3.422
## TX:23 44:23 1971 : 6 3rd Qu.:346429 3rd Qu.:5.310
## UT:23 45:23 1972 : 6 Max. :637289 Max. :8.060
## (Other):102
## eprice oprice lprice heating
## Min. : 1.980 Min. : 5.01 Min. :0.680 Min. : 481
## 1st Qu.: 2.433 1st Qu.: 8.24 1st Qu.:1.258 1st Qu.:2082
## Median : 4.520 Median :19.86 Median :2.615 Median :4272
## Mean : 5.054 Mean :24.64 Mean :3.208 Mean :4155
## 3rd Qu.: 7.282 3rd Qu.:40.10 3rd Qu.:5.192 3rd Qu.:6498
## Max. :10.860 Max. :51.73 Max. :7.870 Max. :7440
##
## income
## Min. : 7465
## 1st Qu.: 9637
## Median :11367
## Mean :11193
## 3rd Qu.:12125
## Max. :16425
##
Để hiểu rõ dạng dữ liệu hơn , ta dùng hàm head() và tail() để nhìn 6 dòng đầu và 6 dong cuối của tập dữ liệu.
head(n)
## state statecode year consumption price eprice oprice lprice heating income
## 1 NY 35 1967 313656 1.42 2.98 7.40 1.47 6262 10903.75
## 2 NY 35 1968 319282 1.38 2.91 7.77 1.42 6125 11370.02
## 3 NY 35 1969 331326 1.37 2.84 7.96 1.38 6040 11578.68
## 4 NY 35 1970 346533 1.40 2.87 8.33 1.37 6085 11586.77
## 5 NY 35 1971 352085 1.50 3.07 8.80 1.40 5907 11657.42
## 6 NY 35 1972 363412 1.62 3.26 8.85 1.50 6248 11860.80
tail(n)
## state statecode year consumption price eprice oprice lprice heating
## 133 CA 5 1984 472151 5.84 7.10 44.68 5.41 2486
## 134 CA 5 1985 527495 5.72 7.78 30.58 5.84 2694
## 135 CA 5 1986 464307 5.14 7.95 44.15 5.72 2192
## 136 CA 5 1987 503473 5.26 8.03 35.24 5.14 2502
## 137 CA 5 1988 497138 5.64 8.69 34.02 5.26 2366
## 138 CA 5 1989 514276 5.59 9.45 44.44 5.64 2420
## income
## 133 13953.85
## 134 14368.46
## 135 14580.77
## 136 14915.05
## 137 15340.38
## 138 15532.93
Trong tập dữ liệu n , ta có thể thấy rằng mỗi hàng cho thấy những thông tin liên quan đến khí gas của 1 tiểu bang trong 1 năm nào đó , những thông tin này được lưu trữ ở định dạng ngang.
Tuy nhiên, dữ liệu ngang như vậy chưa thực sự “gọn gàng” . Ta thấy trong tập dữ liệu , các cột ‘eprice’ , ‘oprice’ , ‘lprice’ , ‘heating’ , ‘income’ đều là yếu tố làm ảnh hưởng đến giá khí đốt , nên ta có thể thu gọn dữ liệu bằng cách làm cho các yếu tố này được lưu trữ ở định dạng dọc , có nghĩa là làm cho tập dữ liệu “dài” hơn.
Ta dùng hàm pivot_longer() trong package tidyverse để làm “dài” dữ liệu , tăng số lượng hàng và giảm số lượng cột.
Đầu tiên , ta gọi package tidyverse xuất hiện.
Tiếp theo , sử dụng hàm pivot_longer() để gom các cột đã nêu ở trên (tương ứng với các cột có thứ tự từ 6 đến 10) thành 2 cột mới . Một cột có tên là ‘factors’ , chứa tên các yếu tố làm ảnh hưởng đến giá khí đốt (tên các cột cũ) và một cột tên ‘facprice’ , chứa các giá trị tương ứng.
Sau đó , gán tập dữ liệu mới vào n1.
library(tidyverse)
n1 <- n %>% pivot_longer(cols = c(6:10), names_to = 'factors', values_to = 'facprice')
n1
## # A tibble: 690 × 7
## state statecode year consumption price factors facprice
## <fct> <fct> <fct> <int> <dbl> <chr> <dbl>
## 1 NY 35 1967 313656 1.42 eprice 2.98
## 2 NY 35 1967 313656 1.42 oprice 7.4
## 3 NY 35 1967 313656 1.42 lprice 1.47
## 4 NY 35 1967 313656 1.42 heating 6262
## 5 NY 35 1967 313656 1.42 income 10904.
## 6 NY 35 1968 319282 1.38 eprice 2.91
## 7 NY 35 1968 319282 1.38 oprice 7.77
## 8 NY 35 1968 319282 1.38 lprice 1.42
## 9 NY 35 1968 319282 1.38 heating 6125
## 10 NY 35 1968 319282 1.38 income 11370.
## # ℹ 680 more rows
Sau khi thực hiện xong , ta thấy tập dữ liệu đã “dài” hơn . Tập dữ liệu n có 138 hàng và 10 cột trong khi tập dữ liệu n1 có 690 hàng và 7 cột . Như vậy , tập dữ liệu mới đã “gọn” hơn và dễ quan sát hơn.
Trong một số trường hợp , ta muốn chuyển đổi bộ dữ liệu sang định dạng ngang thì ta có thể sử dụng hàm pivot_wider() , tăng số lượng cột và giảm số lượng dòng.
Lấy lại tập dữ liệu n, ta định dạng lại dữ liệu lượng tiêu thụ khí gas của mỗi ban trong các năm khảo sát từ dọc sang ngang để có thể dễ quan sát hơn.
Đầu tiên , ta dùng lệnh select() để lấy ra 3 biến tương ứng : year (năm) , state (ban) , consumption (lượng tiêu thụ khí gas).
Sau đó , sử dụng hàm pivot_wider để tạo các cột mới có tên lấy từ các quan sát trong cột ‘year’ , hàng lấy từ cột ‘state’ và lấy các giá trị từ cột ‘consumption’ để điền.
n2 <- n %>% select(year, state,consumption) %>% pivot_wider(names_from = year, id_cols = state, values_from = consumption)
n2
## # A tibble: 6 × 24
## state `1967` `1968` `1969` `1970` `1971` `1972` `1973` `1974` `1975` `1976`
## <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 NY 313656 319282 331326 346533 352085 363412 342608 341032 327384 339949
## 2 FL 9430 11318 11636 14702 13242 12837 16295 14793 15209 16839
## 3 MI 302472 315694 333264 340033 343773 355266 341607 346116 334866 339417
## 4 TX 201407 211763 220728 232189 237387 240662 241478 222603 232320 235637
## 5 UT 38935 40779 43948 44637 49849 48855 48647 50347 59736 66417
## 6 CA 522122 517636 562127 552544 630998 637289 615719 580009 631398 599631
## # ℹ 13 more variables: `1977` <int>, `1978` <int>, `1979` <int>, `1980` <int>,
## # `1981` <int>, `1982` <int>, `1983` <int>, `1984` <int>, `1985` <int>,
## # `1986` <int>, `1987` <int>, `1988` <int>, `1989` <int>
So với tập dữ liệu gốc, có 138 hàng và 3 cột (khi chỉ xét 3 biến ‘year’ , ‘state’ , ‘consumption’) thì ta thấy tập dữ liệu mới n2 đã rộng hơn , có 6 hàng và 24 cột.
Trung bình lượng tiêu thụ khí gas của các ban là 252902.
Lượng tiêu thụ thấp nhất là 9430 và lượng tiêu thụ cao nhất là 637289.
Ở mức tiêu thụ 49104 thì có 25% dữ liệu có lượng tiêu thụ thấp hơn mức này.
Ở mức tiêu thụ 300836 thì có 50% dữ liệu có lượng tiêu thụ thấp hơn và 50% dữ liệu cao hơn mức này.
Ở mức tiêu thụ 346429 thì có 75% dữ liệu có lượng tiêu thụ thấp hơn mức này.
summary(n$consumption)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9430 49104 300836 252902 346429 637289
n22 <- n
Khoảng từ 9429 đến 66417 sẽ có tên là ‘thap’ , được xem mức tiêu thụ thấp.
Khoảng từ 66417 đến 338996 tên là ‘trungbinh’, được xem như mức tiêu thụ trung bình.
Và khoảng từ 338996 đến 637290 đặt tên là ‘cao’ , được xem như mức tiêu thụ cao.
n22$consump <- cut(n$consumption, breaks = c(9429, 66417, 338996, 637290), labels = c('thap', 'trungbinh', 'cao'))
table(n22$consump)
##
## thap trungbinh cao
## 46 46 46
Kết quả từ bảng tần số cho thấy số lần xuất hiện của ba tổ đều bằng nhau là 46. Như vậy mỗi tổ chiếm 33,3%.
Nếu lượng tiêu thụ thấp thì hiển thị số 0.
Nếu lượng tiêu thụ trung bình thì hiển thị số 1.
Nếu lượng tiêu thụ cao thì hiển thị số 2.
n22<-n22 %>% mutate(con=case_when(n22$consump== 'thap'~0,
n22$consump== 'trungbinh'~1,
n22$consump== 'cao'~2))
head(n22)
## state statecode year consumption price eprice oprice lprice heating income
## 1 NY 35 1967 313656 1.42 2.98 7.40 1.47 6262 10903.75
## 2 NY 35 1968 319282 1.38 2.91 7.77 1.42 6125 11370.02
## 3 NY 35 1969 331326 1.37 2.84 7.96 1.38 6040 11578.68
## 4 NY 35 1970 346533 1.40 2.87 8.33 1.37 6085 11586.77
## 5 NY 35 1971 352085 1.50 3.07 8.80 1.40 5907 11657.42
## 6 NY 35 1972 363412 1.62 3.26 8.85 1.50 6248 11860.80
## consump con
## 1 trungbinh 1
## 2 trungbinh 1
## 3 trungbinh 1
## 4 cao 2
## 5 cao 2
## 6 cao 2
Tương tự như ở trên, từ tập dữ liệu n22 , ta chọn ra ba cột là ‘con’ , ‘state’ , ‘year’ và dùng hàm pivot_wider() để hoàn thiện tập dữ liệu con_wide.
con_wide <- n22 %>% select(con,state,year) %>% pivot_wider(names_from = year, id_cols = state, values_from = con)
con_wide
## # A tibble: 6 × 24
## state `1967` `1968` `1969` `1970` `1971` `1972` `1973` `1974` `1975` `1976`
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NY 1 1 1 2 2 2 2 2 1 2
## 2 FL 0 0 0 0 0 0 0 0 0 0
## 3 MI 1 1 1 2 2 2 2 2 1 2
## 4 TX 1 1 1 1 1 1 1 1 1 1
## 5 UT 0 0 0 0 0 0 0 0 0 0
## 6 CA 2 2 2 2 2 2 2 2 2 2
## # ℹ 13 more variables: `1977` <dbl>, `1978` <dbl>, `1979` <dbl>, `1980` <dbl>,
## # `1981` <dbl>, `1982` <dbl>, `1983` <dbl>, `1984` <dbl>, `1985` <dbl>,
## # `1986` <dbl>, `1987` <dbl>, `1988` <dbl>, `1989` <dbl>
Tiếp theo, khi muốn lấy một vài kí tự trong chuỗi các kí tự, ta có thể dùng hàm str_extract() . Sử dụng lại tập dữ liệu n1 , Ở cột ‘factors’ , ta chỉ lấy kí tự 1 và 2 của các phần tử trong cột đó.
Bên cạnh đó , ta cũng có thể sử dụng hàm substr() để làm việc tương tự . Các phần tử trong cột ‘year’ đều có 2 kí tự đầu giống nhau là ‘19’ nên ta chỉ cho xuất hiện kí tự thứ 3 , 4 để quan sát dễ hơn.
n11 <- n1 %>% mutate(factors = str_extract(n1$factors, '[a-z]{1,2}'))
n11$year <- substr(n11$year, 3,4)
n11
## # A tibble: 690 × 7
## state statecode year consumption price factors facprice
## <fct> <fct> <chr> <int> <dbl> <chr> <dbl>
## 1 NY 35 67 313656 1.42 ep 2.98
## 2 NY 35 67 313656 1.42 op 7.4
## 3 NY 35 67 313656 1.42 lp 1.47
## 4 NY 35 67 313656 1.42 he 6262
## 5 NY 35 67 313656 1.42 in 10904.
## 6 NY 35 68 319282 1.38 ep 2.91
## 7 NY 35 68 319282 1.38 op 7.77
## 8 NY 35 68 319282 1.38 lp 1.42
## 9 NY 35 68 319282 1.38 he 6125
## 10 NY 35 68 319282 1.38 in 11370.
## # ℹ 680 more rows
library(ggplot2)
ggplot(data = n11) +
geom_col(mapping = aes(x= year, y = price,fill = state))
Đồ thị cho thấy giá khí gas ở tất cả các ban tăng đều theo từng năm, trong đó tăng mạnh nhất là ban CA (California), tăng ít nhất là ban UT.
ggplot(data = n11)+
geom_line(mapping =aes(x = year, y = consumption, color = state, group = state))
Đồ thị cho thấy ở tất cả các năm lượng tiêu thụ của ban CA đều cao nhất và cao hơn hẳn các ban khác, trong đó ban FL có lượng tiêu thụ khí gas thấp nhất.
Gọi dữ liệu PhDPublications từ package AER
Sau đó sẽ gán dữ liệu vào p
Tiếp theo là đặt tên cho các biến tương ứng
a: articles
g: gender
ma: married
k: kids
pr: prestige
m: mentor
library(AER)
data('PhDPublications')
p <- PhDPublications
names(p) <- c('a','g','ma','k','pr','m')
Lọc lấy dữ liệu những ngiên cứu sinh đã kết hôn rồi
Ta thấy kết quả có 606 người nghiên cứu sinh đã kết hôn (66%)
yes <- p[p$ma== 'yes',]
yes
## a g ma k pr m
## 1 0 male yes 0 2.520 7
## 4 0 male yes 1 1.180 3
## 6 0 female yes 2 3.590 2
## 8 0 male yes 2 2.960 4
## 10 0 female yes 0 1.250 0
## 13 0 female yes 1 3.690 3
## 14 0 female yes 0 3.400 4
## 15 0 female yes 0 1.790 0
## 17 0 female yes 0 2.000 7
## 18 0 male yes 2 4.290 13
## 21 0 female yes 0 2.260 6
## 22 0 male yes 3 2.960 3
## 23 0 male yes 1 4.290 5
## 24 0 male yes 1 2.860 4
## 25 0 male yes 3 2.760 1
## 26 0 female yes 0 1.520 3
## 27 0 female yes 1 3.540 8
## 28 0 male yes 1 4.290 3
## 30 0 male yes 0 2.320 3
## 32 0 male yes 0 4.290 8
## 35 0 male yes 1 1.520 0
## 39 0 male yes 1 1.220 2
## 40 0 female yes 0 3.750 5
## 42 0 female yes 1 2.860 3
## 44 0 female yes 1 3.360 3
## 46 0 male yes 1 1.180 0
## 47 0 male yes 0 2.500 1
## 48 0 male yes 0 3.360 25
## 50 0 female yes 0 3.920 8
## 52 0 female yes 2 1.970 0
## 53 0 male yes 2 2.960 12
## 54 0 male yes 0 4.290 8
## 55 0 male yes 1 2.260 2
## 58 0 male yes 1 3.150 1
## 59 0 male yes 1 3.920 1
## 62 0 male yes 1 2.100 0
## 64 0 female yes 0 3.540 2
## 65 0 female yes 0 2.540 1
## 66 0 male yes 1 2.760 3
## 67 0 male yes 0 4.540 10
## 68 0 male yes 0 1.680 6
## 69 0 male yes 1 2.200 0
## 72 0 female yes 2 2.580 0
## 73 0 female yes 0 1.790 1
## 75 0 female yes 0 1.280 4
## 76 0 male yes 2 2.580 5
## 77 0 male yes 2 2.120 0
## 78 0 male yes 1 2.210 1
## 79 0 male yes 1 2.260 5
## 82 0 female yes 1 3.540 1
## 83 0 male yes 1 3.400 18
## 84 0 male yes 0 2.210 6
## 85 0 male yes 0 2.210 19
## 86 0 male yes 2 0.920 1
## 88 0 male yes 2 3.150 6
## 89 0 male yes 0 4.290 19
## 90 0 male yes 1 2.510 8
## 91 0 male yes 1 4.290 1
## 92 0 female yes 0 2.760 0
## 93 0 male yes 0 1.420 3
## 94 0 male yes 0 2.210 19
## 96 0 male yes 0 1.520 7
## 99 0 female yes 2 3.750 4
## 100 0 male yes 0 4.290 8
## 102 0 male yes 1 2.100 0
## 103 0 male yes 2 1.400 7
## 104 0 female yes 0 3.190 4
## 105 0 male yes 2 1.810 1
## 106 0 male yes 1 3.150 2
## 107 0 female yes 0 3.750 7
## 109 0 male yes 3 2.210 3
## 110 0 female yes 2 3.360 2
## 111 0 female yes 0 3.470 11
## 113 0 female yes 1 3.360 2
## 114 0 male yes 0 2.540 5
## 115 0 male yes 2 2.150 4
## 116 0 male yes 1 4.540 3
## 117 0 male yes 0 1.680 4
## 118 0 female yes 1 2.550 0
## 120 0 male yes 1 3.470 2
## 121 0 female yes 0 3.470 1
## 123 0 male yes 1 2.120 10
## 126 0 male yes 1 2.860 13
## 127 0 female yes 1 4.290 9
## 128 0 male yes 0 3.210 2
## 130 0 female yes 0 1.810 5
## 132 0 male yes 1 3.360 23
## 133 0 female yes 0 4.540 4
## 134 0 female yes 1 4.290 4
## 136 0 male yes 2 4.620 30
## 137 0 female yes 1 3.590 14
## 139 0 male yes 3 2.860 1
## 141 0 female yes 1 2.500 0
## 142 0 female yes 0 4.620 0
## 144 0 female yes 1 3.360 3
## 146 0 female yes 2 3.410 5
## 147 0 male yes 0 2.100 0
## 149 0 male yes 0 3.360 2
## 150 0 male yes 3 3.590 7
## 152 0 female yes 0 3.590 12
## 154 0 male yes 3 4.540 11
## 156 0 male yes 1 2.210 5
## 157 0 male yes 2 3.690 5
## 158 0 female yes 0 1.780 1
## 160 0 male yes 0 2.860 8
## 161 0 female yes 0 2.580 3
## 163 0 female yes 1 1.220 11
## 168 0 female yes 0 1.860 6
## 169 0 male yes 0 2.960 0
## 170 0 female yes 0 3.690 7
## 171 0 female yes 0 3.690 2
## 172 0 female yes 0 4.290 1
## 175 0 male yes 2 2.320 2
## 179 0 female yes 2 4.540 6
## 180 0 male yes 1 2.100 0
## 181 0 female yes 1 2.540 0
## 182 0 male yes 1 2.210 19
## 184 0 male yes 1 2.100 12
## 186 0 female yes 1 4.620 15
## 190 0 female yes 0 1.830 2
## 192 0 female yes 1 4.290 6
## 194 0 male yes 0 2.140 1
## 195 0 male yes 2 3.400 13
## 197 0 female yes 0 2.960 0
## 198 0 female yes 2 3.190 0
## 199 0 male yes 1 3.690 16
## 200 0 female yes 2 1.255 0
## 201 0 male yes 2 4.140 12
## 202 0 male yes 1 2.390 5
## 203 0 male yes 2 3.920 2
## 205 0 female yes 0 2.120 2
## 206 0 female yes 2 2.120 1
## 207 0 female yes 0 2.610 3
## 209 0 male yes 3 2.860 7
## 210 0 female yes 0 2.390 0
## 211 0 male yes 2 3.340 1
## 213 0 female yes 1 3.590 8
## 214 0 male yes 2 4.540 1
## 215 0 female yes 0 3.590 1
## 217 0 male yes 0 1.520 4
## 218 0 male yes 0 4.290 6
## 219 0 female yes 0 4.620 5
## 220 0 male yes 1 4.290 13
## 221 0 male yes 0 2.510 3
## 223 0 female yes 0 2.960 8
## 224 0 female yes 0 3.690 3
## 225 0 female yes 0 3.470 2
## 226 0 male yes 2 4.290 15
## 229 0 female yes 0 2.000 6
## 230 0 male yes 0 2.320 4
## 231 0 female yes 1 2.000 9
## 232 0 male yes 1 1.680 27
## 234 0 male yes 0 2.200 2
## 235 0 male yes 1 2.120 10
## 238 0 male yes 2 4.290 24
## 239 0 male yes 1 2.100 0
## 243 0 male yes 1 2.580 6
## 244 0 female yes 0 3.150 7
## 247 0 male yes 2 3.590 5
## 251 0 male yes 0 3.400 13
## 254 0 female yes 0 2.860 13
## 257 0 female yes 0 2.390 2
## 258 0 male yes 2 2.860 11
## 259 0 female yes 0 2.960 7
## 261 0 male yes 1 1.810 5
## 262 0 male yes 1 4.290 2
## 263 0 male yes 1 2.100 0
## 265 0 male yes 2 4.290 2
## 266 0 male yes 0 4.290 2
## 267 0 male yes 2 3.400 0
## 269 0 male yes 2 2.320 5
## 271 0 female yes 0 2.580 0
## 272 0 male yes 0 3.690 3
## 273 0 male yes 2 3.410 7
## 274 0 male yes 0 2.320 0
## 275 0 male yes 1 3.690 8
## 276 1 male yes 0 2.540 4
## 277 1 female yes 1 1.760 4
## 278 1 male yes 1 4.290 13
## 279 1 male yes 3 2.100 0
## 280 1 female yes 1 3.090 12
## 282 1 male yes 0 2.100 0
## 283 1 female yes 1 3.750 7
## 287 1 male yes 0 2.000 4
## 288 1 male yes 1 2.000 16
## 289 1 male yes 1 2.610 6
## 290 1 male yes 0 4.250 12
## 292 1 female yes 0 4.290 11
## 293 1 male yes 0 2.100 2
## 294 1 female yes 0 2.870 5
## 295 1 female yes 0 3.470 3
## 296 1 male yes 0 1.780 1
## 297 1 male yes 0 4.140 15
## 298 1 male yes 3 4.290 0
## 302 1 female yes 0 2.610 7
## 303 1 male yes 0 1.680 34
## 304 1 female yes 0 3.190 3
## 305 1 male yes 1 3.590 5
## 306 1 male yes 0 2.500 0
## 310 1 male yes 1 3.920 0
## 311 1 male yes 2 2.960 0
## 313 1 male yes 0 4.290 11
## 314 1 female yes 1 3.320 24
## 317 1 female yes 0 1.640 22
## 320 1 female yes 0 4.290 6
## 321 1 male yes 0 1.750 3
## 322 1 male yes 0 2.960 8
## 324 1 male yes 2 4.250 20
## 325 1 male yes 2 2.560 22
## 327 1 male yes 2 3.920 2
## 328 1 male yes 1 1.780 77
## 329 1 female yes 0 3.400 14
## 330 1 male yes 1 1.740 4
## 333 1 female yes 0 2.870 18
## 334 1 male yes 0 4.290 6
## 335 1 female yes 0 3.190 2
## 336 1 male yes 1 1.220 1
## 337 1 female yes 2 3.540 17
## 338 1 male yes 1 4.290 1
## 339 1 male yes 1 4.620 3
## 343 1 male yes 1 3.400 2
## 344 1 female yes 0 1.280 2
## 345 1 male yes 2 1.740 4
## 346 1 male yes 1 2.260 1
## 347 1 female yes 0 3.590 5
## 348 1 male yes 1 4.620 16
## 351 1 male yes 1 2.390 3
## 352 1 male yes 0 2.260 1
## 353 1 male yes 2 2.860 7
## 354 1 male yes 2 2.760 8
## 355 1 male yes 1 1.630 8
## 356 1 male yes 2 4.290 12
## 358 1 female yes 0 2.120 0
## 359 1 female yes 1 2.610 6
## 360 1 male yes 0 1.800 1
## 361 1 female yes 0 4.290 21
## 363 1 female yes 0 4.620 16
## 365 1 male yes 2 2.100 0
## 366 1 female yes 0 2.000 5
## 368 1 male yes 2 1.750 2
## 372 1 male yes 1 3.920 8
## 373 1 male yes 2 2.510 3
## 375 1 male yes 1 2.000 11
## 379 1 male yes 0 4.620 1
## 380 1 male yes 1 2.560 16
## 381 1 male yes 0 4.620 18
## 382 1 male yes 0 3.590 10
## 383 1 male yes 2 4.290 6
## 386 1 male yes 0 3.190 3
## 387 1 female yes 0 3.590 1
## 388 1 female yes 0 2.960 19
## 390 1 male yes 3 2.960 6
## 391 1 female yes 0 4.540 13
## 392 1 male yes 1 4.540 10
## 393 1 male yes 2 2.500 4
## 394 1 male yes 0 1.680 8
## 395 1 male yes 0 2.320 4
## 396 1 female yes 3 3.190 9
## 398 1 female yes 0 1.250 5
## 400 1 female yes 0 4.620 4
## 402 1 female yes 0 3.150 9
## 404 1 female yes 0 1.950 3
## 406 1 female yes 0 4.540 2
## 407 1 female yes 2 2.580 2
## 408 1 female yes 0 3.850 29
## 409 1 male yes 1 3.410 10
## 410 1 female yes 1 2.260 9
## 412 1 male yes 1 3.590 6
## 413 1 female yes 1 2.120 9
## 414 1 male yes 0 2.960 7
## 418 1 female yes 2 2.860 7
## 419 1 male yes 0 4.540 2
## 420 1 male yes 0 3.590 12
## 421 1 female yes 0 4.620 18
## 422 1 male yes 3 1.670 3
## 423 1 male yes 2 1.750 1
## 424 1 female yes 1 2.830 5
## 425 1 male yes 3 3.150 11
## 426 1 male yes 1 3.590 9
## 429 1 male yes 0 4.290 0
## 430 1 male yes 2 4.290 0
## 431 1 female yes 0 2.390 7
## 432 1 male yes 1 4.540 3
## 433 1 male yes 0 2.320 4
## 435 1 male yes 1 3.690 5
## 438 1 male yes 0 2.760 5
## 440 1 male yes 2 3.620 4
## 441 1 male yes 1 4.290 14
## 443 1 female yes 1 2.390 9
## 445 1 male yes 0 1.780 4
## 446 1 male yes 1 2.100 8
## 447 1 female yes 0 2.250 3
## 448 1 male yes 1 2.260 5
## 449 1 male yes 0 1.860 5
## 451 1 male yes 0 4.340 10
## 455 1 male yes 1 4.540 45
## 458 1 male yes 0 1.520 2
## 459 1 male yes 0 2.550 11
## 460 1 female yes 0 1.180 1
## 461 1 female yes 2 3.090 9
## 463 1 female yes 0 2.320 1
## 465 1 male yes 0 4.290 1
## 468 1 male yes 1 3.590 2
## 471 1 female yes 0 3.590 32
## 474 1 female yes 0 1.750 0
## 475 1 female yes 0 3.470 3
## 476 1 male yes 1 2.610 4
## 478 1 male yes 2 4.290 9
## 480 1 female yes 0 4.620 18
## 481 1 male yes 1 2.860 17
## 482 1 male yes 1 2.860 17
## 483 1 male yes 0 2.860 39
## 485 1 female yes 0 1.760 8
## 486 1 male yes 0 2.500 0
## 489 1 female yes 1 3.540 14
## 490 1 female yes 0 3.690 1
## 493 1 male yes 1 4.340 4
## 494 1 male yes 0 3.540 11
## 495 1 male yes 2 4.290 10
## 496 1 male yes 0 1.810 0
## 498 1 male yes 1 1.810 5
## 500 1 female yes 1 2.320 5
## 502 1 male yes 1 4.290 2
## 503 1 male yes 1 2.860 2
## 504 1 female yes 1 2.860 2
## 505 1 male yes 1 1.220 0
## 506 1 male yes 0 2.100 0
## 507 1 male yes 1 1.680 12
## 509 1 female yes 0 2.870 15
## 510 1 male yes 1 3.470 1
## 512 1 male yes 1 3.540 21
## 513 1 female yes 0 1.950 11
## 514 1 male yes 1 3.590 19
## 517 1 female yes 2 4.290 13
## 518 1 male yes 2 3.190 5
## 519 1 male yes 0 2.960 0
## 520 1 male yes 1 2.760 7
## 521 1 female yes 0 1.810 11
## 522 2 male yes 0 3.360 4
## 525 2 female yes 0 4.540 10
## 527 2 female yes 0 3.090 2
## 531 2 male yes 1 4.290 2
## 532 2 female yes 1 1.740 4
## 533 2 male yes 2 2.960 8
## 535 2 male yes 1 4.540 10
## 537 2 male yes 1 4.290 13
## 539 2 female yes 0 3.590 0
## 543 2 female yes 1 3.470 11
## 545 2 male yes 0 1.950 4
## 546 2 male yes 2 2.960 46
## 547 2 male yes 1 4.540 53
## 548 2 male yes 0 3.400 9
## 549 2 male yes 0 2.100 4
## 550 2 male yes 2 4.290 8
## 553 2 male yes 1 2.500 2
## 554 2 female yes 1 4.620 17
## 555 2 female yes 0 1.800 10
## 558 2 male yes 2 1.800 6
## 559 2 female yes 0 3.590 5
## 560 2 male yes 0 2.760 3
## 561 2 male yes 0 4.140 16
## 564 2 female yes 0 0.920 0
## 566 2 male yes 1 2.390 4
## 567 2 male yes 0 1.180 0
## 568 2 male yes 2 4.540 2
## 569 2 female yes 2 3.850 47
## 570 2 male yes 2 2.960 21
## 571 2 female yes 0 3.360 8
## 572 2 female yes 0 3.190 5
## 573 2 female yes 1 3.690 15
## 574 2 male yes 0 1.630 8
## 575 2 male yes 0 1.720 1
## 576 2 female yes 0 2.580 5
## 577 2 male yes 0 1.520 5
## 579 2 female yes 2 1.220 4
## 582 2 male yes 2 2.870 20
## 583 2 male yes 1 3.150 7
## 585 2 male yes 1 1.760 7
## 586 2 male yes 1 1.520 3
## 588 2 male yes 2 4.290 10
## 589 2 male yes 1 2.560 5
## 591 2 female yes 0 1.860 5
## 593 2 female yes 0 3.920 7
## 595 2 male yes 1 4.290 14
## 596 2 female yes 1 3.690 10
## 597 2 male yes 2 1.970 0
## 598 2 male yes 1 3.190 10
## 601 2 male yes 0 2.830 1
## 602 2 male yes 3 4.340 7
## 606 2 male yes 0 4.290 24
## 607 2 male yes 1 2.760 8
## 608 2 female yes 0 3.750 0
## 609 2 male yes 1 4.290 12
## 610 2 male yes 2 2.210 12
## 611 2 male yes 0 3.540 21
## 612 2 male yes 0 2.960 2
## 613 2 female yes 0 2.120 2
## 617 2 female yes 0 4.540 9
## 619 2 male yes 0 1.760 0
## 620 2 male yes 2 4.340 17
## 621 2 female yes 0 2.520 16
## 622 2 male yes 1 2.560 7
## 624 2 female yes 0 1.400 0
## 625 2 male yes 2 3.320 27
## 626 2 male yes 0 2.510 5
## 627 2 female yes 2 2.580 3
## 628 2 male yes 2 3.540 16
## 629 2 male yes 0 4.540 11
## 631 2 male yes 0 4.340 5
## 632 2 female yes 1 3.470 4
## 634 2 male yes 2 2.500 5
## 635 2 male yes 3 2.000 8
## 637 2 female yes 0 4.620 23
## 642 2 male yes 0 3.690 5
## 643 2 male yes 0 4.290 17
## 645 2 male yes 0 4.290 13
## 646 2 female yes 1 3.210 7
## 648 2 male yes 0 2.500 0
## 650 2 female yes 0 3.750 4
## 652 2 male yes 0 3.190 11
## 653 2 female yes 1 2.000 7
## 654 2 female yes 0 3.090 1
## 655 2 female yes 1 3.590 2
## 656 2 female yes 0 4.340 11
## 658 2 male yes 0 2.100 2
## 660 2 male yes 1 2.100 3
## 661 2 male yes 1 1.780 1
## 662 2 male yes 0 2.510 0
## 663 2 male yes 1 2.520 10
## 664 2 female yes 1 3.400 4
## 665 2 female yes 1 3.090 3
## 666 2 male yes 0 4.290 13
## 667 2 female yes 0 2.960 8
## 668 2 female yes 2 3.590 11
## 670 2 female yes 0 3.590 11
## 671 2 male yes 1 3.420 3
## 672 2 female yes 1 4.290 4
## 674 2 female yes 1 4.290 11
## 675 2 male yes 0 4.620 3
## 676 2 male yes 2 1.860 6
## 677 2 male yes 0 4.620 8
## 678 2 female yes 2 4.540 48
## 679 2 female yes 0 3.750 8
## 680 2 male yes 0 1.760 0
## 681 2 female yes 0 3.410 31
## 682 2 male yes 0 2.550 24
## 683 2 male yes 1 1.250 2
## 684 2 female yes 0 1.480 9
## 685 2 female yes 0 2.830 3
## 686 2 female yes 0 4.290 6
## 689 2 female yes 2 3.210 2
## 691 2 female yes 0 1.450 7
## 692 2 female yes 1 3.340 4
## 694 2 male yes 2 4.290 30
## 697 2 female yes 1 4.540 7
## 698 2 male yes 1 4.540 6
## 703 3 male yes 2 4.540 31
## 704 3 male yes 0 3.090 5
## 705 3 male yes 1 1.950 14
## 706 3 female yes 1 3.590 3
## 707 3 male yes 1 2.610 5
## 710 3 female yes 0 3.410 19
## 711 3 female yes 1 2.320 5
## 712 3 female yes 0 2.120 3
## 713 3 male yes 0 4.540 37
## 714 3 male yes 0 2.960 8
## 716 3 male yes 0 2.320 4
## 717 3 male yes 2 1.800 6
## 719 3 female yes 1 4.620 14
## 721 3 male yes 0 4.540 5
## 723 3 male yes 2 4.290 0
## 724 3 male yes 1 2.960 5
## 725 3 male yes 2 4.290 25
## 726 3 male yes 1 4.290 18
## 727 3 male yes 1 2.540 6
## 731 3 female yes 0 3.750 6
## 732 3 male yes 2 1.950 3
## 733 3 male yes 1 1.800 4
## 734 3 male yes 0 2.760 8
## 736 3 male yes 0 4.250 20
## 737 3 male yes 2 2.830 7
## 739 3 female yes 0 1.180 0
## 740 3 female yes 0 3.360 11
## 741 3 female yes 0 4.290 21
## 742 3 female yes 1 4.620 49
## 744 3 male yes 0 3.690 24
## 745 3 male yes 0 2.260 12
## 747 3 male yes 1 4.290 19
## 748 3 male yes 0 1.420 3
## 749 3 female yes 2 1.890 16
## 750 3 male yes 0 3.690 26
## 751 3 female yes 0 2.960 22
## 752 3 female yes 1 1.860 1
## 753 3 female yes 0 2.260 6
## 754 3 male yes 0 4.290 15
## 755 3 female yes 0 3.150 4
## 756 3 male yes 0 2.610 0
## 758 3 male yes 1 2.210 10
## 759 3 male yes 0 1.780 0
## 760 3 male yes 1 3.620 5
## 761 3 male yes 0 3.920 0
## 762 3 female yes 0 4.620 10
## 763 3 male yes 0 2.610 5
## 764 3 female yes 1 3.360 3
## 765 3 female yes 0 3.690 12
## 766 3 male yes 0 3.470 14
## 767 3 male yes 0 1.250 4
## 768 3 male yes 0 4.620 18
## 769 3 male yes 1 3.590 14
## 771 3 male yes 0 4.290 38
## 773 3 male yes 2 2.580 2
## 775 3 male yes 0 3.470 8
## 776 3 female yes 0 4.620 14
## 778 3 male yes 2 2.100 4
## 779 3 male yes 2 1.380 8
## 780 3 male yes 1 3.090 5
## 781 3 male yes 3 2.860 3
## 783 3 female yes 1 1.220 3
## 784 4 male yes 0 2.830 5
## 785 4 female yes 0 4.540 16
## 786 4 male yes 0 4.290 22
## 788 4 male yes 0 3.540 9
## 791 4 female yes 0 4.340 6
## 792 4 female yes 1 2.510 2
## 793 4 male yes 0 4.290 2
## 794 4 male yes 1 2.960 0
## 797 4 female yes 0 3.400 5
## 799 4 male yes 1 2.960 57
## 800 4 female yes 0 3.540 5
## 801 4 male yes 2 1.720 2
## 802 4 male yes 2 2.860 15
## 803 4 male yes 2 4.540 66
## 804 4 male yes 1 1.760 11
## 805 4 male yes 2 1.860 15
## 806 4 male yes 0 3.470 4
## 808 4 male yes 0 1.810 10
## 809 4 male yes 2 2.050 13
## 811 4 female yes 0 2.260 3
## 812 4 male yes 1 1.860 47
## 813 4 female yes 1 4.290 4
## 814 4 male yes 2 3.540 2
## 815 4 male yes 0 4.290 30
## 816 4 male yes 0 2.540 11
## 817 4 female yes 0 4.250 13
## 819 4 female yes 1 3.540 12
## 820 4 female yes 0 3.190 8
## 821 4 male yes 2 4.540 21
## 823 4 female yes 0 2.580 14
## 824 4 female yes 0 1.280 4
## 825 4 female yes 0 3.210 14
## 832 4 male yes 1 2.550 21
## 834 4 female yes 0 2.360 5
## 835 4 male yes 1 4.250 29
## 836 4 male yes 1 4.290 5
## 837 4 female yes 0 3.190 7
## 840 4 male yes 0 1.760 7
## 841 4 male yes 1 2.580 25
## 842 4 female yes 0 3.410 4
## 844 4 female yes 0 1.780 4
## 846 4 male yes 2 3.690 16
## 847 4 male yes 0 3.620 5
## 848 4 male yes 0 1.505 4
## 849 4 male yes 2 2.580 6
## 851 5 female yes 0 2.260 16
## 853 5 male yes 2 3.850 15
## 854 5 male yes 1 3.150 5
## 855 5 male yes 1 3.150 27
## 856 5 male yes 0 4.340 6
## 857 5 male yes 0 4.250 12
## 860 5 male yes 1 2.580 25
## 861 5 male yes 1 3.590 21
## 862 5 male yes 1 2.960 4
## 863 5 male yes 0 4.540 13
## 864 5 male yes 0 4.290 30
## 866 5 female yes 0 4.540 15
## 867 5 female yes 1 3.850 1
## 868 5 male yes 0 2.500 4
## 869 5 male yes 1 3.470 0
## 870 5 female yes 0 2.860 24
## 871 5 female yes 0 4.620 0
## 872 5 male yes 1 4.540 53
## 873 5 male yes 0 1.250 2
## 874 5 female yes 0 3.210 19
## 875 5 male yes 1 1.760 11
## 878 6 male yes 1 4.620 8
## 879 6 female yes 0 2.100 36
## 880 6 female yes 2 1.860 38
## 881 6 male yes 0 4.340 9
## 882 6 female yes 0 4.290 24
## 883 6 male yes 2 2.510 11
## 884 6 male yes 1 2.960 13
## 888 6 male yes 1 3.850 16
## 892 6 female yes 0 4.290 1
## 895 7 male yes 0 3.590 1
## 898 7 male yes 1 1.970 0
## 902 7 male yes 0 3.690 9
## 905 7 male yes 1 3.590 27
## 907 8 male yes 0 2.510 11
## 908 9 male yes 1 2.960 23
## 909 9 male yes 1 1.860 47
## 910 10 female yes 0 3.590 18
## 911 11 male yes 2 2.860 7
## 912 12 male yes 1 4.290 35
## 913 12 male yes 1 1.860 5
## 914 16 male yes 0 1.740 21
## 915 19 male yes 0 1.860 42
Ngược lại, ta lọc lấy dữ liệu của những nghiên cứu sinh chưa kết hôn và có 309 người chưa kết hôn (34%)
no <- p[p$ma== 'no',]
head(no)
## a g ma k pr m
## 2 0 female no 0 2.05 6
## 3 0 female no 0 3.75 6
## 5 0 female no 0 3.75 26
## 7 0 female no 0 3.19 3
## 9 0 male no 0 4.62 6
## 11 0 male no 0 2.96 14
Ta dùng lệnh summary tóm tắt thống kê dữ liệu. Ta có thể biết các thông tin về min, max, trung bình, trung vị, tứ phân vị của các biến trong tập dữ liệu.
summary(p)
## a g ma k pr
## Min. : 0.000 male :494 no :309 Min. :0.0000 Min. :0.755
## 1st Qu.: 0.000 female:421 yes:606 1st Qu.:0.0000 1st Qu.:2.260
## Median : 1.000 Median :0.0000 Median :3.150
## Mean : 1.693 Mean :0.4951 Mean :3.103
## 3rd Qu.: 2.000 3rd Qu.:1.0000 3rd Qu.:3.920
## Max. :19.000 Max. :3.0000 Max. :4.620
## m
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 6.000
## Mean : 8.767
## 3rd Qu.:12.000
## Max. :77.000
Ta cũng có thể sử dụng các lệnh thống kê để phân tích biến a (số bài báo cáo)
Kết quả cho thấy:
-Trung bình số bài báo cáo của 1 nghiên cứu sinh là gần được 2 bài
-Trung vị là 1 cho biết có 50% số nghiên cứu sinh có số bài báo cáo ít hơn 1
-Độ lệch chuẩn của biến a là 1.92
-Phương sai của biến a là 3.7
-Hàm Quantile cho biết 70% nghiên cứu sinh có số lượng bài báo cáo ít hơn 2
mean(p$a)
## [1] 1.692896
median(p$a)
## [1] 1
sd(p$a)
## [1] 1.926069
var(p$a)
## [1] 3.709742
quantile(p$a,0.7)
## 70%
## 2
Đầu tiên, ta nhìn tổng quan biến a (số bài báo cáo)
Chia số bài báo cáo thành 3 tổ khác nhau
Sau đó, lập bảng thống kê với biến a
Ta thấy, tổ it là tổ có số bài báo cáo từ 1 bài đến 6 bài có số lượng nghiên cứu sinh nhiều nhất là 619 người(67%)
Tổ trungbinh là tổ có số bài báo cáo từ 6 đến 12 bài có số lượng nghiên cứu sinh chiếm thứ 2 là 19 người (2%)
Tổ nhieu là tổ có số bài báo cáo từ 12 bài trở lên có số lượng nghiên cứu sinh chiếm ít nhất là 2 người(0.2%)
Phần còn lại là số nghiên cứu sinh không có bài báo cáo nào với 275 người.
summary(p$a)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 1.000 1.693 2.000 19.000
sbbc <- cut(p$a, breaks = c(0,6,12,19), labels = c('it','trungbinh','nhieu'))
table(sbbc)
## sbbc
## it trungbinh nhieu
## 619 19 2
Thống kê tổng hợp dữ liệu của biến a theo biến g và tính trung bình của các biến trong g theo a bằng lệnh aggregate
Từ kết quả ta thấy, những nam nghiên cứu sinh trung bình làm khoảng 2 bài báo cáo
Còn những nữ nghiên cứu sinh trung bình làm được 1 bài báo cáo
aggregate(p$a, list(p$g), FUN = 'mean')
## Group.1 x
## 1 male 1.882591
## 2 female 1.470309
Ta dùng lệnh “group_by” để phân nhóm dữ liệu theo giới tính
Bên cạnh đó, có thể dùng lệnh summarise để tính trung bình số bài báo cáo các nghiên cứu sinh làm được theo giới tính
library(tidyverse)
p %>% group_by(g)
## # A tibble: 915 × 6
## # Groups: g [2]
## a g ma k pr m
## <int> <fct> <fct> <int> <dbl> <int>
## 1 0 male yes 0 2.52 7
## 2 0 female no 0 2.05 6
## 3 0 female no 0 3.75 6
## 4 0 male yes 1 1.18 3
## 5 0 female no 0 3.75 26
## 6 0 female yes 2 3.59 2
## 7 0 female no 0 3.19 3
## 8 0 male yes 2 2.96 4
## 9 0 male no 0 4.62 6
## 10 0 female yes 0 1.25 0
## # ℹ 905 more rows
group_by(p,g)
## # A tibble: 915 × 6
## # Groups: g [2]
## a g ma k pr m
## <int> <fct> <fct> <int> <dbl> <int>
## 1 0 male yes 0 2.52 7
## 2 0 female no 0 2.05 6
## 3 0 female no 0 3.75 6
## 4 0 male yes 1 1.18 3
## 5 0 female no 0 3.75 26
## 6 0 female yes 2 3.59 2
## 7 0 female no 0 3.19 3
## 8 0 male yes 2 2.96 4
## 9 0 male no 0 4.62 6
## 10 0 female yes 0 1.25 0
## # ℹ 905 more rows
p %>% group_by(g) %>% summarise(n = mean(a))
## # A tibble: 2 × 2
## g n
## <fct> <dbl>
## 1 male 1.88
## 2 female 1.47
Tập dữ liệu PhDPublications được thu thập vào năm 1997 nói về số bài báo cáo của các nghiên cứu sinh trong lĩnh vực hóa sinh.
Dữ liệu gồm 915 quan sát và có 6 biến:
articles: số bài báo cáo được đăng trong 3 năm gần đây
gender: giới tính của nghiên cứu sinh
married: tình trạng hôn nhân của nghiên cứu sinh
kids: số con dưới 6 tuổi của nghiên cứu sinh
prestige: chất lượng của chương trình đào tạo
mentor: số bài báo cáo được đăng của người hướng dẫn nghiên cứu sinh
library(AER)
data("PhDPublications")
Gán dữ liệu vào p
p <- PhDPublications
Xem cấu trúc dữ liệu
str(p)
## 'data.frame': 915 obs. of 6 variables:
## $ articles: int 0 0 0 0 0 0 0 0 0 0 ...
## $ gender : Factor w/ 2 levels "male","female": 1 2 2 1 2 2 2 1 1 2 ...
## $ married : Factor w/ 2 levels "no","yes": 2 1 1 2 1 2 1 2 1 2 ...
## $ kids : int 0 0 0 1 0 2 0 2 0 0 ...
## $ prestige: num 2.52 2.05 3.75 1.18 3.75 ...
## $ mentor : int 7 6 6 3 26 2 3 4 6 0 ...
## - attr(*, "datalabel")= chr "Academic Biochemists / S Long"
## - attr(*, "time.stamp")= chr "30 Jan 2001 10:49"
## - attr(*, "formats")= chr [1:6] "%9.0g" "%9.0g" "%9.0g" "%9.0g" ...
## - attr(*, "types")= int [1:6] 98 98 98 98 102 98
## - attr(*, "val.labels")= chr [1:6] "" "sexlbl" "marlbl" "" ...
## - attr(*, "var.labels")= chr [1:6] "Articles in last 3 yrs of PhD" "Gender: 1=female 0=male" "Married: 1=yes 0=no" "Number of children < 6" ...
## - attr(*, "version")= int 6
## - attr(*, "label.table")=List of 6
## ..$ marlbl: Named num [1:2] 0 1
## .. ..- attr(*, "names")= chr [1:2] "Single" "Married"
## ..$ sexlbl: Named num [1:2] 0 1
## .. ..- attr(*, "names")= chr [1:2] "Men" "Women"
## ..$ : NULL
## ..$ : NULL
## ..$ : NULL
## ..$ : NULL
Xem các quan sát đầu của tập dữ liệu
head(p)
## articles gender married kids prestige mentor
## 1 0 male yes 0 2.52 7
## 2 0 female no 0 2.05 6
## 3 0 female no 0 3.75 6
## 4 0 male yes 1 1.18 3
## 5 0 female no 0 3.75 26
## 6 0 female yes 2 3.59 2
Xem các quan sát cuối của tập dữ liệu
tail(p)
## articles gender married kids prestige mentor
## 910 10 female yes 0 3.59 18
## 911 11 male yes 2 2.86 7
## 912 12 male yes 1 4.29 35
## 913 12 male yes 1 1.86 5
## 914 16 male yes 0 1.74 21
## 915 19 male yes 0 1.86 42
Đặt tên các biến
names(p) <- c('a','g','ma','k','pr','m')
Gán biến a vào sobaibc
Lọc số nghiên cứu sinh có số bài báo cáo từ 5 đến 10 bài
sobaibc <- p$a
sobaibc510 <- sobaibc[sobaibc>5 & sobaibc<10]
sobaibc510
## [1] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 8 9 9
Lọc số nghiên cứu sinh có số bài báo cáo nhiều hơn 1 và có hơn 1 con
sobaibcs <- p[p$a>1&p$k>1,]
sobaibcs
## a g ma k pr m
## 533 2 male yes 2 2.96 8
## 546 2 male yes 2 2.96 46
## 550 2 male yes 2 4.29 8
## 558 2 male yes 2 1.80 6
## 568 2 male yes 2 4.54 2
## 569 2 female yes 2 3.85 47
## 570 2 male yes 2 2.96 21
## 579 2 female yes 2 1.22 4
## 582 2 male yes 2 2.87 20
## 588 2 male yes 2 4.29 10
## 597 2 male yes 2 1.97 0
## 602 2 male yes 3 4.34 7
## 610 2 male yes 2 2.21 12
## 620 2 male yes 2 4.34 17
## 625 2 male yes 2 3.32 27
## 627 2 female yes 2 2.58 3
## 628 2 male yes 2 3.54 16
## 634 2 male yes 2 2.50 5
## 635 2 male yes 3 2.00 8
## 668 2 female yes 2 3.59 11
## 676 2 male yes 2 1.86 6
## 678 2 female yes 2 4.54 48
## 689 2 female yes 2 3.21 2
## 694 2 male yes 2 4.29 30
## 703 3 male yes 2 4.54 31
## 717 3 male yes 2 1.80 6
## 723 3 male yes 2 4.29 0
## 725 3 male yes 2 4.29 25
## 732 3 male yes 2 1.95 3
## 737 3 male yes 2 2.83 7
## 749 3 female yes 2 1.89 16
## 773 3 male yes 2 2.58 2
## 778 3 male yes 2 2.10 4
## 779 3 male yes 2 1.38 8
## 781 3 male yes 3 2.86 3
## 801 4 male yes 2 1.72 2
## 802 4 male yes 2 2.86 15
## 803 4 male yes 2 4.54 66
## 805 4 male yes 2 1.86 15
## 809 4 male yes 2 2.05 13
## 814 4 male yes 2 3.54 2
## 821 4 male yes 2 4.54 21
## 846 4 male yes 2 3.69 16
## 849 4 male yes 2 2.58 6
## 853 5 male yes 2 3.85 15
## 880 6 female yes 2 1.86 38
## 883 6 male yes 2 2.51 11
## 911 11 male yes 2 2.86 7
Chia biến a thành 4 tổ và lập bảng tần số
Số lượng bài báo cáo dưới 5 bài chiếm số lượng nhiều nhất với 850 nghiên cứu sinh (chiếm 93%)
Tổ từ 5 đến 10 bài báo cáo có 59 nghiên cứu sinh( chiếm 6.4%)
Tổ từ 10 đến 15 bài báo cáo có 4 nghiên cứu sinh (chiếm 0.4%)
Số lượng nghiên cứu sinh có từ 15 đến 19 bài báo cáo chiếm số lượng ít nhất với 2 người (chiếm 0.2%)
tablesa <- table(cut(p$a,4))
prop.table(tablesa)
##
## (-0.019,4.75] (4.75,9.5] (9.5,14.2] (14.2,19]
## 0.928961749 0.064480874 0.004371585 0.002185792
Lập bảng tần số của số bài báo cáo theo giới tính
Ta thấy trong 915 nghiên cứu sinh thì nam chiếm nhiều hơn với 494 người (chiếm 54%) tuy nghiên không có sự cách biệt quá lớn so với nữ (chiếm 46%).
Số lượng bài báo cáo dưới 5 chiếm nhiều nhất (93%) với 450 bài là của nam nghiên cứu sinh và 400 bài của nữ nghiên cứu sinh.
table(cut(p$a,4),p$g)
##
## male female
## (-0.019,4.75] 450 400
## (4.75,9.5] 39 20
## (9.5,14.2] 3 1
## (14.2,19] 2 0
Lập bảng tần số của số bài báo cáo theo số con
table(cut(p$a,4),p$k)
##
## 0 1 2 3
## (-0.019,4.75] 556 177 101 16
## (4.75,9.5] 40 16 3 0
## (9.5,14.2] 1 2 1 0
## (14.2,19] 2 0 0 0