Skip to contents
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_pop.tex", fsep = .Platform$file.sep)

Implement PrjCompPPTS-5, Summ: Global child population.

We generate a table with 11 variables:

  • Unit of observation: country at selected years
  • var country
  • var (3) children to teacher ratio in 1980, 2000, 2020
  • var (3) children to teacher ranking in 1980 vs 2020
  • var (1) children to teacher ratio change over time 1980 to 2020
  • var (1) percentage change in children 1980 to 2020
  • var (1) percentage change in teachers 1980 to 2020
  • var (1) teacher-children elasticity over time

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.

df_lrce_region_country <- bind_rows(
  df_lrce_region,
  df_lrce_country %>% filter(location_level == "country"),
)

Global Population Table

Prep Table inputs

Select and prep Table 1. Combine national and regional data together.

# Select variables
tab1_global_pop <- df_lrce_region_country %>%
  filter(
    vartype == "lvl",
    variable == "youthpop"
  ) %>%
  select(
    -vartype, -variable, -location_level, -location_code,
    -chg_80v60, -contains("elas_")
  )

Second, count variables in regional groups.

df_region_counts <- tab1_global_pop %>%
  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
tab1_global_pop <- tab1_global_pop %>%
  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 = ","
      ),
      "%"
    ))
  )

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",
    "1960",
    "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,
    "Age 0-14 population (1000s)" = 4,
    "Age 0-14 pop. changes (%)" = 3
  )

  # Second, we construct main table, and add styling.
  bk_youthpop <- kbl(
    tab1_global_pop %>%
      select(
        location_name_full,
        year1960, year1980, year2000, year2020,
        chg_00v80, chg_20v00, chg_20v80
      ),
    format = st_kableformat,
    label = "main:tab:global:pop",
    # escape = F,
    linesep = "",
    booktabs = T,
    longtable = T,
    align = "c",
    caption = "Global youth population",
    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_youthpop <- bk_youthpop %>% 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_youthpop <- bk_youthpop %>%
      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_youthpop <- bk_youthpop %>%
    column_spec(1, width = st_width_country) %>%
    column_spec(2:8, 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{8}{r}{\\emph{Continued on next page}}\\\\\n",
    "\\endfoot\\endlastfoot"
  )
  bk_youthpop <- sub(bk_youthpop,
    pattern = "\\midrule", replacement = st_headend,
    fixed = TRUE
  )
  # country-names left-align
  bk_youthpop <- gsub(bk_youthpop,
    pattern = paste0("\\centering\\arraybackslash}p{", st_width_country, "}"),
    replacement = paste0("\\raggedright\\arraybackslash}p{", st_width_country, "}"),
    fixed = TRUE
  )
  # midrule replacing hline
  bk_youthpop <- gsub(bk_youthpop,
    pattern = "hline",
    replacement = "midrule", fixed = TRUE
  )

  # Sixth, display.
  # pl_bk_asset_count <- bk_asset_count %>% as_image()
  if (st_kableformat == "html") {
    print(dim(bk_youthpop))
  } else {
    if (bl_tex_save) {
      fileConn <- file(spn_tex_out)
      writeLines(bk_youthpop, 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_youthpop
Global youth population
Age 0-14 population (1000s)
Age 0-14 pop. changes (%)
Country by region 1960 1980 2000 2020 2000/1980 2020/2000 2020/1980
Global regions
Sub-Saharan Africa 97,324 172,959 294,882 477,202 70% 62% 176%
Middle East & North Africa 45,133 80,465 115,244 138,455 43% 20% 72%
Latin America & Caribbean 93,310 142,229 167,538 155,704 18% -7% 9%
North America 61,490 57,098 67,118 66,903 18% 0% 17%
South Asia 232,284 361,420 499,156 512,158 38% 3% 42%
Europe & Central Asia 187,008 190,631 170,203 166,458 -11% -2% -13%
East Asia & Pacific 410,016 560,642 529,048 460,563 -6% -13% -18%
Sub-Saharan Africa (SSF)
Angola 2,298 3,846 7,739 15,248 101% 97% 296%
Benin 937 1,661 3,099 5,085 87% 64% 206%
Botswana 219 435 635 786 46% 24% 80%
Burkina Faso 1,995 3,110 5,429 9,275 75% 71% 198%
Burundi 1,226 1,858 3,194 5,381 72% 68% 190%
Cabo Verde 85 134 184 156 37% -15% 16%
Cameroon 2,067 3,852 6,995 11,166 82% 60% 190%
Central African Republic 571 928 1,575 2,103 70% 33% 127%
Chad 1,230 2,035 4,084 7,636 101% 87% 275%
Comoros 79 138 239 339 73% 42% 146%
Congo, Dem. Rep.  6,612 11,755 21,452 41,015 82% 91% 249%
Congo, Rep.  425 820 1,319 2,277 61% 73% 178%
Côte d’Ivoire 1,497 3,636 7,180 10,949 97% 53% 201%
Equatorial Guinea 96 97 246 516 153% 109% 430%
Eritrea 438 767 1,048 NA 37% NA% NA%
Eswatini 154 294 432 434 47% 0% 48%
Ethiopia 9,627 15,856 30,770 45,891 94% 49% 189%
Gabon 155 286 504 829 76% 65% 190%
Gambia 155 278 620 1,062 123% 71% 283%
Ghana 2,928 5,185 8,184 11,538 58% 41% 123%
Guinea 1,412 2,109 3,826 5,654 81% 48% 168%
Guinea-Bissau 247 340 546 825 60% 51% 143%
Kenya 3,776 8,223 14,463 20,750 76% 43% 152%
Lesotho 373 614 813 691 32% -15% 12%
Liberia 460 832 1,216 2,042 46% 68% 145%
Madagascar 2,177 4,024 7,119 11,094 77% 56% 176%
Malawi 1,604 2,868 5,137 8,224 79% 60% 187%
Mali 2,149 3,124 5,097 9,519 63% 87% 205%
Mauritania 378 701 1,145 1,845 63% 61% 163%
Mauritius 307 344 306 212 -11% -31% -38%
Mozambique 3,017 5,044 7,883 13,772 56% 75% 173%
Namibia 263 492 754 936 53% 24% 90%
Niger 1,637 2,882 5,470 12,024 90% 120% 317%
Nigeria 18,781 32,353 53,321 89,645 65% 68% 177%
Rwanda 1,403 2,474 3,520 5,113 42% 45% 107%
Senegal 1,408 2,586 4,380 7,132 69% 63% 176%
Seychelles 16 24 23 23 -4% 1% -4%
Sierra Leone 889 1,442 2,025 3,218 40% 59% 123%
Somalia 1,174 2,749 4,188 7,335 52% 75% 167%
South Sudan 1,180 1,997 2,779 4,626 39% 66% 132%
Sudan 3,395 6,831 11,947 17,452 75% 46% 155%
São Tomé and Príncipe 21 46 63 92 38% 45% 101%
Tanzania 4,586 8,582 14,997 26,017 75% 73% 203%
Togo 679 1,263 2,130 3,364 69% 58% 166%
Uganda 3,096 5,854 11,745 21,048 101% 79% 260%
Zambia 1,407 2,840 4,834 8,092 70% 67% 185%
Zimbabwe 1,724 3,681 4,998 6,229 36% 25% 69%
Middle East & North Africa (MEA)
Algeria 4,930 8,904 10,667 13,499 20% 27% 52%
Bahrain 67 124 200 311 61% 55% 150%
Djibouti 36 167 294 286 76% -3% 71%
Egypt 11,215 17,661 25,370 34,713 44% 37% 97%
Iran 9,361 16,852 22,288 20,784 32% -7% 23%
Iraq 3,022 6,395 10,088 15,169 58% 50% 137%
Israel 771 1,281 1,766 2,564 38% 45% 100%
Jordan 406 1,165 2,029 3,352 74% 65% 188%
Kuwait 93 551 580 917 5% 58% 66%
Lebanon 751 1,013 1,195 1,711 18% 43% 69%
Libya 605 1,541 1,814 1,909 18% 5% 24%
Malta 125 75 77 74 3% -4% -2%
Morocco 5,512 8,656 9,642 9,880 11% 2% 14%
Oman 241 520 842 1,148 62% 36% 121%
Qatar 20 75 152 393 103% 158% 422%
Saudi Arabia 1,763 4,228 7,909 8,598 87% 9% 103%
Syrian Arab Republic 2,126 4,372 6,731 5,386 54% -20% 23%
Tunisia 1,816 2,661 2,869 2,871 8% 0% 8%
United Arab Emirates 41 287 816 1,465 185% 80% 411%
West Bank and Gaza NA NA 1,397 1,843 NA% 32% NA%
Yemen 2,233 3,938 8,518 11,582 116% 36% 194%
Latin America & Caribbean (LCN)
Antigua and Barbuda 23 23 22 21 -7% -2% -9%
Argentina 6,360 8,485 10,494 11,088 24% 6% 31%
Aruba 24 16 21 19 32% -12% 16%
Bahamas, The 46 78 87 85 12% -3% 9%
Barbados 88 75 59 48 -21% -19% -36%
Belize 42 67 101 116 50% 15% 73%
Bolivia 1,508 2,279 3,177 3,526 39% 11% 55%
Brazil 31,157 46,094 52,329 44,019 14% -16% -5%
Chile 3,208 3,824 4,193 3,678 10% -12% -4%
Colombia 7,498 10,767 12,909 11,288 20% -13% 5%
Costa Rica 603 880 1,235 1,061 40% -14% 21%
Cuba 2,504 3,124 2,402 1,803 -23% -25% -42%
Curaçao 51 46 33 28 -27% -16% -39%
Dominican Republic 1,589 2,482 2,958 2,977 19% 1% 20%
Ecuador 1,972 3,356 4,434 4,833 32% 9% 44%
El Salvador 1,244 2,013 2,157 1,725 7% -20% -14%
Grenada 44 36 34 27 -4% -22% -25%
Guatemala 1,896 3,185 5,068 5,621 59% 11% 76%
Guyana 266 331 266 218 -19% -18% -34%
Haiti 1,557 2,306 3,406 3,703 48% 9% 61%
Honduras 944 1,745 2,815 3,030 61% 8% 74%
Jamaica 675 859 853 692 -1% -19% -19%
Mexico 17,267 30,335 33,820 33,310 11% -2% 10%
Nicaragua 839 1,536 2,010 1,954 31% -3% 27%
Panama 497 809 969 1,143 20% 18% 41%
Paraguay 913 1,352 2,048 2,061 52% 1% 52%
Peru 4,445 7,428 9,113 8,141 23% -11% 10%
Puerto Rico 1,002 1,012 897 517 -11% -42% -49%
St. Lucia 40 52 51 33 -2% -35% -36%
St. Vincent 40 44 34 24 -23% -28% -45%
Suriname 136 143 154 156 8% 2% 9%
Trinidad and Tobago 363 369 324 281 -12% -13% -24%
Uruguay 707 785 815 706 4% -13% -10%
Venezuela 3,748 6,257 8,219 7,752 31% -6% 24%
Virgin Islands (U.S.) 13 36 28 20 -21% -27% -43%
North America (NAC)
Canada 6,040 5,579 5,881 6,000 5% 2% 8%
United States 55,450 51,519 61,237 60,903 19% -1% 18%
South Asia (SAS)
Afghanistan 3,791 6,168 10,160 16,281 65% 60% 164%
Bangladesh 20,191 35,607 47,179 44,062 32% -7% 24%
Bhutan 94 178 235 192 32% -18% 8%
India 182,271 274,326 366,905 361,018 34% -2% 32%
Maldives 35 72 113 106 57% -6% 47%
Nepal 4,084 6,218 9,807 8,394 58% -14% 35%
Pakistan 17,668 33,455 59,733 76,914 79% 29% 130%
Sri Lanka 4,150 5,397 5,024 5,191 -7% 3% -4%
Europe & Central Asia (ECS)
Albania 646 961 937 489 -3% -48% -49%
Armenia 724 938 792 617 -16% -22% -34%
Austria 1,567 1,549 1,348 1,285 -13% -5% -17%
Azerbaijan 1,540 2,146 2,507 2,373 17% -5% 11%
Belarus 2,369 2,197 1,849 1,617 -16% -13% -26%
Belgium 2,152 1,986 1,801 1,966 -9% 9% -1%
Bosnia and Herzegovina 1,225 1,201 777 476 -35% -39% -60%
Bulgaria 2,053 1,963 1,279 1,018 -35% -20% -48%
Channel Islands 24 23 25 26 8% 3% 11%
Croatia 1,139 968 774 589 -20% -24% -39%
Cyprus 210 171 211 200 23% -5% 17%
Czechia 2,471 2,412 1,684 1,686 -30% 0% -30%
Denmark 1,154 1,067 986 949 -8% -4% -11%
Estonia 280 319 246 219 -23% -11% -31%
Finland 1,347 970 939 877 -3% -7% -10%
France NA 12,367 11,517 11,895 -7% 3% -4%
Georgia 1,043 1,140 849 753 -26% -11% -34%
Germany NA NA 12,885 11,606 NA% -10% NA%
Greece 2,279 2,280 1,630 1,461 -29% -10% -36%
Hungary 2,529 2,358 1,718 1,405 -27% -18% -40%
Iceland 61 63 65 71 4% 9% 13%
Ireland 875 1,041 817 1,039 -22% 27% 0%
Italy 12,587 12,401 8,157 7,721 -34% -5% -38%
Kazakhstan 3,602 4,791 4,097 5,466 -14% 33% 14%
Kyrgyz Republic 788 1,336 1,712 2,148 28% 26% 61%
Latvia 467 511 423 312 -17% -26% -39%
Lithuania 754 796 701 433 -12% -38% -46%
Luxembourg 67 68 83 98 21% 19% 44%
Moldova 650 729 686 416 -6% -39% -43%
Montenegro 167 156 130 112 -17% -14% -28%
Netherlands NA NA 2,941 2,739 NA% -7% NA%
North Macedonia 566 574 460 338 -20% -26% -41%
Norway 929 906 897 928 -1% 3% 2%
Poland 9,945 8,548 7,483 5,767 -12% -23% -33%
Portugal 2,595 2,522 1,650 1,344 -35% -19% -47%
Romania 5,315 5,953 4,172 2,989 -30% -28% -50%
Russian Federation 36,412 29,975 26,746 26,461 -11% -1% -12%
Serbia 1,974 1,818 1,541 1,060 -15% -31% -42%
Slovak Republic 1,280 1,303 1,062 849 -18% -20% -35%
Slovenia 438 445 314 318 -29% 1% -28%
Spain 8,334 9,728 5,978 6,820 -39% 14% -30%
Sweden 1,679 1,628 1,634 1,825 0% 12% 12%
Switzerland 1,315 1,279 1,253 1,292 -2% 3% 1%
Tajikistan 833 1,671 2,643 3,555 58% 34% 113%
Turkmenistan 639 1,195 1,638 1,857 37% 13% 55%
Türkiye 11,511 17,434 19,354 20,193 11% 4% 16%
Ukraine 11,627 10,742 8,418 7,057 -22% -16% -34%
United Kingdom 12,134 11,839 11,209 11,882 -5% 6% 0%
Uzbekistan 3,381 6,475 9,188 9,859 42% 7% 52%
East Asia & Pacific (EAS)
Australia 3,102 3,717 4,000 4,957 8% 24% 33%
Brunei Darussalam 36 75 102 98 35% -4% 29%
Cambodia 2,618 2,749 5,056 5,170 84% 2% 88%
China 265,642 352,612 312,994 249,901 -11% -20% -29%
Fiji 190 249 284 260 14% -8% 4%
French Polynesia 34 61 77 62 25% -19% 2%
Guam 27 36 47 40 32% -15% 12%
Hong Kong SAR, China 1,250 1,277 1,124 948 -12% -16% -26%
Indonesia 35,049 60,593 64,919 70,941 7% 9% 17%
Japan 28,211 27,548 18,752 15,665 -32% -16% -43%
Kiribati 19 23 34 43 44% 27% 83%
Korea, Dem. People’s Rep.  4,311 6,402 5,947 5,115 -7% -14% -20%
Korea, Rep.  NA 12,911 9,691 6,502 -25% -33% -50%
Lao PDR 894 1,448 2,308 2,324 59% 1% 61%
Macao SAR, China 70 56 98 93 73% -5% 65%
Malaysia 3,711 5,449 7,737 7,589 42% -2% 39%
Micronesia 20 35 43 36 26% -17% 4%
Mongolia 354 738 834 1,019 13% 22% 38%
Myanmar 8,804 14,129 15,190 13,867 8% -9% -2%
New Caledonia 30 52 65 60 23% -7% 15%
New Zealand 780 847 876 988 3% 13% 17%
Papua New Guinea 957 1,558 2,325 3,145 49% 35% 102%
Philippines 12,353 20,425 30,003 32,921 47% 10% 61%
Samoa 54 72 71 74 -1% 4% 3%
Singapore 712 653 754 699 15% -7% 7%
Solomon Islands 50 109 173 275 58% 59% 152%
Taiwan NA 5,739 4,703 2,963 -18% -37% -48%
Thailand 11,708 18,682 15,097 11,554 -19% -23% -38%
Timor-Leste 195 240 397 486 65% 22% 103%
Tonga 28 39 38 37 -3% -3% -5%
Vanuatu 29 51 77 118 49% 54% 129%
Vietnam 13,112 22,171 25,231 22,577 14% -11% 2%