Bộ dữ liệu population-and-demography thống kê tổng dân số và số dân ở một số độ tuổi nhất định của 254 quốc gia trong khoảng thời gian từ 1950 - 2021.
Đầu tiên, ta tiến hành import dữ liệu từ file excel vào bằng câu lệnh read.xlsx nằm trong package xlsx, ở đây ta gắn dữ liệu với object khl . Ta có thể xem tên của các biến bằng lệnh names(khl)(kết quả được trình bày ở bên dưới)
library(xlsx)
khl <- read.xlsx("C:/Users/Dell/OneDrive/UFM/R/population-and-demography.xlsx", sheetIndex = 1, header = 1)
names(khl)
## [1] "Country.name"
## [2] "Year"
## [3] "Population"
## [4] "Population.of.children.under.the.age.of.1"
## [5] "Population.of.children.under.the.age.of.5"
## [6] "Population.of.children.under.the.age.of.15"
## [7] "Population.under.the.age.of.25"
## [8] "Population.aged.15.to.64.years"
## [9] "Population.older.than.15.years"
## [10] "Population.older.than.18.years"
## [11] "Population.at.age.1"
## [12] "Population.aged.1.to.4.years"
## [13] "Population.aged.5.to.9.years"
## [14] "Population.aged.10.to.14.years"
## [15] "Population.aged.15.to.19.years"
## [16] "Population.aged.20.to.29.years"
## [17] "Population.aged.30.to.39.years"
## [18] "Population.aged.40.to.49.years"
## [19] "Population.aged.50.to.59.years"
## [20] "Population.aged.60.to.69.years"
## [21] "Population.aged.70.to.79.years"
## [22] "Population.aged.80.to.89.years"
## [23] "Population.aged.90.to.99.years"
## [24] "Population.older.than.100.years"
Để có thể xem một số thông tin cơ bản, ta dùng câu lệnh skim(khl) nằm trong package skimr. Sau khi thực hiện câu lệnh, ta được kết quả như sau:
Dataset có 18288 hàng tương đương với 18288 quan sát và 24 cột tương đương với 24 biến
Dataset có 1 biến định dạng dữ liệu ký tự (character) và 23 biến định dạng dữ liệu số (numeric).
Với biến định dạng ký tự (biến Country.name):
Không có dữ liệu bị miss
Chuỗi ký tự ngắn nhất trên 1 ô dữ liệu là 4
Chuỗi ký tự dài nhất trên 1 ô dữ liệu là 59
Có 254 giá trị duy nhất, có nghĩa là dataset này thống kê dữ liệu dựa trên 254 quốc gia riêng biệt
Với các biến dữ liệu số, ta có thể xem được các giá trị như sau:
n_missing: số ô dữ liệu bị miss(trống)
complete_rate: tỷ lệ ô có dữ liệu
mean: trung bình
sd: độ lệch chuẩn là đại lượng để đo lường mức độ phân tán của dữ liệu
p0: giá trị nhỏ nhất
p25: Phân vị thứ nhất cho biết có 25% giá trị nằm dưới và 75% giá trị nằm trên p25
p50: Phân vị thứ hai cũng chính là trung vị, cho biết 50% giá trị nằm dưới và 50% giá trị nằm trên p50
p75: phân vị thứ ba cho biết có 75% giá trị nằm dưới và 25% giá trị nằm trên p75
p100: giá trị lớn nhất
hist: biểu đồ Histogram
library(skimr)
skim(khl)
| Name | khl |
| Number of rows | 18288 |
| Number of columns | 24 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 23 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Country.name | 0 | 1 | 4 | 59 | 0 | 254 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Year | 0 | 1 | 1985.50 | 20.78 | 1950 | 1967.75 | 1985.5 | 2003.25 | 2021 | ▇▇▇▇▇ |
| Population | 0 | 1 | 126470436.62 | 588851230.77 | 1363 | 291591.50 | 3833997.5 | 16785463.50 | 7909295000 | ▇▁▁▁▁ |
| Population.of.children.under.the.age.of.1 | 0 | 1 | 3133496.86 | 14167006.03 | 25 | 6663.75 | 88352.0 | 463000.50 | 139783730 | ▇▁▁▁▁ |
| Population.of.children.under.the.age.of.5 | 0 | 1 | 14825709.57 | 67384368.62 | 136 | 31995.25 | 423784.5 | 2160046.50 | 690360700 | ▇▁▁▁▁ |
| Population.of.children.under.the.age.of.15 | 0 | 1 | 41095227.11 | 188416973.54 | 416 | 89541.50 | 1186121.5 | 5905944.75 | 2015023400 | ▇▁▁▁▁ |
| Population.under.the.age.of.25 | 0 | 1 | 63762600.31 | 294251869.66 | 623 | 139541.50 | 1843099.5 | 9025129.75 | 3239281000 | ▇▁▁▁▁ |
| Population.aged.15.to.64.years | 0 | 1 | 77429505.08 | 367651914.71 | 748 | 170263.50 | 2246772.0 | 9641250.00 | 5132999000 | ▇▁▁▁▁ |
| Population.older.than.15.years | 0 | 1 | 85372101.76 | 404866940.61 | 849 | 186716.00 | 2482104.0 | 10354345.50 | 5893678600 | ▇▁▁▁▁ |
| Population.older.than.18.years | 0 | 1 | 78196242.04 | 372017010.49 | 752 | 166417.50 | 2238130.5 | 9239904.00 | 5516283000 | ▇▁▁▁▁ |
| Population.at.age.1 | 0 | 1 | 3011212.81 | 13661998.41 | 26 | 6473.75 | 85824.0 | 440787.50 | 138478740 | ▇▁▁▁▁ |
| Population.aged.1.to.4.years | 0 | 1 | 11692212.72 | 53238243.89 | 101 | 25269.25 | 334454.0 | 1697850.75 | 550970400 | ▇▁▁▁▁ |
| Population.aged.5.to.9.years | 0 | 1 | 13598575.21 | 62534310.11 | 138 | 29406.25 | 392220.5 | 1947260.75 | 683611800 | ▇▁▁▁▁ |
| Population.aged.10.to.14.years | 0 | 1 | 12670942.28 | 58775457.46 | 73 | 27879.50 | 363895.5 | 1796754.00 | 659934300 | ▇▁▁▁▁ |
| Population.aged.15.to.19.years | 0 | 1 | 11782258.92 | 55126036.18 | 110 | 26296.50 | 336969.5 | 1626210.75 | 623576060 | ▇▁▁▁▁ |
| Population.aged.20.to.29.years | 0 | 1 | 20872880.04 | 98860990.50 | 158 | 45050.75 | 609723.5 | 2758738.50 | 1210493200 | ▇▁▁▁▁ |
| Population.aged.30.to.39.years | 0 | 1 | 17158704.11 | 82404600.95 | 137 | 36608.25 | 486290.5 | 2113149.00 | 1165207300 | ▇▁▁▁▁ |
| Population.aged.40.to.49.years | 0 | 1 | 13622138.99 | 66008221.21 | 119 | 27440.25 | 364712.5 | 1556334.00 | 976407200 | ▇▁▁▁▁ |
| Population.aged.50.to.59.years | 0 | 1 | 10177069.11 | 49288480.77 | 95 | 19649.75 | 264781.5 | 1203386.00 | 851356900 | ▇▁▁▁▁ |
| Population.aged.60.to.69.years | 0 | 1 | 6801756.84 | 32712918.99 | 64 | 12603.00 | 168417.5 | 845242.75 | 598067140 | ▇▁▁▁▁ |
| Population.aged.70.to.79.years | 0 | 1 | 3618710.03 | 17491538.61 | 31 | 6221.00 | 81824.0 | 436710.00 | 330491170 | ▇▁▁▁▁ |
| Population.aged.80.to.89.years | 0 | 1 | 1195799.30 | 6238308.33 | 6 | 1818.75 | 20269.5 | 133380.50 | 131835590 | ▇▁▁▁▁ |
| Population.aged.90.to.99.years | 0 | 1 | 142784.38 | 853350.39 | 0 | 154.75 | 1468.5 | 12499.00 | 22223974 | ▇▁▁▁▁ |
| Population.older.than.100.years | 0 | 1 | 3107.72 | 20951.57 | 0 | 0.00 | 13.0 | 163.00 | 593166 | ▇▁▁▁▁ |
Từ kết quả trên, ta có thể đánh giá 1 số đặc điểm về bộ dữ liệu này như sau:
Dataset có 18288 quan sát và 24 biến
Có 1 biến định tính, 1 biến thời gian và 22 biến định lượng
Có 23 biến định dạng số và 1 biến định dạng ký tự
Dataset lấy số liệu từ 254 quốc gia và trong khoảng từ 1950-2021 nên được thống kê thành một Panel Data(Dữ liệu bảng)
Không có dữ liệu bị miss
Có độ lệch chuẩn khá lớn, có nghĩa là bộ dữ liệu này có mức độ phân tán giá trị khá cao
Dân số từ 15 và 18 tuổi trở lên chiếm đa số
Từ 30 tuổi trở đi, dân số có xu hướng giảm dần theo độ tuổi
Để tiến hành rút trích dữ liệu, ta có nhiều cách để tiến hành, ở đây ta dùng lệnh filter và select của package tidyverse. Ta sẽ chọn 5 quốc gia lần lượt là Vietnam, Thailand, Malaysia, Cambodia, Singapore và các biến Country.name, Year, Population, Population.aged.60.to.69.years, Population.aged.70.to.79.years, Population.aged.80.to.89.years, Population.aged.90.to.99.years, Population.older.than.100.years và gán vào object khl1.
Sau đó ta có thể xem kết quả của việc rút trích bằng lệnh str(khl1) sẽ cho ra số hàng, số cột và định dạng loại dữ liệu.
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
khl1 <- filter(khl,khl$Country.name %in% c('Vietnam','Thailand','Malaysia', 'Cambodia','Singapore')) %>% select(Country.name, Year, Population,
Population.aged.60.to.69.years,
Population.aged.70.to.79.years,
Population.aged.80.to.89.years,
Population.aged.90.to.99.years,
Population.older.than.100.years)
str(khl1)
## 'data.frame': 360 obs. of 8 variables:
## $ Country.name : chr "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
## $ Year : num 1950 1951 1952 1953 1954 ...
## $ Population : num 4380384 4485394 4592881 4702070 4814380 ...
## $ Population.aged.60.to.69.years : num 133728 137369 141236 145214 149203 ...
## $ Population.aged.70.to.79.years : num 54119 54463 54783 55214 55962 ...
## $ Population.aged.80.to.89.years : num 8876 9108 9395 9697 9987 ...
## $ Population.aged.90.to.99.years : num 426 406 398 393 381 370 360 350 349 360 ...
## $ Population.older.than.100.years: num 2 2 2 2 2 2 1 1 1 1 ...
Lúc này, để có thể xem tổng quan về dữ liệu đã rút, ta tiếp tục sử dụng lệnh skim(khl1) để có thể xem các đặc điểm nổi bật về dữ liệu.
library(skimr)
skim(khl1)
| Name | khl1 |
| Number of rows | 360 |
| Number of columns | 8 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 7 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Country.name | 0 | 1 | 7 | 9 | 0 | 5 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Year | 0 | 1 | 1985.50 | 20.81 | 1950 | 1967.75 | 1985.5 | 2003.25 | 2021 | ▇▇▇▇▇ |
| Population | 0 | 1 | 27921050.42 | 26454038.28 | 1006712 | 6049071.00 | 16302305.0 | 45102906.50 | 97468024 | ▇▃▂▂▁ |
| Population.aged.60.to.69.years | 0 | 1 | 1424164.67 | 1752429.88 | 22975 | 226499.25 | 671358.0 | 2047020.25 | 8457481 | ▇▂▁▁▁ |
| Population.aged.70.to.79.years | 0 | 1 | 721147.99 | 921019.97 | 8521 | 100140.75 | 297416.0 | 971559.75 | 4335041 | ▇▂▁▁▁ |
| Population.aged.80.to.89.years | 0 | 1 | 246827.93 | 374608.65 | 1713 | 24352.25 | 84455.5 | 274761.00 | 1920116 | ▇▁▁▁▁ |
| Population.aged.90.to.99.years | 0 | 1 | 35030.16 | 63436.84 | 151 | 1252.75 | 8189.0 | 37137.00 | 421693 | ▇▁▁▁▁ |
| Population.older.than.100.years | 0 | 1 | 1645.47 | 4045.90 | 0 | 8.00 | 104.5 | 889.25 | 28840 | ▇▁▁▁▁ |
Từ kết quả của câu lệnh, ta đọc được một số đặc điểm nổi bật như sau:
Bộ dữ liệu không có dữ liệu bị miss
Bộ dữ liệu được rút trích còn lại 360 hàng và 8 cột
Trong đó có 1 cột là dữ liệu ký tự và 7 cột là dữ liệu số
Về biến Country.name, ta thấy:
Chuỗi ký tự ngắn nhất là 7 và dài nhất là 9
Có 5 giá trị riêng biệt(đúng vì ta đã rút ra 5 quốc gia)
Độ lệch chuẩn của các biến tương đối lớn, điều này có nghĩa là mức độ phân tán dữ liệu khá cao
Giá trị nhỏ nhất của biến Population.older.than.100.years bằng 0, có nghĩa là tồn tại một hay nhiều quốc gia không có người lớn hơn 100 tuổi.
Dân số và độ tuổi hầu như có tỷ lệ nghịch với nhau, tuổi càng cao thì số dân càng ít.
Ta tiến hành mã hóa dữ liệu thông qua việc so sánh dân số ở độ tuổi từ 70-79 so với 80-89, cụ thể như sau: nếu giá trị ở biến dân số tuổi 70-79 lớn hơn 80-89 thì ô dữ liệu tương ứng sẽ hiện “Lớn hơn”, theo đó ta có 2 trường hợp còn lại là “bằng nhau” và “nhỏ hơn”. Sau đó, ta có thể xem sơ qua kết quả bằng câu lệnh str
library(tidyverse)
khl1 <- khl1 %>% mutate(sosanh=case_when(khl1$Population.aged.70.to.79.years>khl1$Population.aged.80.to.89.years~"Lớn hơn",khl1$Population.aged.70.to.79.years<khl1$Population.aged.80.to.89.years~"Nhỏ hơn",khl1$Population.aged.70.to.79.years==khl1$Population.aged.80.to.89.years~"Bằng nhau"))
str(khl1)
## 'data.frame': 360 obs. of 9 variables:
## $ Country.name : chr "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
## $ Year : num 1950 1951 1952 1953 1954 ...
## $ Population : num 4380384 4485394 4592881 4702070 4814380 ...
## $ Population.aged.60.to.69.years : num 133728 137369 141236 145214 149203 ...
## $ Population.aged.70.to.79.years : num 54119 54463 54783 55214 55962 ...
## $ Population.aged.80.to.89.years : num 8876 9108 9395 9697 9987 ...
## $ Population.aged.90.to.99.years : num 426 406 398 393 381 370 360 350 349 360 ...
## $ Population.older.than.100.years: num 2 2 2 2 2 2 1 1 1 1 ...
## $ sosanh : chr "Lớn hơn" "Lớn hơn" "Lớn hơn" "Lớn hơn" ...
Ta sẽ tiến hành tính toán tần số của kết quả so sánh bên trên bằng câu lệnh table(khl1$sosanh) hay kết hợp chức năng group_by với câu lệnh tính số lượng summaries(n())
Ở đây, tôi sẽ tiến hành 2 cách để so sánh kết quả
table(khl1$sosanh)
##
## Lớn hơn
## 360
library(tidyverse)
group_by(khl1,sosanh) %>% summarise(n())
## # A tibble: 1 × 2
## sosanh `n()`
## <chr> <int>
## 1 Lớn hơn 360
Chúng ta có thể thấy cả 2 câu lệnh đều cho ra kết quả như nhau đó là có 360 dữ liệu là “Lớn hơn” với tỷ lệ là 100%, điều này có nghĩa dân số ở độ tuổi 70-79 ở bất kỳ quốc gia và bất kỳ thời gian nào đều lớn hơn dân số 80-89. Điều này càng khẳng định hơn việc dân số tỷ lệ nghịch với độ tuổi.
Ta thực hiện tính các đặc trưng của tổng dân số cho tất cả 5 quốc gia, cho từng quốc gia và tính theo khoảng thời gian.
Để tính toán 1 cách tóm tắt các đặc trưng đo lường ta có thể dùng câu lệnh summary, câu lệnh dùng để tính toán các đặc trưng dễ dàng nhất. Ta sẽ chỉ tính toán các biến định lượng, bởi vì đặc trưng đo lường của biến định tính không có ý nghĩa. Biến định lượng trong dữ liệu này gồm các biến dân số và dân số cho khoảng tuổi.
summary(khl1)
## Country.name Year Population
## Length:360 Min. :1950 Min. : 1006712
## Class :character 1st Qu.:1968 1st Qu.: 6049071
## Mode :character Median :1986 Median :16302305
## Mean :1986 Mean :27921050
## 3rd Qu.:2003 3rd Qu.:45102906
## Max. :2021 Max. :97468024
## Population.aged.60.to.69.years Population.aged.70.to.79.years
## Min. : 22975 Min. : 8521
## 1st Qu.: 226499 1st Qu.: 100141
## Median : 671358 Median : 297416
## Mean :1424165 Mean : 721148
## 3rd Qu.:2047020 3rd Qu.: 971560
## Max. :8457481 Max. :4335041
## Population.aged.80.to.89.years Population.aged.90.to.99.years
## Min. : 1713 Min. : 151
## 1st Qu.: 24352 1st Qu.: 1253
## Median : 84456 Median : 8189
## Mean : 246828 Mean : 35030
## 3rd Qu.: 274761 3rd Qu.: 37137
## Max. :1920116 Max. :421693
## Population.older.than.100.years sosanh
## Min. : 0.0 Length:360
## 1st Qu.: 8.0 Class :character
## Median : 104.5 Mode :character
## Mean : 1645.5
## 3rd Qu.: 889.2
## Max. :28840.0
Ở bản tóm tắt này, ta có thể đọc được các giá trị như sau:
Min: Giá trị nhỏ nhất
1st: Phân vị thứ nhất
Median: Phân vị thứ hai hay là trung vị
Mean: Giá trị trung bình
3rd: Phân vị thứ 3
Max: Giá trị lớn nhất
Ở đây, tôi sẽ tiến hành tính toán giá trị trung bình và độ lệch chuẩn của tổng dân số các quốc gia riêng biệt bằng cách thực hiện câu lệnh group_by và kết hợp với lệnh summaries để tính toán các thống kê mỗi nhóm và sẽ gán vào object khl2
library(tidyverse)
khl2 <- khl1 %>% group_by(Country.name) %>% summarise(mean_of_country=mean(Population),sd_of_country=sd(Population))
khl2
## # A tibble: 5 × 3
## Country.name mean_of_country sd_of_country
## <chr> <dbl> <dbl>
## 1 Cambodia 9323148. 3881020.
## 2 Malaysia 17388128. 8720294.
## 3 Singapore 3141772. 1496864.
## 4 Thailand 48988953. 16956963.
## 5 Vietnam 60763252. 22973741.
Lúc này, ta có thể dễ dàng so sánh dân số ở các nước, ta thấy dân số cao nhất là quốc gia Vietnam và thấp nhất nằm ở Singapore và dân số ở các quốc gia chênh lệch nhau một khoảng khá lớn. Về độ lệch chuẩn, ta thấy ở quốc gia nào độ lệch chuẩn cũng khá cao, có nghĩa là mức độ phân tán dữ liệu khá lớn, điều này có thể hiểu là dữ liệu khi dùng để tính toán các thống kê thì không đáng tin cậy lắm.
Ở đây, tôi sẽ tiến hành tính giá trị trung bình và trung vị trong khoảng thời gian từ 2000 - 2021 của các quốc gia riêng biệt.
Trước tiên, tôi sẽ thực hiện rút trích dữ liệu để có thể nhận dữ liệu trong khoảng từ năm 2000 - 2021 bằng lệnh filter và sau đó sẽ thực hiện lệnh group_by kết hợp summarise để tính đặc trưng của từng quốc gia.
library(tidyverse)
khl3 <- khl1 %>% filter(khl1$Year>=2000&khl1$Year<=2021)%>%
group_by(Country.name) %>% summarise(meanofyear=mean(Population),medianofyear=median(Population))
khl3
## # A tibble: 5 × 3
## Country.name meanofyear medianofyear
## <chr> <dbl> <dbl>
## 1 Cambodia 14426727. 14468714
## 2 Malaysia 28680065. 28950934
## 3 Singapore 5078409. 5222468
## 4 Thailand 68096756. 68491670
## 5 Vietnam 88086727. 87880058
Ở khoảng thời gian từ năm 2020-2021 ta thấy Vietnam vẫn là quốc gia dẫn đầu trong tổng số dân và trung vị ở đây cũng khá xấp xỉ giá trị trung bình
Dữ liệu được tổng hợp Worldbank bao gồm các biến như sau:
Country: Tên quốc gia
Year: Năm
GDP (current US$): GDP theo giá của người mua tính bằng USD
Population, total: Tổng dân số
Foreign direct investment, net inflows (BoP, current US$): Đầu tư trực tiếp nước ngoài tính bằng USD
Agriculture, forestry, and fishing, value added (current US$): Nông, Lâm, Ngư nghiệp và giá trị gia tăng là sản lượng ròng của một ngành sau khi cộng tất cả các đầu ra và trừ đi các đầu vào trung gian.
Inflation, consumer prices (annual %): Lạm phát
Ta tiến hành import dữ liệu bằng câu lệnh read.xlsx trong package xlsx
library(xlsx)
hoa <- read.xlsx('C:/Users/Dell/OneDrive/UFM/R/P_Data_Extract_From_World_Development_Indicators.xlsx', sheetIndex = 1, header = T)
Ta thực hiện lệnh skim trong package skimr để có thể xem thông tin tổng quan của bộ dữ liệu
library(skimr)
skim(hoa)
| Name | hoa |
| Number of rows | 228 |
| Number of columns | 7 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 6 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Country.Name | 0 | 1 | 5 | 13 | 0 | 6 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Year | 0 | 1.00 | 2.003500e+03 | 1.099000e+01 | 1.985000e+03 | 1.994000e+03 | 2.003500e+03 | 2.013000e+03 | 2.022000e+03 | ▇▇▇▇▇ |
| GDP..current.US.. | 0 | 1.00 | 3.760581e+12 | 5.524029e+12 | 6.293305e+09 | 1.275232e+11 | 4.563230e+11 | 5.062015e+12 | 2.543970e+13 | ▇▁▁▁▁ |
| Population..total | 0 | 1.00 | 3.061574e+08 | 4.444090e+08 | 2.733373e+06 | 6.350407e+07 | 1.095119e+08 | 2.907823e+08 | 1.412360e+09 | ▇▁▁▁▂ |
| Foreign.direct.investment..net.inflows..BoP..current.US.. | 0 | 1.00 | 6.318495e+10 | 1.037903e+11 | -4.947474e+09 | 2.505750e+09 | 1.241324e+10 | 6.605156e+10 | 5.114340e+11 | ▇▁▁▁▁ |
| Agriculture..forestry..and.fishing..value.added..current.US.. | 24 | 0.89 | 1.192126e+11 | 2.356938e+11 | 5.969522e+07 | 7.521169e+09 | 4.132959e+10 | 1.128935e+11 | 1.311311e+12 | ▇▁▁▁▁ |
| Inflation..consumer.prices..annual… | 13 | 0.94 | 2.930000e+00 | 3.800000e+00 | -1.710000e+00 | 6.600000e-01 | 2.190000e+00 | 3.610000e+00 | 2.426000e+01 | ▇▂▁▁▁ |
Từ kết quả trên, ta có thể đọc được một số thông tin như sau:
Dữ liệu gồm 228 hàng ứng với 228 quan sát và 7 cột ứng với 7 biến trong đó có 1 biến định dạng ký tự và 6 biến định dạng số.
Về biến Country.Name, ta có thể thấy dữ liệu biến tồn tại 6 giá trị riêng biệt không giống nhau, nghĩa là bộ dữ liệu này thu thập số liệu từ 6 quốc gia khác nhau.
Về các biến định dạng số, ta có:
Ở biến Agriculture..forestry..and.fishing..value.added..current.US.. chứa 24 giá trị trống với tỷ lệ là 0,11
Ở biến Inflation..consumer.prices..annual… chứa 13 giá trị trống chiếm tỷ lệ 0,06
Và một số đặc trưng thống kê khác của từng biến ta có thể xem ở kết quả bên trên.
Ta sẽ tiến hành xem dữ liệu được lấy từ những quốc gia nào bằng câu lệnh table.
table(hoa$Country.Name)
##
## China Japan Singapore Thailand United States
## 38 38 38 38 38
## Viet Nam
## 38
và kiểm tra khoảng thời gian cụ thể nào bằng cách tính giá trị min, max
c(min(hoa$Year),max(hoa$Year))
## [1] 1985 2022
Từ kết quả trên, ta có thể thấy dữ liệu được thu thập từ 6 quốc gia là China, Japan, Singapore, Thailand, United States, Viet Nam với mỗi quốc gia gồm 38 quan sát và trong khoảng thời gian từ 1950-2022
Để có thể tránh sự ảnh hưởng của dữ liệu trống đến quá trình tính toán đặc trưng đo lường, ta sẽ tiến hành gán giá trị của dữ liệu trống bằng với giá trị trung bình của chính biến và loại đi những giá trị trống đó.
Trước tiên, ta sẽ tiến hành đổi tên biến để thuận tiện cho quá trình làm việc
Và ta sẽ kiểm tra kết quả bằng câu lệnh sum(is.na())
names(hoa) <- c('country','year','gdp','popu','fdi','agri','infla')
hoa$agri[is.na(hoa$agri)] <- mean(hoa$agri,na.rm = T)
hoa$infla[is.na(hoa$infla)] <- mean(hoa$infla,na.rm = T)
sum(is.na(hoa))
## [1] 0
Tôi dự định sẽ làm việc với GDP nên sẽ rút GDP của các nước ra bằng câu lệnh select của package tidyverse và gán vào object , sau đó sẽ chuyển dạng bảng từ long table sang wide table bằng câu lệnh spread.
library(tidyverse)
gdpofcountry <- select(hoa,country,year,gdp)
wide_gdp <- spread(gdpofcountry,key=country,value=gdp)
Ta sẽ tiến hành mã hóa dữ liệu bằng cách so sánh GDP của Việt Nam và Thái Lan bằng câu lệnh ifelse. Biến so sánh là ‘Lớn hơn’ nếu GDP VN lớn hơn Thái Lan và tương tự các trường hợp còn lại. Sau khi thực hiện, ta có thể kiểm tra bằng câu lệnh str để xem cấu trúc bảng sau khi được mã hóa.
wide_gdp$sosanh <- ifelse(wide_gdp$`Viet Nam`>wide_gdp$Thailand,'Lớn hơn',ifelse(wide_gdp$`Viet Nam`< wide_gdp$Thailand,'Nhỏ hơn','Bằng nhau'))
str(wide_gdp)
## 'data.frame': 38 obs. of 8 variables:
## $ year : num 1985 1986 1987 1988 1989 ...
## $ China : num 3.10e+11 3.01e+11 3.27e+11 4.08e+11 4.56e+11 ...
## $ Japan : num 1.43e+12 2.12e+12 2.58e+12 3.13e+12 3.11e+12 ...
## $ Singapore : num 1.92e+10 1.86e+10 2.09e+10 2.54e+10 3.05e+10 ...
## $ Thailand : num 3.89e+10 4.31e+10 5.05e+10 6.17e+10 7.23e+10 ...
## $ United States: num 4.34e+12 4.58e+12 4.86e+12 5.24e+12 5.64e+12 ...
## $ Viet Nam : num 1.41e+10 2.63e+10 3.67e+10 2.54e+10 6.29e+09 ...
## $ sosanh : chr "Nhỏ hơn" "Nhỏ hơn" "Nhỏ hơn" "Nhỏ hơn" ...
Ta sẽ lập bảng tần số của biến so sánh để xem xét liệu có bao nhiêu năm thì GDP của VN lớn hơn Thái Lan.
table(wide_gdp$sosanh)
##
## Nhỏ hơn
## 38
Ta thấy giá trị nhỏ hơn xuất hiện 38 lần và không có giá trị nào khác, có nghĩa là trong 38 quan sát thì GDP VN đều thấp hơn GDP của Thái Lan.
Tính toán được các đặc trưng đo lường của các quốc gia
So sánh được các biến dữ liệu giữa các quốc gia với nhau
Ta tiếp tục sử dụng câu lệnh summary như bài 3.1 để tính toán đặc trưng trên tổng các quốc gia
summary(hoa)
## country year gdp popu
## Length:228 Min. :1985 Min. :6.293e+09 Min. :2.733e+06
## Class :character 1st Qu.:1994 1st Qu.:1.275e+11 1st Qu.:6.350e+07
## Mode :character Median :2004 Median :4.563e+11 Median :1.095e+08
## Mean :2004 Mean :3.761e+12 Mean :3.062e+08
## 3rd Qu.:2013 3rd Qu.:5.062e+12 3rd Qu.:2.908e+08
## Max. :2022 Max. :2.544e+13 Max. :1.412e+09
## fdi agri infla
## Min. :-4.947e+09 Min. :5.970e+07 Min. :-1.7103
## 1st Qu.: 2.506e+09 1st Qu.:9.959e+09 1st Qu.: 0.6968
## Median : 1.241e+10 Median :4.792e+10 Median : 2.3213
## Mean : 6.318e+10 Mean :1.192e+11 Mean : 2.9311
## 3rd Qu.: 6.605e+10 3rd Qu.:1.192e+11 3rd Qu.: 3.5251
## Max. : 5.114e+11 Max. :1.311e+12 Max. :24.2570
Như đã giải thích ở bài 3.1, ta có thể đọc được các đặc trưng đo lường của các biến trên tổng quốc gia
Ta tiếp tục sử dụng các câu lệnh như bài 3.1, ở đây ta sẽ tính đặc trưng là giá trị trung bình và độ lệch chuẩn của biến gdp
library(tidyverse)
hoa1 <- hoa %>% group_by(country) %>% summarise(mean_of_country_gdp=mean(gdp),sd_of_country_gdp=sd(gdp))
hoa1
## # A tibble: 6 × 3
## country mean_of_country_gdp sd_of_country_gdp
## <chr> <dbl> <dbl>
## 1 China 5.01e12 5.60e12
## 2 Japan 4.50e12 1.02e12
## 3 Singapore 1.73e11 1.33e11
## 4 Thailand 2.45e11 1.60e11
## 5 United States 1.25e13 5.85e12
## 6 Viet Nam 1.16e11 1.23e11
Ta dễ dàng thấy được China là quốc gia dẫn đầu trong GDP và Vietnam là quốc gia có GDP thấp nhất.
Ta tiến hành tính toán đặc trưng trung bình và trung vị của FDI ở các nước riêng biệt trong khoảng thời gian từ 2000-2022
library(tidyverse)
hoa2 <- hoa %>% filter(hoa$year>=2000&hoa$year<=2022)%>%
group_by(country) %>% summarise(meanofyear=mean(fdi),medianofyear=median(fdi))
hoa2
## # A tibble: 6 × 3
## country meanofyear medianofyear
## <chr> <dbl> <dbl>
## 1 China 176629654331. 174749584584.
## 2 Japan 18156049363. 11557373874.
## 3 Singapore 56408814913. 55310807548.
## 4 Thailand 7586629857. 8215637195.
## 5 United States 282076347826. 264039000000
## 6 Viet Nam 8550826087. 8368000000
Ở biến FDI thì giá trị trung bình của USA là dẫn đầu, các nước theo sau lần lượt là China,Singapore,Japan,Vietnam và Thailand.
Trước tiên, ta tiến hành rút trích các dữ liệu về GDP của Việt Nam trong khoảng thời gian từ 2000 - 2022 và gán vào object vn
Sau đó, ta xem thử khoảng thời gian là gồm bao nhiêu năm để thuận tiện cho vẽ biểu đồ.
library(tidyverse)
vn <- filter(hoa,hoa$country=='Viet Nam' & hoa$year >= 2000) %>% select(year,gdp)
length(vn$year)
## [1] 23
Ta tiến hành vẽ biểu đồ bằng câu lệnh ggplot nằm trong package ggplot2 và sử dụng gói package scales để thêm định dạng cho biểu đồ
library(ggplot2)
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
hihi <- vector()
for(i in 1:(23-1)) {
hihi[i]= (vn$gdp[i+1]/vn$gdp[i]-1)}
hehe <- data.frame(hihi)
hehe$year <- vn$year[2:23]
hehe %>% ggplot(aes(x = factor(year), y = percent(hihi))) +
geom_col(fill ='red') +
xlab('Năm') +
ylab('Tốc độ phát triển liên hoàn') +
labs(title = 'Hình 3.1: Tốc độ phát triển liên hoàn GDP của Việt Nam từ 2000-2022')
Từ biểu đồ trên, ta nhận xét được tốc độ phát triển GDP của Việt Nam như sau:
Tốc độ phát triển cao nhất nằm ở năm 2017 và thấp nhất là 2018
Tốc độ phát triển không đều nhau, nhưng vẫn tăng từng năm và không có hiện tượng giảm GDP