library(tibble)
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
library(tidyr)
library(stringr)
library(readr)
library(kableExtra)
#>
#> Attaching package: 'kableExtra'
#> The following object is masked from 'package:dplyr':
#>
#> group_rows
library(PrjCompPPTS)
# If resave outputs to data, only do this during development
verbose <- TRUE
bl_tex_save <- FALSE
spt_path_res <- file.path("..", "res-tab", fsep = .Platform$file.sep)
spn_tex_out <- file.path(spt_path_res, "tab_global_students.tex", fsep = .Platform$file.sep)
Implement PrjCompPPTS-5, summarize global number of children in primary schools.
Generate input file
Load prepped all location level files
Load file with interpolated data.
# Locaiton codes
ppts_code_wrk <- ppts_country_code
# We load in the global population data.
df_ppts <- ppts_easia_weuro_world_pchg
Run PrjCompPPTS functions
Run functions to generate FLR, FPC, and FEL files. Run FLR.
# Generate PLR
df_flr <- PrjCompPPTS::ff_ppts_lrce_flr(
df_ppts,
st_year_bins_type = "1940t2020i01",
ar_it_years = c(1960, 1980, 1990, 2000, 2010, 2020),
verbose = TRUE
)
#> F-713479, S1
#> [1] 2000 2010 1960 1980 1990 2020
#> F-713479, S2
#> dim of youth wide file: 1616
#> dim of youth wide file: 7
#> F-713479, S2
#> [1] "var_rat_y2t"
#> [1] "var_lvl_youthpop"
#> [1] "var_lvl_teacher"
#> dim FLR: 1616
#> dim FLR: 8
#> F-713479, S2
#> [1] "var_rat_s2t"
#> [1] "var_lvl_student"
#> [1] "var_lvl_teacher"
#> dim FLR: 1616
#> dim FLR: 9
#> F-713479, S2
#> [1] "var_rat_y2s"
#> [1] "var_lvl_youthpop"
#> [1] "var_lvl_school"
#> dim FLR: 1616
#> dim FLR: 10
#> F-713479, S2
#> [1] "var_rat_s2s"
#> [1] "var_lvl_student"
#> [1] "var_lvl_school"
#> dim FLR: 1616
#> dim FLR: 11
#> F-713479, S3
#> [1] "location_code" "location_level" "year_bins" "var_lvl_student"
#> [5] "var_lvl_teacher" "var_lvl_youthpop" "var_lvl_school" "var_rat_y2t"
#> [9] "var_rat_s2t" "var_rat_y2s" "var_rat_s2s"
#> dim of youth wide ratio file: 1616
#> dim of youth wide ratio file: 11
Run FPC.
# Generate FPC
df_fpc <- PrjCompPPTS::ff_ppts_lrce_fpc(
df_flr,
ar_it_years_chg = c(1960, 1980, 2000, 2020),
ls_chg_years = list(
"chg_80v60" = c(1960, 1980),
"chg_00v80" = c(1980, 2000),
"chg_20v00" = c(2000, 2020),
"chg_20v80" = c(1980, 2020)
), verbose = TRUE
)
#> F-376864, S1
#> dim of youth wide ratio file: 6644
#> dim of youth wide ratio file: 6
#> F-376864, S2
#> dim of youth wide ratio file: 6644
#> dim of youth wide ratio file: 6
#> F-376864, S3
#> dim of youth wide ratio file: 2728
#> dim of youth wide ratio file: 8
#> F-376864, SD3
#> [1] "chg_80v60"
#> [1] "year1960"
#> [1] "year1980"
#> dim FPC: 2728
#> dim FPC: 9
#> F-376864, SD3
#> [1] "chg_00v80"
#> [1] "year1980"
#> [1] "year2000"
#> dim FPC: 2728
#> dim FPC: 10
#> F-376864, SD3
#> [1] "chg_20v00"
#> [1] "year2000"
#> [1] "year2020"
#> dim FPC: 2728
#> dim FPC: 11
#> F-376864, SD3
#> [1] "chg_20v80"
#> [1] "year1980"
#> [1] "year2020"
#> dim FPC: 2728
#> dim FPC: 12
#> F-376864, S4
#> dim FPC: 2728
#> dim FPC: 12
Run FEL.
# Generate FEL
df_fel <- PrjCompPPTS::ff_ppts_lrce_fel(
df_fpc,
verbose = TRUE
)
#> F-307302, S1
#> dim df_fpc_base: 818
#> dim df_fpc_base: 7
#> F-307302, S2
#> dim df_fel_long: 2456
#> dim df_fel_long: 5
#> F-307302, S3
#> dim df_fel_wide: 1055
#> dim df_fel_wide: 7
#> F-307302, S3
#> [1] "var_elas_y2t"
#> [1] "var_chg_youthpop"
#> [1] "var_chg_teacher"
#> dim FEL: 1055
#> dim FEL: 8
#> F-307302, S3
#> [1] "var_elas_s2t"
#> [1] "var_chg_student"
#> [1] "var_chg_teacher"
#> dim FEL: 1055
#> dim FEL: 9
#> F-307302, S3
#> [1] "var_elas_y2s"
#> [1] "var_chg_youthpop"
#> [1] "var_chg_school"
#> dim FEL: 1055
#> dim FEL: 10
#> F-307302, S3
#> [1] "var_elas_s2s"
#> [1] "var_chg_student"
#> [1] "var_chg_school"
#> dim FEL: 1055
#> dim FEL: 11
#> F-307302, S4
#> dim df_fel_elas: 1055
#> dim df_fel_elas: 11
#> F-307302, S4
#> dim FEL: 517
#> dim FEL: 7
Merge FPC and FEL, country and region
Now we combine the level and change information from FPC with the elasticity results from FEL.
We have the LRCE file, level, ratio, change, and elasticity.
df_lrce <- df_fpc %>% left_join(
df_fel %>% mutate(vartype = "rat"),
by = (c(
"location_code" = "location_code",
"location_level" = "location_level",
"variable" = "variable",
"vartype" = "vartype"
))
)
print(glue::glue("dim df_lrce: {dim(df_lrce)}"))
#> dim df_lrce: 2728
#> dim df_lrce: 16
Finally, merge in country key info to FPC, country-level information.
df_lrce_country <- df_lrce %>%
filter(location_level != "multicountry") %>%
left_join(
ppts_code_wrk %>%
select(
location_name, location_code,
location_region_group, location_region_group_code
),
by = c("location_code" = "location_code")
) %>%
# mutate(location_name_full = paste0(location_name, " (", location_code, ")")) %>%
mutate(location_name_full = paste0(location_name)) %>%
select(-location_name) %>%
select(location_name_full, location_region_group, everything()) %>%
arrange(location_region_group_code, location_name_full)
FPC regional information, same variables.
ar_st_wb7 <- c("SSF", "MEA", "LCN", "NAC", "SAS", "ECS", "EAS")
df_lrce_region <- df_lrce %>%
filter(location_level == "multicountry") %>%
filter(location_code %in% ar_st_wb7) %>%
left_join(
ppts_code_wrk %>%
select(
location_name, location_code, location_code_adj,
location_region_group, location_region_group_code
),
by = c("location_code" = "location_code")
) %>%
select(-location_code) %>%
rename(location_code = location_code_adj) %>%
# mutate(location_name_full = paste0(location_name, " (", location_code, ")")) %>%
mutate(location_name_full = paste0(location_name)) %>%
select(-location_name) %>%
select(location_name_full, location_region_group, everything()) %>%
mutate(
location_region_group_code = "0WORLD",
location_region_group = "Global regions"
) %>%
arrange(location_region_group_code, location_code)
Combine region and country.
Global Primary School Students Table
Prep Table inputs
Select and prep Table 1. Combine national and regional data together.
# Select variables
tab1aux_global_students <- df_lrce_region_country %>%
filter(
vartype == "lvl",
variable == "student"
) %>%
select(
-vartype, -variable, -location_level, -location_code,
-chg_80v60, -contains("elas_")
)
Second, count variables in regional groups.
df_region_counts <- tab1aux_global_students %>%
group_by(
location_region_group_code, location_region_group
) %>%
summarize(region_count = n()) %>%
ungroup() %>%
mutate(region_count_start = cumsum(region_count) - region_count + 1) %>%
mutate(region_count_end = cumsum(region_count)) %>%
select(region_count_start, region_count_end, everything())
#> `summarise()` has grouped output by 'location_region_group_code'. You can
#> override using the `.groups` argument.
Third, format variables.
# Format variables
tab1aux_global_students <- tab1aux_global_students %>%
select(-location_region_group, -location_region_group_code) %>%
mutate_at(
vars(contains("year")),
list(~ paste0(
format(round(. / 1000, 0), nsmall = 0, big.mark = ",")
))
) %>%
mutate_at(
vars(contains("chg")),
list(~ paste0(
format(round(., 2) * 100,
nsmall = 0,
big.mark = ","
),
"%"
))
)
# Replace NAs
tab1aux_global_students <- tab1aux_global_students %>%
mutate_at(vars(starts_with("chg")), ~ str_replace(., "NA%", "")) %>%
mutate_at(vars(starts_with("year")), ~ str_replace(., "NA", ""))
Generate table
Now we generate the table.
ar_st_kableformat <- c("latex", "html")
for (st_kableformat in ar_st_kableformat) {
# Column names
ar_st_col_names <- c(
"Country by region",
"1980",
"2000",
"2020",
# "1980/1960",
"2000/1980",
"2020/2000",
"2020/1980"
)
# Define column groups, grouping the names above
# =1/3/2 are number of columns group title covers
ar_st_col_groups <- c(
" " = 1,
"Primary school students (1000s)" = 3,
"Primary students changes (%)" = 3
)
# Second, we construct main table, and add styling.
bk_students <- kbl(
tab1aux_global_students %>%
select(
location_name_full,
year1980, year2000, year2020,
chg_00v80, chg_20v00, chg_20v80
),
format = st_kableformat,
label = "main:tab:global:students",
# escape = F,
linesep = "",
booktabs = T,
longtable = T,
align = "c",
caption = "Global primary school students",
col.names = ar_st_col_names
) %>%
# see https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html#Bootstrap_table_classes
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = F, position = "left"
)
# Third, we add in column groups.
bk_students <- bk_students %>% add_header_above(ar_st_col_groups)
# Fourth, we add in row groups.
for (it_region in seq(1, dim(df_region_counts)[1])) {
# Reion full name info
st_loc <- as.character(df_region_counts[[it_region, "location_region_group"]])
# Regions start and end
it_region_count_start <- df_region_counts[[it_region, "region_count_start"]]
it_region_count_end <- df_region_counts[[it_region, "region_count_end"]]
# Add to table
bk_students <- bk_students %>%
pack_rows(
st_loc, it_region_count_start, it_region_count_end,
latex_gap_space = "1em",
latex_align = "c",
hline_after = TRUE
)
}
# Fifth, column formatting.
fl_width_country <- 3.4
st_width_country <- paste0(fl_width_country, "cm")
bk_students <- bk_students %>%
column_spec(1, width = st_width_country) %>%
column_spec(2:7, width = "1.3cm")
# Final adjustments
# Headings on all pages, note use `sub` to replace first midrule
st_headend <- paste0(
"\\midrule\\endhead\n",
"\\addlinespace[0.2em]\\hline\\addlinespace[0.2em]\n",
"\\multicolumn{7}{r}{\\emph{Continued on next page}}\\\\\n",
"\\endfoot\\endlastfoot"
)
bk_students <- sub(bk_students,
pattern = "\\midrule", replacement = st_headend,
fixed = TRUE
)
# country-names left-align
bk_students <- gsub(bk_students,
pattern = paste0("\\centering\\arraybackslash}p{", st_width_country, "}"),
replacement = paste0("\\raggedright\\arraybackslash}p{", st_width_country, "}"),
fixed = TRUE
)
# midrule replacing hline
bk_students <- gsub(bk_students,
pattern = "hline",
replacement = "midrule", fixed = TRUE
)
# Sixth, display.
# pl_bk_asset_count <- bk_asset_count %>% as_image()
if (st_kableformat == "html") {
print(dim(bk_students))
} else {
if (bl_tex_save) {
fileConn <- file(spn_tex_out)
writeLines(bk_students, fileConn)
close(fileConn)
if (verbose) {
print(glue::glue("Latex saved: {spn_tex_out}"))
}
}
}
}
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> Warning in pack_rows(., st_loc, it_region_count_start, it_region_count_end, : latex_align parameter is not used in HTML Mode,
#> use label_row_css instead.
#> NULL
bk_students
Country by region | 1980 | 2000 | 2020 | 2000/1980 | 2020/2000 | 2020/1980 |
---|---|---|---|---|---|---|
Global regions | ||||||
Sub-Saharan Africa | 49,940 | 90,722 | 185,517 | 82% | 104% | 271% |
Middle East & North Africa | 24,138 | 41,785 | 54,568 | 73% | 31% | 126% |
Latin America & Caribbean | 56,800 | 70,186 | 62,774 | 24% | -11% | 11% |
North America | 22,893 | 27,435 | 27,028 | 20% | -1% | 18% |
South Asia | 88,806 | 149,389 | 172,331 | 68% | 15% | 94% |
Europe & Central Asia | 57,826 | 54,880 | 53,447 | -5% | -3% | -8% |
East Asia & Pacific | 224,997 | 223,007 | 191,347 | -1% | -14% | -15% |
Sub-Saharan Africa (SSF) | ||||||
Angola | 1,421 | 1,667 | 6,463 | 17% | 288% | 355% |
Benin | 357 | 932 | 2,183 | 161% | 134% | 511% |
Botswana | 172 | 324 | 365 | 89% | 13% | 112% |
Burkina Faso | 185 | 852 | 3,240 | 361% | 280% | 1,653% |
Burundi | 160 | 705 | 2,257 | 341% | 220% | 1,313% |
Cabo Verde | 58 | 92 | 61 | 58% | -33% | 5% |
Cameroon | 1,303 | 2,237 | 4,607 | 72% | 106% | 254% |
Central African Republic | 243 | 434 | 1,000 | 78% | 131% | 311% |
Chad | 244 | 914 | 2,519 | 274% | 176% | 932% |
Comoros | 55 | 93 | 130 | 71% | 39% | 138% |
Congo, Dem. Rep. | 4,055 | 4,452 | 19,202 | 10% | 331% | 374% |
Congo, Rep. | 383 | 419 | 800 | 9% | 91% | 109% |
Côte d’Ivoire | 954 | 1,943 | 4,101 | 104% | 111% | 330% |
Equatorial Guinea | 43 | 73 | 96 | 70% | 30% | 122% |
Eritrea | 296 | 355 | 20% | |||
Eswatini | 112 | 214 | 235 | 91% | 10% | 110% |
Ethiopia | 1,811 | 5,847 | 20,419 | 223% | 249% | 1,027% |
Gabon | 149 | 265 | 79% | |||
Gambia | 37 | 175 | 393 | 366% | 125% | 949% |
Ghana | 1,372 | 2,561 | 4,584 | 87% | 79% | 234% |
Guinea | 263 | 790 | 2,108 | 201% | 167% | 702% |
Guinea-Bissau | 77 | 150 | 96% | |||
Kenya | 3,575 | 5,035 | 8,796 | 41% | 75% | 146% |
Lesotho | 245 | 411 | 390 | 68% | -5% | 59% |
Liberia | 147 | 496 | 580 | 237% | 17% | 294% |
Madagascar | 1,598 | 2,208 | 4,446 | 38% | 101% | 178% |
Malawi | 667 | 2,695 | 4,750 | 304% | 76% | 612% |
Mali | 299 | 1,017 | 2,359 | 240% | 132% | 690% |
Mauritania | 85 | 356 | 700 | 318% | 97% | 723% |
Mauritius | 129 | 135 | 84 | 5% | -38% | -35% |
Mozambique | 1,407 | 2,544 | 7,220 | 81% | 184% | 413% |
Namibia | 389 | 521 | 34% | |||
Niger | 210 | 579 | 2,617 | 176% | 352% | 1,147% |
Nigeria | 10,799 | 19,151 | 30,394 | 77% | 59% | 181% |
Rwanda | 559 | 1,432 | 2,521 | 156% | 76% | 351% |
Senegal | 393 | 1,108 | 2,260 | 182% | 104% | 476% |
Seychelles | 10 | 10 | 10 | 4% | -5% | -1% |
Sierra Leone | 305 | 443 | 1,760 | 45% | 297% | 477% |
Somalia | 271 | 318 | 17% | |||
South Sudan | 1,083 | |||||
Sudan | 2,607 | 5,585 | 114% | |||
São Tomé and Príncipe | 17 | 25 | 40 | 53% | 56% | 140% |
Tanzania | 3,368 | 4,382 | 10,926 | 30% | 149% | 224% |
Togo | 484 | 915 | 1,634 | 89% | 79% | 238% |
Uganda | 1,302 | 6,559 | 9,419 | 404% | 44% | 623% |
Zambia | 1,042 | 1,590 | 3,542 | 53% | 123% | 240% |
Zimbabwe | 1,235 | 2,461 | 2,870 | 99% | 17% | 132% |
Middle East & North Africa (MEA) | ||||||
Algeria | 3,061 | 4,843 | 4,852 | 58% | 0% | 59% |
Bahrain | 49 | 78 | 118 | 60% | 52% | 142% |
Djibouti | 15 | 38 | 69 | 151% | 81% | 354% |
Egypt | 4,537 | 7,947 | 13,917 | 75% | 75% | 207% |
Iran | 4,929 | 8,288 | 8,689 | 68% | 5% | 76% |
Iraq | 2,609 | 3,639 | 39% | |||
Israel | 474 | 677 | 979 | 43% | 45% | 106% |
Jordan | 448 | 724 | 1,126 | 61% | 56% | 151% |
Kuwait | 146 | 140 | 279 | -4% | 99% | 92% |
Lebanon | 388 | 404 | 517 | 4% | 28% | 33% |
Libya | 645 | 793 | 23% | |||
Malta | 32 | 34 | 27 | 6% | -21% | -17% |
Morocco | 2,052 | 3,670 | 4,536 | 79% | 24% | 121% |
Oman | 84 | 316 | 304 | 277% | -4% | 263% |
Qatar | 28 | 61 | 164 | 114% | 168% | 475% |
Saudi Arabia | 841 | 2,386 | 3,432 | 184% | 44% | 308% |
Syrian Arab Republic | 1,481 | 2,775 | 87% | |||
Tunisia | 1,034 | 1,414 | 1,269 | 37% | -10% | 23% |
United Arab Emirates | 80 | 273 | 462 | 239% | 69% | 475% |
West Bank and Gaza | 388 | 503 | 30% | |||
Yemen | 2,467 | 3,934 | 59% | |||
Latin America & Caribbean (LCN) | ||||||
Antigua and Barbuda | 10 | 13 | 10 | 32% | -19% | 6% |
Argentina | 3,917 | 4,901 | 4,825 | 25% | -2% | 23% |
Aruba | 9 | |||||
Bahamas, The | 32 | 34 | 28 | 6% | -16% | -11% |
Barbados | 31 | 24 | 19 | -22% | -21% | -39% |
Belize | 28 | 45 | 49 | 60% | 10% | 76% |
Bolivia | 857 | 1,462 | 1,394 | 71% | -5% | 63% |
Brazil | 16,090 | 20,212 | 15,433 | 26% | -24% | -4% |
British Virgin Islands | 2 | 3 | 3 | 40% | -2% | 36% |
Cayman Islands | 2 | 3 | 5 | 63% | 32% | 115% |
Chile | 1,754 | 1,799 | 1,566 | 3% | -13% | -11% |
Colombia | 4,168 | 5,221 | 4,225 | 25% | -19% | 1% |
Costa Rica | 349 | 551 | 493 | 58% | -11% | 41% |
Cuba | 1,550 | 1,046 | 760 | -33% | -27% | -51% |
Curaçao | 13 | |||||
Dominica | 16 | 12 | 6 | -25% | -47% | -60% |
Dominican Republic | 1,069 | 1,364 | 1,224 | 28% | -10% | 14% |
Ecuador | 1,450 | 1,925 | 1,876 | 33% | -3% | 29% |
El Salvador | 696 | 949 | 592 | 36% | -38% | -15% |
Grenada | 19 | 16 | 13 | -14% | -22% | -32% |
Guatemala | 803 | 1,909 | 2,348 | 138% | 23% | 192% |
Guyana | 132 | 109 | -18% | |||
Haiti | 580 | 1,605 | 177% | |||
Honduras | 601 | 1,095 | 1,080 | 82% | -1% | 80% |
Jamaica | 363 | 327 | 220 | -10% | -33% | -39% |
Mexico | 14,126 | 14,766 | 13,964 | 5% | -5% | -1% |
Nicaragua | 472 | 838 | 78% | |||
Panama | 338 | 400 | 422 | 19% | 5% | 25% |
Paraguay | 519 | 966 | 692 | 86% | -28% | 33% |
Peru | 3,161 | 4,338 | 3,842 | 37% | -11% | 22% |
Puerto Rico | 474 | 358 | 191 | -24% | -47% | -60% |
St. Kitts and Nevis | 8 | 7 | 5 | -17% | -22% | -35% |
St. Lucia | 31 | 25 | 15 | -17% | -39% | -49% |
St. Vincent | 22 | 19 | 14 | -11% | -29% | -37% |
Suriname | 81 | 64 | 69 | -20% | 6% | -15% |
Trinidad and Tobago | 167 | 169 | 1% | |||
Turks and Caicos Islands | 2 | 2 | 5 | 19% | 131% | 175% |
Uruguay | 331 | 361 | 288 | 9% | -20% | -13% |
Venezuela | 2,457 | 3,328 | 3,008 | 35% | -10% | 22% |
Virgin Islands (U.S.) | 14 | |||||
North America (NAC) | ||||||
Bermuda | 6 | 5 | 4 | -14% | -15% | -27% |
Canada | 2,206 | 2,456 | 2,408 | 11% | -2% | 9% |
United States | 24,616 | |||||
South Asia (SAS) | ||||||
Afghanistan | 960 | 749 | 7,019 | -22% | 837% | 631% |
Bangladesh | 8,240 | 14,645 | 17,604 | 78% | 20% | 114% |
Bhutan | 30 | 85 | 94 | 185% | 11% | 215% |
India | 71,183 | 113,613 | 121,700 | 60% | 7% | 71% |
Maldives | 31 | 74 | 52 | 140% | -30% | 69% |
Nepal | 1,068 | 3,780 | 3,890 | 254% | 3% | 264% |
Pakistan | 5,213 | 13,987 | 24,263 | 168% | 73% | 365% |
Sri Lanka | 2,081 | 1,779 | 1,696 | -15% | -5% | -19% |
Europe & Central Asia (ECS) | ||||||
Albania | 272 | 283 | 162 | 4% | -43% | -40% |
Andorra | 3 | 4 | 4 | 39% | 5% | 46% |
Armenia | 180 | 155 | -14% | |||
Austria | 401 | 394 | 348 | -2% | -12% | -13% |
Azerbaijan | 470 | 700 | 651 | 49% | -7% | 38% |
Belarus | 733 | 600 | 437 | -18% | -27% | -40% |
Belgium | 862 | 774 | 825 | -10% | 7% | -4% |
Bosnia and Herzegovina | 152 | |||||
Bulgaria | 521 | 393 | 251 | -25% | -36% | -52% |
Croatia | 199 | 157 | -21% | |||
Cyprus | 51 | 64 | 60 | 26% | -6% | 18% |
Czechia | 673 | 645 | 580 | -4% | -10% | -14% |
Denmark | 443 | 384 | 455 | -13% | 19% | 3% |
Estonia | 130 | 123 | 91 | -5% | -26% | -30% |
Finland | 390 | 388 | 373 | -1% | -4% | -4% |
France | 6,129 | 5,445 | 5,433 | -11% | 0% | -11% |
Georgia | 325 | 298 | 325 | -8% | 9% | 0% |
Germany | 3,353 | 2,842 | -15% | |||
Gibraltar | 3 | 2 | 3 | -12% | 22% | 7% |
Greece | 900 | 645 | 629 | -28% | -3% | -30% |
Hungary | 586 | 501 | 355 | -15% | -29% | -39% |
Iceland | 25 | 31 | 33 | 27% | 6% | 35% |
Ireland | 418 | 450 | 573 | 8% | 27% | 37% |
Italy | 4,507 | 2,836 | 2,800 | -37% | -1% | -38% |
Kazakhstan | 1,048 | 1,208 | 1,513 | 15% | 25% | 44% |
Kyrgyz Republic | 299 | 466 | 566 | 56% | 22% | 89% |
Latvia | 141 | 135 | 120 | -4% | -11% | -15% |
Liechtenstein | 2 | 2 | -6% | |||
Lithuania | 172 | 218 | 119 | 27% | -46% | -31% |
Luxembourg | 26 | 32 | 40 | 27% | 24% | 57% |
Moldova | 227 | 252 | 139 | 11% | -45% | -39% |
Monaco | 1 | 2 | 2 | 36% | -2% | 34% |
Montenegro | 38 | 39 | 3% | |||
Netherlands | 1,644 | 1,492 | -9% | |||
North Macedonia | 127 | 111 | -12% | |||
Norway | 395 | 420 | 450 | 6% | 7% | 14% |
Poland | 3,116 | 3,319 | 2,348 | 7% | -29% | -25% |
Portugal | 1,234 | 811 | 604 | -34% | -26% | -51% |
Romania | 1,488 | 1,189 | 915 | -20% | -23% | -38% |
Russian Federation | 5,961 | 6,138 | 7,324 | 3% | 19% | 23% |
San Marino | 2 | 1 | 2 | -19% | 28% | 4% |
Serbia | 351 | 259 | -26% | |||
Slovak Republic | 309 | 234 | -24% | |||
Slovenia | 106 | 87 | 136 | -18% | 57% | 28% |
Spain | 3,609 | 2,540 | 3,033 | -30% | 19% | -16% |
Sweden | 677 | 776 | 884 | 15% | 14% | 31% |
Switzerland | 440 | 474 | 530 | 8% | 12% | 20% |
Tajikistan | 692 | 953 | 38% | |||
Turkmenistan | 589 | |||||
Türkiye | 5,614 | 6,562 | 5,435 | 17% | -17% | -3% |
Ukraine | 2,177 | 2,079 | 1,725 | -5% | -17% | -21% |
United Kingdom | 5,134 | 4,632 | 4,946 | -10% | 7% | -4% |
Uzbekistan | 1,351 | 2,602 | 2,508 | 93% | -4% | 86% |
East Asia & Pacific (EAS) | ||||||
American Samoa | 7 | |||||
Australia | 1,718 | 1,906 | 2,280 | 11% | 20% | 33% |
Brunei Darussalam | 31 | 45 | 40 | 49% | -13% | 30% |
Cambodia | 1,169 | 2,248 | 2,165 | 92% | -4% | 85% |
China | 146,270 | 130,133 | 107,254 | -11% | -18% | -27% |
Fiji | 99 | 115 | 126 | 16% | 10% | 27% |
French Polynesia | 29 | 27 | -8% | |||
Guam | 18 | |||||
Hong Kong SAR, China | 542 | 497 | 377 | -8% | -24% | -30% |
Indonesia | 24,308 | 28,509 | 29,574 | 17% | 4% | 22% |
Japan | 11,827 | 7,366 | 6,301 | -38% | -14% | -47% |
Kiribati | 13 | 15 | 18 | 10% | 26% | 39% |
Korea, Dem. People’s Rep. | 1,499 | |||||
Korea, Rep. | 5,658 | 4,020 | 2,694 | -29% | -33% | -52% |
Lao PDR | 463 | 832 | 761 | 80% | -9% | 64% |
Macao SAR, China | 25 | 47 | 34 | 90% | -28% | 37% |
Malaysia | 2,009 | 3,026 | 3,064 | 51% | 1% | 53% |
Marshall Islands | 8 | 7 | -20% | |||
Micronesia | 24 | 20 | 13 | -18% | -36% | -47% |
Mongolia | 141 | 253 | 344 | 79% | 36% | 143% |
Myanmar | 3,968 | 4,858 | 5,127 | 22% | 6% | 29% |
Nauru | 1 | 2 | 1 | 12% | -7% | 4% |
New Caledonia | 27 | |||||
New Zealand | 381 | 360 | 388 | -6% | 8% | 2% |
Palau | 2 | 2 | -22% | |||
Papua New Guinea | 300 | 560 | 1,524 | 87% | 172% | 408% |
Philippines | 8,113 | 12,708 | 12,975 | 57% | 2% | 60% |
Samoa | 28 | 28 | 34 | -1% | 21% | 20% |
Singapore | 292 | 281 | 236 | -4% | -16% | -19% |
Solomon Islands | 29 | 57 | 109 | 99% | 90% | 277% |
Taiwan | 2,234 | 1,926 | 1,174 | -14% | -39% | -47% |
Thailand | 7,244 | 6,101 | 4,887 | -16% | -20% | -33% |
Timor-Leste | 186 | 200 | 8% | |||
Tonga | 19 | 17 | 17 | -12% | 2% | -10% |
Tuvalu | 1 | 2 | 1 | 53% | -12% | 35% |
Vanuatu | 23 | 36 | 56 | 53% | 58% | 142% |
Vietnam | 7,923 | 10,063 | 8,718 | 27% | -13% | 10% |