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

1.1 WEB SCRAPING - CÀO DỮ LIỆU

1.1.1 Tổng quát về Web scraping

1.1.1.1 Web scraping là gì?

   Web scraping đề cập đến việc trích xuất dữ liệu từ một trang web. Thông tin này được thu thập và sau đó xuất thành định dạng hữu ích hơn cho người dùng (có thể là bảng tính hoặc API).

   Mặc dù web scraping có thể được thực hiện thủ công, nhưng trong hầu hết các trường hợp, các công cụ tự động được ưu tiên khi trích xuất dữ liệu web vì chúng ít tốn kém và hoạt động với tốc độ nhanh hơn.

   Nhưng trong hầu hết các trường hợp, web scraping không phải là một nhiệm vụ đơn giản. Các trang web có nhiều hình dạng và biểu mẫu, do đó, các web scraper (trình trích xuất dữ liệu web) khác nhau về chức năng và tính năng.

1.1.1.2 Web scraping hoạt động như thế nào

   Web scraper tự động hoạt động theo cách khá đơn giản nhưng cũng rất phức tạp. Rốt cuộc, các trang web được xây dựng cho con người hiểu chứ không phải máy móc. Đầu tiên, web scraper sẽ được cung cấp một hoặc nhiều URL để load trước khi trích xuất dữ liệu. Sau đó, scraper sẽ load toàn bộ code HTML cho trang đang đề cập. Những scraper nâng cao hơn sẽ kết xuất toàn bộ trang web, bao gồm các yếu tố CSS và Javascript.

1.1.1.3 Web scraping dùng để làm gì

   Đến thời điểm này, có lẽ bạn có thể nghĩ ra một số cách khác nhau để sử dụng web scraper. Dưới đây là một số công dụng phổ biến nhất:

• Trích xuất giá cổ phiếu vào API ứng dụng

• Trích xuất dữ liệu từ YellowPages để tạo khách hàng tiềm năng

• Trích xuất dữ liệu từ một công cụ định vị cửa hàng để tạo danh sách các địa điểm kinh doanh

• Trích xuất dữ liệu sản phẩm từ các trang web như Amazon hoặc eBay để phân tích đối thủ cạnh tranh

• Trích xuất dữ liệu trang web trước khi di chuyển trang web

• Trích xuất chi tiết sản phẩm để so sánh khi mua sắm

• Trích xuất dữ liệu tài chính để nghiên cứu thị trường

1.1.2 Dữ liệu USD/VND từ 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.

   Với hơn 300.000 công cụ tài chính, Investing.com cho phép người dùng truy cập không giới hạn và hoàn toàn miễn phí các công cụ hiện đại bậc nhất thị trường tài chính như báo giá và thông báo theo thời gian thực, danh mục đầu tư tùy chỉnh, thông báo cá nhân, lịch, công cụ tính và thông tin tài chính chuyên sâu.

   Ngoài thông tin về các Thị trường Chứng khoán trên toàn cầu, Investing.com còn cung cấp thông tin về Hàng hóa, Tiền điện tử, các Chỉ số quốc tế, Các loại tiền tệ trên thế giới, Trái phiếu, các Quỹ và Lãi suất, Hợp đồng tương lai và Quyền chọn của các Quỹ giao dịch ngoại hối (ETF)

   Trong bài này tôi sẽ giới thiệu với các bạn cách sử dụng gói rvest trong R để scrape dữ liệu lịch sử thị trường các loại tiền

1.1.2.1 Thông tin dữ liệu

   Tỷ giá hối đoán Việt Nam _ tỷ lệ giá trị của đồng USD so với VND Giá của 1 USD = ? VND

1.1.2.2 Lấy dữ liệu từ trang web để tiến hành phân tích

dl <- paste0("https://www.investing.com/currencies/usd-vnd-historical-data")

1.1.2.3 Đọc dữ liệu từ web

url <- read_html(dl)
data <- url%>%html_table(fill = TRUE)
da = data[[2]]
da
## # A tibble: 22 × 7
##    Date       Price    Open     High     Low      Vol.  `Change %`
##    <chr>      <chr>    <chr>    <chr>    <chr>    <lgl> <chr>     
##  1 07/25/2023 23,665.0 23,675.0 23,719.0 23,657.5 NA    0.00%     
##  2 07/24/2023 23,665.0 23,665.0 23,676.5 23,645.5 NA    +0.04%    
##  3 07/21/2023 23,656.0 23,665.0 23,670.0 23,636.5 NA    +0.04%    
##  4 07/20/2023 23,647.0 23,697.5 23,697.5 23,635.5 NA    +0.07%    
##  5 07/19/2023 23,630.0 23,642.5 23,654.5 23,630.0 NA    -0.02%    
##  6 07/18/2023 23,635.0 23,635.0 23,650.5 23,625.0 NA    +0.02%    
##  7 07/17/2023 23,630.0 23,645.0 23,672.0 23,625.0 NA    0.00%     
##  8 07/14/2023 23,630.0 23,660.0 23,665.0 23,627.5 NA    -0.15%    
##  9 07/13/2023 23,665.0 23,630.0 23,677.5 23,625.0 NA    +0.02%    
## 10 07/12/2023 23,660.0 23,700.0 23,700.0 23,655.0 NA    -0.13%    
## # ℹ 12 more rows
  • Giải thích các biến của dataset USD/VND:
    • Date: ngày.
    • Price: giá thị trường của USD/VND
    • Open: giá mở bán của USD/VND
    • High: giá cao nhất trong ngày của USD/VND
    • Low: giá thấp nhất trong ngày của USD/VND

1.1.2.4 Xử lý dữ liệu từ web

   Dữ liệu thô ban đầu được scraping 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 để biến đổi dữ liệu gốc thành dữ liệu số để thực hiện được phân tích.

price <- da$Price
daprice <- as.numeric(gsub(",", "", price))
daprice
##  [1] 23665 23665 23656 23647 23630 23635 23630 23630 23665 23660 23690 23640
## [13] 23635 23710 23745 23700 23695 23575 23569 23555 23520 23530

   Dữ liệu ban đầu sau khi nhập từ web về là dữ liệu được xếp theo thứ tự ngày gần nhất đến ngày xa nhất. Vì thế ta cần sắp xếp lại chiều vector từ trái qua phải với thứ tự ngày xa nhất đến ngày gần nhất.

daprice1 <- rev(daprice)
daprice1
##  [1] 23530 23520 23555 23569 23575 23695 23700 23745 23710 23635 23640 23690
## [13] 23660 23665 23630 23630 23635 23630 23647 23656 23665 23665

1.1.3 Phân tích dữ liệu chuỗi thời gian

   Chuỗi thời gian (time series) là một chuỗi các điểm dữ liệu xảy ra theo thứ tự liên tiếp trong một khoảng thời gian. Một chuỗi thời gian sẽ theo dõi chuyển động của các điểm dữ liệu đã chọn trong một khoảng thời gian xác định.

1.1.3.1 Lập bảng thống kê mô tả

   Thống kê mô tả giúp mô tả và hiểu được các tính chất của một bộ dữ liệu cụ thể bằng cách đưa ra các tóm tắt ngắn về mẫu và các thông số của dữ liệu. Loại thống kê mô tả phổ biến nhất là các thông số xu hướng tập trung gồm: giá trị trung bình, trung vị và độ lệch chuẩn, độ lệch, độ nhọn.

library("fBasics")
basicStats(daprice1)
##                  daprice1
## nobs            22.000000
## NAs              0.000000
## Minimum      23520.000000
## Maximum      23745.000000
## 1. Quartile  23630.000000
## 3. Quartile  23665.000000
## Mean         23638.500000
## Median       23643.500000
## Sum         520047.000000
## SE Mean         12.389905
## LCL Mean     23612.733783
## UCL Mean     23664.266217
## Variance      3377.214286
## Stdev           58.113805
## Skewness        -0.445223
## Kurtosis        -0.560629

1.1.3.2 Vẽ đồ thị

1.1.3.2.1 Vẽ đồ thị giá theo thời gian
library(tseries)
plot.ts(daprice1, ylab= "Price", xlab= "Time" , main= "USD/VND")

  • Nhận xét: Trong 30 ngày gần nhất, giá của để mua một USD bằng VND cao nhất ~23800VND và thấp nhất ~23525VND.
1.1.3.2.2 Vẽ biểu đồ tần số các khoảng giá USD/VND:
hist(daprice1)

  • Nhận xét: trong 22 ngày gần nhất, khoảng 23500-23550VND để mua 1 USD là khoảng có tần số lớn nhất khi trong 22 ngày này, có tới 7 ngày thuộc khoảng giá này.
1.1.3.2.3 Vẽ biểu đồ mật đồ (density plot)

   Biểu đồ mật độ biểu diễn dữ liệu liên tục bằng một đường cong được ước lượng từ dữ liệu với phương pháp ước lượng mật độ hạt nhân. Trong phương pháp này, một đường cong liên tục được vẽ tại mọi điểm dữ liệu riêng lẻ. Tất cả các đường cong này sẽ được cộng lại để tạo ra một đường ước tính mật độ duy nhất. Hạt nhân thường được sử dụng nhất là Gaussian (tạo ra đường cong hình chuông Gauss tại mỗi điểm dữ liệu).

d1<- density(daprice1)
plot(d1,type='l')

-> Biểu đồ cho thấy Không có sự liên quan đến nhau (không tạo thành hình chuông) - chuỗi không có tính dừng

1.1.3.3 Trực quan hóa thành phần xu hướng của chuỗi thời gian

   Đường MA hay đường trung bình cộng (tiếng Anh: Moving Average) biểu thị biến động và chỉ báo xu hướng của giá cổ phiếu trong khoảng thời gian nhất định.

   Mục đích: Theo dõi giá đang đang đứng yên hoặc đang vận động theo xu hướng giảm hay tăng.

  • Ta thực hiện vẽ đường trung bình cộng bậc 3 trên R như sau:
plot(daprice1)

library(forecast)
MA_m22= forecast::ma(daprice1, order=3, centre= TRUE)
plot(MA_m22)

  • Lưu ý: Đường MA sẽ không có tác dụng dự báo, mà chỉ xem như là chỉ báo chậm, nó chủ yếu vận động theo diễn biến giá đã được hình thành.

1.1.3.4 Kiểm định dữ liệu

1.1.3.4.1 Kiểm định phân phối chuẩn

   Kiểm định Jarque-Bera Giá trị kiểm định Jarque-Bera được xây dựng dựa trên hệ số skewness và kutorsis JB sẽ tuân theo qui luật phân phối khi bình phương bởi nó là tổng của bình phương 2 phân phối chuẩn.

h0: là phân phối chuẩn ta có thể sử dụng p-value để so sánh với α=0.05 trong mức ý nghĩa thống kê 1−α=0.95 để kết luận bác bỏ H0 nếu p-value nhỏ hơn ngưỡng này.

normalTest(daprice1, method = c("jb"))
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 0.9312
##   P VALUE:
##     Asymptotic p Value: 0.6278

   p-value=0,4124 < mức ý nghĩa 0.05 -> chưa đủ cơ sở bác bỏ h0. Vậy mô hình trên có phân phối chuẩn

1.1.3.4.2 Kiểm định tính dừng _ Dickey - Fuller

   Chúng ta sẽ so sánh giá trị ngưỡng kiểm định này với giá trị tới hạn của phân phối Dickey - Fuller để đưa ra kết luận về chấp nhận hoặc bác bỏ giả thuyết H0. Kiểm định tính dừng của chuỗi, sử dụng hàm adf.test() của package tseries. Trong các kiểm định thống kê của R, hầu hết các kết quả trả về đều có dạng xác xuất. Việc này sẽ thuận tiện hơn cho người dùng khi đưa ra kết luận vì ngưỡng tới hạn để bác bỏ giả thuyết luôn là 0.05. Do đó thay vì so sánh cặp giá trị kiểm định với giá trị tới hạn ta sẽ so sánh giá trị xác xuất kiểm định p-value với ngưỡng 0.05. Khi đã đọc nhiều kiểm định sẽ hình thành phản xạ rất nhanh khi so sánh với 0.05.

   H0:Chuỗi không dừng được chấp nhận khi p-value > 0.05    H1:alternative hypothesis: stationary: có tính dừng khi p-value < 0.05.

library(tseries)
adf.test(daprice1)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  daprice1
## Dickey-Fuller = -2.4708, Lag order = 2, p-value = 0.393
## alternative hypothesis: stationary

   Kết quả cho biết p-value > 5% không đủ cơ sở bác bỏ H0 vì thế ta kết luận không có tính dừng

1.1.3.4.3 Kiểm định KPSS

   H0: Có tính dừng H1: Không có tính dừng

kpss.test(daprice1)
## Warning in kpss.test(daprice1): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  daprice1
## KPSS Level = 0.26942, Truncation lag parameter = 2, p-value = 0.1

   Kết quả cho biết p-value < 5% bác bỏ H0 vì thế ta kết luận mô hình không có tính dừng

1.1.3.4.4 Kiểm định sự tự tương quan theo chuỗi

   Kiểm tra yếu tố tự tương quan của phần dư bằng đồ thị ACF thông qua hàm acf():

acf(daprice1)

   Ta có thể thấy phần dư không có yếu tố tự tương quan do các giá trị tự tương quan không vượt quá ngưỡng tin cậy 95%.

   Các đường nét đứt màu xanh thể hiện cận trên và dưới của khoảng tin cậy 95% đối với kiểm định hệ số tương quan bằng 0. Trục tung là giá trị của hệ số tương quan trễ và trục hoành là các độ trễ tương ứng. Tại độ trễ bằng 0 hệ số tương quan đo lường chuỗi đó với chính nó nên giá trị bằng 1. Ngoài các độ trễ ở mức 1, 2, 3 thì các độ trễ khác hệ số tương quan không vượt quá khoảng tin cậy 95% nên có thể thấy chuỗi nhiễu trắng không có hiện tượng tự tương quan.

1.1.3.5 Dự báo chuỗi thời gian

PriceForecasts <- HoltWinters(daprice1, gamma = FALSE)
coefficients <- PriceForecasts$coefficients
x <- data.frame(as.numeric(coefficients))
ketquadubao= sum(x)
ketquadubao
## [1] 23664.79
  • Kết quả: Vậy để mua một USD bằng tiền VND vào ngày mai là 23630VND

1.2 VIẾT 1 FUNCTION CHO CÔNG VIỆC

1.2.1 Viết hàm dự báo giá để mua 1 USD

   Giả sử tôi muốn biết tỷ giá hối đoái giữa giá trị đơn vị tiền tệ của Hoa Kỳ(USD) với đơn vị tiền tệ của một quốc gia khác và sử dụng tỷ giá đó để tính toán giá trị của các giao dịch thương mại quốc tế, đầu tư nước ngoài và các hoạt động tài chính khác.

   Vì vậy, để tính toán tỷ giá của đồng USD với đồng tiền của quốc gia khác một cách dễ dàng mà không mất nhiều thời gian nhưng vẫn đảm bào được độ chính xác, thì tôi chỉ cần tạo ra 1 function mẫu trong đó giá trị tiền tệ của các quốc gia khác sẽ được đặt là ẩn “x”. Như vậy, khi tôi cần tính tỷ giá của USD với đồng tiền nước khác thì tôi chỉ cần thay biến “x” bằng đồng tiền của quốc gia đó.

   Để thực hiện ý tưởng đó, tôi cần tạo một function: get_data_currency(currency) với biến currency là đồng tiền của một nước mà ta cần biết giá là cần bao nhiêu tiền của nước đó để mua một USD chỉ bằng tên viết tắt của loại tiền đó. Ví dụ: vnd(Việt Nam), cny(Trung Quốc), jnp(Nhật Bản), …

1.2.1.1 Viết hàm dự báo

# Tạo hàm get dữ liệu với ẩn tigia 
get_data_currency <- function(currency){
# Tạo đường link thông tin đầu vào
historyurl <- paste0("https://www.investing.com/currencies/usd-",currency,"-historical-data")
# Đọc dữ liệu từ trang web cần dùng 
url <- read_html(historyurl)
data <- url %>% html_table(fill = TRUE)
data = data[[2]]
data$Slug <- currency
# Xử lý dữ liệu
P <- data$Price
P1 <- as.numeric(gsub(",", "", P))
P2 <- rev(P1)
# Bảng thống kê dự báo
PriceForecasts <- HoltWinters(P2, gamma = FALSE)
coefficients <- PriceForecasts$coefficients
x <- data.frame(as.numeric(coefficients))
ketquadubao= sum(x)
ketquadubao
# In kết quả
return(ketquadubao)
}

1.2.1.2 Thao tác với hàm mẫu

  • Tôi muốn biết cần bao nhiêu tiền VND để mua một USD vào ngày hôm sau, ở đây biến currency của tôi là “vnd”
get_data_currency("vnd")
## [1] 23664.79
  • Tôi muốn biết phải cần bao nhiêu Tệ thì có thể mua một đô la Mỹ(USD) vào ngày hôm sau. Biến tigia của tôi là “cny”
get_data_currency("cny")
## [1] 7.129334

1.2.2 Viết hàm kiểm định tính dừng của tỉ giá giữa 2 nước.

1.2.2.1 Viết hàm kiểm định tính dừng

   Tương tự như hàm dự báo ta có thể thực hiện việc viết một hàm để kiểm định tính dừng về tỷ giá hối đoái giữa 2 đồng tiền.

   Ở trường hợp này, ta đặt ẩn là “tigia2” và khi cần kiểm định tính dừng giữa hai giá trị nào đó thì ta cũng chỉ cần thay thế biến đó vào “tigia2”

# Tạo hàm get dữ liệu
get_data_currency2 <- function(tigia2){
# Tạo đường link thông tin đầu vào
historyurl2 <- paste0("https://www.investing.com/currencies/",tigia2,"-historical-data")
# Đọc dữ liệu từ web
url2 <- read_html(historyurl2)
data2 <- url2 %>% html_table(fill = TRUE)
data2 = data2[[2]]
data2$Slug <- tigia2
# Xử lý dữ liệu
P2 <- data2$Price
P12 <- as.numeric(gsub(",", "", P2))
P22 <- rev(P12)
# Kiểm định tính dừng
xyz <- adf.test(P22)
# In kết quả
return(xyz)
}

1.2.2.2 Thao tác với hàm mẫu

  • Tôi muốn biết giá của tỷ giá VND/USD có tính dừng hay không
get_data_currency2("vnd-usd")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  P22
## Dickey-Fuller = -2.6783, Lag order = 2, p-value = 0.3135
## alternative hypothesis: stationary

   Kết quả cho biết p-value > 5% không đủ cơ sở bác bỏ H0 vì thế ta kết luận giá của VND/USD không có tính dừng.

1.3 TÌM HIỂU 10 INDICATOR TỪ WORLDBANK (WDI)

1.3.1 Tra cứu danh sách các indicator có trong WORLDBANK

Nh   Các chỉ số phát triển của Ngân hàng Thế giới cho R Ngân hàng Thế giới cung cấp rất nhiều dữ liệu tuyệt vời từ các Chỉ số Phát triển Thế giới thông qua API web của mình. Gói WDI cho R giúp dễ dàng tìm kiếm và tải xuống chuỗi dữ liệu từ WDI.

Nh   Cài đặt WDI được xuất bản trên CRAN và do đó có thể được cài đặt bằng cách nhập mã này vào bảng điều khiển R:

Nh   Cài đặt gói (‘WDI’)

library(WDI)
library(wbstats)
search <- WDIsearch("")
search <- WDIsearch("")

1.3.2 Tìm kiếm dữ liệu

   Bạn có thể tìm kiếm dữ liệu bằng cách sử dụng các từ khóa trong WDIsearch. Chẳng hạn, nếu bạn đang tìm kiếm dữ liệu về giáo dục:

WDIsearch("Education")[1:10,]
##                         indicator
## 196      3.1_LOW.SEC.NEW.TEACHERS
## 197          3.1_PRI.NEW.ENTRANTS
## 201       3.11_LOW.SEC.CLASSROOMS
## 202   3.12_LOW.SEC.NEW.CLASSROOMS
## 203  3.13_PRI.MATH.BOOK.PER.PUPIL
## 204 3.14_PRI.LANGU.BOOK.PER.PUPIL
## 209              3.2_PRI.STUDENTS
## 210              3.3_PRI.TEACHERS
## 211          3.4_PRI.NEW.TEACHERS
## 212            3.5_PRI.CLASSROOMS
##                                                             name
## 196     Lower secondary education, new teachers, national source
## 197             Primary education, new entrants, national source
## 201       Lower secondary education, classrooms, national source
## 202   Lower secondary education, new classrooms, national source
## 203 Ratio of textbooks per pupil, primary education, mathematics
## 204    Ratio of textbooks per pupil, primary education, language
## 209                   Primary education, pupils, national source
## 210                 Primary education, teachers, national source
## 211             Primary education, new teachers, national source
## 212               Primary education, classrooms, national source
  • SE.PRM.ENRR:School enrollment, primary (% gross)

  • SE.XPD.TOTL.GB.ZS: Government expenditure on education, total (% of government expenditure)

  • SP.POP.TOTL: Total population is based on the de facto definition of population, which counts all residents regardless of legal status or citizenship. The values shown are midyear estimates.

  • ER.PTD.TOTL.ZS:Terrestrial and marine protected areas (% of total territorial area)

  • SP.POP.GROW:Population growth (annual %)

  • EG.FEC.RNEW.ZS:Renewable energy consumption (% of total final energy consumption)

  • SH.STA.MMRT:Maternal mortality ratio (modeled estimate, per 100,000 live births)

  • SG.GEN.PARL.ZS:Proportion of seats held by women in national parliaments (%)

  • IT.NET.USER.ZS:Individuals using the Internet (% of population)

  • SP.URB.GROW:Urban population growth (annual %)

1.3.2.1 SE.PRM.ENRR - School enrollment, primary (% gross) _ Ghi danh đi học, tiểu học (% gộp)

  • Giải thích: Tỷ lệ nhập học chung là tỷ lệ giữa tổng số nhập học, bất kể độ tuổi, so với dân số của nhóm tuổi chính thức tương ứng với trình độ học vấn được hiển thị. Giáo dục tiểu học cung cấp cho trẻ em các kỹ năng đọc, viết và toán học cơ bản cùng với hiểu biết cơ bản về các môn học như lịch sử, địa lý, khoa học tự nhiên, khoa học xã hội, nghệ thuật và âm nhạc.
d1<- data.frame(WDI(country="VNM", indicator="SE.PRM.ENRR", start=2003, end=NULL))
head(d1,3)
##   country iso2c iso3c year SE.PRM.ENRR
## 1 Vietnam    VN   VNM 2022          NA
## 2 Vietnam    VN   VNM 2021    118.4305
## 3 Vietnam    VN   VNM 2020    117.1572
d1<- data.frame(WDI(country="VNM", indicator="SE.PRM.ENRR", start=2003, end=NULL))
nam1 <- d1$year
giatri1 <- d1$SE.PRM.ENRR
plot(nam1, giatri1, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: ở bậc tiểu học, số học sinh đi học có xu hướng tăng và tăng lên đến 118% vào năm 2022.

1.3.2.2 SE.XPD.TOTL.GB.ZS - Government expenditure on education, total (% of government expenditure) _ Chi tiêu của chính phủ cho giáo dục, tổng số (% chi tiêu của chính phủ)

  • Giải thích: Chi tiêu chung của chính phủ cho giáo dục (hiện tại, vốn và chuyển giao) được biểu thị bằng tỷ lệ phần trăm của tổng chi tiêu chung của chính phủ cho tất cả các lĩnh vực (bao gồm y tế, giáo dục, dịch vụ xã hội, v.v.). Nó bao gồm chi tiêu được tài trợ bằng chuyển giao từ các nguồn quốc tế cho chính phủ. Chính phủ chung thường đề cập đến chính quyền địa phương, khu vực và trung ương.
d2<- data.frame(WDI(country="VNM", indicator="SE.XPD.TOTL.GB.ZS", start=2003, end=NULL))
head(d2,3)
##   country iso2c iso3c year SE.XPD.TOTL.GB.ZS
## 1 Vietnam    VN   VNM 2022          15.44934
## 2 Vietnam    VN   VNM 2021          14.81749
## 3 Vietnam    VN   VNM 2020          14.40717
d2<- data.frame(WDI(country="VNM", indicator="SE.XPD.TOTL.GB.ZS", start=2003, end=NULL))
nam2 <- d2$year
giatri2 <- d2$SE.XPD.TOTL.GB.ZS
plot(nam2, giatri2, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: % chi tiêu cho chính phủ biến động trong khoảng 13% đến 19% tổng chi tiêu chính phủ, tuy nhiên sau năm 2013, chi tiêu chính phủ có xu hướng giảm từ 19% xuống còn 15,5% vào năm 2022

1.3.2.3 SP.POP.TOTL - Population, total _ Tổng dân số (người)

  • Giải thích: Tổng 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. Các giá trị được hiển thị là ước tính giữa năm.
d3<- data.frame(WDI(country="VNM", indicator="SP.POP.TOTL", start=2003, end=NULL))
head(d3,3)
##   country iso2c iso3c year SP.POP.TOTL
## 1 Vietnam    VN   VNM 2022    98186856
## 2 Vietnam    VN   VNM 2021    97468029
## 3 Vietnam    VN   VNM 2020    96648685
d3<- data.frame(WDI(country="VNM", indicator="SP.POP.TOTL", start=2003, end=NULL))
nam3 <- d3$year
giatri3 <- d3$SP.POP.TOTL
plot(nam3, giatri3, type = "l", lty = 1, xlab="Năm", ylab="Người")

  • Nhận xét đồ thị: Tổng dân số Việt Nam có số lượng tăng rất ổn định và gần như tuyến tính từ năm 2001 cho đến nay, kể từ năm 2001, hiện nay dân số đã tăng gần hơn 13 triệu người

1.3.2.4 ER.PTD.TOTL.ZS - Terrestrial and marine protected areas (% of total territorial area)_ Khu bảo tồn biển và đất liền (% trên tổng diện tích lãnh thổ)

  • Giải thích: Các khu bảo tồn trên cạn là các khu bảo tồn toàn bộ hoặc một phần có diện tích ít nhất 1.000 ha được chính quyền quốc gia chỉ định là khu bảo tồn khoa học hạn chế tiếp cận công chúng, công viên quốc gia, di tích tự nhiên, khu bảo tồn thiên nhiên hoặc khu bảo tồn động vật hoang dã, cảnh quan được bảo vệ và các khu vực được quản lý chủ yếu để sử dụng bền vững . Các khu bảo tồn biển là các khu vực có địa hình bãi triều hoặc cận triều - và vùng nước trên mặt nước cũng như hệ thực vật và động vật có liên quan cũng như các đặc điểm lịch sử và văn hóa - đã được luật pháp hoặc các biện pháp hiệu quả khác bảo lưu để bảo vệ một phần hoặc toàn bộ môi trường bao quanh. Các trang web được bảo vệ theo luật địa phương hoặc tỉnh được loại trừ.
d4<- data.frame(WDI(country="VNM", indicator="ER.PTD.TOTL.ZS", start=2015, end=NULL))
head(d4,3)
##   country iso2c iso3c year ER.PTD.TOTL.ZS
## 1 Vietnam    VN   VNM 2022       2.929507
## 2 Vietnam    VN   VNM 2021       2.929507
## 3 Vietnam    VN   VNM 2020       2.929507
d4<- data.frame(WDI(country="VNM", indicator="ER.PTD.TOTL.ZS", start=2015, end=NULL))
nam4 <- d4$year
giatri4 <- d4$ER.PTD.TOTL.ZS
plot(nam4, giatri4, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: từ thống kế năm 2016 cho đến nay, % diện tích khu bảo tồn đất liền gần như không đổi ở mức 2.93% và đồ thị dường như đã là 1 chuỗi dừng.

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

  • Giải thích: Tốc độ tăng dân số hàng nă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ặ quyền công dân.
d5<- data.frame(WDI(country="VNM", indicator="SP.POP.GROW", start=2003, end=NULL))
head(d5,3)
##   country iso2c iso3c year SP.POP.GROW
## 1 Vietnam    VN   VNM 2022   0.7347941
## 2 Vietnam    VN   VNM 2021   0.8441817
## 3 Vietnam    VN   VNM 2020   0.9062992
d5<- data.frame(WDI(country="VNM", indicator="SP.POP.GROW", start=2003, end=NULL))
nam5 <- d5$year
giatri5 <- d5$SP.POP.GROW
plot(nam5, giatri5, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Giải thích đồ thị: từ 2001 đến 2022, % gia tăng dân số biến động trong khoảng 0,7% đến 1,07% và kể từ sau năm 2013 đang có xu hướng giảm dần.

1.3.2.6 EG.FEC.RNEW.ZS - Renewable energy consumption (% of total final energy consumption)_ Tiêu thụ năng lượng tái tạo (% trên tổng tiêu thụ năng lượng cuối cùng)

  • Giải thích: Tiêu thụ năng lượng tái tạo là tỷ lệ năng lượng tái tạo trong tổng tiêu thụ năng lượng cuối cùng.
d6<- data.frame(WDI(country="VNM", indicator="EG.FEC.RNEW.ZS", start=2003, end=NULL))
head(d6,3)
##   country iso2c iso3c year EG.FEC.RNEW.ZS
## 1 Vietnam    VN   VNM 2022             NA
## 2 Vietnam    VN   VNM 2021             NA
## 3 Vietnam    VN   VNM 2020          19.11
d6<- data.frame(WDI(country="VNM", indicator="EG.FEC.RNEW.ZS", start=2003, end=NULL))
nam6 <- d6$year
giatri6 <- d6$EG.FEC.RNEW.ZS
plot(nam6, giatri6, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: ở Việt Nam, tổng tiêu thụ năng lượng tái tạo từ năm 2005-2020 có xu hướng giảm từ 50% xuốn còn chỉ 20%.

1.3.2.7 SH.STA.MMRT :Maternal mortality ratio (modeled estimate, per 100,000 live births)_ Tỷ lệ tử vong của người mẹ sau sinh.

  • Giải thích: Tỷ suất tử vong của người mẹ là số phụ nữ chết vì các nguyên nhân liên quan đến thai sản khi đang mang thai hoặc trong vòng 42 ngày sau khi chấm dứt thai nghén trên 100.000 ca sinh sống. Dữ liệu được ước tính bằng mô hình hồi quy sử dụng thông tin về tỷ lệ tử vong mẹ trong số các trường hợp tử vong không do AIDS ở phụ nữ độ tuổi 15-49, khả năng sinh sản, người đỡ đẻ và GDP được đo bằng sức mua tương đương (PPP).
d7<- data.frame(WDI(country="VNM", indicator="SH.STA.MMRT", start=2003, end=NULL))
head(d7,3)
##   country iso2c iso3c year SH.STA.MMRT
## 1 Vietnam    VN   VNM 2022          NA
## 2 Vietnam    VN   VNM 2021          NA
## 3 Vietnam    VN   VNM 2020         124
d7<- data.frame(WDI(country="VNM", indicator="SH.STA.MMRT", start=2003, end=NULL))
nam7 <- d7$year
giatri7 <- d7$SH.STA.MMRT
plot(nam7, giatri7, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: % người mẹ tử vong sau sinh ở Việt Nam tăng liên tục trong giai đoạn 2001 đến 2018 từ 80 người/ 100,0 người lên 132 người/ 100,000 người, mãi cho đến sau năm 2018, xu hướng bắt đầu giảm.

1.3.2.8 SG.GEN.PARL.ZS - Proportion of seats held by women in national parliaments (%)_Tỷ lệ ghế do phụ nữ nắm giữ trong quốc hội (%)

  • Giải thích: Phụ nữ trong quốc hội là tỷ lệ phần trăm số ghế quốc hội trong một phòng đơn hoặc hạ viện do phụ nữ nắm giữ.
d8<- data.frame(WDI(country="VNM", indicator="SG.GEN.PARL.ZS", start=2003, end=NULL))
head(d8,3)
##   country iso2c iso3c year SG.GEN.PARL.ZS
## 1 Vietnam    VN   VNM 2022       30.26052
## 2 Vietnam    VN   VNM 2021       30.26052
## 3 Vietnam    VN   VNM 2020       26.72065
d8<- data.frame(WDI(country="VNM", indicator="SG.GEN.PARL.ZS", start=2003, end=NULL))
nam8 <- d8$year
giatri8 <- d8$SG.GEN.PARL.ZS
plot(nam8, giatri8, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét đồ thị: đồ thị có các khoản dừng mỗi giai đoạn 4 năm (mỗi 1 nhiệm kì=4 năm), biến động trong khoảng từ 22 người đến 31 người nắm giữ vị trí trong ghế Quốc Hội Việt Nam.

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

  • Giải thích: 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 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.
d9<- data.frame(WDI(country="VNM", indicator="IT.NET.USER.ZS", start=2003, end=NULL))
head(d9,3)
##   country iso2c iso3c year IT.NET.USER.ZS
## 1 Vietnam    VN   VNM 2022             NA
## 2 Vietnam    VN   VNM 2021          74.21
## 3 Vietnam    VN   VNM 2020          70.30
d9<- data.frame(WDI(country="VNM", indicator="IT.NET.USER.ZS", start=2003, end=NULL))
nam9 <- d9$year
giatri9 <- d9$IT.NET.USER.ZS
plot(nam9, giatri9, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét: Số người dùng internet có xu hướng ngày càng tăng và có dấu hiệu tiếp tục tăng dần theo thời gian. Cụ thể ở năm 2003 tỷ lệ rất thấp (nhỏ hơn 10%) và hiện tại cũng là mức có tỷ lệ cao nhất ( trên 70%)

1.3.2.10 SP.URB.GROW - Urban population growth (annual %) _ Tăng dân số đô thị (% hàng năm)

  • Giải thích: Dân số thành thị là những người sống ở khu vực thành theo định nghĩa của các cơ quan thống kê quốc gia. Nó được tính toán bằng cách sử dụng ước tính dân số của Ngân hàng Thế giới và tỷ lệ đô thị từ Triển vọng Đô thị hóa Thế giới của Liên Hợp Quốc.
d10<- data.frame(WDI(country="VNM", indicator="SP.URB.GROW", start=2003, end=NULL))
head(d10,3)
##   country iso2c iso3c year SP.URB.GROW
## 1 Vietnam    VN   VNM 2022    2.593789
## 2 Vietnam    VN   VNM 2021    2.733031
## 3 Vietnam    VN   VNM 2020    2.831514
d10<- data.frame(WDI(country="VNM", indicator="SP.URB.GROW", start=2003, end=NULL))
nam10 <- d10$year
giatri10 <- d10$SP.URB.GROW
plot(nam10, giatri10, type = "l", lty = 1, xlab="Năm", ylab="%")

  • Nhận xét: Dân số thành thị hằng năm có xu hướng giảm dần theo thời gian, cụ thể dân số ở thành thị từ trước năm 2005(~4) ở mức rất cao và sau đó giảm dần về sau năm 2020(~3).

2 MÔ TẢ DỮ LIỆU

2.1 Dữ liệu sử dụng cho tuần 1,2,3,4

  • CreditCard - Dữ liệu chéo nói về lịch sử tín dụng của một người xin cấp thẻ tín dụng.

Ý nghĩa các biến thuộc dữ liệu CreditCard

  • Card:trả lời cho câu hỏi “Đơn xin cấp thẻ tín dụng có được chấp nhận không?”
  • Reports:Số báo cáo xúc phạm lớn.
  • Age:Tuổi tính bằng năm cộng với phần mười hai của một năm.
  • Income: Thu nhập hàng năm (bằng USD 10,000).
  • Share: Tỷ lệ chi tiêu thẻ tín dụng hàng tháng so với thu nhập hàng năm.
  • Expenditure: Chi tiêu thẻ tín dụng trung bình hàng tháng.
  • Owner: Trả lời cho câu hỏi “Cá nhân có sở hữu nhà riêng không?”
  • Selfemp: Trả lời cho câu hỏi “cá nhân tự làm chủ hay không?”
  • Dependents: Số người phụ thuộc vào người được khảo sát.
  • Months: Thời gian sống tại địa chỉ hiện tại(tháng).
  • Majorcards: Số lượng thẻ tín dụng chính được tổ chức.
  • Active:Số lượng tài khoản tín dụng đang hoạt động.

2.2 Dữ liệu sử dụng cho tuần 4.

GrowthSW - Dữ liệu về tỷ lệ tăng trưởng trung bình (1960–1995) của 65 quốc gia, cùng với các biến số có khả năng liên quan đến tăng trưởng. Một khung dữ liệu chứa 65 quan sát trên 6 biến.

  • growth: phần trăm tăng trưởng trung bình hằng năm của GDP thực tế (1960 - 1995).

  • rgdp60: giá trị GDP bình quân đầu người năm 1960(đô la Mỹ)

  • tradeshare: tỷ trọng thương mại trung bình trong nền kinh tế (1995-1960), tính bằng công thức (X + M)/GDP trong đó X là xuất khẩu, M là nhập khẩu.

  • education: số năm đi học trung bình của cư dân ở quốc gia đó (1960).

  • revolutions: số cuộc cách mạng, nổi dậy và đảo chính trung bình hàng năm ở quốc gia đó (1960–1995).

  • assassinations: số vụ ám sát chính trị trung bình hàng năm ở quốc gia đó (1960–1995) (tính trên một triệu dân).

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

3.1 NHẬP DỮ LIỆU

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

Đây là dữ liệu Chuỗi thời gian về mức tiêu dùng (Y : đơn vị 100000 VNĐ) và thu nhập (X : đơn vị 100000 VNĐ). Tính theo đầu người và tính theo giá cố định năm 1980 trong thời kỳ 1971 – 1990 ở một khu vực

nam <- c(1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990 )
chitieu <- c(48.34, 48.54,  47.44,  54.58,  55, 63.49,  59.22,  57.77,  60.22,  55.4,   52.17,  60.84,  60.73,  76.04,  76.42,  69.34,  61.75,  68.78,  67.07,  72.94 )
thunhap <- c(51.01, 52.41,  51.55,  58.88,  59.66,  68.42,  64.27,  63.01,  65.61,  61.05,  63.36,  67.42,  67.86,  83.39,  84.26,  77.41,  70.08,  77.44,  75.79,  81.89)
chuoitg <- data.frame(nam, chitieu, thunhap)
head(chuoitg)
##    nam chitieu thunhap
## 1 1971   48.34   51.01
## 2 1972   48.54   52.41
## 3 1973   47.44   51.55
## 4 1974   54.58   58.88
## 5 1975   55.00   59.66
## 6 1976   63.49   68.42

3.1.2 Trang tính Excel

Ta sử dụng package “readxl” để thực hiện thao tác nhập dữ liệu từ file excel.

library(readxl)
## Warning: package 'readxl' was built under R version 4.3.1

Cũng với bộ dữ liệu trên nhưng được lưu dưới dạng tập tin excel. Vị trí file dữ liệu cần dùng là “C:/Users/TIEN/Downloads/HQD.xlsx” thì ta thực hiện thao tác nhập dữ liệu như:

hq1 <- read_excel("C:/Users/TIEN/Downloads/HQD.xlsx")
View(hq1)

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

3.2.1 Đồ thị dạng scatter - biểu đồ phân tán dữ liệu.

Biểu đồ phân tán (scatter plot):

  • Sử dụng các dấu chấm để thể hiện giá trị (điểm giao nhau) của hai biến số khác nhau.

  • Dùng để quan sát mối tương quan giữa 2 biến định lượng.

  • Trục hoành (trục X) mô tả biến độc lập. Trục tung (Y) mô tả biến phụ thuộc.

3.2.1.1 Sử dụng bô dữ liệu đã được nhập thủ công hoặc đã nhập được từ file excel.

  • Vẽ đồ thị phân tán (scatter) giữa 2 biến thu nhập Và chi tiêu.
hq1 |> ggplot(map=aes(x = thunhap , y = chitieu )) + geom_point(color = "blue")

  • Cũng với những dữ liệu ở đồ thị trên nhưng ta muốn đặt tên lại trên các trục tọa độ.
hq1 |> ggplot(map=aes(x = thunhap , y = chitieu )) + geom_point(color = "blue")+ xlab("Thu Nhập")+ ylab("Chi Tiêu")

  • Vẽ thêm đường hồi quy tuyến tính.
hq1 |> ggplot(aes(x = thunhap, y = chitieu )) + 
  geom_smooth(formula = y ~ x, method = "lm", col = "green") + 
  geom_point(color = 'red') +
  labs(title = 'Đồ Thị Dạng Scatter', x = "Thu nhập", y = "Chi tiêu" )

=> Từ đồ thị ta có thể thấy rõ sự tương quan giữa 2 biến thu nhập và chi tiêu. Nếu biến thu nhập thay đổi thì cũng sẽ có ảnh hưởng đến mức chi tiêu. Cụ thể, nếu thu nhập giảm thì mức chi tiêu cũng sẽ giảm. Trên thực tế nếu mức thu nhập của một người bị giảm thì họ sẽ cân nhắc giảm chi tiêu để phù hợp với thu nhập của mình.

  • Nối các điểm trong đồ thị dạng Scatter của 2 biến thu nhập và chi tiêu.
hq1 |> ggplot(aes(x = thunhap , y = chitieu)) +  geom_point(color = 'blue') + geom_line(color = 'red')

=> 2 yếu tố này có một mối quan hệ tỉ lệ thuận với nhau, khi số thu nhập tăng lên thì mức chi tiêu cũng có xu hướng tăng theo.

3.2.2 Ta sử dụng dataset GrowthSW thuộc package AER

data("GrowthSW")
g <- GrowthSW
names(g) <- c("gr","rg","tr","ed","re","as")
  • Ta sử dụng biến education và biến rgdp60 để thực hiện phân tích
growth <- GrowthSW$growth
g |> ggplot(aes(x = rg , y = ed , color = growth ))+ geom_point(na.rm = T) + xlab(" GDP bình quân đầu người ") + ylab(" Số năm đi học trung bình ")+ labs(title="Biểu đồ thể hiện sự tương quan giữa trình độ và GDP bình quân ")

=> Biểu đồ cho ta thấy sự tương quan giữa hai biến education và biến rgdp60. Nghĩa là mức độ học vấn của cư dân ở quốc gia đó có ảnh hưởng đến giá trị GDP bình quân đầu người.

  • Vẽ thêm đường hồi quy tương ứng với đồ thị biểu thị mối liên hệ education và rgdp60 .
GrowthSW$grow[growth>2.5] <- "phattriennhanh"
GrowthSW$grow[growth<2.5] <- "champhattrien"
GrowthSW |> ggplot(aes(x = rgdp60 , y = education ))+ geom_point(aes (color= growth ),na.rm = T ) +
  geom_smooth(aes(color = growth),formula = y ~ x, method = 'lm', na.rm=T) +
  xlab("GDP bình quân đầu người") + ylab(" Số năm đi học trung bình ")+ 
  labs(title="Biểu đồ thể hiện sự tương quan giữa trình độ và GDP bình quân")

=> Kết luận: Đường hồi quy cho ta biết biến education và biến rgdp60 tỷ lệ thuận với nhau, nếu thời gian đi học càng nhiều tức là trình dộ học vấn càng cao thì GDP bình quân sẽ có xu hướng tăng cao.

  • Chúng ta cũng có thể nối các điểm trong đồ thị dạng scatter lại với nhau.
g |> ggplot(aes(x = ed , y = rg )) +
  geom_point(color = 'blue') +
  geom_line(color = 'red')

3.3 Đồ thị dạng cột

data("CreditCard")

3.3.1 Đồ thị dạng cột 1 biến

  • Đồ thì dạng cột cho biến card
CreditCard |> ggplot(aes(x = card)) + geom_bar(fill = 'blue')

  • Thay vì trên các trục thể hiện bằng số đếm thì chúng ta cũng có thể thể hiện bằng tỉ lệ % như sau:
CreditCard |> group_by(card) |>
  summarise(n = n()) |> mutate(pG = percent(n/sum(n),accuracy = ,01)) |>  ggplot(aes(x =card , y =pG)) +
  geom_col(fill = 'blue') + theme_classic() + labs(x = 'Tần số', y = 'Tỷ lệ %')

  • Chúng ta có thể ghi chú tỷ lệ % hoặc số đếm lên đỉnh mỗi cột như sau:
CreditCard |> ggplot(aes(x = card, y = after_stat(count))) + geom_bar(fill = 'blue') + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - 0.1 ) + theme_classic() + labs(x = 'Cấp thẻ tín dụng ', y = 'Tần số')

=> Biểu đồ cho ta biết tỷ lệ người được cấp thẻ tín dụng chiếm 78% và tỷ lệ không được cấp thẻ tín dụng chiếm 22%

  • Ngoài việc tính tỷ lệ % và đếm số người theo giới tính chúng ta có thể phân chia đồ thị theo một số tiêu chí (biến) khác để phân tích.
  • Ví dụ chúng ta phân chia theo biến : Majorcards

Chú thích: - Số 0 là thẻ tín dụng không được tổ chức - Số 1 là thẻ tín dụng chính được tổ chức

CreditCard |> ggplot(aes(x = card, 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(. ~ majorcards) +
  theme_classic() +
  labs(x = 'Cấp thẻ tín dụng ', y = 'tần số')

CreditCard |> ggplot(aes(x = card )) +
  geom_bar(aes(y = after_stat(count), fill = majorcards), stat = 'count') +  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - .5) + facet_grid(. ~  majorcards ) + ylab('tần số') + xlab(' Cấp thẻ tín dụng ')

  • Hoặc phân chia theo biến dependents
CreditCard|> count(dependents ) |>
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = dependents , y = n)) +
  geom_col(fill = 'blue') +
  geom_text(aes(label = pC),color = 'black', vjust = 0.5, size = 5) +
  ylab('Tần số') +
  xlab('Số người phụ thuộc')

=> Biểu đồ cho thấy trường hợp có 0 người phụ thuộc chiếm tỷ lệ cao nhất đồng nghĩa với việc có 50% người không có ai phụ thộc vào họ và ngược lại số người phụ thuộc càng nhiều thì tần số càng thấp.

  • Với biểu đồ như trên chúng ta có thể quay ngang như sau:
CreditCard|> count(dependents ) |>
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = dependents , y = n)) +
  geom_col(fill = 'blue') +
  geom_text(aes(label = pC),color = 'black', vjust = 0.5, size = 5) +
  ylab('Tần số') +
  xlab('Số người phụ thuộc ')+ 
  coord_flip()

3.3.2 Đồ thị 2 biến

  • Để có thể so sánh rõ hơn chúng ta cũng có thể vẽ đồ thi dạng cột theo biến dependents nhưng đồng thời chúng ta sẽ phân đồ thì này thành 2 nhóm theo biến card như sau:
CreditCard |> ggplot(aes(x = dependents, y = after_stat(count),fill = card )) +
  geom_bar(position = 'dodge') +
  ylab('Tần số ') +
  xlab('Số người phụ thuộc')

  • Với dạng đồ thị như trên thay vì để 2 cột cạnh nhau, chúng ta có thể chồng nó lên nhau như sau để dễ phân tích hơn.
CreditCard |> ggplot(aes(x = dependents)) + geom_bar(aes(y = after_stat(count), fill = card ), stat = 'count') +
 ylab('Tần số ') +
  xlab('Số người phụ thuộc')

  • Tương tự như trường hợp ở trên, chúng ta cũng có thể thêm ghi chú và đồ thị để người đọc dễ so sánh như sau:
CreditCard |> count( dependents , card ) |>
  group_by(dependents) |>
  mutate(pH = n/sum(n)) |>
  ggplot(aes(x = dependents , y = n, fill = card)) +
  geom_col() +
  geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5 ), size = 3) +
  ylab('Tần số ') +
  xlab('Số người phụ thuộc')

  • Ta có thể vẽ đồ thị thể hiện thu nhập trung bình theo nghề nghiệp như sau:
CreditCard |> group_by(selfemp) |> 
  summarise(mr = mean(income, na.rm = T)) |> 
  ggplot(aes(x = selfemp , y = mr)) +
  geom_col(fill = 'blue') +
  geom_text(aes(label = round(mr,2)), vjust = 2, color = 'red', size = 5) +
  xlab('Làm chủ ') +
  ylab('Thu nhập trung bình hằng năm')

  • Tương tự chúng ta cũng có thể dùng đồ thị cột để vẽ phương sai, độ lệch chuẩn, trung vị hay bất kỳ một đặc trưng thống kê nào để thực hiện việc so sánh.
CreditCard |> group_by(selfemp) |> 
  summarise(sdr = sd(income, na.rm = T)) |> 
  ggplot(aes(x = selfemp , y = sdr)) +
  geom_col(stat='indentity', fill = 'blue') +
  geom_text(aes(y= sdr+.5, label = round(sdr ,2)), vjust = 2, color = 'red', size = 5) +
  xlab('Làm chủ ') +
  ylab('Độ lệch chuẩn thu nhập hằng năm')
## Warning in geom_col(stat = "indentity", fill = "blue"): Ignoring unknown
## parameters: `stat`

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

3.4.1 Dữ liệu từ file excel

3.4.1.1 Mô tả dữ liệu

  • Chuỗi thời gian về Chi tiêu(100000VND) và thu nhập (10000VND). Tính theo đầu người và tính theo giá cố định năm 1980 trong thời kỳ năm 1971 - 1990 ở một khu vực
head(hq1)
## # A tibble: 6 × 3
##       N chitieu thunhap
##   <dbl>   <dbl>   <dbl>
## 1  1971    48.3    51.0
## 2  1972    48.5    52.4
## 3  1973    47.4    51.6
## 4  1974    54.6    58.9
## 5  1975    55      59.7
## 6  1976    63.5    68.4

3.4.1.2 Đồ thị thể hiện sự tương quan giữa mức chi tiêu và thu nhập.

hq1a <- lm(data= hq1 ,thunhap~chitieu)
plot(thunhap~chitieu,data=hq1) + abline(hq1a)

## integer(0)
  • Đồ thị cho thấy sự tương quan giữa hai biến thu nhập và chi tiêu.

3.4.2 Phân tích tương quan

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

3.4.2.1.1 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(thunhap, chitieu)
## 
##  Pearson's product-moment correlation
## 
## data:  thunhap and chitieu
## t = 24, df = 18, p-value = 3e-15
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9617 0.9942
## sample estimates:
##   cor 
## 0.985
  • Kết luận: p-value =3e-15 < mức ý nghĩa 0.05 nên ta có thể kết luận hai biến thu nhập và chi tiêu có quan hệ tương quan tuyến tính với nhau
3.4.2.1.2 Hệ số tương quan Spearman
  • 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ố.
cor.test(thunhap, chitieu, method="spearman")
## 
##  Spearman's rank correlation rho
## 
## data:  thunhap and chitieu
## S = 28, p-value = 7e-06
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##    rho 
## 0.9789
  • Kết luận: p-value =7e-06 < mức ý nghĩa 0.05 nên ta có thể kết luận hai biến thu nhập và chi tiêu có quan hệ tương quan tuyến tính với nhau
3.4.2.1.3 Hệ số tương quan Kendall
cor.test( chitieu, thunhap,method="kendall")
## 
##  Kendall's rank correlation tau
## 
## data:  chitieu and thunhap
## T = 182, p-value = 2e-12
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##    tau 
## 0.9158
  • Kết luận: p-value =2e-12 < mức ý nghĩa 0.05 nên ta có thể kết luận hai biến thu nhập và chi tiêu có quan hệ tương quan tuyến tính với nhau

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

3.4.2.2.1 Viết hàm SRF và bảng thống kê tuyến tính
lm( chitieu ~ thunhap)
## 
## Call:
## lm(formula = chitieu ~ thunhap)
## 
## Coefficients:
## (Intercept)      thunhap  
##       3.766        0.848

=> SRF:Y = 3.766 + 0.848β

3.4.2.2.2 Kiểm định các giả thuyết thống kê
  • Lập bảng thống kê hồi quy ta có:
eq <- lm(chitieu ~ thunhap)
summary(eq)
## 
## Call:
## lm(formula = chitieu ~ thunhap)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -5.344 -0.370  0.130  0.883  1.684 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    3.765      2.378    1.58     0.13    
## thunhap        0.848      0.035   24.25  3.4e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.56 on 18 degrees of freedom
## Multiple R-squared:  0.97,   Adjusted R-squared:  0.969 
## F-statistic:  588 on 1 and 18 DF,  p-value: 3.39e-15
  • Kiểm định xem sự phù hợp mô hình: ta có F= 588>C nên mô hình trên là phù hợp

  • Kiểm định sự ảnh hưởng của biến : T= 24.25>C nên khi thu nhập thay đổi thì sẽ làm ảnh hưởng đến mức chi tiêu.

3.4.2.2.3 Dự báo mô hình hồi quy đơn
  • Ta dự báo mức tiêu dùng khi thu nhập là 8000.000 VND với kết quả hàm SRF: Y=3.766+ 0.848β
ketqua <- 3.766 + 0.848*80
ketqua
## [1] 71.61

=> Khi mức thu nhập là 8 triệu VND thì mức chi tiêu trung bình sẽ là 7.161 triệu VND

3.4.3 Dữ liệu từ data GrowthSW

Đồ thị thể hiện sự tương quan giữa trình độ và GDP bình quân

g |> ggplot(map = aes(x = gr , y = ed )) + geom_point(color="red") + xlab(" Phần trăm tăng trưởng trung bình của GDP ") + ylab(" Số năm đi học trung bình ") + geom_smooth(formula = y ~ x, method = 'lm', color = 'black') + labs(title = 'Đồ Thị thể hiện sự tương quan giữa trình độ và phần trăm tăng trưởng GDP thực tế ')

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

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

3.4.3.1.1 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
gr <- g$gr
rg <- g$rg
tr <- g$tr
ed <- g$ed
re <- g$re
as <- g$as
  • Ta kiểm định tương quan giữa biến education và growth
cor.test( ed,gr)
## 
##  Pearson's product-moment correlation
## 
## data:  ed and gr
## t = 2.8, df = 63, p-value = 0.007
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.09475 0.53195
## sample estimates:
##   cor 
## 0.331

=> Kết luận: ta có p-value=0.007 < alpha=0.05 nên hai biến education và growth có quan hệ tương quan tuyến tính với nhau

  • Ta kiểm định sự tương quan giữa biến growth và rgdp60
cor.test(gr,rg)
## 
##  Pearson's product-moment correlation
## 
## data:  gr and rg
## t = 0.5, df = 63, p-value = 0.6
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.184  0.302
## sample estimates:
##     cor 
## 0.06271

=> Kết luận: p-value=0.6 > anpha=0.05 điều này có nghĩa là hai biến growth và rgdp60 không có mối quan hệ tuyến tính với nhau, có nghĩa nếu 1 trong hai biến thay đổi thì sẽ không làm ảnh hưởng đến biến còn lại.

3.4.3.1.2 Hệ số tương quan Spearman
cor.test(ed,gr ,method="spearman" )
## 
##  Spearman's rank correlation rho
## 
## data:  ed and gr
## S = 28510, p-value = 0.002
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##   rho 
## 0.377

=> Kết luận: ta có p-value=0.002 < alpha=0.05 nên hai biến education và growth có quan hệ tương quan tuyến tính với nhau

3.4.3.1.3 Hệ số tương quan Kendall
cor.test(ed,gr ,method="kendall" )
## 
##  Kendall's rank correlation tau
## 
## data:  ed and gr
## z = 2.8, p-value = 0.005
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##    tau 
## 0.2376

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

3.4.3.2.1 Viết hàm hồi quy tuyến tính mẫu SRF
lm(ed ~gr )
## 
## Call:
## lm(formula = ed ~ gr)
## 
## Coefficients:
## (Intercept)           gr  
##       3.123        0.444

=> SRF:Y = 3.123 + 0.444β

3.4.3.2.2 Kiểm định các giả thuyết
eq2 <- lm(ed~gr)
summary(eq2)
## 
## Call:
## lm(formula = ed ~ gr)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.690 -1.852 -0.601  1.399  5.980 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    3.123      0.431    7.25  7.4e-10 ***
## gr             0.444      0.159    2.78   0.0071 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.42 on 63 degrees of freedom
## Multiple R-squared:  0.11,   Adjusted R-squared:  0.0954 
## F-statistic: 7.75 on 1 and 63 DF,  p-value: 0.00708
  • Kiểm định sự phù hợp mô hình: ta có F= 7.75 >C nên mô hình trên là phù hợp.

  • Kiểm định sự ảnh hưởng của biến : T= 2.78 >C nên khi trình độ học vấn thay đổi thì sẽ làm ảnh hưởng đến sự tăng trưởng GDP.

3.4.3.2.3 Dự báo mô hình hồi quy đơn
  • Ta dự đoán khi giá trị biến growth = 3
kq2 <- 3.123 + 0.444 *3
kq2
## [1] 4.455

=> Khi giá trị của growth=3 thì giá trị trung bình của biến education=4.455

4 BÀI THỰC HÀNH TUẦN 3

4.1 Hàm pivot_longer

4.1.1 Tạo dữ liệu để thực hành

yy <- data.frame(player=c("A", "T", "V", "X", "Y", "Z"),
                 year1=c(19, 27, 24, 26, 29, 30),
                 year2=c(23, 30, 17, 18, 25, 19))
yy
##   player year1 year2
## 1      A    19    23
## 2      T    27    30
## 3      V    24    17
## 4      X    26    18
## 5      Y    29    25
## 6      Z    30    19

4.1.1.1 Định dạng dữ liệu từ “ngang-sang-dọc”

yy %>% 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     19
##  2 A      year2     23
##  3 T      year1     27
##  4 T      year2     30
##  5 V      year1     24
##  6 V      year2     17
##  7 X      year1     26
##  8 X      year2     18
##  9 Y      year1     29
## 10 Y      year2     25
## 11 Z      year1     30
## 12 Z      year2     19

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

4.1.2.1 Gọi dữ liệu

data("billboard")
bi <- billboard

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

4.1.3 Hàm pivot_wider

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

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

4.2.1 Tách rời biến Card

4.2.1.1 Những người được chấp nhận và những người không được chấp nhận cấp thẻ tín dụng

co <- subset(t3, ca3=="yes") 
dim(co)
## [1] 1023   12
  • Giải thích: có 1023 người được chấp nhận cấp thẻ tín dụng.
khong <- subset(t3, ca3=="no")
dim(khong)
## [1] 296  12
  • Giải thích: có 296 người không được chấp nhận cấp thẻ tín dụng.

4.2.2 Chọn lọc dữ liệu từ biến Reports có điều kiện

4.2.2.1 Những cá nhân có số báo cáo xúc phạm nhỏ hơn 4

n4 <- subset( t3, re3 < 4)
dim(n4)
## [1] 1271   12
  • Giải thích: có 1271 cá nhân có số báo cáo xúc phạm nhỏ hơn 4.

4.2.2.2 Những cá nhân có số báo cáo xúc phạm lớn hơn 4

l4 <- subset( t3, re3 > 4)
dim(l4)
## [1] 31 12
  • Giải thích: có 31 cá nhân có số báo cáo xúc phạm lớn hơn4.

4.2.2.3 Hoặc một data.frame mới với những cá nhân có số báo cáo lớn hơn 4 và không được cấp phép tín dụng

lno4 <- subset(t3, re3 > 4 & ca3=="no")
dim(lno4)
## [1] 31 12
  • Giải thích: Có 31 cá nhân có số báo cáo lớn hơn 4 và không được phép cấp thẻ tín dụng.

=> Vì có 31 cá nhân có số báo cáo lớn hơn 4 trong khi đó cũng có 31 các cá nhân vừa có số báo cáo lớn hơn 4 vừa không được cáp thẻ tín dụng. Nên ta có thể kết luận đối với các cá nhân có sô báo cáo lớn hơn 4 đều sẽ không được cấp thẻ tín dụng.

4.3 Chiết số liệu từ một data.frame

4.3.1 Trong biến CreditCard có 12 biến, ta có thể chiết dữ liệu và chỉ giữ lại những biến như: “card”,“age”,income”,“months”,“active”

data2 <- t3[,c(1,3,4,10,12)]
head(data2)
##   ca3   ag3   in3 mo3 ac3
## 1 yes 37.67 4.520  54  12
## 2 yes 33.25 2.420  34  13
## 3 yes 33.67 4.500  58   5
## 4 yes 30.50 2.540  25   7
## 5 yes 32.17 9.787  64   5
## 6 yes 23.25 2.500  54   1
  • Cũng với dữ liệu data2 nhưng ta chỉ muốn dùng 10 dòng số liệu đầu tiên
data3 <- t3[1:10,c(1,3,4,10,12)]
data3
##    ca3   ag3   in3 mo3 ac3
## 1  yes 37.67 4.520  54  12
## 2  yes 33.25 2.420  34  13
## 3  yes 33.67 4.500  58   5
## 4  yes 30.50 2.540  25   7
## 5  yes 32.17 9.787  64   5
## 6  yes 23.25 2.500  54   1
## 7  yes 27.92 3.960   7   5
## 8  yes 29.17 2.370  77   3
## 9  yes 37.00 3.800  97   6
## 10 yes 28.42 3.200  65  18

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

  • Xét theo trường hợp nguồn thu nhập của tất cả mội người tăng thêm 10000 USD
TNm <- (in3 + 1)
  • Làm tròn biến dữ liệu age trong khi dữ liệu gốc là Tuổi tính bằng năm cộng với phần mười hai của một năm.
Tuoi <- c(t3$ag3)
percentage <- round(Tuoi , digits =0)
Tuoitron <- paste (percentage, "", sep ="")
head(Tuoitron)
## [1] "38" "33" "34" "30" "32" "23"

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

t1 <- data.frame (in3, ag3, TNm)
t2 <- data.frame (t3, Tuoitron)
head(t2,5)
##   ca3 re3   ag3   in3      sh3     ex3 ow3 se3 de3 mo3 ma3 ac3 Tuoitron
## 1 yes   0 37.67 4.520 0.033270 124.983 yes  no   3  54   1  12       38
## 2 yes   0 33.25 2.420 0.005217   9.854  no  no   3  34   1  13       33
## 3 yes   0 33.67 4.500 0.004156  15.000 yes  no   4  58   1   5       34
## 4 yes   0 30.50 2.540 0.065214 137.869  no  no   0  25   1   7       30
## 5 yes   0 32.17 9.787 0.067051 546.503 yes  no   2  64   1   5       32

4.6 Thay đổi dữ liệu

4.6.1 Nếu tỷ lệ chi tiêu thẻ tín dụng hàng tháng so với hàng năm nằm ở mức thấp và mức chi tiêu trung bình hàng tháng bằng 0 thì sẽ không được cấp thẻ tín dụng

t3$ca3[t3$ex3 == "0" & t3$sh3 < 1] <- "no"
  • Giải thích: nếu tỷ lệ chi tiêu thẻ tín dụng hàng tháng nhỏ hơn 1 và mức chi tiêu thẻ tín dụng trung bình bằng 0 thì đơn xin cấp thẻ tín dụng sẽ không được chấp nhận.

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

  • Selfemp: Trả lời cho câu hỏi “cá nhân tự làm chủ hay không?”
CV3 <- CreditCard$selfemp
tabse3=table(CV3)
tabse3
## CV3
##   no  yes 
## 1228   91
  • Có 91/1319 người tự làm chủ, nếu chúng ta tiến hành chọn mẫu 100 lần, mỗi lần chọn 50 người trong quần thể đó một cách ngẫu nhiên, sự phân phối đó sẽ như thế nào?
h <- rbinom(1000, 50, 0.069)
table(h)
## h
##   0   1   2   3   4   5   6   7   8   9  11 
##  35 111 197 226 192 125  67  27  18   1   1
  • Đồ thị
hist (h, main = " Bảng phân phối nhị phân của biến Selfemp ")

  • Giải thích: Ở hàng số liệu thứ nhất (0,1,2,…,10) là số người làm chủ trong số 50 người mà chúng ta đã chọn. Hà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.

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

4.8.1 Biểu đồ cho 1 biến

4.8.1.1 Biến Card

Card3 <- CreditCard$card
tabca3 <- table(Card3)
tabca3
## Card3
##   no  yes 
##  296 1023
barplot(tabca3,main="Biểu đồ tần số đơn xin cấp thẻ tín dụng ")

  • Giải thích: có 296 người không được cấp thẻ tín dụng, 101023 người được cấp thẻ tín dụng. Biểu đồ cho ta thấy, số lượng người được cấp thẻ tín dụng cao gấp 3 lần số người không được cấp thẻ tín dụng.

4.8.1.2 Biến selfemp

barplot(tabse3, main= " Biểu đồ tần số mức độ làm chủ của người khảo sát")

  • Giải thích:Số người không phải làm chủ (1228 ) cao hơn 13 lần số người làm chủ. Vậy hầu như công việc của mọi người thường không phải là chủ

4.8.1.3 Biến Income

TN3 <- t3$in3
BangTN3 <- cut(TN3, breaks = c(0.2100, 2.868, 5.526, 8.184, 10.842, 13.5000 ), labels = c("thấp", "trung bình" , "trung bình cao", "cao", "rất cao"), right = TRUE)
tabin3= table(BangTN3)
barplot(tabin3, main= " Biểu đồ tần số mức độ thu nhập hằng năm ")

  • Giải thích: Mức thu nhập thấp chiếm tỷ lệ cao nhất và tần số ngày càng giảm khi mức thu nhập tăng lên điều đó cho thấy những người có thu nhập cao chiếm tỷ lệ rất ít và xét trên diên tổng thể thì họ thường có mức thu nhập thấp.

4.8.2 Biểu đồ strip cho 1 biến

4.8.2.1 Biến Majorcards

Soluong3 <- t3$ma3
table(Soluong3)
## Soluong3
##    0    1 
##  241 1078
stripchart(Soluong3 , main= "Biểu đồ thể hiệnhiện số lượng thẻ được tổ chứcchức ", xlab = "Số lượng")

4.8.2.2 Biến Active

Taikhoan3 <- t3$ac3
stripchart(Taikhoan3 , main= "Biểu đồ thể hiện số lượng tài khoản hoạt động", xlab = "Số lượng tài khoản ")

4.8.2.3 Biến Age

stripchart(ag3, main= "Biểu đồ thể hiện số tuổi của người được khảo sát", xlab = "Số tuổi ")

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

4.8.3.1 Kết hợp giữa biến Tuổi và biến Thu nhập

Bangag3 <- cut(ag3 , breaks = c(18,40,60,84 ), labels = c("18-40", "40-60", "60-84"), right = TRUE)
tabag3=table(Bangag3)
tabearnag3 = table(BangTN3, Bangag3)
tabearnag3
##                 Bangag3
## BangTN3          18-40 40-60 60-84
##   thấp             553    83     9
##   trung bình       388   148     9
##   trung bình cao    57    30     5
##   cao               10    14     0
##   rất cao            1     4     0
barplot(tabearnag3, beside=TRUE, xlab="Độ tuổi", ylab= "Tần số") 

  • Giải thích: Dựa theo biểu đồ thì độ tuổi từ 18-40 tuổi thường sẽ có thu nhập thấp, tức là độ tuổi càng nhỏ thì thu nhập càng thấp.

4.8.3.2 Kết hợp giữa biến Tuổi và biến Dependents

Bangde3 <- cut(de3 , breaks = c(0,2,4,6 ), labels = c("0-2", "2-4", "4-6"), right = TRUE)
tabde3=table(Bangde3)
tabagde3=table(Bangde3, Bangag3)
tabagde3 
##        Bangag3
## Bangde3 18-40 40-60 60-84
##     0-2   344   130    10
##     2-4   110    45     2
##     4-6    10     6     0
barplot(tabagde3 , beside=TRUE, xlab="Độ tuổi", ylab= "Tần số") 

  • Giải thích: Dựa theo biểu đồ thì độ tuổi từ 18-40 tuổi thường sẽ có số người phụ thuộc nhiều hơn nhưng hầu hết chỉ có từ 0-2 người phụ thuộc - có thể coi đó là số ít, còn ở độ tuổi từ 60-84 thì rất ít người phụ thuộc - điều này đúng với thực tế.

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

4.8.4.1 Biến Card

pie(tabca3, main = " Biểu đồ tròn của biến Card ")

  • Nhận xét: tỷ lệ đơn xin cấp thẻ tín dụng được chấp nhận cao hơn tỷ lệ đơn không dược chấp nhận

4.8.4.2 Biến Income

pie(tabin3 , main = " Biểu đồ tròn của biến Thu Nhập")

  • Nhận xét: Tỷ lệ thu nhập thấp chiếm 1/2 tổng số lượng trong khi tỷ lệ thu nhập cao lại chiếm tỷ lệ rất ít

4.8.5 Biểu đồ tán xạ cho 2 biến :Income,Share

SH3 <- t3$sh3
plot(TN3,SH3)

5 BÀI THỰC HÀNH TUẦN 2

  • CHỦ ĐỀ : Phân tích sự tác động từ dữ liệu chéo biến định lượng: “age” và biến định tính: “selfemp” của dataset:“CreditCard” lên biến định lượng “income” thuộc package: “AER”

5.1 Khai báo tên package trước khi sử dụng, liệt kê tất cả các thư viện sẵn dùng trong R

library(AER)

5.2 Lấy dữ liệu “Creditcard” từ package “AER” để tiến hành phân tích

data("CreditCard")

5.3 ĐÁNH GIÁ DỮ LIỆU

5.3.1 Biến định lượng “income”: biến thu nhập hằng năm (USD)

  • Trung bình:
mean(CreditCard$income)
## [1] 3.365
  • Trung vị:
median(CreditCard$income, na.rm = FALSE)
## [1] 2.9
  • Phương sai:
var(CreditCard$income)
## [1] 2.869
  • Độ lệch chuẩn:
sd(CreditCard$income)
## [1] 1.694

=> Kết luận: Mean>Median có nghĩa là dữ liệu có phân phối lệch phải. sd và var khá nhỏ, suy ra độ phân tán của các quan sát so với giá trị trung bình khá đồng đều.

5.3.2 Biến định lượng expenditure: Mức chi tiêu thẻ tín dụng hằng tháng

  • Trung bình:
mean(CreditCard$expenditure)
## [1] 185.1
  • Trung vị:
median(CreditCard$expenditure, na.rm = FALSE)
## [1] 101.3
  • Phương sai:
var(CreditCard$expenditure)
## [1] 74103
  • Độ lệch chuẩn:
sd(CreditCard$expenditure)
## [1] 272.2

=> Kết luận: Mean>Median có nghĩa là dữ liệu có phân phối lệch phải. sd và var khá lớn, suy ra độ phân tán của các quan sát so với giá trị trung bình không đồng đều

5.4 LẬP BẢNG TẦN SỐ

5.4.1 Lập bảng tần số của biến thu nhập (income):

TN <- CreditCard$income
BangTN <- cut(TN, breaks = c(0.2100, 2.868, 5.526, 8.184, 10.842, 13.5000 ), labels = c("thấp", "trung bình" , "trung bình cao", "cao", "rất cao"), right = TRUE)
tabin= table(BangTN)
tabin
## BangTN
##           thấp     trung bình trung bình cao            cao        rất cao 
##            647            550             92             24              5

5.4.2 Đồ thị của biến thu nhập (income):

barplot(tabin, xlab = "Thu Nhập", ylab = "Tần số",  main = "Biểu đồ biểu thị mức độ thu nhập hằng năm(USD)", col = c("green", "red", "blue", "white", "pink"))

=> Giải thích kết quả từ bảng tần số của biến thu nhập (income): Dựa vào biểu đồ ta có thể thấy mức độ thụ nhập Cao chiếm tỷ lệ rất thấp và ngược lại, mức độ thu nhập thấp lại chiếm tỷ lệ cao nhất và mức thu nhập từ thấp đến cao lại có xu hướng giảm dần. Điều đó cho thấy thu nhập hằng năm của hầu hết người được khảo sát thuộc mức thu nhập thấp

5.4.3 Lập bảng tần số của biến dependents: số người phụ thuộc vào người được khảo sát

Sng <- CreditCard$dependents
BangSng <- cut(Sng, breaks = c(0,2,4,6), labels = c("0-2", "2-4", "4-6"), right = TRUE)
tabde=table(BangSng)
tabde
## BangSng
## 0-2 2-4 4-6 
## 485 159  16

5.4.4 Đồ thị của biến dependents

barplot(tabde, xlab = "Sng", ylab = "Tần số",  main = "Biểu đồ thể hiện số người phụ thuộc vào người được khảo sát", col = c("green", "red", "yellow"))

=> Giải thích kết quả từ bảng tần số của biến dependents: Từ bảng tần số ta có thể thấy rằng trường hợp có từ 0-2 người phụ thuộc chiếm tỷ lệ cao nhất và tần số cũng giảm dần khi số người phụ thuộc càng nhiều, trường hợp có 4-6 người phụ thuộc là số người cao nhất lại chiếm tỷ lệ thấp nhất. Nghĩa là hầu hết mọi người được khảo sát không có quá nhiều người phụ thuộc vào mình, ho không gặp phải quá nhiều gánh nặng về kinh tế

5.4.5 Lập bảng tần số của biến selfemp :trả lời cho câu hỏi “cá nhân tự làm chủ hay không?”

CV <- CreditCard$selfemp
table(CV)
## CV
##   no  yes 
## 1228   91
tabse=table(CV)
tabse
## CV
##   no  yes 
## 1228   91

5.4.6 Đồ thị của biến giới tính (selfemp):

barplot(tabse, xlab = "CV", ylab = "Tần số",  main = "Biểu đồ cho biết cá nhân có  làm chủ hay không?", col = c("red","green"))

=> Giải thích kết quả từ bảng tần số của biến selfemp: cá nhân có tự làm chủ hay không. Từ bảng tần số ta thấy tần số của câu trả lời “no” cao hơn 10 lần “yes”. Nghĩa là hầu hết công việc của người được khảo sát đều không phải là làm chủ

5.5 Phân tích sự tác động giữa 2 biến định lượng:“dependents”,“income”

5.5.1 Lập bảng kết hợp của 2 biến

tabearnde = table(BangTN, BangSng)
tabearnde
##                 BangSng
## BangTN           0-2 2-4 4-6
##   thấp           205  41   1
##   trung bình     234  81  12
##   trung bình cao  33  27   2
##   cao              9  10   1
##   rất cao          3   0   0

5.5.1.1 Kiểm định chi bình phương (chi-squared):

5.5.1.1.1 Kiểm định giữa 2 biến : Income và Dependents
  • Trong kiểm định này, chúng ta phải kiểm tra các giá trị p-value và đặt ra bài toán kiểm định gồm có giả thuyết H0 và H1.
  • Chúng ta sẽ bác bỏ giả thuyết H0 nếu giá trị p-value xuất hiện trong kết quả nhỏ hơn mức ý nghĩa xác định trước, mức ý nghĩa thường là 0,05.
  • H0: Hai biến độc lập
  • H1: Hai biến phụ thuộc
chisq.test(TN, Sng, correct=FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  TN and Sng
## X-squared = 3310, df = 2580, p-value <2e-16
  • Ta thấy giá trị p-value = 2.2e-16 có nghĩa là con số đó rất nhỏ nên ta xem nó bằng 0 và vì giá trị P-value nhỏ hơn mức ý nghĩa lầ 0,05 nên ta bác bỏ H0. => Kết luận: Giữa 2 biến có sự liên quan đến nhau hay nói cách khác đây là 2 biến phụ thuộc
5.5.1.1.2 Đồ thị của biến thu nhập theo số người phụ thuộc.
Sng0den2 <- Sng[Sng>=0 & Sng<2]
vearnandde0den2 <- c(205,234,33,9,3)
Sng2den4 <- Sng[Sng>=2 & Sng<4]
vearnandde2den4 <- c(41,81,27,10,0)
Sng4den6 <- Sng[Sng>=4 & Sng<6]
vearnandde4den6 <- c(1,12,2,1,0)
plot(vearnandde0den2, xlab = "Mức Thu Nhập: Thấp - Trung bình - Trung bình cao - Cao - Rất Cao", ylab= "Tần số", main = "Biểu đồ của biến thu nhập khi có từ 0-2 người phụ thuộc vào", col = c ("red", "green","yellow", "blue", "black"))

plot(vearnandde2den4, xlab = "Mức Thu Nhập: Thấp - Trung bình - Trung bình cao - Cao - Rất Cao", ylab= "Tần số", main = "Biểu đồ của biến thu nhập khi có từ 2-4 người phụ thuộc vào", col = c ("red", "green","yellow", "blue", "black"))

plot(vearnandde4den6, xlab = "Mức Thu Nhập: Thấp - Trung bình- Trung bình cao - Cao - Rất Cao", ylab= "Tần số", main = "Biểu đồ của biến thu nhập khi có từ 4-6 người phụ thuộc vào", col = c ("red", "green","yellow", "blue", "black")) 

=> Giải thích kết quả 3 đồ thị trên: Xét theo biến dependents ta có 3 nhóm (0-2),(2-4),(4-6) đây là tổng số người phụ thuộc vào người được khảo sát, thì chúng ta có thể thấy số người có mức thu nhập thấp đều sẽ giảm dần (từ 205ng xuống 1ng) khi số người phụ thuộc tăng dần và tương tự như vậy, ở các mức thu nhập còn lại thì tần số cũng sẽ giảm dần trong khi số người phụ thuộc tăng dần. Tức là ở tất cả các mức thu nhập: số người phụ thuộc càng ít thì tần số càng nhiều và ngược lại.

=> Kết luận: Trên thực tế, khi số người phụ thuộc vào càng nhiều tức là gánh nặng càng lớn đồng nghĩa với chi tiêu sẽ càng cao thì lúc đó thu nhập sẽ thấp.

5.6 Phân tích sự tác động giữa 1 biến định tính (selfemp) và 1 biến định lượng (income)

5.6.1 Lập bảng kết hơp của 2 biến

tabearnse = table(BangTN, CV)
tabearnse
##                 CV
## BangTN            no yes
##   thấp           615  32
##   trung bình     506  44
##   trung bình cao  80  12
##   cao             23   1
##   rất cao          3   2

5.6.1.1 Kiểm định chi bình phương (chi-squared):

  • Trong kiểm định này, chúng ta phải kiểm tra các giá trị p-value và đặt ra bài toán kiểm định gồm có giả thuyết H0 và H1.

  • Chúng ta sẽ bác bỏ giả thuyết H0 nếu giá trị p-value xuất hiện trong kết quả nhỏ hơn mức ý nghĩa xác định trước, mức ý nghĩa thường là 0,05.

  • H0: Hai biến độc lập

  • H1: Hai biến phụ thuộc

chisq.test(TN, CV, correct=FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  TN and CV
## X-squared = 488, df = 430, p-value = 0.03
  • Ta thấy giá trị p-value = 0.02773 và vì giá trị P-value<0,05 nên ta bác bỏ H0.

=> Kết luận: Giữa 2 biến có sự liên quan đến nhau hay nói cách khác đây là 2 biến phụ thuộc nhau.

5.6.1.1.1 Đồ thị kết hợp giữa 2 biến
vearnandno <- c(615,506,80,23,3)
vearnandyes <- c(32,44,12,1,2)

plot(vearnandno, xlab= "Mức Thu Nhập: Thấp - Trung Bình - Trung bình cao - Cao - Rất Cao", ylab = "Tần Số",  main = "Biểu đồ thể hiện mức thu nhập khi biết người được khảo sát làm chủ", col = c("red", "green","yellow", "blue", "black"))

plot(vearnandyes, xlab= "Mức Thu Nhập: Thấp - Trung Bình - Trung bình cao - Cao - Rất Cao", ylab = "Tần Số",  main = "Biểu đồ thể hiện mức thu nhập khi biết người được khảo sát không làm chủ", col = c("red", "green","yellow", "blue", "black"))

  • giải thích kết quả từ 2 biểu đồ: Xét theo biến selfemp gồm “no” và “yes”.”No”:Người được khảo sát không phải là chủ.”Yes” người được khảo sát là chủ.

=> Nếu người có mức thu nhập thấp thì tỷ lệ không làm chủ sẽ cao hơn người làm chủ, tương tự các mức thu nhập còn lại cũng vậy. Nhưng vì những người có mức thu nhập thấp và không làm chủ chiếm tỷ lệ cao nhất là tỷ lệ đó cũng giảm dần khi thu nhập của họ cao lên. Điều đó cho thấy nếu người được khảo sát không phải làm chủ thì mức thu nhập của học sẽ thấp

6 BÀI THỰC HÀNH TUẦN 1

6.1 Lấy dữ liệu “Creditcard” từ package “AER” để tiến hành phân tích

data("CreditCard")
head(CreditCard)
##   card reports   age income    share expenditure owner selfemp dependents
## 1  yes       0 37.67  4.520 0.033270     124.983   yes      no          3
## 2  yes       0 33.25  2.420 0.005217       9.854    no      no          3
## 3  yes       0 33.67  4.500 0.004156      15.000   yes      no          4
## 4  yes       0 30.50  2.540 0.065214     137.869    no      no          0
## 5  yes       0 32.17  9.787 0.067051     546.503   yes      no          2
## 6  yes       0 23.25  2.500 0.044438      91.997    no      no          0
##   months majorcards active
## 1     54          1     12
## 2     34          1     13
## 3     58          1      5
## 4     25          1      7
## 5     64          1      5
## 6     54          1      1

6.2 Tạo dữ liệu bản sao “t” từ dữ liệu gốc “CreditCard”

t <- CreditCard

6.3 Xem cấu trúc của dữ liệu gốc “CreditCard”

str(t)
## 'data.frame':    1319 obs. of  12 variables:
##  $ card       : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ reports    : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ age        : num  37.7 33.2 33.7 30.5 32.2 ...
##  $ income     : num  4.52 2.42 4.5 2.54 9.79 ...
##  $ share      : num  0.03327 0.00522 0.00416 0.06521 0.06705 ...
##  $ expenditure: num  124.98 9.85 15 137.87 546.5 ...
##  $ owner      : Factor w/ 2 levels "no","yes": 2 1 2 1 2 1 1 2 2 1 ...
##  $ selfemp    : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ dependents : num  3 3 4 0 2 0 2 0 0 0 ...
##  $ months     : num  54 34 58 25 64 54 7 77 97 65 ...
##  $ majorcards : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ active     : num  12 13 5 7 5 1 5 3 6 18 ...

6.4 Đặt lại tên viết tắt cho các thuộc tính của dữ liệu bản sao “t”

names(t) <- c("ca1","re1","ag1","in1","sh1","ex1","ow1","se1","de1","mo1","ma1","ac1")

6.5 Liệt kê tất cả các biến có trong “t”

list = ls()

6.6 Hiển thị các quan sát của dữ liệu bản sao “t”

  • xem thử 6 dòng đầu tiên của dữ liệu
head(t)
##   ca1 re1   ag1   in1      sh1     ex1 ow1 se1 de1 mo1 ma1 ac1
## 1 yes   0 37.67 4.520 0.033270 124.983 yes  no   3  54   1  12
## 2 yes   0 33.25 2.420 0.005217   9.854  no  no   3  34   1  13
## 3 yes   0 33.67 4.500 0.004156  15.000 yes  no   4  58   1   5
## 4 yes   0 30.50 2.540 0.065214 137.869  no  no   0  25   1   7
## 5 yes   0 32.17 9.787 0.067051 546.503 yes  no   2  64   1   5
## 6 yes   0 23.25 2.500 0.044438  91.997  no  no   0  54   1   1
  • xem thử 7 dòng đầu tiên của dữ liệu
head(t,7)
##   ca1 re1   ag1   in1      sh1     ex1 ow1 se1 de1 mo1 ma1 ac1
## 1 yes   0 37.67 4.520 0.033270 124.983 yes  no   3  54   1  12
## 2 yes   0 33.25 2.420 0.005217   9.854  no  no   3  34   1  13
## 3 yes   0 33.67 4.500 0.004156  15.000 yes  no   4  58   1   5
## 4 yes   0 30.50 2.540 0.065214 137.869  no  no   0  25   1   7
## 5 yes   0 32.17 9.787 0.067051 546.503 yes  no   2  64   1   5
## 6 yes   0 23.25 2.500 0.044438  91.997  no  no   0  54   1   1
## 7 yes   0 27.92 3.960 0.012576  40.833  no  no   2   7   1   5

6.7 Truy vấn dữ liệu: ta sử dụng biến (“age”, “income”, “owner”) từ tập dữ liệu “CreditCard”

ag <- CreditCard$age
inc <- CreditCard$income
ow <- CreditCard$owner
x <- CreditCard[,c("age","income","owner")]

6.8 Tiến hành trực quan hóa dữ liệu bằng package “ggplot2”

library(ggplot2)

6.8.1 Đồ thị trực quan hóa dữ liệu của biến định lượng “age”, tên viết tắt là “ag”

barplot(ag, xlab = " ", ylab = "Độ Tuổi",  main = "Biểu đồ thể hiện dữ liệu của biến Tuổi age")

6.8.2 Đồ thị trực quan hóa dữ liệu của biến định tính “income”, tên viết tắt là “in”

barplot(inc, xlab = " ", ylab ="inc", main = "Biểu đồ thể hiện dữ liệu của biến thu nhập ")

6.9 Xử lý dữ liệu

6.9.1 Lọc dữ liệu: đối với biến thu nhập “income” tiến hành lọc ra những quan sát có thu nhập từ 10.000 đến 11.000 USD/ năm

inc10den11 <- inc[inc>10.000 & inc<11.000]
inc10den11
## [1] 10.04 10.50 11.00 10.03 10.40

6.9.2 Sắp xếp dữ liệu: thực hiện sắp xếp dữ liệu của biến “Income” theo thứ tự thu nhập tăng dần.

ThuNhaptang = t[order(t$`in`), ]
head(ThuNhaptang)
##      ca1 re1   ag1   in1       sh1   ex1 ow1 se1 de1 mo1 ma1 ac1
## 1201 yes   0 49.83 0.210 0.2718571 47.24 yes  no   2  42   1   1
## 1226  no   0 39.58 0.490 0.0024490  0.00 yes  no   2 100   1   0
## 320   no   0 23.92 1.200 0.0010000  0.00  no  no   0  15   0   0
## 1207  no   0 20.58 1.200 0.0010000  0.00  no yes   1  24   1   0
## 226  yes   0 32.83 1.320 0.0387553 42.63  no  no   1   6   1   2
## 660   no   0 23.25 1.434 0.0008368  0.00 yes  no   0  12   1   6

6.10 Lập bảng tần số

6.10.1 Lập bảng tần số cho biến “ow” (biến định tính) của dữ liệu “t”

own <- t$ow
table(own)
## own
##  no yes 
## 738 581

=> Kết quả hiển thị cho biết đối với câu hỏi khảo sát trên thì có 738 người không sở hữu nhà riêng và có 581 người đang sở hữu nhà riêng

6.10.2 Lập bảng tần số cho biến “de” (biến định lượng) của dữ liệu t

  • Dependents: Số người phụ thuộc vào người được khảo sát
de <- t$de
table(cut(de,6))
## 
## (-0.006,1]      (1,2]      (2,3]      (3,4]      (4,5]   (5,6.01] 
##        926        218        115         44          9          7

=> Kết quả hiển thị cho biết đổi với trường hợp có từ 0-2 người phụ thuộc thì chiếm tần số cao nhất với 926 người và tần số càng giảm khi số người phụ thuộc càng tăng điều đó cho thấy hầu hết mọi người không có quá nhiều người phụ thuộc vào mình.