Nhiệm vụ 3.1 thực hiện các thao tác đã học trên bộ dữ liệu population and demography - một set data miêu tả về dân số của 254 quốc gia trên thế giới từ năm 1950 đến năm 2021.
Set data population and demograph là file cvs nên để đọc được dữ liệu thì ta gán bộ dữ liệu vào a và sử dụng lệnh read.csv.
a <- read.csv(file = 'C:/Users/Admin/Downloads/population-and-demography.csv', header = T)
is.data.frame(a) #kiểm tra a có phải là 1 data frame hay không, nếu ra true thì a là một data frame, ra false thì a không là một data frame
## [1] TRUE
length(a) #kiểm tra độ dài của bộ dữ liệu
## [1] 24
names(a) #kiểm tra tên và bộ dữ liệu có bao nhiêu cột (biến)
## [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"
dim(a) #kiểm tra bộ dữ liệu có bao nhiêu quan sát (obs) và biến (variables), hay kiểm tra bộ dữ liệu có bao nhiêu dòng và cột
## [1] 18288 24
str(a) #kiểm tra cấu trúc của bộ dữ liệu
## 'data.frame': 18288 obs. of 24 variables:
## $ Country.name : chr "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ Year : int 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ Population : num 7480464 7571542 7667534 7764549 7864289 ...
## $ Population.of.children.under.the.age.of.1 : num 301735 299368 305393 311574 317584 ...
## $ Population.of.children.under.the.age.of.5 : int 1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
## $ Population.of.children.under.the.age.of.15: int 3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
## $ Population.under.the.age.of.25 : num 4494349 4552138 4613604 4676232 4741371 ...
## $ Population.aged.15.to.64.years : num 4198587 4250002 4303436 4356242 4408474 ...
## $ Population.older.than.15.years : num 4411609 4466098 4522464 4578167 4633229 ...
## $ Population.older.than.18.years : num 3946595 3993640 4041439 4088379 4136116 ...
## $ Population.at.age.1 : num 258652 254304 252906 258717 264765 ...
## $ Population.aged.1.to.4.years : num 946547 947489 942827 943151 950233 ...
## $ Population.aged.5.to.9.years : int 966210 991791 1017993 1039950 1055592 1062420 1063212 1065357 1071666 1084972 ...
## $ Population.aged.10.to.14.years : int 854363 866796 878857 891707 907651 927921 951472 975939 996403 1011748 ...
## $ Population.aged.15.to.19.years : int 757113 768616 781411 794308 806216 817550 828600 839588 851433 867048 ...
## $ Population.aged.20.to.29.years : int 1241348 1260904 1280288 1298803 1316768 1334989 1353958 1374043 1393789 1414034 ...
## $ Population.aged.30.to.39.years : int 909953 922765 935638 948321 961484 975801 991166 1007440 1023595 1040441 ...
## $ Population.aged.40.to.49.years : int 661807 667015 672491 678064 684153 691279 699431 708537 717938 728233 ...
## $ Population.aged.50.to.59.years : int 467170 468881 470898 472969 475117 477664 480665 484018 487393 491447 ...
## $ Population.aged.60.to.69.years : int 271905 273286 274852 276577 278210 279789 281376 282918 284592 286551 ...
## $ Population.aged.70.to.79.years : int 92691 94358 96026 97705 99298 100839 102385 103932 105508 107136 ...
## $ Population.aged.80.to.89.years : int 9499 10155 10721 11254 11793 12342 12890 13428 13959 14495 ...
## $ Population.aged.90.to.99.years : int 123 118 139 166 190 210 233 255 277 307 ...
## $ Population.older.than.100.years : num 0 0 0 0 0 0 0 0 0 0 ...
sum(is.na(a)) #kiểm tra số ô trống của bộ dữ liệu
## [1] 0
table(duplicated(a)) #kiểm tra số dữ liệu bị trùng
##
## FALSE
## 18288
Kết quả trả về cho ta biết:
Bộ dữ liệu có cấu trúc là một data frame, có 18288 quan sát (obs) và 24 biến (variables)
18288 quan sát tương ứng với 18288 hàng
24 biến tương ứng với 24 cột
Cột đầu tiên là biến định lượng, 23 cột sau là biến định tính, trong đó:
chr: Kiểu biến là ký tự
int: Kiểu biến là số nguyên
num: Kiểu biến là số thực
Bộ dữ liệu không có dữ liệu trống và bị trùng nhau
Ý nghĩa tên biến của bộ dữ liệu:
Country.name: Tên quốc gia
Year: Năm
Population: Tổng dân số của quốc gia
Population of children under the age of 1: Dân số dưới 1 tuổi
Population of children under the age of 5: Dân số dưới 5 tuổi
Population of children under the age of 15: Dân số dưới 15 tuổi
Population under the age of 25: Dân số dưới 25 tuổi
Population aged 15 to 64 years: Dân số có độ tuổi từ 15 tới 64
Population older than 15 years: Dân số có độ tuổi lớn hơn 15
Population older than 18 years: Dân số có độ tuổi lớn hơn 18
Population at age 1: Dân số có độ tuổi là 1
Population aged 1 to 4 years: Dân số có độ tuổi từ 1 tới 4
Population aged 5 to 9 years: Dân số có độ tuổi từ 5 tới 9
Population aged 10 to 14 years: Dân số có độ tuổi từ 10 tới 14
Population aged 15 to 19 years: Dân số có độ tuổi từ 15 tới 19
Population aged 20 to 29 years: Dân số có độ tuổi từ 20 tới 29
Population aged 30 to 39 years: Dân số có độ tuổi từ 30 tới 39
Population aged 40 to 49 years: Dân số có độ tuổi từ 40 tới 49
Population aged 50 to 59 years: Dân số có độ tuổi từ 50 tới 59
Population aged 60 to 69 years: Dân số có độ tuổi từ 60 tới 69
Population aged 70 to 79 years: Dân số có độ tuổi từ 70 tới 79
Population aged 80 to 89 years: Dân số có độ tuổi từ 80 tới 89
Population aged 90 to 99 years: Dân số có độ tuổi từ 90 tới 99
Population older than 100 years: Dân số có độ tuổi trên 100
Để thuận tiện cho việc phân tích, trước hết ta đổi tên cột của bộ dữ liệu mà ta sẽ sử dụng với câu lệnh names()
names(a)[names(a) == "Country.name"] <- "name"
names(a)[names(a) == "Year"] <- "Y"
names(a)[names(a) == "Population"] <- "P"
names(a)[names(a) == "Population.aged.1.to.4.years"] <- "a1to4"
names(a)[names(a) == "Population.aged.5.to.9.years"] <- "a5to9"
names(a)[names(a) == "Population.aged.10.to.14.years"] <- "a10to14"
names(a)[names(a) == "Population.aged.15.to.19.years"] <- "a15to19"
names(a)[names(a) == "Population.aged.20.to.29.years"] <- "a20to29"
names(a)[names(a) == "Population.aged.30.to.39.years"] <- "a30to39"
Với câu lệnh names, kết quả trả về cho chúng ta thấy:
Cột ‘Country.name’ đổi tên thành name
Cột ‘Year’ đổi thành Y
Cột ‘Population’ đổi thành P
Cột ‘Population.aged.1.to.4.years’ đổi thành a1to4
Cột ‘Population.aged.5.to.9.years’ đổi thành a5to9
Cột ‘Population.aged.10.to.14.years’ đổi thành a10to14
Cột ‘Population.aged.15.to.19.years’ đổi thành a15to19
Cột ‘Population.aged.20.to.29.years’ đổi thành a20to29
Cột ‘Population.aged.30.to.39.years’ đổi thành a30to39
Set data population and demography có tới 254 quốc gia và nhiều độ tuổi khác nhau, tuy nhiên nhiều khi chúng ta không dùng hết được dữ liệu thu về mà chỉ dùng một lượng nhỏ dữ liệu thôi. Để thực hiện rút trích dữ liệu ta thao tác như sau:
library('tidyverse') #gọi package '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
b <- a %>% select(name, Y, P, a1to4, a5to9, a10to14, a15to19, a20to29, a30to39)
c <- b[b$name=='Argentina' | b$name=='Japan' | b$name=='Brazil' | b$name=='South Korea' | b$name=='France' | b$name=='Canada', ]
d <- c[c$Y==2019 | c$Y==2020 | c$Y==2021, ]
Kết quả trả về cho ta biết:
Trong 254 quốc gia, ta chỉ chọn ra dân số của 6 quốc gia bao gồm: Argentina, Brazil, Canada, France, Japan, South Korea.
Với 6 độ tuổi đó khác nhau: từ 1 tới 4 tuổi, 5 tới 9 tuổi, 10 tới 14 tuổi, 15 tới 19 tuổi, 20 tới 29 tuổi, 30 tới 39 tuổi.
Ở 3 năm liên tiếp 2019, 2020, 2021.
Và chọn thêm 1 cột tổng dân số của 6 nước trên.
Đôi khi, dữ liệu chúng ta thu về là dữ liệu định lượng, mà trong một vài trường hợp, dữ liệu định lượng không thể phản ánh được kết quả chúng ta cần tìm. Khi đó, chúng ta sẽ phải chuyển đổi dữ liệu định lượng sang dữ liệu định tính bằng các câu lệnh case_when, cut(), case_match và ifelse().
library('tidyverse') #gọi package 'tidyverse'
d$Dân.Số <- case_when(d$P<=39999999 ~ 'Thưa thớt', d$P>=40000000 & d$P<=79999999 ~ 'Trung bình', d$P>=80000000 & d$P<=99999999 ~ 'Đông đúc', d$P>=100000000 ~ 'Rất đông đúc' )
d$CL <- cut(d$P,4, labels = c('Thưa thớt', 'Trung bình', 'Đông đúc', 'Rất đông đúc'))
=> Ta dùng để so sánh dân số của các quốc gia với nhau, xem rằng một quốc gia trong một năm nào đó đó thưa thớt hay đông dân.
d$Châu.Lục <- d$name %>% case_match('Argentina' ~ 'Châu Mỹ', 'Brazil' ~ 'Châu Mỹ', 'Canada' ~ 'Bắc Mỹ', 'France' ~ 'Châu Âu', 'Japan' ~ 'Châu Á', 'South Korea' ~ 'Châu Á')
=> Việc mã hóa các quốc gia theo châu lục, có thể giúp các nhà phân tích dễ làm việc với dữ liệu theo nhóm châu lục, so sánh dân số của các quốc gia trong cùng một châu lục, hoặc so sánh dân số châu lục này với châu lục khác.
d$Dân.số.từ.20.đến.29.tuổi <- ifelse(d$a20to29<=7000000, 'Ít ỏi', 'Dày đặc')
=> Câu lệnh này ta có thể dùng để phân tích xem dân số đang trong độ tuổi lao động (20 đến 29 tuổi) của một quốc gia này trong một năm là nhiều hay ít.
Câu lệnh của lập bảng tần số là table(), có công dụng xem một đối tượng đã xuất hiện bao nhiêu lần trong bộ dữ liệu.
Câu lệnh cut() có công dụng chia nhóm các đối tượng lại với nhau.
cut(d$a1to4,4) #chia các giá trị ở cột a1to4 thành 4 nhóm
## [1] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [4] (9.11e+06,1.17e+07] (9.11e+06,1.17e+07] (9.11e+06,1.17e+07]
## [7] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [10] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [13] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## [16] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06] (1.35e+06,3.94e+06]
## 4 Levels: (1.35e+06,3.94e+06] (3.94e+06,6.53e+06] ... (9.11e+06,1.17e+07]
table(cut(d$a1to4,4))
##
## (1.35e+06,3.94e+06] (3.94e+06,6.53e+06] (6.53e+06,9.11e+06] (9.11e+06,1.17e+07]
## 15 0 0 3
Câu lệnh đầu tiên, kết quả trả về cho ta biết:
Cột a1to4 được chia làm 4 nhóm.
Nhóm đầu tiên nhận 15 giá trị.
Nhóm thứ 2 và thứ 3 không có giá trị.
Nhóm thứ 4 nhận 4 giá trị.
e <- d %>% group_by(Châu.Lục) %>% summarise(n = n()) #kểm tra tần số xuất hiện của các quốc gia theo cột Châu.Lục
Câu lệnh thứ hai, kết quả trả về cho ta biết:
Số lần xuất hiện của các châu lục lần lượt là:
Bắc Mỹ: 3 lần
Châu Mỹ: 6 lần
Châu Á: 6 lần
Châu Âu: 3 lần
f <- d %>% group_by('a5to9', 'a10to14') %>% summarise(n=n(), .groups='drop')
Câu lệnh thứ ba, kết quả trả về cho ta biết, nhóm 2 cột a5to9 và a10to14, tần số xuất hiện của nhóm này là 18 lần.
Bước phân tích này sẽ cho chúng ta những kết quả chi tiết nhất của bộ dữ liệu, cụ thể như sau:
summary(d$P)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 37522584 45096220 58122225 89581607 125086702 214326220
Câu lệnh thứ nhất, kết quả trả về cho ta biết, trên cột P:
Số nhỏ nhất là: 37.522.584
Có 25% tổng dân số có giá trị nhỏ hơn: 45.096.220 hay có 75% tổng dân số có giá trị lớn hơn: 45.096.220
Có 50% tổng dân số có giá trị nhỏ hơn: 58.122.225 hay có 50% tổng dân số có giá trị lớn hơn: 58.122.225
Cột P có tổng giá trị trung bình là: 89.581.607
Có 75% tổng dân số có giá trị nhỏ hơn 125.086.702 hay có 25% tổng dân số có giá trị lớn hơn: 125.086.702
Số lớn nhất là: 214.326.220
sum(d$a1to4) #tính tổng giá trị của cột
## [1] 71495439
Câu lệnh thứ hai, kết quả trả về cho biết, tổng dân số trong độ tuổi từ 1 đến 4 của 6 quốc giá trong 3 năm là: 71.495.439
length(d$a5to9)
## [1] 18
Câu lệnh thứ ba, kết quả trả về cho biết, dân số từ 5 đến 9 tuổi của 6 quốc gia trong 3 năm có độ dài bằng: 18
var(d$a10to14)
## [1] 2.17204e+13
Câu lệnh thứ tư, kết quả trả về cho biết, dân số từ 10 đến 14 tuổi của 6 quốc gia trong 3 năm bằng có độ giao động bằng: 2.17204e+13
sd(d$a15to19)
## [1] 4971691
Câu lệnh thứ năm, kết quả trả về cho ta biết, dân số từ 15 đến 19 tuổi của 6 quốc gia trong 3 năm bằng có độ lệch chuẩn bằng: 4971.691
quantile(d$a30to39)
## 0% 25% 50% 75% 100%
## 5177290 6520997 7582803 13632965 34847430
Câu lệnh thứ sau, kết quả trả về cho ta biết, dân số từ 30 đến 39 tuổi của 6 quốc gia trong 3 năm:
Có 0% dân số có giá trị nhỏ hơn: 5.177.290
Có 25% dân số có giá trị nhỏ hơn: 6.520.997
Có 50% dân số có giá trị nhỏ hơn: 7.582.803
Có 75% dân số có giá trị nhỏ hơn: 13.632.965
Có 100% dân số có giá trị nhỏ hơn: 34.847.430
Để tính toán trung vị của cột có dân số từ 1 đến 4 tuổi theo nhóm quốc gia, ta thực hiện như sau:
g <- d %>% group_by(name) %>% summarise(med_of_pop = median(a1to4))
Câu lệnh này, kết quả trả về cho ta biết:
Có 50% dân số Argentina trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 2.797.080
Có 50% dân số Brazil trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 11.620.684
Có 50% dân số Canada trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 1.543.425
Có 50% dân số France trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 2.801.423
Có 50% dân số Japan trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 3.609.702
Có 50% dân số South Korea trong độ tuổi từ 1 đến 4 tuổi có giá trị nhỏ hơn: 1.479.129
Để tính toán độ lệch chuẩn của cột có dân số từ 1 đến 4 tuổi theo nhóm thời gian, ta thực hiện như sau:
h <- d %>% group_by(Y) %>% summarise(med_of_pop = sd(a1to4))
Kết quả trả về cho ta biết, dân số từ 1 đến 4 tuổi:
Năm 2019 có độ lệch chuẩn bằng: 3.838.389
Năm 2020 có độ lệch chuẩn bằng: 3.833.970
Năm 2021 có độ lệch chuẩn bằng: 3.814.198
Set Data Global Education là một bộ dữ liệu cung cấp cái nhìn toàn cảnh về giáo dục trên quy mô toàn cầu, mang lại những hiểu biết sâu sắc về bối cảnh giáo dục năng động ở nhiều quốc gia và khu vực khác nhau.
Bộ dữ liệu này là tài sản không thể thiếu đối với các nhà nghiên cứu, các nhà giáo dục và các nhà hoạch định chính sách có tư duy tiến bộ, giúp họ đánh giá, nâng cao và định hình lại các hệ thống giáo dục trên toàn thế giới.
Sử dụng các phương pháp thống kê mô tả dữ liệu:
Rút trích dữ liệu
Mã hóa dữ liệu
Lập bảng tần số
Tính toán các đặc trưng đo lường
Bộ dữ liệu Global Education được lấy từ Kaggle - một kho tàng dữ liệu khổng lồ cho những ai đặc biệt quan tâm về phân tích dữ liệu.
Global Education là một file cvs, tương tự như các file khác, ta cũng gán bộ dữ liệu vào i và dụng lệnh read.cvs để đọc dữ liệu.
i <- read.csv(file = 'C:/Users/Admin/Downloads/Global_Education.csv', header = T)
is.data.frame(i) #kiểm tra i có phải là 1 data frame hay không, nếu ra true thì i là một data frame, ngược lại thì i không là một data frame
## [1] TRUE
length(i) #kiểm tra độ dài của bộ dữ liệu
## [1] 29
names(i) #kiểm tra tên và bộ dữ liệu có bao nhiêu cột (biến)
## [1] "Countries.and.areas"
## [2] "Latitude"
## [3] "Longitude"
## [4] "OOSR_Pre0Primary_Age_Male"
## [5] "OOSR_Pre0Primary_Age_Female"
## [6] "OOSR_Primary_Age_Male"
## [7] "OOSR_Primary_Age_Female"
## [8] "OOSR_Lower_Secondary_Age_Male"
## [9] "OOSR_Lower_Secondary_Age_Female"
## [10] "OOSR_Upper_Secondary_Age_Male"
## [11] "OOSR_Upper_Secondary_Age_Female"
## [12] "Completion_Rate_Primary_Male"
## [13] "Completion_Rate_Primary_Female"
## [14] "Completion_Rate_Lower_Secondary_Male"
## [15] "Completion_Rate_Lower_Secondary_Female"
## [16] "Completion_Rate_Upper_Secondary_Male"
## [17] "Completion_Rate_Upper_Secondary_Female"
## [18] "Grade_2_3_Proficiency_Reading"
## [19] "Grade_2_3_Proficiency_Math"
## [20] "Primary_End_Proficiency_Reading"
## [21] "Primary_End_Proficiency_Math"
## [22] "Lower_Secondary_End_Proficiency_Reading"
## [23] "Lower_Secondary_End_Proficiency_Math"
## [24] "Youth_15_24_Literacy_Rate_Male"
## [25] "Youth_15_24_Literacy_Rate_Female"
## [26] "Birth_Rate"
## [27] "Gross_Primary_Education_Enrollment"
## [28] "Gross_Tertiary_Education_Enrollment"
## [29] "Unemployment_Rate"
dim(i) #kiểm tra bộ dữ liệu có bao nhiêu quan sát (obs) và biến (variables), hay kiểm tra bộ dữ liệu có bao nhiêu dòng và cột
## [1] 202 29
str(i) #kiểm tra cấu trúc của bộ dữ liệu
## 'data.frame': 202 obs. of 29 variables:
## $ Countries.and.areas : chr "Afghanistan" "Albania" "Algeria" "Andorra" ...
## $ Latitude : num 33.9 41.2 28 42.5 11.2 ...
## $ Longitude : num 67.71 20.17 1.66 1.52 17.87 ...
## $ OOSR_Pre0Primary_Age_Male : int 0 4 0 0 31 14 14 2 52 13 ...
## $ OOSR_Pre0Primary_Age_Female : int 0 2 0 0 39 0 4 2 50 14 ...
## $ OOSR_Primary_Age_Male : int 0 6 0 0 0 0 4 0 9 0 ...
## $ OOSR_Primary_Age_Female : int 0 3 0 0 0 0 1 0 9 0 ...
## $ OOSR_Lower_Secondary_Age_Male : int 0 6 0 0 0 0 1 0 11 2 ...
## $ OOSR_Lower_Secondary_Age_Female : int 0 1 0 0 0 0 2 0 9 3 ...
## $ OOSR_Upper_Secondary_Age_Male : int 44 21 0 0 0 0 14 15 16 10 ...
## $ OOSR_Upper_Secondary_Age_Female : int 69 15 0 0 0 0 12 7 4 6 ...
## $ Completion_Rate_Primary_Male : int 67 94 93 0 63 0 0 91 99 0 ...
## $ Completion_Rate_Primary_Female : int 40 96 93 0 57 0 0 94 99 0 ...
## $ Completion_Rate_Lower_Secondary_Male : int 49 98 49 0 42 0 0 70 95 0 ...
## $ Completion_Rate_Lower_Secondary_Female : int 26 97 65 0 32 0 0 79 99 0 ...
## $ Completion_Rate_Upper_Secondary_Male : int 32 76 22 0 24 0 0 46 69 0 ...
## $ Completion_Rate_Upper_Secondary_Female : int 14 80 37 0 15 0 0 53 79 0 ...
## $ Grade_2_3_Proficiency_Reading : int 22 0 0 0 0 0 0 76 0 94 ...
## $ Grade_2_3_Proficiency_Math : int 25 0 0 0 0 0 0 71 0 70 ...
## $ Primary_End_Proficiency_Reading : int 13 0 0 0 0 0 0 46 0 0 ...
## $ Primary_End_Proficiency_Math : int 11 0 0 0 0 0 0 56 55 64 ...
## $ Lower_Secondary_End_Proficiency_Reading: int 0 48 21 0 0 0 0 48 0 80 ...
## $ Lower_Secondary_End_Proficiency_Math : int 0 58 19 0 0 0 0 31 50 78 ...
## $ Youth_15_24_Literacy_Rate_Male : int 74 99 98 0 0 0 0 99 0 0 ...
## $ Youth_15_24_Literacy_Rate_Female : int 56 100 97 0 0 0 0 100 0 0 ...
## $ Birth_Rate : num 32.5 11.8 24.3 7.2 40.7 ...
## $ Gross_Primary_Education_Enrollment : num 104 107 110 106 114 ...
## $ Gross_Tertiary_Education_Enrollment : num 9.7 55 51.4 0 9.3 ...
## $ Unemployment_Rate : num 11.12 12.33 11.7 0 6.89 ...
sum(is.na(i)) #kiểm tra số ô trống của bộ dữ liệu
## [1] 0
table(duplicated(i)) #kiểm tra số dữ liệu bị trùng
##
## FALSE
## 202
Kết quả trả về cho ta biết:
Bộ dữ liệu có cấu trúc là một data frame, có 202 quan sát (obs) và 29 biến (variables)
202 quan sát tương ứng với 202 hàng
29 biến tương ứng với 29 cột
Cột đầu tiên là biến định lượng, 28 cột sau là biến định tính, trong đó:
chr: Kiểu biến là ký tự
int: Kiểu biến là số nguyên
num: Kiểu biến là số thực
Bộ dữ liệu không có dữ liệu trống và bị trùng nhau
Ý nghĩa tên biến của bộ dữ liệu:
Countries.and.areas: Tên quốc gia và khu vực
Latitude: Tọa độ vĩ độ của vị trí địa lý
Longitude: Tọa độ kinh độ của vị trí địa lý
OOSR_Pre0Primary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi mầm non
OOSR_Pre0Primary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi mầm non
OOSR_Primary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi tiểu học
OOSR_Primary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi tiểu học
OOSR_Lower_Secondary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi THCS
OOSR_Lower_Secondary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi THCS
OOSR_Upper_Secondary_Age_Male: Tỷ lệ bỏ học của nam độ tuổi THPT
OOSR_Upper_Secondary_Age_Female: Tỷ lệ bỏ học của nữ độ tuổi THPT
Completion_Rate_Primary_Male: Tỷ lệ hoàn thành bậc tiểu học của nam
Completion_Rate_Primary_Female: Tỷ lệ hoàn thành bậc tiểu học của nữ
Completion_Rate_Lower_Secondary_Male: Tỷ lệ hoàn thành bậc THCS của nam
Completion_Rate_Lower_Secondary_Female: Tỷ lệ hoàn thành bậc THCS của nữ
Completion_Rate_Upper_Secondary_Male: Tỷ lệ hoàn thành bậc THPT của nam
Completion_Rate_Upper_Secondary_Female: Tỷ lệ hoàn thành bậc THPT của nữ
Grade_2_3_Thành thạo_Reading: Thành thạo kỹ năng đọc dành cho học sinh lớp 2-3
Grade_2_3_Proficiency_Math: Thành thạo môn toán dành cho học sinh lớp 2-3
Primary_End_Proficiency_Reading: Thành thạo kỹ năng đọc khi kết thúc bậc tiểu học
Primary_End_Proficiency_Math: Thành thạo toán khi kết thúc bậc tiểu học
Lower_Secondary_End_Proficiency_Reading: Thành thạo kỹ năng đọc khi kết thúc bậc THCS
Lower_Secondary_End_Proficiency_Math: Thành thạo môn toán khi kết thúc bậc THCS
Youth_15_24_Literacy_Rate_Male: Tỷ lệ biết chữ của thanh niên nam độ tuổi 15-24
Youth_15_24_Literacy_Rate_Female: Tỷ lệ biết chữ của thanh niên nữ độ tuổi 15-24
Birth_Rate: Tỷ lệ sinh ở các quốc gia/khu vực tương ứng
Gross_Primary_Education_Enrollment: Tổng số tuyển sinh tiểu học
Gross_Tertiary_Education_Enrollment: Tổng số tuyển sinh vào giáo dục đại học
Unemployment_Rate: Tỷ lệ thất nghiệp ở các quốc gia/khu vực tương ứng
Ở bộ dữ liệu gốc, tên biến của dữ liệu được đặt khá dài. Vì vậy để tiện cho việc phân tích, ta sẽ sử dụng lệnh names() đổi tên các biến ngắn gọn hơn, dễ sử dụng hơn. Ta thực hiện thao tác đổi tên biến như sau:
names(i)[names(i) == "Countries.and.areas"] <- "name"
names(i)[names(i) == "OOSR_Upper_Secondary_Age_Male"] <- "drop.m"
names(i)[names(i) == "OOSR_Upper_Secondary_Age_Female"] <- "drop.f"
names(i)[names(i) == "Youth_15_24_Literacy_Rate_Male"] <- "read.m"
names(i)[names(i) == "Youth_15_24_Literacy_Rate_Female"] <- "read.f"
names(i)[names(i) == "Unemployment_Rate"] <- "UnE"
Kết quả trả về cho ta thấy:
Cột “Countries.and.areas” được đổi tên thành name
Cột “OOSR_Upper_Secondary_Age_Male” được đổi tên thành drop.m
Cột “OOSR_Upper_Secondary_Age_Female” được đổi tên thành drop.f
Cột “Youth_15_24_Literacy_Rate_Male” được đổi tên thành read.m
Cột “Youth_15_24_Literacy_Rate_Female” được đổi tên thành read.f
Cột “Unemployment_Rate” được đổi tên thành UnE
=> Tên các biến đã trở nên ngắn gọn, ta dễ dàng thực hiện các thao tác phân tích.
Chúng ta sẽ không phân tích tất thảy 202 quan sát và 29 biến mà chúng ta sẽ chỉ phân tích 6 quốc gia trong khu vực Châu Á bao gồm: Brunei, Đông Timo, Indonesia, Nepal, Malaysia và Ấn Độ, ở các mảng:
Tỷ lệ bỏ học THPT của nam giới
Tỷ lệ bỏ học THPT của nữ giới
Tỷ lệ nam từ 15 đến 24 tuổi biết chữ
Tỷ lệ nữ từ 15 đến 24 tuổi biết chữ
Tỷ lệ thất nghiệp
library('tidyverse') #gọi package 'tidyverse'
k <- i %>% select(name, drop.m, drop.f, read.m, read.f, UnE)
m <- k[k$name=='Brunei' | k$name=='Malaysia' | k$name=='East Timor' | k$name=='Indonesia' | k$name=='India' |k$name=='Nepal', ]
Dữ liệu chúng ta thu về là dữ liệu định tính, để phân tích chúng ta sẽ mã hóa dữ liệu sang dữ liệu định lượng bằng lệnh case_when như sau:
library('tidyverse') #gọi package 'tidyverse'
m$Bỏ.học.nam <- case_when(m$drop.m<=19 ~ 'Thấp', m$drop.m>=20 & m$drop.m<=49 ~ 'Trung bình', m$drop.m>=50 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến bỏ học là nam
m$Bỏ.học.nữ <- case_when(m$drop.f<=19 ~ 'Thấp', m$drop.f>=20 & m$drop.f<=49 ~ 'Trung bình', m$drop.f>=50 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến bỏ học là nam
Kết quả trả về cho chúng ta thấy:
6 quốc gia đều có tỷ lệ bỏ học THPT ở mức thấp hoặc mức trung bình cho cả giới tính nam và nữ.
Không có quốc gia nào có tỷ lệ bỏ học THPT trên trung bình. (>=50)
Sau khi mã hóa dữ liệu xong, để tiếp tục xem tỷ lệ bỏ học THPT ở mức thấp/trung bình của nam và nữ xuất hiện bao nhiêu lần, với tần số bao nhiêu, thì ta thực hiện như sau:
r1 <- m %>% group_by(Bỏ.học.nam) %>% summarise(n = n()) #kiểm tra tần số tỷ lệ bỏ học THPT ở nam giới
r2 <- m %>% group_by(Bỏ.học.nữ) %>% summarise(n = n())#kiểm tra tần số tỷ lệ bỏ học THPT ở nữ giới
Với nam giới, có 1/6 quốc gia có tỷ lệ bỏ học là thấp, 5/6 quốc gia có tỷ lệ bỏ học là trung bình. Với nữ giới 2/6 quốc gia có tỷ lệ bỏ học là thấp, 4/6 quốc gia có tỷ lệ bỏ học là trung bình.
summary(m$drop.m)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 19.00 23.75 26.50 30.50 37.50 47.00
summary(m$drop.f)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 13.0 17.5 22.0 25.5 29.5 48.0
Chi tiết hơn, ta thấy rằng:
Với nam giới:
Tỷ lệ bỏ học THPT bé nhất bằng 19 (Brunei)
Tỷ lệ bỏ học THPT lớn nhất bằng 47 (Ấn Độ)
Tỷ lệ bỏ học THPT trung bình bằng 30.5 (mức trung bình)
25% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 23.75
50% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 26.5
75% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 37.5
Với nữ giới:
Tỷ lệ bỏ học THPT bé nhất bằng 13 (Napel)
Tỷ lệ bỏ học THPT lớn nhất bằng 48 (Ấn ĐỘ )
Tỷ lệ bỏ học THPT trung bình bằng 22.5 (mức trung bình)
25% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 17.5
50% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 22
75% số tỷ lệ bỏ học THPT có giá trị nhỏ hơn 29.5
NHẬN XÉT
=> Điều này cho thấy, tuy các 6 quốc gia đã hạn chế việc bỏ học THPT, nhưng vẫn không giảm triệt để được việc bỏ học cho cả nhóm đối tượng là nam và nữ. Các quốc gia cần tiếp tục đẩy mạnh các chiến lược/chính sách để giảm thiểu việc bỏ học THPT (đặc biệt là Ấn Độ) sao cho chỉ còn mức tỷ lệ là thấp, trung bình thấp hoặc lý tưởng hơn là không có quốc gia nào có học sinh bỏ học.
Tương tự tỷ lệ bỏ học THPT, ta tiếp tục sử dụng lệnh case_when để mã hóa dữ liệu sang dữ liệu định lượng như sau:
library('tidyverse') #gọi package 'tidyverse'
m$Biết.đọc.nam <- case_when(m$read.m<=29 ~ 'Thấp', m$read.m>=30 & m$read.m<=79 ~ 'Trung bình', m$read.m>=80 & m$read.m<=89 ~ 'Trung bình cao', m$read.m>=90 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến biết đọc là nam từ 15 đến 24 tuổi
m$Biết.đọc.nữ <- case_when(m$read.f<=29 ~ 'Thấp', m$read.f>=30 & m$read.f<=79 ~ 'Trung bình', m$read.f>=80 & m$read.f<=89 ~ 'Trung bình cao', m$read.f>=90 ~ 'Cao') #mã hóa dữ liệu định tính sang dữ liệu định lượng của cột biến biết đọc là nữ từ 15 đến 25 tuổi
Trái ngược với tỷ lệ bỏ học THPT, từ kết quả ta có thể thấy rằng đa số người dân trong độ tuổi từ 15 đến 24 dù nam hay nữ thì đều biết đọc - một điều tối thiểu mà một nền giáo dục quốc gia nên làm. Tỷ lệ của 6 quốc gia đều đạt mức từ trung bình cao cho đến cao, cho thấy đây là một điều đáng mừng của nên giáo dục thế giới.
u1 <- m %>% group_by(Biết.đọc.nam) %>% summarise(n = n()) #kiểm tra tần số tỷ lệ biết đọc ở nam giới
u2 <- m %>% group_by(Biết.đọc.nữ) %>% summarise(n = n())#kiểm tra tần số tỷ lệ biết đọc ở nữ giới
Mặc dù, tỷ lệ biết đọc của 6 quốc gia trong khu vực châu Á khá cao (5/6 đạt mức tỷ lệ cao), thế nhưng có vẻ Brunei đang bị “tụt lại” so với các “anh em” khác của mình. Brunei là quốc gia duy nhất đạt mức tỷ lệ trung bình cao.
NHẬN XÉT
5 quốc gia bao gồm: East Timor, Indonesia, Nepal, Malaysia và India cần tiếp tục triển khai diện rộng cho đến khi đạt được mục tiêu tất cả cả các đều có tỷ lệ người biết đọc trong độ tuổi từ 15 đến 24 là 100%. Riêng Brunei thì cần nổ lực nhiều hơn nữa để đưa tỷ lệ biết đọc trong độ tuổi 15 đến 24 lên mức cao.
m$Thất.nghiệp <- case_when(m$UnE<=2.9 ~ 'Thấp', m$UnE>=3 & m$UnE<=6.9 ~ 'Vừa phải', m$UnE>=7 ~ 'Cao') #mã hóa dữ liệu
p <- m %>% group_by(Thất.nghiệp) %>% summarise(n = n()) #kiểm tra tần số
Kết quả trả về cho chúng ta biết, trong 6 nước thì có bao gồm 4 nước: India, Indonesia, Malaysia và East Timor có tỷ lệ thất nghiệp ở mức vừa phải, Nepal ở mức thấp và Brunei ở mức cao.
o <- m %>% group_by(name) %>% summarise(sum_of_edu = sum(UnE))
Và theo kết quả của tổng tỷ lệ thất nghiệp theo nhóm quốc gia, điều kỳ lạ là cho dù Brunei có tỷ lệ bỏ học THPT ở cả nam và nữ đều ở mức thấp và tỷ lệ biết đọc từ 15 đến 24 tuổi mức cao thì tổng tỷ lệ thất nghiệp của Brunei lại vô cùng cao. Đặt ra một dấu nghi vấn vô cùng to lớn (= 9.12)
Trong khi đó, chúng ta có thể quan sát một ví dụ tích cực từ Nepal - một quốc gia với tỷ lệ thất nghiệp thấp nhất trong số 6 quốc gia được nghiên cứu. Nepal đáng được đánh giá cao khi họ không chỉ giảm thiểu tỷ lệ bỏ học ở cấp trung học phổ thông xuống mức thấp/trung bình, mà còn tăng cường tỷ lệ biết đọc của nhóm dân số từ 15 đến 24 tuổi lên mức cao và giảm thiểu tình trạng thất nghiệp. Các quốc gia khác có thể học hỏi từ những thành tựu của Nepal và áp dụng những biện pháp tương tự để cải thiện tình hình giáo dục và thị trường lao động của mình.
Giáo dục đóng vai trò quan trọng trong việc định hình sự phồn thịnh của một quốc gia. “Ai có tri thức người đó có sức mạnh” vì vậy, không chỉ 6 quốc gia trong khu vực châu Á được nghiên cứu trước đó, mà mọi quốc gia, không phụ thuộc vào giới tính hay độ tuổi, đều cần phải đặt ưu tiên cao và đầu tư mạnh mẽ vào lĩnh vực giáo dục.
Quan trọng là không để những vấn đề như lạm phát hay thành tích ảo xuất hiện trong hệ thống giáo dục. Cần luôn tôn trọng và đánh giá cao những người tài năng, giúp họ phát huy tối đa khả năng và từ đó giảm thiểu tỷ lệ thất nghiệp. Việc này không chỉ tạo điều kiện thuận lợi cho sự phát triển cá nhân mà còn đóng góp tích cực vào sự thịnh vượng của cả xã hội.