Nhiệm vụ 3.1

Đọc dữ liệu từ file csv

ptt <- read.csv("C:/Users/PHAN THANH TRONG/Downloads/population-and-demography.csv", header = T)
str(ptt) # Đây là câu lệnh giúp ta kiểm tra cấu trúc của "ptt"
## 'data.frame':    18288 obs. of  24 variables:
##  $ Country                                   : 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 ...

Ta thấy, “ptt” là một data frame bao gồm 18288 quan sát và 24 biến. Tên các biến của “ptt” như sau:

  • Country: Tên quốc gia

  • Year: Năm

  • Population: Dân số

  • 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ố từ 15 đến 64 tuổi

  • Population.older.than.15.years: Dân số lớn hơn 15 tuổi

  • Population.older.than.18.years: Dân số lớn hơn 18 tuổi

  • Population.at.age.1: Dân số tại độ tuổi 1

  • Population.aged.1.to.4.years: Dân số từ 1 đến 4 tuổi

  • Population.aged.5.to.9.years: Dân số từ 5 đến 9 tuổi

  • Population.aged.10.to.14.years: Dân số từ 10 đến 14 tuổi

  • Population.aged.15.to.19.years: Dân số từ 15 đến 19 tuổi

  • Population.aged.20.to.29.years: Dân số từ 20 đến 29 tuổi

  • Population.aged.30.to.39.years: Dân số từ 30 đến 39 tuổi

  • Population.aged.40.to.49.years: Dân số từ 40 đến 49 tuổi

  • Population.aged.50.to.59.years: Dân số từ 50 đến 59 tuổi

  • Population.aged.60.to.69.years: Dân số từ 60 đến 69 tuổi

  • Population.aged.70.to.79.years: Dân số từ 70 đến 79 tuổi

  • Population.aged.80.to.89.years: Dân số từ 80 đến 89 tuổi

  • Population.aged.90.to.99.years: Dân số từ 90 đến 99 tuổi

  • Population.older.than.100.years: Dân số lớn hơn 100 tuổi

Chuẩn bị dữ liệu

Ta thấy file “population-and-demography.csv” là một file cực kỳ lớn với 24 biến và 18288 quan sát. Ta chỉ cần lọc ra dữ liệu về quốc gia, độ tuổi và dân số của 5 nước. Ta thực hiện thao tác sau:

  • Để sử dụng hàm “%>%”, trước tiên ta cần load gói dplyr
library('dplyr')
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
  • Lọc ra dữ liệu của các nước: Botswana, Brazil, Comoros, Ecuador, và Greenland

    • Trong cột Country, chọn ra những hàng có tên Botswana, Brazil, Comoros, Ecuador, Greenland và gán nó cho “ptt”
ptt <- ptt %>% filter(Country %in% c('Botswana', 'Brazil', 'Comoros', 'Ecuador', 'Greenland'))
  • Chọn những cột Tên quốc gia, Năm, Dân số dưới 15 tuổi, Dân số từ 60 đến 69 tuổi, Dân số từ 70 đến 79 tuổi, Dân số từ 80 đến 89 tuổi, Dân số từ 90 đến 99 tuổi, Dân số trên 100 tuổi

    • Chỉ lấy những cột Country.name, Year, Population, Population.of.children.under.the.age.of.15, 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 nó cho “pad”
ptt <- ptt %>% select(Country,Year,Population,Population.of.children.under.the.age.of.15,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)
  • Ta được bảng mới như sau
ptt
  • Vì tên các cột quá dài nên ta sẽ đặt lại tên để dễ dàng thao tác hơn, các tên cột mới sẽ ứng với các tên cột cũ như sau:

    • name: Country

    • yr: Year

    • pp: Population

    • under15: Population.of.children.under.the.age.of.15

    • 60-69: Population.aged.60.to.69.years

    • 70-79: Population.aged.70.to.79.years

    • 80-89: Population.aged.80.to.89.years

    • 90-99: Population.aged.90.to.99.years

    • older100: Population.older.than.100.years

# Đổi tên các biến của "ptt" bằng cách gán các vector
names(ptt) <- c('name','yr','pp','under15','60-69','70-79','80-89','90-99','older100')
ptt

Phân tích dữ liệu

Sau khi hoàn tất việc chuẩn bị dữ liệu, ta cần có những thao tác để phân tích dữ liệu như sau:

Các thông tin cơ bản

  • Kiểm tra pad có phải là một data frame
is.data.frame(ptt)
## [1] TRUE

Kết quả trả ra là TRUE, nghĩa là pad là một data frame

  • Câu lệnh thể hiện tên các biến (hay các cột) trong “ptt”
names(ptt)
## [1] "name"     "yr"       "pp"       "under15"  "60-69"    "70-79"    "80-89"   
## [8] "90-99"    "older100"

Kết quả lần lượt là tên các biến trong data frame: “name”, “yr”, “pp”, “under15”, “60-69”, “70-79”, “80-89”, “90-99”, “older100”

  • Câu lệnh thể hiện tên số biến (cột) trong “ptt”
length(ptt)
## [1] 9

Kết quả hiển thị là 8, nghĩa là ptt có 8 biến (cột)

  • Câu lệnh thể hiện tên số quan sát và số biến của “ptt”
dim(ptt)
## [1] 360   9

Số quan sát là 216 và số biến là 8

Thống kê mô tả

Ta thực hiện câu lệnh sau

# Load gói skimr
library(skimr)

# Câu lệnh dùng để thực hiện thao tác thống kê
skim(ptt)
Data summary
Name ptt
Number of rows 360
Number of columns 9
_______________________
Column type frequency:
character 1
numeric 8
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
name 0 1 6 9 0 5 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
yr 0 1 1985.50 20.81 1950 1967.75 1985.5 2003.25 2021 ▇▇▇▇▇
pp 0 1 29602844.14 58264117.43 23142 228571.00 1158989.5 13359540.50 214326220 ▇▁▁▁▁
under15 0 1 9641335.43 17694787.26 10082 101587.25 538578.5 4554062.00 53536730 ▇▁▁▁▂
60-69 0 1 1426211.59 3290211.30 674 8867.75 37188.0 552995.00 17704992 ▇▁▁▁▁
70-79 0 1 725740.79 1728191.57 218 3748.75 15828.0 310615.00 9285972 ▇▁▁▁▁
80-89 0 1 216090.46 552927.08 20 773.50 3975.0 115419.75 3213211 ▇▁▁▁▁
90-99 0 1 15871.76 41711.05 0 48.75 348.5 11431.50 276940 ▇▁▁▁▁
older100 0 1 152.72 355.01 0 0.00 4.0 92.00 2190 ▇▁▁▁▁

Trong đó:

  • n_missing: dữ liệu bị mất khi không được trả lời

  • complete_rate: tỉ lệ dữ liệu đầy đủ

  • min: số lượng ký tự ít nhất trong một ô (không bao gồm biến)

  • max: số lượng ký tự nhiều nhất trong ô (không bao gômg biến)

  • n_unique: các dữ liệu trùng lặp

  • whitespace: khoảng trắng

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0, p25, p50, p75, p100: phân vị 1

  • hist: biểu đồ Histogram

Tạo dữ liệu mới từ dữ liệu cũ

  • “ptt” bao gồm các cột tên quốc gia và dân số theo độ tuổi từ dưới 15 và từ 60 đến 69, 70 đến 79, 80 đến 89, 90 đến 99 và trên 100. Vì file “population-and-demography.csv” không có dữ liệu về dân số trong độ tuổi ngoài 60 nên ta cần phải tính chúng bằng cách cộng các cột dữ liệu về dân số ngoài 60 tuổi. Ta thực hiện thao tác sau

    • Thêm vào ptt một cột “older60” và gán tổng giá trị các biến ở các cột “60-69”, “70-79”, “80-89”, “90-99”, “older100” trên cùng một hàng vào “older60”. Ta được kết quả như bên dưới
ptt$older60 <- (ptt$`60-69`+ptt$`70-79`+ptt$`80-89`+ptt$`90-99`+ptt$older100)
ptt
  • Vì file “population-and-demography.csv” không có dữ liệu về dân số trong độ tuổi từ 16 đến 59, ta cần thêm một cột này và tính chúng bằng cách lấy tổng dân số trừ đi dân số ở độ tuổi dưới 15 và ngoài 60.

    • Tạo thêm cột “16-59” và gán với hiệu của giá trị cột “pp” với hai cột “under15” và “older60”, ta được kết quả
ptt$`16-59` <- (ptt$pp-ptt$under15-ptt$older60)
ptt
  • Vì ta đã có dữ liệu dân số ở các độ tuổi dưới 15, 16 đến 59 và ngoài 60, ta có thể xóa đi những dữ liệu không cần thiết bằng hàm select.

    • Chỉ chọn những cột “name”, “yr”, “pp”, “under15”, “16-59”, “older60” và gán nó cho “ptt” và được kết quả như bên dưới
ptt <- select(ptt,-c('60-69','70-79','80-89','90-99','older100'))
ptt

Mã hóa dữ liệu

Như ta đã biết, một nước được coi là có dân số “trẻ” nếu tỉ lệ người trong độ tuổi dưới 15 vượt quá 35% và số người ở độ tuổi trên 60 không quá 7% tổng số dân cả nước. Ngược lại, những nước có dân số “già” khi độ tuổi dưới 15 dao động trong khoảng 30 – 35%, độ tuổi trên 60 vượt quá 7% tổng số dân. (Nguồn: danso.org)

Vậy, để kết luận các đất nước mà ta chọn để phân tích có dân số trẻ hay già, ta có thể thực hiện thao tác sau:

  • Thêm vào “ptt” cột age_struc, nếu tỉ lệ under15/pp(Tỉ lệ dân số dưới 15 tuổi so với tổng dân số) bé hơn 0.35 và older60/pp(Tỉ lệ dân số lớn hơn 60 tuổi so với tổng dân số) lớn hơn 0.07 có nghĩa là “già”, nếu tỉ lệ under15/pp lớn hơn 0.35 và older60/pp bé hơn 0.07 có nghĩa là “trẻ”, nếu không thuộc hai trường hợp trên thì là “bình thường”.
ptt$age_struc <- ifelse(ptt$under15/ptt$pp<0.35 | ptt$older60/ptt$pp>0.07,'Già',ifelse(ptt$under15/ptt$pp>0.35 | ptt$older60/ptt$pp<0.07,'Trẻ','Bình thường'))
  • Ta được bảng sau:
ptt

Tính toán các đặc trưng đo lường

Để dễ dàng tính toán, ta chỉ cần lấy dữ liệu ở một mốc thời gian duy nhất. Chọn dữ liệu vào năm 2021 bằng thao tác sau

ptt0 <- filter(ptt,yr=='2021')
ptt0

Tổng:

sum(ptt0$pp)
## [1] 235590278

Tổng dân số của 5 nước là 235590278, rơi vào khoảng 235,5 triệu dân trong năm 2021

Trung bình:

mean(ptt0$pp)
## [1] 47118056

Trung bình, mỗi nước sẽ có dân số là 47118056, rơi vào khoảng 47,1 triệu dân trong năm 2021

Độ lệch chuẩn

sd(ptt0$pp)
## [1] 93754080

Tổng dân số trong mỗi nước sẽ có chênh lệnh 93754080 ~ khoảng 93,7 triệu dân so với bình quân dân số 5 nước

Phân vị

quantile(ptt0$pp)
##        0%       25%       50%       75%      100% 
##     56266    821632   2588424  17797736 214326220
  • Giá trị đầu tiên - giá trị nhỏ nhất (56266) mang ý nghĩa là giá trị dân số thấp nhất trong 5 nước.

  • Giá trị thứ hai - tứ phân vị thứ nhất (821632) mang ý nghĩa là có ít nhất 25% dân số các nước bé hơn hoặc bằng 821632 và 75% dân số các nước lớn hơn hoặc bằng 821632

  • Giá trị thứ ba - trung vị (2588424) mang ý nghĩa là có ít nhất 50% dân số bé hơn hoặc bằng 2588424 và 50% dân số lớn hơn hoặc bằng 2588424

  • Giá trị thứ tư - tứ phân vị thứ ba (17797736) mang ý nghĩa là có ít nhất 75% dân số các nước bé hơn hoặc bằng 17797736 và 25% dân số các nước lớn hơn hoặc bằng 17797736

  • Giá trị thứ năm - Giá trị lớn nhất (214326220) mang ý nghĩa là giá trị dân số cao nhất trong 5 nước

Chuyển dữ liệu từ long table sang wide table

“pad” là data frame đang ở định dạng long table, nghĩa là giá trị ở cột đầu tiên bị lặp lại. Ta chuyển chúng thành wide table để có thể tiện quan sát hơn bằng câu lệnh sau:

# Trước tiên cần load gói tidyr
library(tidyr)

# Chuyển từ long table sang wide table bằng câu lệnh spread, trong đó các giá trị ở cột "name" sẽ trở thành biến mới và chúng mang giá trị của cột "pp"
ptt1 <- ptt %>% spread(key = name,value = pp)

# Ta được bảng như sau
ptt1

  1. Sẽ giải thích ở phần tính toán các đặc trưng đo lường↩︎