1 BÀI TẬP VỀ NHÀ 5 (TUẦN 6)

1.1 WEB SCRAPING DATA - GIÁ BITCOIN 30 NGÀY GẦN NHẤT

1.1.1 Web Scraping và dữ liệu giá Bitcoin

1.1.1.1 Web Scraping là gì?

     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)

1.1.1.2 Nạp dữ liệu giá Bitcoin từ webstie investing.com

     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%
  • Giải thích các biến của dataset bitcoin:
    • Date: ngày.
    • Price: giá thị trường của Bitcoin ($)
    • Open: giá mở bán của Bitcoin ($)
    • High: giá cao nhất trong ngày của Bitcoin ($)
    • Low: giá thấp nhất trong ngày của Bitcoin ($)

1.2 PHÂN TÍCH CHUỖI THỜI GIAN DỮ LIỆU GIÁ BITCOIN

1.2.1 Xử lý xử liệu giá Bitcoin

1.2.1.1 Xử lý dữ liệu vecto character thành numberic

     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 ","

1.2.1.2 Sắp xếp lại thứ tự vecto giá bitoin cho phù hợp phân tích

     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

1.2.1.3 Chuyển đổi thành dữ liệu chuỗi thời gian

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

1.2.2 Vẽ đồ thị lịch sử giá bitcoin

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

1.2.3 Phân rã chuỗi không có yếu tố mùa vụ

     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.

1.2.4 Kiểm định tính dừ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

1.2.5 Dự báo giá Bitcoin bằng hàm mũ Holt

     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

1.2.6 Chuỗi thời gian đa biến cho dữ liệu giá Bitcoin và Ethereum

1.2.6.1 Bitcoin - Ethereum

     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, BitcoinEthereum đứ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ý.

1.2.6.2 Tạo 1 dataset gồm 2 biến giá của Bitcoin và Ethereum

     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

1.2.6.3 Vẽ đồ thị giá của Bitcoin và Ethereum

plot.ts(BitEthex)

autoplot(BitEthex)

1.2.6.4 Hệ số tương quan giữa 2 chuỗi thời gian về giá của Bitcoin - Ethereum

     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.

1.3 VIẾT 1 FUNCTION XỬ LÝ CÔNG VIỆC

1.3.1 Viết hàm cho công việc

     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"))
}

1.3.2 Áp dụng hàm vừa tạo

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

1.4 TÌM HIÊU 10 INDICATOR TỪ DỮ LIỆU WORLDBANK

1.4.1 Mở danh sách các Indicator từ dữ liệu WorldBank

     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 WDIwbstats 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)

1.4.2 Tra cứu 10 Indicator mà tôi muốn quan tâm bằng WDIsearch()

  • ** Net inflows (Dòng vốn vào quốc nội ròng)**
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)

1.4.3 Tìm hiểu 10 indicator trên

     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

1.4.3.1 BN.KLT.DINV.DRS.GDP.ZS - Foreign direct investment, net inflows (% of GDP): Đầu tư trực tiếp nước ngoài, dòng vốn vào ròng (% GDP)

     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.

  • Giải thích xu hướng trên: Giai đoạn từ năm 1990-2000 và 2005-20010 là 2 giai đoạn Việt Nam tăng vốn đầu tư nước ngoài. Điều này có thể do những năm đầu giành lại độc lập cần nguồn vốn phát triển kinh tế và sau đó là những cuộc cải cách công nghệ tại Việt Nam.

1.4.3.2 SP.POP.GROW - Population growth (annual %): Gia tăng dân số (% hàng năm)

     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.

  • Giải thích xu hướng trên: Điều này có thể đến từ kế hoạch hóa gia đình và sự ảnh hưởng của thời đại 4.0 lên tư tưởng hôn nhân, gia đình của người dân.

1.4.3.3 NY.GDP.MKTP.KD.ZG - GDP growth (annual %): Tăng trưởng GDP (% hàng năm)

     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%.

  • Giải thích xu hướng trên: Năm 2020-2021 là những năm GDP Việt Nam sụt giảm nghiêm trọng, nguyên nhân là do dịch Covid-19 bùng phát toàn cầu và Việt Nam phải hạn chế hoạt động sản xuất.

1.4.3.4 FP.CPI.TOTL.ZG - Inflation, consumer prices (annual %): Lạm phát, giá tiêu dùng (%)

     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%.

  • Giải thích xu hướng trên: Những năm 2007-2013 là những năm tỉ lệ lạm phát không ổn định, nguyên nhân là do khủng hoảng kinh tế toàn cầu 2009. Tuy nhiên những năm gần đầy, tỉ lệ làm phát Việt Nam đã ổn định ở mức phù hợp.

1.4.3.5 EN.ATM.CO2E.PC - CO2 emissions (metric tons per capita): Lượng khí thải CO2 (tấn/ người)

     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.

  • Giải thích xu hướng trên: Khí thải CO2 ở Việt Nam ngày càng nghiêm trọng, vấn đề này xuất phát từ quá trình công nghiệp hóa của đất nước và ô nhiễm môi trường ngày càng cao.

1.4.3.6 IT.NET.USER.ZS - Individuals using the Internet (% of population): Cá nhân sử dụng Internet (% dân số)

     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.

  • Giải thích xu hướng trên: % cá nhân sử dụng internet liên tục tăng cao và hiện tại đã lên tới 70%, điều này là do internet ngày càng phổ biến và người dân càng có nhiều điều kiện để tiếp cận.

1.4.3.7 EG.ELC.ACCS.ZS - Access to electricity (% of population): Tiếp cận điện năng của người dân (% dân số)

     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.

  • Giải thích: Người dân Việt Nam được tiếp cận điện năng càng nhiều, tuy nhiên hiện nay ở một số vùng sâu vùng xa vẫn chưa tiếp cận được nguồn điện.

1.4.3.8 VC.IHR.PSRC.P5 - Intentional homicides (per 100,000 people): Cố ý giết người (trên 100.000 dân)

     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.

1.4.3.9 SM.POP.NETM - Net migration: Di cư ròng

     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.

1.4.3.10 AG.LND.FRST.ZS - Forest area (% of land area): % Diện tích rừng

     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.

  • Giải thích xu hướng trên: Diện tích rừng của Việt Nam ngày tăng, vì chiến tranh không còn nên không còn diện tích rừng bị tàn phá, rừng tự nhiên được duy trì ở mức ổn định và rừng trồng tăng lên.

2 BÀI TẬP VỀ NHÀ 4 (TUẦN 4,5)

2.1 Giới thiệu package “rio” và “here”

  • 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,…

2.2 NHẬP DỮ LIỆU

2.2.1 Nhập dữ liệu thủ công

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

2.2.2 Loại tệp đặc trưng của R .rds

  • Chúng ta sẽ sử dụng một bộ dữ liệu .rds giả định về các trường hợp ghi nhận sốt rét hàng ngày, theo cơ sở y tế và nhóm tuổi. File .rds được tải về trên web
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>

2.2.3 Trang tính Excel

  • Để chèn dữ liệu từ file Excel, ta sử dụng package “readxl”
library("readxl")
  • Chúng ta đang có 1 file Excel Hoiquydon.xlsx có sẵn trong ổ đĩa C:/, đọc dữ liệu như sau:
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

2.3 TRỰC QUAN HÓA DỮ LIỆU & GGPLOT2

2.3.1 Mô tả dữ liệu

  • 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:

    • [1] are: diện tích lỗ rỗng, tính bằng pixel trên 256 x 256
    • [2] peri: chu vi tính bằng pixel
    • [3] shape: tỉ số của chu vi và căn hai của diện tích
    • [4] perm: độ thấm perm tính bằng milli-Darcies
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

2.3.2 Đồ thị dạng scatter

2.3.2.1 Với Dataset “rock” ta vẽ được đồ thị scatter như sau

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')

2.3.2.2 Vẽ thêm đường hồi quy tuyến tính tương ứng với dataset “rock”

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')

2.3.2.3 Kết luận nhanh từ 2 đồ thị trên

  • Giữa biến area và biến peri có sự tương quan dương với nhau, cụ thể khi giá trị của biến area tăng thì giá trị của biến peri cũng tăng theo.

2.3.3 Đồ thị dạng cột

  • Ta sử dụng lại dataset Parade2005 từ tuần 1,2,3
data("Parade2005")

2.3.3.1 Đồ thị dạng cột

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')

2.3.3.2 Đồ thị dạng cột theo tiêu chí của 1 biến

  • celebrity: người được khảo sát là người nổi tiếng (yes/no)
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')

2.3.3.3 Đồ thị dạng cột cho 2 biến

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')

2.3.4 Đồ thị dạng tròn

pie(tabThuNhap4, main = "Biểu đồ tròn của biến Giới Tính")

  • thấp: 50.8% - trung bình: 39.2% - trung bình cao: 2.3% - cao: 1.5% - rất cao: 5.4%
tabGioiTinh4=table(GioiTinh4)
pie(tabGioiTinh4, main = "Biểu đồ tròn của biến Giới Tính")

  • female: 47.3% - male 52.7%
tabNoiTieng4=table(NoiTieng4)
pie(tabNoiTieng4, main = "Biểu đồ tròn của biến Nổi Tiếng" )

  • no: 91.5% - yes: 8.5%

2.4 PHÂN TÍCH HỒI QUY ĐƠN

2.4.1 Dữ liệu từ file Excel Hoiquydon.xlsx

2.4.1.1 Mô tả dữ liệu:

  • Cho số liệu về năng suất (Y: tạ/ha) và mức phân bón (X: tạ/ha) của một loại cây trồng từ năm 1988 đến năm 1997 như sau:
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

2.4.1.2 Đồ thị thể hiện sự tương quan giữa năng suất và mức phân bón

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')

  • Kết luận: như vậy giữa hai biến Năng suất và Mức phân bón có quan hệ tương quan tuyến tính với nhau.

2.4.1.3 Các hệ số tương quan tuyến tính

2.4.1.3.1 Hệ số tương quan là gì
  • Hệ số tương quan (r) là một chỉ số thống kê đo lường mối liên hệ tương quan giữa hai biến số, như giữa độ tuổi (x) và cholesterol (y). Hệ số tương quan có giá trị từ -1 đến
  1. Hệ số tương quan bằng 0 (hay gần 0) có nghĩa là hai biến số không có liên hệ gì với nhau; ngược lại nếu hệ số bằng -1 hay 1 có nghĩa là hai biến số có một mối liên hệ tuyệt đối. Nếu giá trị của hệ số tương quan là âm (r <0) có nghĩa là khi x tăng cao thì y giảm (và ngược lại, khi x giảm thì y tăng); nếu giá trị hệ số tương quan là dương (r > 0) có nghĩa là khi x tăng cao thì y cũng tăng, và khi x tăng cao thì y cũng giảm theo
2.4.1.3.2 Hệ số tương quan Person
  • Hệ số tương quan Pearson còn được gọi là hệ số Pearson (Pearson Correlation Coefficient) trong thống kê được định nghĩa là thước đo mối quan hệ thống kê giữa hai biến và sự liên kết của chúng với nhau
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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến năng suất và mức phân bón có quan hệ tương quan tuyến tính với nhau
2.4.1.3.3 Hệ số tương quan Spearman
  • Ý 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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến năng suất và mức phân bón có quan hệ tương quan tuyến tính với nhau
2.4.1.3.4 Hệ số tương quan Kendall
  • Ý nghĩa: Hệ số tương quan Kendall (cũng là một phương pháp phân tích phi tham số) được ước tính bằng cách tìm các cặp số (x, y) “song hành” với nhau. Một cặp (x, y) song hành ở đây được định nghĩa là hiệu (độ khác biệt) trên trục hoành có cùng dấu hiệu (dương hay âm) với hiệu trên trục tung. Nếu hai biến số x và y không có liên hệ với nhau, thì số cặp song hành bằng hay tương đương với số cặp không song hành.
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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến năng suất và mức phân bón có quan hệ tương quan tuyến tính với nhau

2.4.1.4 Hồi quy tuyến tính đơn biến

2.4.1.4.1 Viết hàm hồi quy tuyến tính mẫu SRF
  • Hàm lm (viết tắt từ linear model) trong R có thể tính toán các giá trị của α và β trong mô hình hồi quy đơn: α + β.X
lm(mucphanbon ~ nangsuat)
## 
## Call:
## lm(formula = mucphanbon ~ nangsuat)
## 
## Coefficients:
## (Intercept)     nangsuat  
##       27.12         1.66
  • Kết quả: như vậy mô hình hồi quy đơn có dạng là: SRF= 27.12 + 1.66β
2.4.1.4.2 Kiểm định các giả thuyết
  • Trước tiên ta lập bảng thống kê hồi quy để lấy các kết quả kiểm định:
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

2.4.1.4.3 Dự báo mô hình hồi quy đơn
  • Ta dự đoán mức phân bón bằng 50 vào hàm SRF-hồi quy tuyến tính mẫu, SRF= 27.12 + 1.66β
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

2.4.2 Dữ liệu từ dataset “rock”

2.4.2.1 Mô tả dữ liệu

  • “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

2.4.2.2 Đồ thị thể hiện sự tương quan giữa biến area 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')

  • Kết luận: như vậy giữa hai biến area và peri có quan hệ tương quan tuyến tính với nhau.

2.4.2.3 Các hệ số tương quan tuyến tính

2.4.2.3.1 Hệ số tương quan là gì
  • Hệ số tương quan (r) là một chỉ số thống kê đo lường mối liên hệ tương quan giữa hai biến số, như giữa độ tuổi (x) và cholesterol (y). Hệ số tương quan có giá trị từ -1 đến
  1. Hệ số tương quan bằng 0 (hay gần 0) có nghĩa là hai biến số không có liên hệ gì với nhau; ngược lại nếu hệ số bằng -1 hay 1 có nghĩa là hai biến số có một mối liên hệ tuyệt đối. Nếu giá trị của hệ số tương quan là âm (r <0) có nghĩa là khi x tăng cao thì y giảm (và ngược lại, khi x giảm thì y tăng); nếu giá trị hệ số tương quan là dương (r > 0) có nghĩa là khi x tăng cao thì y cũng tăng, và khi x tăng cao thì y cũng giảm theo
2.4.2.3.2 Hệ số tương quan Person
  • Hệ số tương quan Pearson còn được gọi là hệ số Pearson (Pearson Correlation Coefficient) trong thống kê được định nghĩa là thước đo mối quan hệ thống kê giữa hai biến và sự liên kết của chúng với nhau
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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến area và peri có quan hệ tương quan tuyến tính với nhau
2.4.2.3.3 Hệ số tương quan Spearman
  • Ý 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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến area và peri có quan hệ tương quan tuyến tính với nhau
2.4.2.3.4 Hệ số tương quan Kendall
  • Ý nghĩa: Hệ số tương quan Kendall (cũng là một phương pháp phân tích phi tham số) được ước tính bằng cách tìm các cặp số (x, y) “song hành” với nhau. Một cặp (x, y) song hành ở đây được định nghĩa là hiệu (độ khác biệt) trên trục hoành có cùng dấu hiệu (dương hay âm) với hiệu trên trục tung. Nếu hai biến số x và y không có liên hệ với nhau, thì số cặp song hành bằng hay tương đương với số cặp không song hành.
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
  • Kết luận: ta có p-value < alpha=0.05 nên hai biến area và peri có quan hệ tương quan tuyến tính với nhau.

2.4.2.4 Hồi quy tuyến tính đơn biến

2.4.2.4.1 Viết hàm hồi quy tuyến tính mẫu SRF
  • Hàm lm (viết tắt từ linear model) trong R có thể tính toán các giá trị của α và β trong mô hình hồi quy đơn: α + β.X
lm(peri ~ area)
## 
## Call:
## lm(formula = peri ~ area)
## 
## Coefficients:
## (Intercept)         area  
##    -471.436        0.439
  • Kết quả: như vậy mô hình hồi quy đơn có dạng là: SRF= 5.09 - 1.2X
2.4.2.4.2 Kiểm định các giả thuyết
  • Trước tiên ta lập bảng thống kê hồi quy để lấy các kết quả kiểm định:
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.

2.4.2.4.3 Dự báo mô hình hồi quy đơn
  • Ta dự đoán khi loga giá của thuốc lá = 2 vào hàm SRF-hồi quy tuyến tính mẫu, SRF= 5.09 - 1.2X
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.

3 BÀI TẬP VỀ NHÀ 3 (TUẦN 3)

3.1 Sử dụng hàm pivot trong xoay trục dữ liệu

3.1.1 Tạo 1 data.fram mới để thực hành hàm Pivot_longer

3.1.1.1 Tạo data.fram

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

3.1.1.2 Định dạng dữ liệu từ ngang sang dọc

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

3.1.2 Thực hành pivot_longer với dataset “billboard”

3.1.2.1 Gọi dữ liệu

data("billboard")
bi <- billboard

3.1.2.2 Định dạng dữ liệu từ ngang sang dọc

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

3.1.3 Hàm pivot_wider

3.1.3.1 Định dạng dữ liệu dọc sang sang ngang từ dữ liệu billboard

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>, …

3.2 Biên tập dữ liệu

3.2.1 Tách rời dữ liệu

  • Chỉ riêng những người nam giớigiới
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
  • Chỉ riêng những người có độ tuổi trên 35
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
  • Chỉ riêng những người vừa là nam giới vừa trên 35 tuổi
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

3.2.2 Chiết số liệu từ 1 data.frame

  • Chỉ lấy biến earnings, age, gender từ tập dữ liệu Parade2005
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
  • Chỉ chọn 3 dòng đầu tiên sau khi chọn 3 biến như trên
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

3.2.3 Bổ sung số liệu mới

ThuNhap4moi <- (ThuNhap4 + Tuoi4)
Tuoi4moi <- (Tuoi4+2)

3.2.4 Gộp các biến thành 1 dữ liệu mới

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

3.2.5 Thay dổi dữ liệu:

  • Giới tính là nữ, bang NE, tuoi tren 60 thì thu nhập =0
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

3.2.6 Tạo thêm 1 biến định tính

  • PPhân chia giàu nghèo từ biến định lượng Thu Nhập
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

3.3 CÁC HÀM PHÂN PHỐI NHỊ PHÂN VÀ PHÂN PHỐI POISSON

3.3.1 Hàm phân phối nhị phân

table(GioiTinh4)
## GioiTinh4
## female   male 
##     62     68
  • Ý nghĩa: Biết rằng trong một quần thể quan sát có khoảng 62/130 người thuộc giới tính nữ; nếu chúng ta tiến hành chọn mẫu 1000 lần, mỗi lần chọn 20 người trong quần thể đó một cách ngẫu nhiên, sự phân phối đó sẽ như thế nào?
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
  • Đồ thị thể hiện:
hist(b, main="Phân phối nhị phân của biến giới tính nữ") 

  • Giải thích: Dòng số liệu thứ nhất (2, 3, …, 18) là số người thuộc giới tính nữ trong số 20 người mà chúng ta chọn. Dòng số liệu thứ hai cho chúng ta biết số lần chọn mẫu trong 1000 lần xảy ra.

3.3.2 Hàm phân phối Poisson

  • Ý 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
  • Giải thích: Vậy xác xuất khảo sát được 2 hoặc trên 2 người nổi tiếng trong tổng số mẫu 1000 người là 0,73%

3.4 BIỂU DIỄN DỮ LIỆU BẰNG ĐỒ THỊ

3.4.1 Biểu đồ cột cho 1 biến

tabGioiTinh4=table(GioiTinh4)
barplot(tabGioiTinh4, main= "Biểu đồ biến Giới Tính" ) 

  • female: 47.3% - male 52.7%
tabNoiTieng4=table(NoiTieng4)
barplot(tabNoiTieng4, main= " Biểu đồ biến Nổi Tiếng" )

  • no: 91.5% - yes: 8.5%
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") 

  • thấp: 50.8% - trung bình: 39.2% - trung bình cao: 2.3% - cao: 1.5% - rất cao: 5.4%
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") 

  • 18-30: 24.6% - 30-40: 33.8% - 40-52: 25.4%

3.4.2 Biểu đồ Strip cho 1 biến

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

3.4.3 Biểu đồ cột cho 2 biến

3.4.3.1 Thu Nhập và Tuổi

  • Chú thích: màu đen -> màu xám trắng: thu nhập thấp -> rất cao
tabTNT4 = table(BangThuNhap4, BangTuoi4)
barplot(tabTNT4, beside=TRUE, xlab="Độ tuổi", ylab= "Tần số") 

3.4.3.2 Giới Tính và Nổi Tiếng

  • Chú thích: màu đen -> không nổi tiếng; màu xám -> có nổi tiếng
tabGTNT4=table(NoiTieng4, GioiTinh4)
barplot(tabGTNT4, beside=TRUE, xlab="Giới Tính", ylab= "Tần số") 

3.4.4 Biểu đồ tròn cho 1 biến

pie(tabThuNhap4, main = "Biểu đồ tròn của biến Giới Tính")

  • thấp: 50.8% - trung bình: 39.2% - trung bình cao: 2.3% - cao: 1.5% - rất cao: 5.4%
pie(tabGioiTinh4, main = "Biểu đồ tròn của biến Giới Tính")

  • female: 47.3% - male 52.7%
pie(tabNoiTieng4, main = "Biểu đồ tròn của biến Nổi Tiếng" )

  • no: 91.5% - yes: 8.5%
pie(tabTuoi4, main = "Biểu đồ tròn của biến Tuổi")

  • 18-30: 24.6% - 30-40: 33.8% - 40-52: 25.4%

3.4.5 Biểu đồ tán xạ

3.4.5.1 ThuNhap và Tuoi

 plot(ThuNhap4, Tuoi4)

4 BÀI TẬP VỀ NHÀ 2 (TUẦN 2)

4.1 CHỦ ĐỀ PHÂN TÍCH

  • PHÂN TÍCH SỰ TÁC ĐỘNG CỦA BIẾN TUỔI VÀ GIỚI TÍNH LÊN BIẾN THU NHẬP

4.1.1 Mô tả dữ liệu

4.1.1.1 Dataset

  • “Parade2005” à 1 tập dữ liệu được thu thập ở Mỹ trong năm 2005 bởi tạp chí Parade. Tập dữ liệu này gồm 130 quan sát và 5 biến. Ở chủ đề này, chúng ta sẽ phân tích 3 biến: earnings, age, gender.

4.1.1.2 Các biến

  • earnings: thu nhập cá nhân hàng năm
  • age:tuổi của người được khảo sát
  • gender: giới tính của người được khảo sát

4.1.2 Mục tiêu

  • Đánh giá được độ tập trung và phân tán của dữ liệu.
  • Dùng đồ thị để thể hiện tần số của các biến.
  • Kiểm định rằng càng biến có quan hệ phụ thuộc nhau hay không và phân tích quan hệ ấy bằng đồ thị đơn giản.

4.2 CÁC ĐẠI LƯỢNG ĐO LƯỜNG ĐỘ TẬP TRUNG

4.2.1 Biến Thu Nhập

4.2.1.1 Trung bình

  • Ý nghĩa: được tính là giá trị trung bình cộng của các giá trị.
mean(ThuNhap1)
## [1] 1503412

4.2.1.2 Trung vị

  • Ý nghĩa: là số nằm ở giữa một nhóm các số; có nghĩa là, phân nửa các số có giá trị lớn hơn số trung vị, còn phân nửa các số có giá trị bé hơn số trung vị.
median(ThuNhap1)
## [1] 50000
  • Kết luận: Ta có Mean>Median nên biến Thu Nhập có phân phối lệch phải.

4.2.2 Biến Tuổi

  • Ý nghĩa: được tính là giá trị trung bình cộng của các giá trị.
mean(Tuoi1)
## [1] 39.18

4.2.2.1 Trung vị

  • Ý nghĩa: là số nằm ở giữa một nhóm các số; có nghĩa là, phân nửa các số có giá trị lớn hơn số trung vị, còn phân nửa các số có giá trị bé hơn số trung vị.
median(Tuoi1)
## [1] 38.5
  • Kết luận: Ta có Mean>Median nên biến Thu Nhập có phân phối lệch phải.

4.3 CÁC ĐẠI LƯỢNG ĐO LƯỜNG ĐỘ PHÂN TÁN

4.3.1 Biến Thu Nhập

4.3.1.1 Phương sai

  • Ý nghĩa: là số đại diện cho độ phân tán của các số liệu so với giá trị trung bình.
var(ThuNhap1)
## [1] 3.495e+13

4.3.1.2 Độ lệch chuẩn

  • Ý nghĩa: là số được tính bằng căn hai của phương sai và được thể hiện bằng các đơn vị giống với dữ liệu có sẵn.
sd(ThuNhap1)
## [1] 5912241
  • Kết luận: Biến Thu Nhập có độ phân tán dữ liệu lớn (sd gấp hơn 3 lần mean).

4.3.2 Biến Tuổi

4.3.2.1 Phương sai

  • Ý nghĩa: là số đại diện cho độ phân tán của các số liệu so với giá trị trung bình.
var(Tuoi1)
## [1] 122.9

4.3.2.2 Độ lệch chuẩn

  • Ý nghĩa: là số được tính bằng căn hai của phương sai và được thể hiện bằng các đơn vị giống với dữ liệu có sẵn.
sd(Tuoi1)
## [1] 11.09
  • Kết luận: Biến Tuổi có độ phân tán thấp (sd chỉ bằng khoảng 1/3 so với mean).

4.4 LẬP BẢNG TẦN SỐ VÀ VẼ ĐỒ THỊ GIỮA 2 BIẾN

4.4.1 Lập bảng tần số cho biến Thu Nhập, Tuổi, Giới Tính

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

4.4.2 Vẽ đồ thị cho biến Thu Nhập, Tuổi, Giới Tính

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

4.4.3 Kiểm định Chi bình phương xác định sự phụ thuộc giữa 2 biến

4.4.3.1 Biến Thu Nhập và biến Tuổi

  • Trong kiểm định này, chúng ta phải kiểm tra các giá trị p. Hơn nữa, giống như tất cả các thử nghiệm thống kê, chúng tôi giả định thử nghiệm này là giả thuyết H0 và giả thuyết H1.
  • Chúng ta sẽ bác bỏ giả thuyết H0 nếu giá trị p xuất hiện trong kết quả nhỏ hơn mức ý nghĩa xác định trước, thường là 0,05, thì chúng ta bác bỏ giả thuyết H0
chisq.test(ThuNhap1, Tuoi1, correct=FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  ThuNhap1 and Tuoi1
## X-squared = 3735, df = 3526, p-value = 0.007
  • Ta có giá trị chi bình phương xấp xỉ 3735 và giá trị p-value xấp xỉ 0.0071. Vì chúng ta nhận được giá trị p nhỏ hơn mức ý nghĩa 0,05, chúng ta bác bỏ giả thuyết H0.
  • Như vậy, biến thu nhập (earnings) và biến tuổi (age) trên thực tế là 2 biến phụ thuộc.
4.4.3.1.1 Lập bảng tần số giữa biến Thu Nhập và Tuổi
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
4.4.3.1.2 Vẽ đồ thị biến Thu Nhập theo từng nhóm độ tuổi
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)
4.4.3.1.3 Giải thích kết quả:
  • Nhóm thu nhập thấp từ độ tuổi 18-30 đến độ tuổi 40-52 có xu hướng giảm từ 21 xuống 13 người, trong khi đó nhóm thu nhập trung bình từ độ tuổi 18-30 đến độ tuổi 40-52 có xu hướng tăng từ 5 lên 18 người. Các nhóm thu nhập trung bình cao, cao và rất cao có tần số quá ít để xác định kết xu hướng tăng giảm.
  • Kết luận: biến Tuổi và Thu Nhập có quan hệ tương quan dương khi độ tuổi càng cao thì nhóm thu nhập thấp giảm và thu nhập nhóm trung bình càng tăng.

4.4.3.2 Biến Thu Nhập và biến Giới Tính

  • Trong kiểm định này, chúng ta phải kiểm tra các giá trị p. Hơn nữa, giống như tất cả các thử nghiệm thống kê, chúng tôi giả định thử nghiệm này là giả thuyết H0 và giả thuyết H1.
  • Chúng ta sẽ bác bỏ giả thuyết H0 nếu giá trị p xuất hiện trong kết quả nhỏ hơn mức ý nghĩa xác định trước, thường là 0,05, thì chúng ta bác bỏ giả thuyết H0
chisq.test(ThuNhap1, GioiTinh1, correct=FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  ThuNhap1 and GioiTinh1
## X-squared = 85, df = 86, p-value = 0.5
  • Ta có giá trị chi bình phương xấp xỉ 85 và giá trị p-value xấp xỉ 0.517. Vì chúng ta nhận được giá trị p lớn hơn mức ý nghĩa 0,05, chúng ta chấp nhận giả thiết H0.
  • Như vậy, biến Thu Nhập (earnings) và biến Giới Tính (gender) trên thực tế là 2 biến độc lậplập.

5 BÀI TẬP VỀ NHÀ 1 (TUẦN 1)

5.1 GIẢI THÍCH DỮ LIỆU

5.1.1 Dataset

  • “Parade2005” là 1 tập dữ liệu được thu thập ở Mỹ trong năm 2005 bởi tạp chí Parade. Tập dữ liệu này gồm 130 quan sát và 5 biến.

5.1.2 Các biến

5.1.2.1 earnings

  • Thu nhập cá nhân hàng năm.

5.1.2.2 age

  • Tuổi của người được khảo sát

5.1.2.3 ender

  • Giới tính của người được khảo sát.

5.1.2.4 state

  • Tiểu bang của người được khảo sát.

5.1.2.5 celebrity

  • Người được khảo sát có phải là người nổi tiếng? (yes/no).

5.2 THAO TÁC CƠ BẢN TRÊN DỮ LIỆU

5.2.1 Sử dụng tập dữ liệu “Parade2005”. Và hiển thị 6 quan sát đầu tiên

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

5.2.2 Tiến hành tạo dữ liệu bản sao

Pa <- Parade2005
names(Pa) <- c("ThuNhap","Tuoi","GioiTinh","Bang","NoiTieng")

5.2.3 Truy vấn dữ liệu con

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 ...

5.3 TRỰC QUAN HÓA DỮ LIỆU

5.3.1 Sử dụng Package :ggplot2”

library(ggplot2)

5.3.2 Đồ thị thể hiện dữ liệu

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

5.4 XỬ LÝ DỮ LIỆU

5.4.1 Lọc dữ liệu

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

5.4.2 Sắp xếp lại dữ liệu

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

5.5 LẬP BẢNG TẦN SỐ VÀ ĐỒ THỊ MÔ TẢ

5.5.1 Biến Thu Nhập

5.5.1.1 Bảng tần số

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

5.5.1.2 Giải thích kết quả

  • Phần lớn người được khảo sát thuộc nhóm thu nhập thấp và trung bình (từ 10000$ đến 250000) với tỉlệ rất cao là 90.
  • Trong đó nhóm thu nhập thấp(10000đến50000) chiếm tỉ lệ cao nhất là 50.1%.

5.5.2 Biến Tuổi

5.5.2.1 Bảng tần số

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

5.5.2.2 Giải thích kết quả

  • Phần lớn người được khảo sát thuộc nhóm độ tuổi trung niên (từ 30 đến 45 tuổi) với tỉ lệ cao nhất là 46.2%