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.
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.
Đế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
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
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
dl <- paste0("https://www.investing.com/currencies/usd-vnd-historical-data")
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
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
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.
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
library(tseries)
plot.ts(daprice1, ylab= "Price", xlab= "Time" , main= "USD/VND")
hist(daprice1)
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
Đườ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.
plot(daprice1)
library(forecast)
MA_m22= forecast::ma(daprice1, order=3, centre= TRUE)
plot(MA_m22)
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
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
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
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.
PriceForecasts <- HoltWinters(daprice1, gamma = FALSE)
coefficients <- PriceForecasts$coefficients
x <- data.frame(as.numeric(coefficients))
ketquadubao= sum(x)
ketquadubao
## [1] 23664.79
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), …
# 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)
}
get_data_currency("vnd")
## [1] 23664.79
get_data_currency("cny")
## [1] 7.129334
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)
}
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.
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("")
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 %)
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="%")
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="%")
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")
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="%")
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="%")
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="%")
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="%")
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="%")
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="%")
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="%")
Ý nghĩa các biến thuộc dữ liệu CreditCard
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).
Đâ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
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)
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.
hq1 |> ggplot(map=aes(x = thunhap , y = chitieu )) + geom_point(color = "blue")
hq1 |> ggplot(map=aes(x = thunhap , y = chitieu )) + geom_point(color = "blue")+ xlab("Thu Nhập")+ ylab("Chi Tiêu")
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.
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.
data("GrowthSW")
g <- GrowthSW
names(g) <- c("gr","rg","tr","ed","re","as")
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.
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.
g |> ggplot(aes(x = ed , y = rg )) +
geom_point(color = 'blue') +
geom_line(color = 'red')
data("CreditCard")
CreditCard |> ggplot(aes(x = card)) + geom_bar(fill = 'blue')
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ệ %')
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%
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 ')
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.
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()
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')
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')
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')
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')
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`
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
hq1a <- lm(data= hq1 ,thunhap~chitieu)
plot(thunhap~chitieu,data=hq1) + abline(hq1a)
## integer(0)
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
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
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
lm( chitieu ~ thunhap)
##
## Call:
## lm(formula = chitieu ~ thunhap)
##
## Coefficients:
## (Intercept) thunhap
## 3.766 0.848
=> SRF:Y = 3.766 + 0.848β
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.
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
Đồ 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ế ')
gr <- g$gr
rg <- g$rg
tr <- g$tr
ed <- g$ed
re <- g$re
as <- g$as
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
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.
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
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
lm(ed ~gr )
##
## Call:
## lm(formula = ed ~ gr)
##
## Coefficients:
## (Intercept) gr
## 3.123 0.444
=> SRF:Y = 3.123 + 0.444β
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.
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
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
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
data("billboard")
bi <- billboard
dy <- bi |> pivot_longer(cols=starts_with("wk"), names_to="tuần", values_to="hạng")
head(dy, 5)
## # A tibble: 5 × 5
## artist track date.entered tuần hạng
## <chr> <chr> <date> <chr> <dbl>
## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk1 87
## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk2 82
## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk3 72
## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk4 77
## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 wk5 87
dx <- dy |> pivot_wider(names_from="tuần", values_from="hạng")
head(dx, 5)
## # A tibble: 5 × 79
## artist track date.entered wk1 wk2 wk3 wk4 wk5 wk6 wk7 wk8
## <chr> <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 Pac Baby… 2000-02-26 87 82 72 77 87 94 99 NA
## 2 2Ge+her The … 2000-09-02 91 87 92 NA NA NA NA NA
## 3 3 Doors Do… Kryp… 2000-04-08 81 70 68 67 66 57 54 53
## 4 3 Doors Do… Loser 2000-10-21 76 76 72 69 67 65 55 59
## 5 504 Boyz Wobb… 2000-04-15 57 34 25 17 17 31 36 49
## # ℹ 68 more variables: wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>,
## # wk13 <dbl>, wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
## # wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>,
## # wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
## # wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
## # wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>,
## # wk43 <dbl>, wk44 <dbl>, wk45 <dbl>, wk46 <dbl>, wk47 <dbl>, wk48 <dbl>, …
co <- subset(t3, ca3=="yes")
dim(co)
## [1] 1023 12
khong <- subset(t3, ca3=="no")
dim(khong)
## [1] 296 12
n4 <- subset( t3, re3 < 4)
dim(n4)
## [1] 1271 12
l4 <- subset( t3, re3 > 4)
dim(l4)
## [1] 31 12
lno4 <- subset(t3, re3 > 4 & ca3=="no")
dim(lno4)
## [1] 31 12
=> 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.
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
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
TNm <- (in3 + 1)
Tuoi <- c(t3$ag3)
percentage <- round(Tuoi , digits =0)
Tuoitron <- paste (percentage, "", sep ="")
head(Tuoitron)
## [1] "38" "33" "34" "30" "32" "23"
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
t3$ca3[t3$ex3 == "0" & t3$sh3 < 1] <- "no"
CV3 <- CreditCard$selfemp
tabse3=table(CV3)
tabse3
## CV3
## no yes
## 1228 91
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
hist (h, main = " Bảng phân phối nhị phân của biến Selfemp ")
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 ")
barplot(tabse3, main= " Biểu đồ tần số mức độ làm chủ của người khảo sát")
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 ")
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")
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 ")
stripchart(ag3, main= "Biểu đồ thể hiện số tuổi của người được khảo sát", xlab = "Số tuổi ")
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ố")
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ố")
pie(tabca3, main = " Biểu đồ tròn của biến Card ")
pie(tabin3 , main = " Biểu đồ tròn của biến Thu Nhập")
library(AER)
data("CreditCard")
mean(CreditCard$income)
## [1] 3.365
median(CreditCard$income, na.rm = FALSE)
## [1] 2.9
var(CreditCard$income)
## [1] 2.869
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.
mean(CreditCard$expenditure)
## [1] 185.1
median(CreditCard$expenditure, na.rm = FALSE)
## [1] 101.3
var(CreditCard$expenditure)
## [1] 74103
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
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
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
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
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ế
CV <- CreditCard$selfemp
table(CV)
## CV
## no yes
## 1228 91
tabse=table(CV)
tabse
## CV
## no yes
## 1228 91
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ủ
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
chisq.test(TN, Sng, correct=FALSE)
##
## Pearson's Chi-squared test
##
## data: TN and Sng
## X-squared = 3310, df = 2580, p-value <2e-16
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.
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
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
=> 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.
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"))
=> 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
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
t <- 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 ...
names(t) <- c("ca1","re1","ag1","in1","sh1","ex1","ow1","se1","de1","mo1","ma1","ac1")
list = ls()
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
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
ag <- CreditCard$age
inc <- CreditCard$income
ow <- CreditCard$owner
x <- CreditCard[,c("age","income","owner")]
library(ggplot2)
barplot(ag, xlab = " ", ylab = "Độ Tuổi", main = "Biểu đồ thể hiện dữ liệu của biến Tuổi age")
barplot(inc, xlab = " ", ylab ="inc", main = "Biểu đồ thể hiện dữ liệu của biến thu nhập ")
inc10den11 <- inc[inc>10.000 & inc<11.000]
inc10den11
## [1] 10.04 10.50 11.00 10.03 10.40
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
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
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.