Web scraping, web harvesting hay còn gọi là web data extraction là quá trình cào dữ liệu được sử dụng để trích xuất dữ liệu từ các website. Các phần mềm web scraping truy cập vào website bằng giao thức HTTP hoặc bằng web browser để lấy ra các dữ liệu mà chúng ta cần sử dụng.
Web scraping chính là cách giúp chúng ta trích xuất dữ liệu từ các trang web một cách tự động. Kỹ thuật này chủ yếu tập trung vào việc chuyển đổi dữ liệu phi cấu trúc (HTML) trên web thành dữ liệu có cấu trúc (cơ sở dữ liệu, bảng tính,…).
Không giống như screen scraping, chỉ sao chép các pixel hiển trị trên màn hình. Web scraping trích xuất mã HTML bên dưới và cùng với nó, dữ liệu được lưu trữ trong database. Sau đó, scraper có thể sao chép toàn bộ nội dung website ở nơi khác, điển hình là RStudio. Với lập trình R, chúng ta hoàn toàn có thể cập nhật các dữ liệu thay đổi mới mỗi ngày trên 1 website chỉ bằng cách chạy toàn bộ file Rds trên RStudio hoặc dùng tổ hợp phím (Ctrl+Alt+Shift+P)
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.
Bitcoin (BTC) là tiền mã hóa được biết đến là loại tiền tệ kỹ thuật số phi tập trung - một hình thức tài chính dựa trên công nghệ blockchain và không phụ thuộc vào các bên trung gian. Đồng Bitcoin được mã hóa dưới dạng mã nguồn mở dùng để trao đổi trực tiếp bằng thiết bị kết nối Internet, giao dịch theo hình thức ngang hàng trong mọi giao dịch. Hiện Bitcoin là đồng tiền đứng vị trí thứ nhất trong danh sách những đồng điện tử có vốn hóa lớn trên thị trường. Mức lưu trữ giá trị và tốc độ tăng trưởng của Bitcoin những năm gần đây tăng theo cấp số nhân đã thu hút sự chú ý, quan tâm của nhiều tổ chức lướn, thậm chí cả phố Wall.
Trong đề tài này sẽ sử dụng gói rvest trong R để scrape dữ liệu lịch sử thị trường của loại tiền điện tử Bitcoin trên trong web investing.com với đường link: www.investing.com/crypto/bitcoin/historical-data.
Trước hết, chúng ta cần sử dụng các thư viện package cần dùng vào R để thực hành:
library("rvest") # thư viện để scape web
library("dplyr") # thư viện để xử lý dataframe
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)
Mọi thứ đã được chuẩn bị sẵn sàng, bây giờ chúng ta chỉ cần đọc và bảng dữ liệu giá thị trường Bitcoin sẽ được lưu vào như 1 data trong R.
url <- read_html("https://www.investing.com/crypto/bitcoin/historical-data") # đọc dữ liệu từ web
bitcoin <- url %>% html_table(fill = TRUE) # đọc dữ liệu dạng bảng
bitcoin = bitcoin[[1]] # chọn bảng trong dataset
head(bitcoin)
## # A tibble: 6 × 7
## Date Price Open High Low Vol. `Change %`
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 Jul 17, 2023 30,147.4 30,235.5 30,335.9 30,034.0 28.43K -0.29%
## 2 Jul 16, 2023 30,235.5 30,291.8 30,435.0 30,075.4 20.31K -0.18%
## 3 Jul 15, 2023 30,291.4 30,316.8 30,395.4 30,246.9 17.06K -0.09%
## 4 Jul 14, 2023 30,317.4 31,465.4 31,602.6 29,944.3 82.42K -3.65%
## 5 Jul 13, 2023 31,466.1 30,387.3 31,764.5 30,260.0 99.81K 3.55%
## 6 Jul 12, 2023 30,387.3 30,623.3 30,951.3 30,231.7 54.06K -0.77%
Dữ liệu thô ban đầu được scrape từ web là một dữ liệu dạng “character” chứ không phải dạng vecto số “numberic”. Vì vậy chúng ta cần dùng hàm as.numberic() để biến đổi dữ liệu gốc thành dữ liệu số để thực hiện được phân tích:
Price <- bitcoin$Price # lấy biến Price ra từ dataset Bitcoin
BitcoinPrice <- as.numeric(gsub(",", "", Price)) # chuyển đổi "character" thành "numberic" và xóa đi dấu ","
Dữ liệu trên web investing.com được sắp xếp theo thứ tự ngày gần nhất đến ngày xa nhất. Như vậy trong quá trình phân tích sẽ có một số khó khăn khi dữ liệu không phải từ trái sang phải. Như vậy, tôi sẽ đảo ngược vecto Giá của Bitcoin bằng hàm rev():
BitcoinPricex <- rev(BitcoinPrice) # đảo ngược vecto thành chiều trái sang phải
BitcoinPricex
## [1] 26515 26340 26846 28308 29997 29891 30679 30534 30465 30267 30689 30079
## [13] 30446 30473 30587 30618 31151 30768 30513 29913 30346 30289 30167 30415
## [25] 30623 30387 31466 30317 30291 30236 30147
PriceBitcoin <- ts(BitcoinPricex) # chuyển thành định dạng timeseries với hàm ts()
PriceBitcoin
## Time Series:
## Start = 1
## End = 31
## Frequency = 1
## [1] 26515 26340 26846 28308 29997 29891 30679 30534 30465 30267 30689 30079
## [13] 30446 30473 30587 30618 31151 30768 30513 29913 30346 30289 30167 30415
## [25] 30623 30387 31466 30317 30291 30236 30147
plot.ts(PriceBitcoin, ylab= " Giá của Coin", xlab="30 ngày gần nhất", main= "Đồ thị giá của Coin trong 30 ngày gần nhất")
Phân rã một chuỗi thời gian là tách chuỗi thành các cấu phần đặc trưng của chuỗi. Thông thường, một chuỗi thời gian sẽ bao gồm ba thành phần chính là thành phần xu hướng (trend component), thành phần bất thường (irregular component) và thành phần mùa vụ (seasonal component) nếu có. Tuy nhiên, với dữ liệu thị truòng giá Bitcoin là dữ liệu không có yếu tố mùa vụ.
Một chuỗi thời gian không có yếu tố mùa vụ (non-seasonal time series) mùa bao gồm một thành phần xu hướng và một thành phần bất thường.
Phân tách chuỗi thời gian liên quan đến việc cố gắng tách chuỗi thời gian thành các các thành phần, nghĩa là ước tính thành phần xu hướng và thành phần bất thường. Để ước tính thành phần xu hướng của chuỗi thời gian không có yếu tố mùa vụ dạng cộng tính, người ta thường sử dụng phương pháp làm mịn (smoothing method), chẳng hạn như tính toán trung bình động đơn giản (simple moving average) của chuỗi.
Hàm SMA() trong gói TTR có thể được sử dụng để làm mượt chuỗi bằng cách sử dụng kỹ thuật trung bình trượt giản đơn. Để sử dụng hàm này, đầu tiên bạn cần cài đặt gói TTR vào máy và gọi thư viện package TTR.
library("TTR")
Chúng ta có thể ước tính thành phần xu hướng của chuỗi bằng phương pháp làm mịn chuỗi với kỹ thuật trung bình trượt giản đơn. Thiết lập n = 5 để tính toán trung bình 5 kỳ và hiển thị chuỗi đã được làm mịn như sau:
PriceBitcoinSMA <- SMA(PriceBitcoin, n = 5)
plot.ts(PriceBitcoinSMA)
=> Dữ liệu được làm mịn với đường trung bình động đơn giản bậc 5 cho một bức tranh rõ ràng hơn về thành phần xu hướng.
library(tseries) # thư viện dùng cho phân tích chuỗi thời gian
adf.test(PriceBitcoin, alternative = c("stationary","explosive"), k = trunc((length(PriceBitcoin) - 1)^1/3))
##
## Augmented Dickey-Fuller Test
##
## data: PriceBitcoin
## Dickey-Fuller = -2.8, Lag order = 10, p-value = 0.3
## alternative hypothesis: stationary
=> Kết luận p-value > a=0,05 nên ta chấp nhận giả thuyết H0: dữ liệu là chuỗi không dừng
Phương pháp làm mịn hàm mũ Holt-Winters ước tính level, độ dốc tại thời điểm hiện tại.
Việc làm mịn được kiểm soát bởi ba tham số: alpha, beta và gamma, để ước tính level, độ dốc b của thành phần xu hướng và thành phần mùa tương ứng tại thời điểm hiện tại. Những thông số alpha, beta và gamma đều có các giá trị từ 0 đến 1 và các giá trị càng gần 0 cho biết các quan sát gần nhất càng ít quan trọng (trọng số nhỏ) đối với các giá trị dự báo trong tương lai.
Chúng ta cần nạp thư viên package forecast vào R để thực hiện dự báo.
library("forecast") # thư viện dừng để dự báo, dự báo chậm, ...
Để đưa ra dự báo, chúng ta có thể điều chỉnh mô hình dự báo bằng cách sử dụng hàm HoltWinters() trong R. Để sử dụng HoltWinters() cho việc làm trơn hàm mũ của Holt, chúng ta cần đặt tham số gamma=FALSE.
PriceForecasts <- HoltWinters(PriceBitcoin, gamma = FALSE)
=> Giá Bitcoin vào n ngày sau được cho bởi công thức là Yt= a + b.n
Như vậy, giá của Bitcoin vào 1 ngày sau theo phương pháp dự báo Holt-Winter là:
coefficients <- PriceForecasts$coefficients # đọc bảng cofficients từ kết quả dự bảo
x <- data.frame(as.numeric(coefficients)) # xử lý bảng cofficients thành dạng vecto numberic
ketquadubao= sum(x) # cộng 2 giá trị numberic là a + b
ketquadubao
## [1] 30135
Năm 2009 thực sự là một cuộc cách mạng trong không gian crypto. Đó là năm Bitcoin (một loại tiền kỹ thuật số cạnh tranh với tiền định danh) ra đời. Như chúng ta đã biết, Bitcoin không chỉ tạo ra một tài sản ảo; Bitcoin đã giúp các nhà đổi mới công nghệ hiện thực hóa ý tưởng về công nghệ blockchain. Tận dụng cùng một công nghệ với Bitcoin, Ethereum là một nền tảng phát triển ứng dụng được ra đời vào năm 2014. Từ đó tới năm 2020, có hàng trăm loại tiền điện tử trên thị trường, Bitcoin và Ethereum đứng đầu bảng xếp hạng tài sản crypto.
Ethereum (hay nói về mặt kỹ thuật là Ether – tiền điện tử dựa trên Ethereum bblockchain. Tuy nhiên, thuật ngữ Ethereum vẫn thường được sử dụng) có thể là loại crypto tốt nhất để đầu tư vào năm 2021, dựa trên việc triển khai nâng cấp Ethereum 2.0 Giai đoạn 0. Đồng thời, Bitcoin vẫn là một con đường đầu tư quan trọng vì vị trí số một vững chắc trong ngành crypto và sự chấp nhận ngày càng tăng giữa các doanh nghiệp/cơ quan quản lý.
Với dữ liệu Bitcoin đã được Scraping ở trên, tôi sẽ chỉ gọi dữ liệu giá Bitcoin:
BitcoinPricex
## [1] 26515 26340 26846 28308 29997 29891 30679 30534 30465 30267 30689 30079
## [13] 30446 30473 30587 30618 31151 30768 30513 29913 30346 30289 30167 30415
## [25] 30623 30387 31466 30317 30291 30236 30147
Sau đó, tôi sẽ nạp dữ liệu giá Ethereum trên investing.com vào R
ur <- read_html("https://www.investing.com/crypto/ethereum/historical-data") # đọc dữ liệu từ web
ethe <- ur %>% html_table(fill = TRUE) # đọc dữ liệu dạng bảng
ethe = ethe[[1]] # chọn bảng trong dataset ethe
head(ethe)
## # A tibble: 6 × 7
## Date Price Open High Low Vol. `Change %`
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 Jul 17, 2023 1,905.67 1,922.45 1,935.99 1,894.41 210.97K -0.87%
## 2 Jul 16, 2023 1,922.45 1,931.43 1,942.55 1,918.01 158.59K -0.46%
## 3 Jul 15, 2023 1,931.42 1,938.05 1,946.10 1,926.83 145.89K -0.34%
## 4 Jul 14, 2023 1,938.05 2,004.77 2,025.56 1,900.22 530.86K -3.33%
## 5 Jul 13, 2023 2,004.77 1,871.86 2,010.75 1,863.22 588.53K 7.10%
## 6 Jul 12, 2023 1,871.86 1,878.33 1,901.45 1,865.11 280.91K -0.34%
Tiếp theo, tôi sẽ tiến hành xử lý dữ liệu Ethereum từ investing.com:
P <- ethe$Price # lấy dữ liệu giá từ dataset ethe
EthePrice <- as.numeric(gsub(",", "", P)) # xử lý dữ liệu character thành numberic
EthePricex <- rev(EthePrice) # đảo ngược vecto số cho phù hợp
EthePricex
## [1] 1728 1721 1737 1792 1890 1872 1892 1875 1899 1859 1890 1828 1852 1934 1925
## [16] 1938 1956 1936 1910 1848 1871 1865 1863 1880 1878 1872 2005 1938 1931 1922
## [31] 1906
Cuối cùng, tôi gọp 2 dữ liệu chuỗi thời gian trên thành 1 chuỗi thời gian đa biến
BitEthe <- data.frame(BitcoinPricex, EthePricex) # tạo 1 bảng dữ liệu gồm 2 biến là giá bitcoin và ethereum
BitEthex <- ts(BitEthe) # chuyển thành định dạng timeseries
BitEthex
## Time Series:
## Start = 1
## End = 31
## Frequency = 1
## BitcoinPricex EthePricex
## 1 26515 1728
## 2 26340 1721
## 3 26846 1737
## 4 28308 1792
## 5 29997 1890
## 6 29891 1872
## 7 30679 1892
## 8 30534 1875
## 9 30465 1899
## 10 30267 1859
## 11 30689 1890
## 12 30079 1828
## 13 30446 1852
## 14 30473 1934
## 15 30587 1925
## 16 30618 1938
## 17 31151 1956
## 18 30768 1936
## 19 30513 1910
## 20 29913 1848
## 21 30346 1871
## 22 30289 1865
## 23 30167 1863
## 24 30415 1880
## 25 30623 1878
## 26 30387 1872
## 27 31466 2005
## 28 30317 1938
## 29 30291 1931
## 30 30236 1922
## 31 30147 1906
plot.ts(BitEthex)
autoplot(BitEthex)
Phân tích tương quan Pearson r (cung cấp một hệ số tương quan Pearson, được ký hiệu là r) là thước đo độ mạnh của mối liên kết tuyến tính giữa hai biến. Về cơ bản, sự tương quan Pearson cố gắng vẽ một đường phù hợp nhất thông qua dữ liệu của hai biến và hệ số tương quan Pearson, r, cho biết khoảng cách tất cả các điểm dữ liệu này đến đường phù hợp nhất này (tức là các điểm dữ liệu này tốt như thế nào với mô hình / đường mới phù hợp nhất).
Để tiến hành kiểm định sự tương quan, ta có hàm cor(x)
cor(BitEthex) # tính toán ma trận tương quan
## BitcoinPricex EthePricex
## BitcoinPricex 1.0000 0.8968
## EthePricex 0.8968 1.0000
Kết quả cho thấy: hệ số tương quan giữa giá Bitcoin và Ethereum > 0.9 cho thấy sự biến động giá cả của 2 loại tiền điện tử này là rất tương đồng với nhau
Tuy nhiên tôi cho rằng, 2 biến này trong thực tế không có mối quan hệ phụ thuộc với nhau mức độ quan hệ phụ thuộc với nhau đáng kể, theo tôi đây là cả 2 loại tiền điền tự đều bị tác động bởi sự biến động chung của thị trường crypto.
Giả sử, tôi là trader chuyên giao dịch các đồng tiền điện tử - crypto và tôi thường xuyên theo dõi giá thị trường của các loại coin phổ biến mỗi ngày điển hình như Bitcoin. Vì vậy, tôi cần thực hiện việc vẽ biểu đồ biến đồng giá theo thời gian của 3 loại coin ảo phổ biến nhất hiện nay là Bitcoin hoặc các coin điện tử khác chỉ với 1 function duy nhất và chỉ bằng cách nhập tên coin như một biến “x” vào.
Về phần ý tưởng, tôi sẽ tạo 11function: get_data_coin(coin). Khi đó, chúng ta chỉ cần gõ tên coin điện tử trên trang web investing thì sẽ có được kết quả gồm những đồ thị biến động giá của tiền điện tử. Các tên coin điện tử phổ biến hiện nay là: bitcoin, ethereum, tether, bnb, …
Đầu tiên, tôi sẽ tạo 1 function get_data_coin():
# Tạo hàm get dữ liệu coin
get_data_coin <- function(coin){
# coin: slug của coin
# Tạo đường link thông tin đầu vào, giữa đường link được đặt ,coin, để tùy chọn các tiền điện tử khác
historyurl <- paste0("https://www.investing.com/crypto/",coin,"/historical-data")
# Đọc dữ liệu từ web
url <- read_html(historyurl)
# Đọc dữ liệu dạng bảng
data <- url %>% html_table(fill = TRUE)
# Chọn bảng cần chọn trong dataset data
data = data[[1]]
data$Slug <- coin
# Xử lý dữ liệu: chọn biến, chuyển 'character' thành 'numberic', đảo ngược vecto
Price <- data$Price
Price1 <- as.numeric(gsub(",", "", Price))
Price2 <- rev(Price1)
Price2
# vẽ đồ thị giá thị trường của coin, ylab=coin sẽ thể hiện tên coin được nhập vào trên đồ thị
return(plot.ts(Price2, ylab= coin, xlab="30 ngày gần nhất", main= "Đồ thị giá của Coin trong 30 ngày gần nhất"))
}
Tiếp theo, tôi sẽ thử với 3 loại coin phổ biến nhất: bitcoin, ethereum, lite coin vào hàm get_data_coin() để hiện thị đồ thị cần quan sát:
get_data_coin(coin="bitcoin")
get_data_coin(coin="ethereum")
get_data_coin(coin="litecoin")
WDI là một hệ thống cơ sở dữ liệu lớn về các chỉ sổ phát triển do Ngân hàng Thế giới (WB) xây dựng. WDI bao gồm hơn 1,400 chỉ số về 217 nền kinh tế và hơn 40 nhóm nước trong khoảng thời gian lên tới hơn 50 năm. WDI là một công cụ tra cứu hiện đại và tiện dụng với các chức năng cho phép người dùng lựa chọn và trình bày dữ liệu, thiết lập các biểu đồ và bản đồ. Người dùng cũng có thể thiết lập các bản báo cáo dựa trên việc lựa chọn nước, chỉ số và năm. Tất cả các báo cáo nào đều có thể dễ dàng chỉnh sửa, lưu lại, chia sẻ hoặc nhúng lên website hoặc blog.
Trên R, chúng ta có package WDI gồm các hàm và dữ liệu để sử dụng trên cơ sở dữ liệu Ngân Hàng Thế Giới (WorldBank Data).
Nạp package WDI và wbstats từ thư viện để sử dụng như sau:
library(WDI)
library(wbstats)
Tôi sẽ dùng hàm WDIsearch() có sẵn trong package WDI để tạo 1 dataset gồm các indicitor và name của chúng một cách toàn bộ:
search <- WDIsearch()
head(search, 10)
## 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)
## 1558 BG.KAC.FNEI.GD.PP.ZS Gross private capital flows (% of GDP, PPP)
## 1559 BG.KAC.FNEI.GD.ZS Gross private capital flows (% of GDP)
## 1560 BG.KLT.DINV.GD.PP.ZS Gross foreign direct investment (% of GDP, PPP)
## 1561 BG.KLT.DINV.GD.ZS Gross foreign direct investment (% of GDP)
FDI <- WDIsearch('Net inflows')
head(FDI, 3)
## indicator name
## 1819 BN.KLT.DINV.CD.DRS Foreign direct investment, net inflows (US$)
## 1821 BN.KLT.DINV.DRS.GDI.ZS Foreign direct investment, net inflows (% of GDI)
## 1822 BN.KLT.DINV.DRS.GDP.ZS Foreign direct investment, net inflows (% of GDP)
=> Indicator tôi muốn tìm hiểu có STT là 1822: BN.KLT.DINV.DRS.GDP.ZS
Bằng phương pháp trên, tôi đã tra được các indicator theo vấn đề tôi quan tâm như sau:
BN.KLT.DINV.DRS.GDP.ZS - Foreign direct investment, net inflows (% of GDP)
SP.POP.GROW - Population growth (annual %)
NY.GDP.MKTP.KD.ZG - GDP growth (annual %)
FP.CPI.TOTL.ZG - Inflation, consumer prices (annual %)
EN.ATM.CO2E.PC - CO2 emissions (metric tons per capita)
IT.NET.USER.ZS - Individuals using the Internet (% of population)
GC.DOD.TOTL.GD.ZS - Central government debt, total (% of GDP)
VC.IHR.PSRC.P5 - Intentional homicides (per 100,000 people)
SM.POP.NETM - Net migration
AG.LND.FRST.ZS - Forest area (% of land area)
Những indicator dưới đây đều là bộ dữ liệu chéo gồm dữ liệu bảng và dữ liệu chuỗi thời gian của hơn 250 quốc gia trên thế giới từ năm 1970 cho đến hiện tại (tuy nhiên những năm hiện tại và trước đó 1 năm hoặc cả những năm khác sẽ không có dữ liệu thống kê).
Tuy nhiên tôi sẽ chỉ tìm hiểu những Indicator này tại Việt Nam với mã là VNM từ năm 1985 đến 2022
Dòng vốn FDI (Foreign direct investment) ròng là giá trị đầu tư trực tiếp vào bên trong của các nhà đầu tư không cư trú trong nền kinh tế báo cáo trong nước, bao gồm thu nhập tái đầu tư và các khoản vay nội bộ của công ty, vốn hồi hương ròng và hoàn trả các khoản vay
d1 <- data.frame(WDI(country="VNM", indicator="BX.KLT.DINV.WD.GD.ZS", start= 1985, end= 2022))
year1 <- d1$year
value1 <- d1$BX.KLT.DINV.WD.GD.ZS
plot(year1, value1, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%GDP", main="Đồ thị Đầu tư trực tiếp từ nước ngoài tại Việt Nam (% GDP)")
=> Nhận xét: Đầu từ trực tiếp từ nước ngoài theo %GDP biến động trong khoảng từ 0% đến 12%, trong đó giai đoạn 1990-2000 và 2005-2010 là có biến động lớn nhất.
Tốc độ tăng dân số hàng năm cho năm t là tốc độ tăng dân số giữa năm theo cấp số nhân từ năm t-1 đến t, được biểu thị bằng phần trăm . Dân số dựa trên định nghĩa thực tế về dân số, tính tất cả cư dân bất kể tình trạng pháp lý hoặc quyền công dân.
d2 <- data.frame(WDI(country="VNM", indicator="SP.POP.GROW", start= 1985, end= 2022))
year2 <- d2$year
value2 <- d2$SP.POP.GROW
plot(year2, value2, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%", main="Đồ thị Tốc độ gia tăng dân số tại Việt Nam (%)")
=> Nhận xét: Từ 1985 đến nay, tốc độ gia tăng dân số Việt Nam có xư hướng giảm dần từ 2,5% tốc độ tăng xuống dần chạm đấy 0,1% vào năm 2022.
Tỷ lệ phần trăm tăng trưởng GDP hàng năm theo giá thị trường tính theo đồng nội tệ cố định. Tổng hợp dựa trên giá cố định năm 2015, được biểu thị bằng đô la Mỹ. GDP là tổng giá trị gia tăng của tất cả các nhà sản xuất thường trú trong nền kinh tế cộng với bất kỳ loại thuế sản phẩm nào và trừ đi bất kỳ khoản trợ cấp nào không được tính vào giá trị của sản phẩm. Nó được tính toán mà không thực hiện khấu trừ khấu hao tài sản chế tạo hoặc cạn kiệt và suy thoái tài nguyên thiên nhiên.
d3 <- data.frame(WDI(country="VNM", indicator="NY.GDP.MKTP.KD.ZG", start= 1985, end= 2022))
year3 <- d3$year
value3 <- d3$NY.GDP.MKTP.KD.ZG
plot(year3, value3, type="l", col="blue", lwd=5, xlab="%", ylab="YEAR", main="Đồ thị Tốc độ trăng trưởng GDP tại Việt Nam (%)")
=> Nhận xét: Tốc độ tăng trường GDP từ 1985-2020 biến động trong khoảng 2% đến 10% và tập trung trong khoảng 5% đến 7%, tuy nhiên năm 2020, 2021 có sự xụt giảm % tăng GDP nghiêm trọng từ 7& xuống gần 2%.
Lạm phát được đo bằng chỉ số giá tiêu dùng phản ánh phần trăm thay đổi hàng năm trong chi phí để người tiêu dùng trung bình mua một rổ hàng hóa và dịch vụ có thể cố định hoặc thay đổi theo các khoảng thời gian xác định.
d4 <- data.frame(WDI(country="VNM", indicator="FP.CPI.TOTL.ZG", start= 1985, end= 2022))
year4 <- d4$year
value4 <- d4$FP.CPI.TOTL.ZG
plot(year4, value4, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%", main="Đồ thị % Lạm phát, Giá tiêu dùng tại Việt Nam")
=> Nhận xét: tỉ lệ lạm phát ở Việt Năm từ 1997 đến 2022 chủ yêu tập trùng ở khoảng 3% đến 5%, tuy nhiên ở những năm 2009 có sự tăng tỉ lệ lạm phát đột biến lên đến 23%.
Khí thải carbon dioxide là những khí phát sinh từ việc đốt nhiên liệu hóa thạch và sản xuất xi măng. Chúng bao gồm carbon dioxide được tạo ra trong quá trình tiêu thụ nhiên liệu rắn, lỏng, khí và khí đốt.
d5 <- data.frame(WDI(country="VNM", indicator="EN.ATM.CO2E.PC", start= 1985, end= 2022))
year5 <- d5$year
value5 <- d5$EN.ATM.CO2E.PC
plot(year5, value5, type="l", col="blue", lwd=5, xlab="YEAR", ylab="tấn/người", main="Đồ thị lượng khí thải CO2 (tấn/người) tại Việt Nam")
=> Nhận xét: Khí thải CO2 ở Việt Nam từ 1990 đến 2020 có xu hướng tăng dần đều từ 0,3 tấn/người lên 3,6 tấn/người.
Người dùng Internet là những cá nhân đã sử dụng Internet (từ bất kỳ vị trí nào) trong 3 tháng qua. Internet có thể được sử dụng thông qua máy tính, điện thoại di động, trợ lý kỹ thuật số cá nhân, máy trò chơi, TV kỹ thuật số, v.v.
d6 <- data.frame(WDI(country="VNM", indicator="IT.NET.USER.ZS", start= 1985, end= 2022))
year6 <- d6$year
value6 <- d6$IT.NET.USER.ZS
plot(year6, value6, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%", main="Đồ thị % cá nhân sử dụng internet tại Việt Nam")
=> Nhận xét: Cá nhân sử dụng internet ở Việt NAm tăng dần đều từ 0% vào năm 1990 lên 70% vào năm 2021.
Tiếp cận điện năng là tỷ lệ phần trăm dân số được sử dụng điện. Dữ liệu điện khí hóa được thu thập từ các cuộc điều tra công nghiệp, quốc gia và các nguồn quốc tế.
d7 <- data.frame(WDI(country="VNM", indicator="EG.ELC.ACCS.ZS", start= 1985, end= 2022))
year7 <- d7$year
value7 <- d7$EG.ELC.ACCS.ZS
plot(year7,value7, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%", main="Đồ thị % tiếp cận được điện năng (% Dân số) tại Việt Nam")
=> Nhận xét: Mức độ tiếp cận điện của người dân Việt Nam có xu hướng tăng khi tăng từ 77% lên 99,5% vào năm 2021.
Các vụ giết người có chủ ý là ước tính của các vụ giết người trái pháp luật có chủ ý gây ra do tranh chấp trong nước, bạo lực giữa các cá nhân, xung đột bạo lực về tài nguyên đất đai, bạo lực giữa các băng đảng để giành lãnh thổ hoặc quyền kiểm soát, bạo lực cướp bóc và giết chóc của các nhóm vũ trang. Cố ý giết người không bao gồm tất cả các hành vi cố ý giết người; sự khác biệt thường là trong việc tổ chức giết chóc. Các cá nhân hoặc nhóm nhỏ thường phạm tội giết người, trong khi giết người trong xung đột vũ trang thường được thực hiện bởi các nhóm khá gắn kết lên đến vài trăm thành viên và do đó thường bị loại trừ.
d8 <- data.frame(WDI(country="VNM", indicator="VC.IHR.PSRC.P5", start= 1985, end= 2022))
year8 <- d8$year
value8 <- d8$VC.IHR.PSRC.P5
plot(year8,value8, type="l", col="blue", lwd=5, xlab="YEAR", ylab="mỗi 100,000 người", main="Đồ thị Cố ý giết người (trên mỗi 100.000 dân) tại Việt Nam")
=> Dữ liệu thống kê chưa đầy đủ => Thiếu thông tin nhận xét.
Di cư ròng là tổng số người di cư thuần trong kỳ, nghĩa là số người nhập cư trừ đi số người xuất cư, bao gồm cả công dân và người không phải công dân.
d9 <- data.frame(WDI(country="VNM", indicator="SM.POP.NETM", start= 1985, end= 2022))
year9 <- d9$year
value9 <- d9$SM.POP.NETM
plot(year9,value9, type="l", col="blue", lwd=5, xlab="YEAR", ylab="số người", main="Đồ thị Di cư ròng tại Việt Nam")
=> Nhận xét: Những năm 2000 là những năm có lượng người xuất cư cao hơn rất nhiều so với nhập cư vì từ những năm 2000, do chính sách mở cửa của Nhà nước trong quan hệ đối ngoại và ảnh hưởng của quá trình toàn cầu hoá. Số người Việt Nam ra nước ngoài được tạo điều kiện và xuất cư một cách tập trung.
Diện tích rừng là đất dưới các tán cây tự nhiên hoặc được trồng tại chỗ với chiều cao ít nhất 5 mét, cho dù có năng suất hay không, và không bao gồm các gốc cây trong hệ thống sản xuất nông nghiệp (ví dụ: trong các đồn điền cây ăn quả và hệ thống nông lâm kết hợp) và cây cối trong công viên và vườn đô thị .
d10 <- data.frame(WDI(country="VNM", indicator="AG.LND.FRST.ZS", start= 1985, end= 2022))
year10 <- d10$year
value10 <- d10$AG.LND.FRST.ZS
plot(year10,value10, type="l", col="blue", lwd=5, xlab="YEAR", ylab="%", main="Đồ thị % Diện tích rừng Việt Nam")
=> Nhận xét: từ 1990-2020, diện tích rừng ở Việt Nam có xu hướng tăng dần đều từ 28% vào năm 1990 lên 47% vào năm 2020.
Sử dụng package rio để import() và export() linh hoạt nhiều loại tệp
Sử dụng package here để định vị tệp liên quan đến dự án R gốc - để ngăn ngừa sự phức tạp do nhiều đường dẫn tệp chỉ dành riêng cho một máy tính
Các tình huống nhập dữ liệu thường gặp: Nhập từ một Trang tính Excel, Có tiêu đề sắp xếp lộn xộn và cần bỏ qua một số hàng, Nhập trang tính của Google,…
nam <- c(1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997)
nangsuat <- c(6, 10, 12, 14, 16, 18, 22, 24, 26, 32)
mucphanbon <- c(40, 44, 46, 48, 52, 58, 60, 68, 74, 80)
xyz <- data.frame( nam, nangsuat , mucphanbon)
head(xyz, 5)
## nam nangsuat mucphanbon
## 1 1988 6 40
## 2 1989 10 44
## 3 1990 12 46
## 4 1991 14 48
## 5 1992 16 52
count_data <- import("malaria_facility_count_data.rds")
head(count_data, 5)
## # A tibble: 5 × 10
## location_name data_date submitted_date Province District `malaria_rdt_0-4`
## <chr> <date> <date> <chr> <chr> <int>
## 1 Facility 1 2020-08-11 2020-08-12 North Spring 11
## 2 Facility 2 2020-08-11 2020-08-12 North Bolo 11
## 3 Facility 3 2020-08-11 2020-08-12 North Dingo 8
## 4 Facility 4 2020-08-11 2020-08-12 North Bolo 16
## 5 Facility 5 2020-08-11 2020-08-12 North Bolo 9
## # ℹ 4 more variables: `malaria_rdt_5-14` <int>, malaria_rdt_15 <int>,
## # malaria_tot <int>, newid <int>
library("readxl")
hoiquy1 <- read_excel("/Users/84896/Downloads/Hoiquydon.xlsx", sheet="Sheet1")
hoiquy1
## # A tibble: 10 × 3
## Năm nangsuat mucphanbon
## <dbl> <dbl> <dbl>
## 1 1988 6 40
## 2 1989 10 44
## 3 1990 12 46
## 4 1991 14 48
## 5 1992 16 52
## 6 1993 18 58
## 7 1994 22 60
## 8 1995 24 68
## 9 1996 26 74
## 10 1997 32 80
Dataset được chọn là “rock” từ package “dataset”. “rock” là một khung dữ liệu về khảo sát các mẫu đá trong một mỏ dầu chứa 46 quan sát trên 3 biến:
data("rock")
head(rock)
## area peri shape perm
## 1 4990 2792 0.09033 6.3
## 2 7002 3893 0.14862 6.3
## 3 7558 3931 0.18331 6.3
## 4 7352 3869 0.11706 6.3
## 5 7943 3949 0.12242 17.1
## 6 7979 4010 0.16704 17.1
rock |> ggplot(map = aes(x = area, y = peri)) + geom_point(color="red") + xlab("Area") + ylab("Peri") + labs(title = 'Đồ thị scatter thể hiện mối liên hệ giữa biến are và biến peri')
rock |> ggplot(map = aes(x = area, y = peri)) + geom_point(color="red") + xlab("Area") + ylab("Peri") + labs(title = 'Đồ thị scatter thể hiện mối liên hệ giữa biến area và biến peri') + geom_smooth(formula = y ~ x, method = 'lm', color = 'black')
data("Parade2005")
Parade2005 |> ggplot(aes(x = gender, y = after_stat(count))) +
geom_bar(fill = 'blue') +
geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - .5) +
theme_classic() +
labs(x = 'Giới tính', y = 'Số người')
Parade2005 |> ggplot(aes(x = gender, y = after_stat(count))) +
geom_bar(fill = 'blue') +
geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - .5) + facet_grid(. ~ celebrity) +
theme_classic() +
labs(x = 'Giới tính', y = 'Số người')
Parade2005 |> ggplot(aes(x = gender)) +
geom_bar(aes(y = after_stat(count), fill = celebrity), stat = 'count') +
ylab('Giới Tính') +
xlab('Số Người')
pie(tabThuNhap4, main = "Biểu đồ tròn của biến Giới Tính")
tabGioiTinh4=table(GioiTinh4)
pie(tabGioiTinh4, main = "Biểu đồ tròn của biến Giới Tính")
tabNoiTieng4=table(NoiTieng4)
pie(tabNoiTieng4, main = "Biểu đồ tròn của biến Nổi Tiếng" )
hoiquy1 <- read_excel("/Users/84896/Downloads/Hoiquydon.xlsx", sheet="Sheet1")
head(hoiquy1,4)
## # A tibble: 4 × 3
## Năm nangsuat mucphanbon
## <dbl> <dbl> <dbl>
## 1 1988 6 40
## 2 1989 10 44
## 3 1990 12 46
## 4 1991 14 48
hoiquy1 |> ggplot(map = aes(x = mucphanbon, y = nangsuat)) + geom_point(color="red") + xlab("Mức phân bón (tạ/ha)") + ylab("Năng suất lúa (tạ/ha)") + geom_smooth(formula = y ~ x, method = 'lm', color = 'black') + labs(title = 'Đồ Thị thể hiện sự tương quan giữa Mức phân bón và Năng suất')
cor.test(mucphanbon, nangsuat)
##
## Pearson's product-moment correlation
##
## data: mucphanbon and nangsuat
## t = 16, df = 8, p-value = 2e-07
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9374 0.9967
## sample estimates:
## cor
## 0.9854
Ý nghĩa: Hệ số tương quan Pearson chỉ hợp lí nếu biến số x và y tuân theo luật phân phối chuẩn. Nếu x và y không tuân theo luật phân phối chuẩn, chúng ta phải sử dụng một hệ số tương quan khác tên là Spearman, một phương pháp phân tích phi tham số. Hệ số này được ước tính bằng cách biến đổi hai biến số x và y thành thứ bậc (rank), và xem độ tương quan giữa hai dãy số bậc. Do đó, hệ số còn có tên tiếng Anh là Spearman’s Rank correlation
Giả sử năng suất và mức phân bón không có phân phối chuẩn, ta có:
cor.test(mucphanbon,nangsuat, method="spearman")
##
## Spearman's rank correlation rho
##
## data: mucphanbon and nangsuat
## S = 3.7e-14, p-value <2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 1
cor.test(mucphanbon, nangsuat, method="kendall")
##
## Kendall's rank correlation tau
##
## data: mucphanbon and nangsuat
## T = 45, p-value = 6e-07
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 1
lm(mucphanbon ~ nangsuat)
##
## Call:
## lm(formula = mucphanbon ~ nangsuat)
##
## Coefficients:
## (Intercept) nangsuat
## 27.12 1.66
reg <- lm(nangsuat~mucphanbon)
summary(reg)
##
## Call:
## lm(formula = nangsuat ~ mucphanbon)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.0539 -0.5477 0.0208 0.8299 2.2448
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -15.3488 2.0864 -7.36 7.9e-05 ***
## mucphanbon 0.5851 0.0357 16.38 1.9e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.44 on 8 degrees of freedom
## Multiple R-squared: 0.971, Adjusted R-squared: 0.967
## F-statistic: 268 on 1 and 8 DF, p-value: 1.94e-07
Kiểm định sự phù hợp mô hình: ta có F= 268.3>C nên mô hình trên là phù hợp
Kiểm định biến mucphanbon thay đổi ảnh hưởng đến biến nangsuat: ta có t-value=16.381>C nên biến mucphanbon thay đổi dẫn đến sự thay đổi của biến nangsuat
ketqua <- -15.35 + 0.585*50
ketqua
## [1] 13.9
=> Vậy kết quả khi mức phân bón là 50 tạ/ha thì năng suất sẽ là 13.9 tạ/ha
“rock: là một khung dữ liệu có 48 quan sát và 4 biến gồm:
area: diện tích lỗ rỗng, tính bằng pixel trên 256 x 256
peri: chu vi tính bằng pixel
shape: hình chu vi/sqrt(diện tích)
perm: độ thấm perm tính bằng milli-Darcies
rock |> ggplot(map = aes(x = area, y = peri)) + geom_point(color="red") + xlab("Area") + ylab("Peri") + labs(title = 'Đồ thị scatter thể hiện mối liên hệ giữa biến area và biến peri') + geom_smooth(formula = y ~ x, method = 'lm', color = 'black')
area <- rock$area
peri <- rock$peri
cor.test(area,peri)
##
## Pearson's product-moment correlation
##
## data: area and peri
## t = 9.8, df = 46, p-value = 8e-13
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7026 0.8970
## sample estimates:
## cor
## 0.8225
Ý nghĩa: Hệ số tương quan Pearson chỉ hợp lí nếu biến số x và y tuân theo luật phân phối chuẩn. Nếu x và y không tuân theo luật phân phối chuẩn, chúng ta phải sử dụng một hệ số tương quan khác tên là Spearman, một phương pháp phân tích phi tham số. Hệ số này được ước tính bằng cách biến đổi hai biến số x và y thành thứ bậc (rank), và xem độ tương quan giữa hai dãy số bậc. Do đó, hệ số còn có tên tiếng Anh là Spearman’s Rank correlation
Giả sử năng suất và mức phân bón không có phân phối chuẩn, ta có:
cor.test(area, peri, method="spearman")
##
## Spearman's rank correlation rho
##
## data: area and peri
## S = 2616, p-value = 7e-15
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.858
cor.test(area, peri,method="kendall")
##
## Kendall's rank correlation tau
##
## data: area and peri
## z = 6.9, p-value = 4e-12
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 0.693
lm(peri ~ area)
##
## Call:
## lm(formula = peri ~ area)
##
## Coefficients:
## (Intercept) area
## -471.436 0.439
bangthongke2 <- lm(peri~area)
summary(bangthongke2)
##
## Call:
## lm(formula = peri ~ area)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2307 -502 122 565 1292
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -471.4358 342.7749 -1.38 0.18
## area 0.4388 0.0447 9.81 7.5e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 823 on 46 degrees of freedom
## Multiple R-squared: 0.677, Adjusted R-squared: 0.669
## F-statistic: 96.2 on 1 and 46 DF, p-value: 7.51e-13
Kiểm định sự phù hợp mô hình: ta có F= 18.1>C nên mô hình trên là phù hợp
Kiểm định biến giá gói thay đổi ảnh hưởng đến biến số gói: ta có t-value=4.25>C nên biến area thay đổi dẫn đến sự thay đổi của biến peri.
ketqua2 <- -471.44 + 0.44*10000
ketqua2
## [1] 3929
=> Vậy kết quả khi giá trị của biến area=10000 thì trung bình giá trị của biến peri=3929.
df <- data.frame(player=c('A', 'B', 'C', 'D', "E", "F"),
year1=c(13, 15, 19, 19, 20 ,21),
year2=c(22, 29, 18, 12, 13, 16))
df
## player year1 year2
## 1 A 13 22
## 2 B 15 29
## 3 C 19 18
## 4 D 19 12
## 5 E 20 13
## 6 F 21 16
df %>% pivot_longer(cols=c('year1', 'year2'),
names_to='year',
values_to='points')
## # A tibble: 12 × 3
## player year points
## <chr> <chr> <dbl>
## 1 A year1 13
## 2 A year2 22
## 3 B year1 15
## 4 B year2 29
## 5 C year1 19
## 6 C year2 18
## 7 D year1 19
## 8 D year2 12
## 9 E year1 20
## 10 E year2 13
## 11 F year1 21
## 12 F year2 16
data("billboard")
bi <- billboard
dy <- bi |> pivot_longer(cols=starts_with("wk"), names_to="tuần", values_to="hạng")
head(dy, 5)
## # A tibble: 5 × 5
## artist track date.entered tuần hạng
## <chr> <chr> <date> <chr> <dbl>
## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk1 87
## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk2 82
## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk3 72
## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk4 77
## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk5 87
dx <- dy |> pivot_wider(names_from="tuần", values_from="hạng")
head(dx, 5)
## # A tibble: 5 × 79
## artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
## <chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA
## 2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA
## 3 3 Doors Do… Kryp… 2000-04-08 81 70 68 67 66 57 54 53
## 4 3 Doors Do… Loser 2000-10-21 76 76 72 69 67 65 55 59
## 5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49
## # ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
## # wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
## # wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
## # wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
## # wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
## # wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>,
## # wk43 <dbl>, wk44 <dbl>, wk45 <dbl>, wk46 <dbl>, wk47 <dbl>, wk48 <dbl>, …
Nam <- subset(Pa4, GioiTinh4=="male")
head(Nam,4)
## earnings age gender state celebrity
## 1 10000 26 male ND no
## 3 85000 39 male NE no
## 5 91500 61 male DE no
## 8 30000 24 male NM no
Tren35 <- subset(Pa4, Tuoi4>35)
head(Tren35,4)
## earnings age gender state celebrity
## 3 85000 39 male NE no
## 4 75000 50 female NC no
## 5 91500 61 male DE no
## 6 49500 39 female SD no
N35 <- subset(Pa4, Tuoi4>35 & GioiTinh4=="male")
head(N35,4)
## earnings age gender state celebrity
## 3 85000 39 male NE no
## 5 91500 61 male DE no
## 10 23000 45 male VA no
## 14 65500 36 male ID no
data123 <- Pa4[, c(1,2,3)]
head(data123,5)
## earnings age gender
## 1 10000 26 male
## 2 10000000 18 female
## 3 85000 39 male
## 4 75000 50 female
## 5 91500 61 male
data3 <- Pa4[1:3, c(1,2,3)]
head(data3)
## earnings age gender
## 1 1.0e+04 26 male
## 2 1.0e+07 18 female
## 3 8.5e+04 39 male
ThuNhap4moi <- (ThuNhap4 + Tuoi4)
Tuoi4moi <- (Tuoi4+2)
d1 <- data.frame(ThuNhap4, Tuoi4, ThuNhap4moi)
d2 <- data.frame(d1, Tuoi4moi)
head(d2,4)
## ThuNhap4 Tuoi4 ThuNhap4moi Tuoi4moi
## 1 1.0e+04 26 10026 28
## 2 1.0e+07 18 10000018 20
## 3 8.5e+04 39 85039 41
## 4 7.5e+04 50 75050 52
Pa4$state[Pa4$Bang4=="NE" & Pa4$age > 30] <- 0
## Warning in `[<-.factor`(`*tmp*`, Pa4$Bang4 == "NE" & Pa4$age > 30, value =
## structure(c(28L, : invalid factor level, NA generated
head(Pa4,6)
## earnings age gender state celebrity
## 1 10000 26 male ND no
## 2 10000000 18 female CA yes
## 3 85000 39 male NE no
## 4 75000 50 female NC no
## 5 91500 61 male DE no
## 6 49500 39 female SD no
Pa4$GiauNgheo[ThuNhap4 >= 10000000] <- 'giau'
Pa4$GiauNgheo[ThuNhap4 < 10000000 & ThuNhap4 >= 500000] <- 'vua'
Pa4$GiauNgheo[ThuNhap4 < 500000] <- 'ngheo'
head(Pa4,4)
## earnings age gender state celebrity GiauNgheo
## 1 1.0e+04 26 male ND no ngheo
## 2 1.0e+07 18 female CA yes giau
## 3 8.5e+04 39 male NE no ngheo
## 4 7.5e+04 50 female NC no ngheo
table(GioiTinh4)
## GioiTinh4
## female male
## 62 68
b <- rbinom(1000, 20, 0.477)
table(b)
## b
## 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
## 2 3 16 61 103 122 169 203 122 94 70 22 10 2 1
hist(b, main="Phân phối nhị phân của biến giới tính nữ")
Ý nghĩa: Hàm phân phối Poisson, nói chung, rất giống với hàm nhị phân, ngoại trừ thông số p thường rất nhỏ và n thường rất lớn. Vì thế, hàm Poisson thường được sử dụng để mô tả các biến số rất hiếm xảy ra.
Qua số liệu đã thống kê, ta biết được tỉ lệ người được khảo sát là người nổi tiếng là 11/130=0.085.Tính trung bình cứ khoảng 2.000 người thì thì có 17 người nổi tiếng. Hỏi xác suất chọn trúng 2 người nổi tiếng là bao nhiêu
dpois(2, 8.5)
## [1] 0.00735
tabGioiTinh4=table(GioiTinh4)
barplot(tabGioiTinh4, main= "Biểu đồ biến Giới Tính" )
tabNoiTieng4=table(NoiTieng4)
barplot(tabNoiTieng4, main= " Biểu đồ biến Nổi Tiếng" )
tabBang4 = table(Bang4)
barplot(tabBang4, main= "Biểu đồ biến các Bang")
BangThuNhap4 <- cut(ThuNhap4, breaks = c(10000, 50000, 250000, 1000000,10000000, 42000000 ), labels = c("thap", "trungbinh", "trungbinhcao","cao", "ratcao"), right = TRUE)
tabThuNhap4 = table(BangThuNhap4)
barplot(tabThuNhap4, main= "Biểu đồ biến Thu Nhập")
BangTuoi4 <- cut(Tuoi4, breaks = c(18, 30, 40, 52), labels = c("18-30", "30-40", "40-50"), right = TRUE)
tabTuoi4=table(BangTuoi4)
barplot(tabTuoi4, main= "Biểu đồ biến Thu Nhập")
stripchart(ThuNhap4, main= "Biểu đồ Strip của biến Thu Nhập", xlab = "Thu Nhập")
stripchart(Tuoi4, main= "Biểu đồ Strip của biến Tuổi", xlab = "Tuổi")
tabTNT4 = table(BangThuNhap4, BangTuoi4)
barplot(tabTNT4, beside=TRUE, xlab="Độ tuổi", ylab= "Tần số")
tabGTNT4=table(NoiTieng4, GioiTinh4)
barplot(tabGTNT4, beside=TRUE, xlab="Giới Tính", ylab= "Tần số")
pie(tabThuNhap4, main = "Biểu đồ tròn của biến Giới Tính")
pie(tabGioiTinh4, main = "Biểu đồ tròn của biến Giới Tính")
pie(tabNoiTieng4, main = "Biểu đồ tròn của biến Nổi Tiếng" )
pie(tabTuoi4, main = "Biểu đồ tròn của biến Tuổi")
plot(ThuNhap4, Tuoi4)
mean(ThuNhap1)
## [1] 1503412
median(ThuNhap1)
## [1] 50000
mean(Tuoi1)
## [1] 39.18
median(Tuoi1)
## [1] 38.5
var(ThuNhap1)
## [1] 3.495e+13
sd(ThuNhap1)
## [1] 5912241
var(Tuoi1)
## [1] 122.9
sd(Tuoi1)
## [1] 11.09
BangThuNhap1 <- cut(ThuNhap1, breaks = c(10000, 50000, 250000, 1000000,10000000, 42000000 ), labels = c("thap", "trungbinh", "trungbinhcao","cao", "ratcao"), right = TRUE)
tabThuNhap1=table(BangThuNhap1)
tabThuNhap1
## BangThuNhap1
## thap trungbinh trungbinhcao cao ratcao
## 66 51 3 2 7
BangTuoi1 <- cut(Tuoi1, breaks = c(18, 30, 40, 52), labels = c("18-30", "30-40", "40-50"), right = TRUE)
tabTuoi1=table(BangTuoi1)
tabTuoi1
## BangTuoi1
## 18-30 30-40 40-50
## 32 44 33
table(GioiTinh1)
## GioiTinh1
## female male
## 62 68
barplot(tabThuNhap1, xlab = "Thu Nhập", ylab = "Tần số", main = "Biểu đồ tần số của biến Thu Nhập", col = c("red", "green", "blue", "pink", "white"))
barplot(tabTuoi1, xlab = "Tuổi", ylab = "Tần số", main = "Biểu đồ tần số của Biến Tuổi", col = c("red", "green", "blue"))
barplot(table(GioiTinh1), xlab = "Tuổi", ylab = "Tần số", main = "Biểu đồ tần số của Giới Tính", col = c("red", "green"))
chisq.test(ThuNhap1, Tuoi1, correct=FALSE)
##
## Pearson's Chi-squared test
##
## data: ThuNhap1 and Tuoi1
## X-squared = 3735, df = 3526, p-value = 0.007
tabTNT1=table(BangThuNhap1, BangTuoi1)
tabTNT1
## BangTuoi1
## BangThuNhap1 18-30 30-40 40-50
## thap 21 25 13
## trungbinh 5 16 18
## trungbinhcao 1 0 1
## cao 1 0 0
## ratcao 3 3 1
plot(vearnandage18den30, xlab = "Mức Thu Nhập: Thấp - Tr.Bình - Cao - Rất Cao", ylab = "Tần Số", main = "Biểu đồ tần số của biến Thu Nhập ở độ tuổi 18 đến 30", col = c("red", "green", "blue","white"))+plot(vearnandage30den45, xlab = "Mức Thu Nhập: Thấp - Tr.Bình - Cao - Rất Cao", ylab = "Tần Số", main = "Biểu đồ tần số của biến Thu Nhập ở độ tuổi 30 đến 40", col = c("red", "green", "blue","white"))+plot(vearnandage45den52, xlab = "Mức Thu Nhập: Thấp - Tr.Bình - Cao - Rất Cao", ylab = "Tần Số", main = "Biểu đồ tần số của biến Thu Nhập ở độ tuổi 40 đến 52", col = c("red", "green", "blue","white"))
## integer(0)
chisq.test(ThuNhap1, GioiTinh1, correct=FALSE)
##
## Pearson's Chi-squared test
##
## data: ThuNhap1 and GioiTinh1
## X-squared = 85, df = 86, p-value = 0.5
library(AER)
data("Parade2005")
head(Parade2005,4)
## earnings age gender state celebrity
## 1 1.0e+04 26 male ND no
## 2 1.0e+07 18 female CA yes
## 3 8.5e+04 39 male NE no
## 4 7.5e+04 50 female NC no
Pa <- Parade2005
names(Pa) <- c("ThuNhap","Tuoi","GioiTinh","Bang","NoiTieng")
ThuNhap <- Pa$ThuNhap
Tuoi <- Pa$Tuoi
GioiTinh <- Pa$GioiTinh
x <- Pa[, c("ThuNhap","Tuoi","GioiTinh")]
str(x)
## 'data.frame': 130 obs. of 3 variables:
## $ ThuNhap : num 10000 10000000 85000 75000 91500 49500 105000 30000 40000 23000 ...
## $ Tuoi : num 26 18 39 50 61 39 31 24 24 45 ...
## $ GioiTinh: Factor w/ 2 levels "female","male": 2 1 2 1 2 1 1 2 1 2 ...
library(ggplot2)
barplot(ThuNhap, xlab = "", ylab = "Thu Nhập", main = "Biểu đồ thể hiện dữ liệu của biến Thu Nhập", col = c("red", "green", "blue", "pink", "white"))
barplot(Tuoi, xlab = "", ylab = "Tuổi", main = "Biểu đồ thể hiện dữ liệu của biến Tuổi", col = c("red", "green", "blue", "pink", "white"))
m <- Pa[Pa$GioiTinh=='male' & Pa$ThuNhap > 20000000, ]
head(m)
## ThuNhap Tuoi GioiTinh Bang NoiTieng
## 13 2.1e+07 20 male OH yes
## 29 2.5e+07 51 male FL yes
## 96 4.2e+07 28 male IN yes
ThuNhaptang = Pa[order(Pa$ThuNhap), ]
head(ThuNhaptang,4)
## ThuNhap Tuoi GioiTinh Bang NoiTieng
## 1 10000 26 male ND no
## 100 11000 43 female IN no
## 21 12000 39 female MI no
## 94 12000 27 female VA no
BangThuNhap <- cut(ThuNhap, breaks = c(10000, 50000, 250000, 1000000,10000000, 42000000 ), labels = c("thap", "trungbinh", "trungbinhcao","cao", "ratcao"), right = TRUE)
tabThuNhap=table(BangThuNhap)
tabThuNhap
## BangThuNhap
## thap trungbinh trungbinhcao cao ratcao
## 66 51 3 2 7
BangTuoi <- cut(Tuoi, breaks = c(18, 30, 40, 52), labels = c("18-30", "30-40", "40-50"), right = TRUE)
tabTuoi=table(BangTuoi)
tabTuoi
## BangTuoi
## 18-30 30-40 40-50
## 32 44 33