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_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.

df_lrce_region_country <- bind_rows(
  df_lrce_region,
  df_lrce_country %>% filter(location_level == "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
Global primary school students
Primary school students (1000s)
Primary students changes (%)
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%