Table: Global students and teachers
Source:vignettes/ffv_tab_global_students_teachers.Rmd
ffv_tab_global_students_teachers.Rmd
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_teachers.tex", fsep = .Platform$file.sep)
Implement PrjCompPPTS-2, Summ: Global teachers and students.
We generate a table with these possible variables:
- Unit of observation: country at selected years
- var country
- var (3) children to teacher ratio in 1960, 1980, 2000, 2020
- var (1) global ranking in 2020
- var (1) percentage change in teachers 1980 to 2020
- var (1) teacher-students elasticity
- var (1) percentage change in teachers 2000 to 2020
- var (1) teacher-students elasticity
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 students 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.
Table students and teachers
Now we develop the table for students to teacher ratio.
Prep table inputs
Select and prep Table 2. Combine national and regional data together.
First, select ratio and elasticity.
# Select s2t ratio levels and elasticity
tab2_s2t_rat_elas <- df_lrce_region_country %>%
filter(
vartype == "rat",
variable == "s2t"
) %>%
select(
-vartype, -variable, -location_level, -location_code,
-year1960, -contains("chg"), -elas_80v60
) %>%
rename_at(vars(matches("elas_|year")), ~ paste0(., "_s2t"))
print(glue::glue("dim tab2_s2t_rat_elas: {dim(tab2_s2t_rat_elas)}"))
#> dim tab2_s2t_rat_elas: 213
#> dim tab2_s2t_rat_elas: 9
Second, ranks.
# Select s2t ratio levels and elasticity
tab2_s2t_rat_rank <- df_lrce_region_country %>%
filter(
vartype == "rank",
variable == "s2t"
) %>%
select(
-vartype, -variable, -location_level, -location_code,
-year1960, -contains("chg"), -contains("elas"),
) %>%
rename_at(vars(matches("year")), ~ paste0(., "_s2t_rank"))
print(glue::glue("dim tab2_s2t_rat_rank: {dim(tab2_s2t_rat_rank)}"))
#> dim tab2_s2t_rat_rank: 213
#> dim tab2_s2t_rat_rank: 6
Second, select percentage changes.
# Select percentage changes in youth
tab2_youthstudentteacher_lvl <- df_lrce_region_country %>%
filter(
vartype == "lvl",
variable %in% c("youthpop", "student", "teacher")
) %>%
select(
-vartype, -location_level, -location_code,
-year1960,
-contains("year"), -contains("elas_"), -chg_80v60
) %>%
pivot_wider(
id_cols = c(
"location_name_full",
"location_region_group",
"location_region_group_code"
),
names_from = variable,
names_prefix = "",
names_sep = "_",
values_from = c(contains("chg_"))
)
print(glue::glue("dim tab2_youthstudentteacher_lvl: {dim(tab2_youthstudentteacher_lvl)}"))
#> dim tab2_youthstudentteacher_lvl: 217
#> dim tab2_youthstudentteacher_lvl: 12
Third, combine information together
tab_2_global_pop_teacher <- tab2_youthstudentteacher_lvl %>%
left_join(
tab2_s2t_rat_elas,
by = c(
"location_name_full" = "location_name_full",
"location_region_group" = "location_region_group",
"location_region_group_code" = "location_region_group_code"
)
) %>%
left_join(
tab2_s2t_rat_rank,
by = c(
"location_name_full" = "location_name_full",
"location_region_group" = "location_region_group",
"location_region_group_code" = "location_region_group_code"
)
)
Fourth, select a subset of variables for visualizations. Include the following:
- var country
- var (3) children to teacher ratio in 1980, 2000, 2020
- var (1) global ranking in 2020
- var (1) percentage change in student 1980 to 2020
- var (1) percentage change in teachers 1980 to 2020
- var (1) teacher-students elasticity
# Select data
tab_2_global_student_teacher_v1 <- tab_2_global_pop_teacher %>%
select(
contains("location"),
year1980_s2t, year2000_s2t, year2020_s2t,
chg_20v00_student, chg_20v00_teacher, elas_20v00_s2t,
chg_20v80_student, chg_20v80_teacher, elas_20v80_s2t
)
# drop no data rows
tab_2_global_student_teacher_v1 <- tab_2_global_student_teacher_v1 %>%
mutate(
avg_stats = base::rowMeans(
dplyr::pick(matches("year|chg|elas")),
na.rm = TRUE
)
) %>%
drop_na(avg_stats) %>%
select(-avg_stats)
Fourth, count variables in regional groups.
df_region_counts <- tab_2_global_student_teacher_v1 %>%
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 and replace NAs.
# Format variables
tab_2_global_student_teacher_v1 <- tab_2_global_student_teacher_v1 %>%
select(-location_region_group, -location_region_group_code) %>%
mutate_at(
vars(contains("year")),
list(~ paste0(
format(round(., 0), nsmall = 0, big.mark = ",")
))
) %>%
mutate_at(
vars(contains("elas")),
list(~ paste0(
format(round(., 2), nsmall = 0, big.mark = ",")
))
) %>%
mutate_at(
vars(contains("chg")),
list(~ paste0(
format(round(., 2) * 100,
nsmall = 0,
big.mark = ","
),
"%"
))
)
# Replace NAs
tab_2_global_student_teacher_v1 <- tab_2_global_student_teacher_v1 %>%
mutate_at(vars(starts_with("chg")), ~ str_replace(., "NA%", "")) %>%
mutate_at(vars(starts_with("year")), ~ str_replace(., "NA", "")) %>%
mutate_at(vars(starts_with("elas")), ~ 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",
"Students",
"Teachers",
"$\\Delta$\\%T/$\\Delta$\\%Y",
"Students",
"Teachers",
"$\\Delta$\\%T/$\\Delta$\\%Y"
)
# Define column groups, grouping the names above
# =1/3/2 are number of columns group title covers
ar_st_col_groups_l1 <- c(
" " = 1,
"Ratios" = 3,
# "Rank" = 1,
"\\% change" = 2,
"Elasticity" = 1,
"\\% change" = 2,
"Elasticity" = 1
)
ar_st_col_groups_l2 <- c(
" " = 1,
"Student to teacher" = 3,
"2000 to 2020" = 3,
"1980 to 2020" = 3
)
# Second, we construct main table, and add styling.
bk_student_teacher_rela <- kbl(
tab_2_global_student_teacher_v1 %>%
select(
location_name_full,
year1980_s2t, year2000_s2t, year2020_s2t,
chg_20v00_student, chg_20v00_teacher, elas_20v00_s2t,
chg_20v80_student, chg_20v80_teacher, elas_20v80_s2t
),
format = st_kableformat,
label = "main:tab:global:students:teachers",
# escape = F,
linesep = "",
booktabs = T,
longtable = T,
align = "c",
caption = "Global changes in primary students and teachers",
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_student_teacher_rela <- bk_student_teacher_rela %>%
add_header_above(ar_st_col_groups_l1) %>%
add_header_above(ar_st_col_groups_l2)
# 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_student_teacher_rela <- bk_student_teacher_rela %>%
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_student_teacher_rela <- bk_student_teacher_rela %>%
column_spec(1, width = st_width_country) %>%
column_spec(2:10, width = "0.9cm")
# 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{10}{r}{\\emph{Continued on next page}}\\\\\n",
"\\endfoot\\endlastfoot"
)
bk_student_teacher_rela <- sub(bk_student_teacher_rela,
pattern = "\\midrule", replacement = st_headend,
fixed = TRUE
)
# country-names left-align
bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
pattern = paste0("\\centering\\arraybackslash}p{", st_width_country, "}"),
replacement = paste0("\\raggedright\\arraybackslash}p{", st_width_country, "}"),
fixed = TRUE
)
# midrule replacing hline
bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
pattern = "hline",
replacement = "midrule", fixed = TRUE
)
# Backslash replace
bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
pattern = "\\textbackslash{}Delta", replacement = "\\Delta", fixed = TRUE
)
bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
pattern = "\\textbackslash{}", replacement = "", fixed = TRUE
)
bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
pattern = "\\$", replacement = "$", fixed = TRUE
)
# bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
# pattern = "\\%Y", replacement = "%Y", fixed = TRUE
# )
# bk_student_teacher_rela <- gsub(bk_student_teacher_rela,
# pattern = "\\% change", replacement = "% change", fixed = TRUE
# )
# Sixth, display.
# pl_bk_asset_count <- bk_asset_count %>% as_image()
if (st_kableformat == "html") {
print(dim(bk_student_teacher_rela))
} else {
if (bl_tex_save) {
fileConn <- file(spn_tex_out)
writeLines(bk_student_teacher_rela, 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_student_teacher_rela
Country by region | 1980 | 2000 | 2020 | Students | Teachers | %T/%Y | Students | Teachers | %T/%Y |
---|---|---|---|---|---|---|---|---|---|
Global regions | |||||||||
Sub-Saharan Africa | 37 | 42 | 36 | 104% | 138% | 0.76 | 271% | 281% | 0.97 |
Middle East & North Africa | 29 | 23 | 21 | 31% | 39% | 0.78 | 126% | 208% | 0.61 |
Latin America & Caribbean | 30 | 25 | 21 | -11% | 9% | -1.16 | 11% | 61% | 0.17 |
North America | 14 | 15 | 15 | -1% | 0% | 4.87 | 18% | 9% | 2.04 |
South Asia | 43 | 40 | 28 | 15% | 63% | 0.24 | 94% | 194% | 0.49 |
Europe & Central Asia | 20 | 17 | 15 | -3% | 7% | -0.39 | -8% | 22% | -0.34 |
East Asia & Pacific | 29 | 24 | 17 | -14% | 20% | -0.72 | -15% | 42% | -0.36 |
Sub-Saharan Africa (SSF) | |||||||||
Angola | 43 | 42 | 127 | 288% | 27% | 10.85 | 355% | 55% | 6.44 |
Benin | 55 | 53 | 38 | 134% | 222% | 0.60 | 511% | 771% | 0.66 |
Botswana | 32 | 27 | 31 | 13% | -4% | -2.91 | 112% | 118% | 0.95 |
Burkina Faso | 53 | 49 | 37 | 280% | 401% | 0.70 | 1,653% | 2,402% | 0.69 |
Burundi | 35 | 55 | 44 | 220% | 306% | 0.72 | 1,313% | 1,019% | 1.29 |
Cabo Verde | 42 | 29 | 19 | -33% | -1% | 23.02 | 5% | 125% | 0.04 |
Cameroon | 52 | 53 | 46 | 106% | 137% | 0.77 | 254% | 293% | 0.86 |
Central African Republic | 61 | 98 | 87 | 131% | 161% | 0.81 | 311% | 187% | 1.66 |
Chad | 65 | 69 | 55 | 176% | 242% | 0.72 | 932% | 1,119% | 0.83 |
Comoros | 47 | 37 | 62 | 39% | -17% | -2.27 | 138% | 81% | 1.70 |
Congo, Dem. Rep. | 41 | 29 | 29 | 331% | 318% | 1.04 | 374% | 556% | 0.67 |
Congo, Rep. | 56 | 60 | 24 | 91% | 379% | 0.24 | 109% | 384% | 0.28 |
Côte d’Ivoire | 39 | 45 | 41 | 111% | 134% | 0.83 | 330% | 311% | 1.06 |
Equatorial Guinea | 56 | 43 | 19 | 30% | 197% | 0.15 | 122% | 553% | 0.22 |
Eritrea | 48 | 38 | 20% | 51% | 0.39 | ||||
Eswatini | 34 | 31 | 25 | 10% | 36% | 0.28 | 110% | 183% | 0.60 |
Ethiopia | 59 | 67 | 38 | 249% | 519% | 0.48 | 1,027% | 1,652% | 0.62 |
Gabon | 43 | 51 | |||||||
Gambia | 27 | 37 | 36 | 125% | 131% | 0.95 | 949% | 683% | 1.39 |
Ghana | 28 | 34 | 25 | 79% | 145% | 0.54 | 234% | 286% | 0.82 |
Guinea | 38 | 46 | 48 | 167% | 153% | 1.09 | 702% | 542% | 1.30 |
Guinea-Bissau | 25 | 44 | |||||||
Kenya | 34 | 29 | 75% | 106% | 0.71 | 146% | |||
Lesotho | 48 | 48 | 31 | -5% | 49% | -0.10 | 59% | 150% | 0.40 |
Liberia | 38 | 25 | 17% | 80% | 0.21 | 294% | |||
Madagascar | 46 | 48 | 34 | 101% | 185% | 0.55 | 178% | 281% | 0.63 |
Malawi | 67 | 52 | 76% | 127% | 0.60 | 612% | |||
Mali | 42 | 65 | 37 | 132% | 309% | 0.43 | 690% | 802% | 0.86 |
Mauritania | 46 | 45 | 48 | 97% | 83% | 1.17 | 723% | 676% | 1.07 |
Mauritius | 20 | 26 | 15 | -38% | 11% | -3.31 | -35% | -10% | 3.63 |
Mozambique | 84 | 64 | 58 | 184% | 214% | 0.86 | 413% | 649% | 0.64 |
Namibia | 32 | 24 | 34% | 74% | 0.46 | ||||
Niger | 39 | 41 | 40 | 352% | 361% | 0.98 | 1,147% | 1,125% | 1.02 |
Nigeria | 36 | 43 | 30 | 59% | 130% | 0.45 | 181% | 240% | 0.75 |
Rwanda | 56 | 54 | 55 | 76% | 73% | 1.05 | 351% | 358% | 0.98 |
Senegal | 43 | 51 | 34 | 104% | 205% | 0.51 | 476% | 624% | 0.76 |
Seychelles | 23 | 15 | 15 | -5% | -9% | 0.58 | -1% | 51% | -0.02 |
Sierra Leone | 34 | 31 | 38 | 297% | 224% | 1.33 | 477% | 415% | 1.15 |
Somalia | 31 | 27 | |||||||
South Sudan | 43 | ||||||||
Sudan | 114% | ||||||||
São Tomé and Príncipe | 29 | 35 | 28 | 56% | 92% | 0.61 | 140% | 142% | 0.99 |
Tanzania | 42 | 42 | 56 | 149% | 85% | 1.75 | 224% | 145% | 1.55 |
Togo | 54 | 37 | 39 | 79% | 71% | 1.11 | 238% | 367% | 0.65 |
Uganda | 34 | 59 | 42 | 44% | 101% | 0.43 | 623% | 477% | 1.31 |
Zambia | 49 | 50 | 39 | 123% | 189% | 0.65 | 240% | 329% | 0.73 |
Zimbabwe | 44 | 37 | 38 | 17% | 14% | 1.16 | 132% | 170% | 0.78 |
Middle East & North Africa (MEA) | |||||||||
Algeria | 36 | 28 | 24 | 0% | 18% | 0.01 | 59% | 135% | 0.43 |
Bahrain | 20 | 17 | 13 | 52% | 102% | 0.50 | 142% | 268% | 0.53 |
Djibouti | 42 | 37 | 30 | 81% | 122% | 0.67 | 354% | 542% | 0.65 |
Egypt | 33 | 23 | 26 | 75% | 53% | 1.43 | 207% | 285% | 0.73 |
Iran | 29 | 26 | 32 | 5% | -16% | -0.31 | 76% | 55% | 1.39 |
Iraq | 28 | 21 | |||||||
Israel | 12 | 14 | 12 | 45% | 61% | 0.73 | 106% | 104% | 1.02 |
Jordan | 32 | 22 | 17 | 56% | 96% | 0.58 | 151% | 369% | 0.41 |
Kuwait | 19 | 14 | 8 | 99% | 235% | 0.42 | 92% | 342% | 0.27 |
Lebanon | 17 | 14 | 13 | 28% | 44% | 0.63 | 33% | 82% | 0.40 |
Libya | 20 | ||||||||
Malta | 21 | 19 | 13 | -21% | 21% | -1.02 | -17% | 38% | -0.44 |
Morocco | 38 | 29 | 27 | 24% | 31% | 0.77 | 121% | 207% | 0.59 |
Oman | 23 | 25 | 11 | -4% | 123% | -0.03 | 263% | 684% | 0.38 |
Qatar | 14 | 13 | 12 | 168% | 173% | 0.97 | 475% | 545% | 0.87 |
Saudi Arabia | 18 | 12 | 14 | 44% | 30% | 1.46 | 308% | 443% | 0.70 |
Syrian Arab Republic | 29 | 25 | |||||||
Tunisia | 39 | 23 | 17 | -10% | 24% | -0.43 | 23% | 185% | 0.12 |
United Arab Emirates | 16 | 16 | 19 | 69% | 46% | 1.52 | 475% | 398% | 1.19 |
West Bank and Gaza | 36 | 21 | 30% | 118% | 0.25 | ||||
Yemen | 24 | 23 | 59% | 66% | 0.90 | ||||
Latin America & Caribbean (LCN) | |||||||||
Antigua and Barbuda | 25 | 19 | 13 | -19% | 15% | -1.31 | 6% | 99% | 0.06 |
Argentina | 20 | 20 | -2% | 23% | |||||
Aruba | 19 | ||||||||
Bahamas, The | 26 | 15 | 20 | -16% | -36% | 0.45 | -11% | 19% | -0.58 |
Barbados | 24 | 18 | 13 | -21% | 6% | -3.59 | -39% | 12% | -3.15 |
Belize | 23 | 19 | 10% | 35% | 0.30 | 76% | |||
Bolivia | 24 | 18 | -5% | 28% | -0.16 | 63% | |||
Brazil | 29 | 25 | 20 | -24% | -6% | 4.13 | -4% | 38% | -0.11 |
British Virgin Islands | 19 | 17 | 9 | -2% | 74% | -0.03 | 36% | 177% | 0.20 |
Cayman Islands | 19 | 14 | 13 | 32% | 46% | 0.69 | 115% | 210% | 0.55 |
Chile | 32 | 16 | -13% | 71% | -0.18 | -11% | |||
Colombia | 31 | 26 | 23 | -19% | -6% | 3.01 | 1% | 36% | 0.04 |
Costa Rica | 28 | 25 | 11 | -11% | 95% | -0.11 | 41% | 242% | 0.17 |
Cuba | 18 | 11 | 9 | -27% | -7% | 3.95 | -51% | -2% | 23.34 |
Dominica | 34 | 20 | 12 | -47% | -14% | 3.48 | -60% | 14% | -4.38 |
Dominican Republic | 51 | 31 | 19 | -10% | 48% | -0.21 | 14% | 210% | 0.07 |
Ecuador | 36 | 23 | 25 | -3% | -8% | 0.32 | 29% | 92% | 0.32 |
El Salvador | 44 | 23 | -38% | 22% | -1.75 | -15% | |||
Grenada | 32 | 20 | 17 | -22% | -5% | 4.69 | -32% | 29% | -1.10 |
Guatemala | 34 | 33 | 20 | 23% | 98% | 0.24 | 192% | 388% | 0.50 |
Guyana | 33 | 26 | |||||||
Haiti | 43 | 31 | |||||||
Honduras | 37 | 34 | 29 | -1% | 17% | -0.08 | 80% | 130% | 0.61 |
Jamaica | 41 | 30 | 19 | -33% | 5% | -6.55 | -39% | 29% | -1.38 |
Mexico | 41 | 27 | 24 | -5% | 5% | -1.02 | -1% | 67% | -0.02 |
Nicaragua | 35 | 36 | |||||||
Panama | 27 | 25 | 22 | 5% | 18% | 0.30 | 25% | 54% | 0.46 |
Paraguay | 27 | 25 | -28% | 33% | |||||
Peru | 37 | 29 | 18 | -11% | 40% | -0.29 | 22% | 150% | 0.14 |
Puerto Rico | 25 | 15 | 15 | -47% | -47% | 0.98 | -60% | -34% | 1.73 |
St. Kitts and Nevis | 25 | 19 | 10 | -22% | 53% | -0.41 | -35% | 65% | -0.54 |
St. Lucia | 32 | 23 | 14 | -39% | -1% | 30.34 | -49% | 14% | -3.45 |
St. Vincent | 18 | 19 | 14 | -29% | -9% | 3.35 | -37% | -21% | 1.77 |
Suriname | 23 | 19 | 13 | 6% | 65% | 0.10 | -15% | 57% | -0.26 |
Trinidad and Tobago | 26 | 21 | |||||||
Turks and Caicos Islands | 21 | 18 | 26 | 131% | 61% | 2.15 | 175% | 119% | 1.46 |
Uruguay | 22 | 21 | 13 | -20% | 30% | -0.67 | -13% | 53% | -0.24 |
Venezuela | 28 | -10% | 22% | ||||||
Virgin Islands (U.S.) | 12 | ||||||||
North America (NAC) | |||||||||
Bermuda | 23 | 10 | 8 | -15% | 0% | 4,017.14 | -27% | 99% | -0.27 |
Canada | 15 | 17 | -2% | 9% | |||||
United States | 15 | 5% | 17% | ||||||
South Asia (SAS) | |||||||||
Afghanistan | 50 | 23 | 51 | 837% | 324% | 2.58 | 631% | 611% | 1.03 |
Bangladesh | 54 | 52 | 30 | 20% | 106% | 0.19 | 114% | 279% | 0.41 |
Bhutan | 32 | 41 | 32 | 11% | 42% | 0.25 | 215% | 211% | 1.02 |
India | 43 | 40 | 26 | 7% | 62% | 0.11 | 71% | 180% | 0.39 |
Maldives | 23 | 9 | -30% | 74% | -0.40 | 69% | |||
Nepal | 38 | 38 | 19 | 3% | 103% | 0.03 | 264% | 624% | 0.42 |
Pakistan | 37 | 33 | 52 | 73% | 10% | 7.27 | 365% | 231% | 1.58 |
Sri Lanka | 34 | 27 | 21 | -5% | 18% | -0.27 | -19% | 27% | -0.68 |
Europe & Central Asia (ECS) | |||||||||
Albania | 23 | 17 | -43% | -23% | 1.86 | -40% | |||
Andorra | 12 | 12 | 10 | 5% | 26% | 0.21 | 46% | 63% | 0.73 |
Armenia | 15 | 19 | -14% | -31% | 0.45 | ||||
Austria | 15 | 12 | 9 | -12% | 10% | -1.15 | -13% | 35% | -0.38 |
Azerbaijan | 19 | 16 | -7% | 7% | -0.97 | 38% | |||
Belarus | 18 | 20 | -27% | -34% | 0.80 | -40% | |||
Belgium | 19 | 12 | 11 | 7% | 19% | 0.34 | -4% | 69% | -0.06 |
Bosnia and Herzegovina | 16 | ||||||||
Bulgaria | 17 | 11 | -36% | -5% | 7.49 | -52% | |||
Croatia | 19 | 12 | -21% | 19% | -1.10 | ||||
Cyprus | 23 | 18 | 11 | -6% | 48% | -0.13 | 18% | 143% | 0.13 |
Czechia | 29 | 17 | -10% | -14% | |||||
Denmark | 13 | 10 | 10 | 19% | 22% | 0.84 | 3% | 32% | 0.09 |
Estonia | 14 | 11 | -26% | -3% | 7.49 | -30% | |||
Finland | 16 | 17 | 13 | -4% | 19% | -0.20 | -4% | 12% | -0.38 |
France | 21 | 17 | 17 | 0% | 1% | -0.22 | -11% | 10% | -1.13 |
Georgia | 19 | 17 | 10 | 9% | 84% | 0.11 | 0% | 95% | 0.00 |
Germany | 16 | 12 | -15% | 10% | -1.47 | ||||
Gibraltar | 18 | 23 | 13 | 22% | 117% | 0.19 | 7% | 53% | 0.12 |
Greece | 25 | 13 | 8 | -3% | 63% | -0.04 | -30% | 116% | -0.26 |
Hungary | 11 | 9 | -29% | -19% | 1.56 | -39% | |||
Iceland | 16 | 13 | 10 | 6% | 43% | 0.14 | 35% | 125% | 0.28 |
Ireland | 29 | 21 | 27% | 37% | |||||
Italy | 16 | 11 | 11 | -1% | -3% | 0.42 | -38% | -9% | 4.28 |
Kazakhstan | 20 | 17 | 25% | 46% | 0.55 | 44% | |||
Kyrgyz Republic | 30 | 24 | 26 | 22% | 14% | 1.57 | 89% | 120% | 0.74 |
Latvia | 20 | 15 | 11 | -11% | 18% | -0.63 | -15% | 49% | -0.31 |
Liechtenstein | 11 | 7 | -6% | 38% | -0.15 | ||||
Lithuania | 25 | 16 | 14 | -46% | -36% | 1.27 | -31% | 25% | -1.23 |
Luxembourg | 14 | 12 | 8 | 24% | 90% | 0.26 | 57% | 185% | 0.31 |
Moldova | 29 | 21 | 18 | -45% | -36% | 1.25 | -39% | 0% | -277.32 |
Monaco | 18 | 22 | 11 | -2% | 97% | -0.02 | 34% | 116% | 0.29 |
Montenegro | 3% | ||||||||
Netherlands | 12 | 11 | -9% | 4% | -2.17 | ||||
North Macedonia | 22 | 14 | -12% | 32% | -0.38 | ||||
Norway | 15 | 11 | 9 | 7% | 35% | 0.20 | 14% | 98% | 0.14 |
Poland | 10 | 10 | -29% | -29% | 0.99 | -25% | |||
Portugal | 18 | 13 | 12 | -26% | -17% | 1.51 | -51% | -26% | 1.99 |
Romania | 25 | 19 | 19 | -23% | -26% | 0.89 | -38% | -20% | 1.92 |
Russian Federation | 29 | 18 | 21 | 19% | 0% | -55.82 | 23% | 66% | 0.34 |
San Marino | 12 | 5 | 6 | 28% | 8% | 3.48 | 4% | 91% | 0.05 |
Serbia | 14 | -26% | |||||||
Slovak Republic | 18 | 15 | -24% | -13% | 1.85 | ||||
Slovenia | 13 | 6 | 57% | 240% | 0.24 | 28% | |||
Spain | 28 | 15 | 13 | 19% | 36% | 0.53 | -16% | 84% | -0.19 |
Sweden | 17 | 12 | 12 | 14% | 9% | 1.52 | 31% | 80% | 0.38 |
Switzerland | 17 | 13 | 10 | 12% | 50% | 0.24 | 20% | 117% | 0.17 |
Tajikistan | 22 | 23 | 38% | 33% | 1.15 | ||||
Turkmenistan | 26 | ||||||||
Türkiye | 28 | 26 | 18 | -17% | 19% | -0.90 | -3% | 53% | -0.06 |
Ukraine | 20 | 15 | -17% | 7% | -2.48 | -21% | |||
United Kingdom | 19 | 19 | 18 | 7% | 14% | 0.50 | -4% | 4% | -0.85 |
Uzbekistan | 24 | 21 | 21 | -4% | 1% | -6.75 | 86% | 118% | 0.73 |
East Asia & Pacific (EAS) | |||||||||
American Samoa | 18 | ||||||||
Australia | 19 | 18 | 20% | 33% | |||||
Brunei Darussalam | 18 | 14 | 9 | -13% | 28% | -0.45 | 30% | 155% | 0.19 |
Cambodia | 41 | 50 | 42 | -4% | 15% | -0.25 | 85% | 78% | 1.09 |
China | 27 | 22 | 17 | -18% | 10% | -1.79 | -27% | 17% | -1.57 |
Fiji | 24 | 28 | 19 | 10% | 64% | 0.15 | 27% | 63% | 0.43 |
French Polynesia | 21 | 11 | |||||||
Guam | 20 | ||||||||
Hong Kong SAR, China | 30 | 22 | 13 | -24% | 27% | -0.90 | -30% | 62% | -0.49 |
Indonesia | 34 | 22 | 16 | 4% | 41% | 0.09 | 22% | 154% | 0.14 |
Japan | 25 | 18 | 15 | -14% | 4% | -3.94 | -47% | -10% | 4.82 |
Kiribati | 30 | 32 | 26 | 26% | 53% | 0.50 | 39% | 62% | 0.63 |
Korea, Dem. People’s Rep. | 20 | ||||||||
Korea, Rep. | 48 | 29 | 14 | -33% | 35% | -0.94 | -52% | 59% | -0.89 |
Lao PDR | 31 | 30 | 22 | -9% | 26% | -0.33 | 64% | 132% | 0.49 |
Macao SAR, China | 30 | 30 | 13 | -28% | 61% | -0.46 | 37% | 207% | 0.18 |
Malaysia | 27 | 20 | 13 | 1% | 57% | 0.02 | 53% | 230% | 0.23 |
Marshall Islands | 16 | -20% | |||||||
Micronesia | 21 | 23 | 21 | -36% | -29% | 1.20 | -47% | -46% | 1.01 |
Mongolia | 32 | 33 | 31 | 36% | 45% | 0.80 | 143% | 151% | 0.95 |
Myanmar | 48 | 33 | 27 | 6% | 27% | 0.20 | 29% | 128% | 0.23 |
Nauru | 21 | 21 | 23 | -7% | -15% | 0.48 | 4% | -8% | -0.43 |
New Caledonia | 20 | ||||||||
New Zealand | 18 | 18 | 14 | 8% | 41% | 0.19 | 2% | 30% | 0.06 |
Palau | 16 | -22% | |||||||
Papua New Guinea | 31 | 35 | 33 | 172% | 190% | 0.91 | 408% | 376% | 1.09 |
Philippines | 32 | 35 | 24 | 2% | 48% | 0.04 | 60% | 111% | 0.54 |
Samoa | 20 | 24 | 21% | 20% | |||||
Singapore | 31 | 24 | 14 | -16% | 42% | -0.37 | -19% | 78% | -0.24 |
Solomon Islands | 25 | 18 | 24 | 90% | 45% | 2.00 | 277% | 297% | 0.93 |
Taiwan | 32 | 19 | 12 | -39% | -5% | 8.60 | -47% | 40% | -1.18 |
Thailand | 26 | 21 | 12 | -20% | 41% | -0.49 | -33% | 46% | -0.70 |
Timor-Leste | 81 | 26 | 8% | 232% | 0.03 | ||||
Tonga | 24 | 22 | 22 | 2% | 3% | 0.65 | -10% | 0% | 40.18 |
Tuvalu | 20 | 10 | -12% | 72% | -0.16 | 35% | |||
Vanuatu | 24 | 23 | 4 | 58% | 783% | 0.07 | 142% | 1,317% | 0.11 |
Vietnam | 36 | 30 | 23 | -13% | 11% | -1.23 | 10% | 74% | 0.14 |