Drinking Water Service Level and Gross Domestic Product (GDP) per capita in ASEAN Countries: A Comparative Study

Author

Adnan Rafif Wijayarso

Published

February 13, 2024

Abstract
The current Eastern and South-Eastern Asia region defined by the United Nations (UN) to report the progress towards Sustainable Development Goals (SDGs) target contains two contrasting groups of countries, in terms of income — therefore it is justified to emphasize the study on ASEAN countries as they may need to narrow the gap in drinking water service level compared to higher income countries. The study finds that the ASEAN region ranks 6th of all regions in level of access to improved drinking water service (94.9% of households served) and 3rd of all regions in level of access to safely managed drinking water service (39.8% of households served). Households in Singapore and Malaysia have the highest access to safely managed drinking water service in the ASEAN region, with service level being 99% and 93.9%, respectively. A strong, positive correlation (Spearman’s correlation coefficient ρ = 0.72, p-value = 0.000) exists between ASEAN and other countries’ access level to improved drinking water service and their GDP per capita. An even stronger correlation (Spearman’s correlation coefficient ρ = 0.88, p-value = 0.000) exists between ASEAN and other countries’ access level to safely managed drinking water service and their GDP per capita.

Introduction

Clean drinking water is essential for our life, therefore universal access to safe drinking water is a fundamental human right. On September 2000, the United Nations declared the Millenium Development Goals (MDGs) which targeted to halve the proportion of the population without sustainable access to safe drinking water by 2015. The agenda was even made to be more ambitious by the declaration of Sustainable Development Goals (SDGs) in 2016 which targets all countries participating to ensure availability of safely managed drinking water by 2030.

The United Nations (UN) currently reports the progress made towards SDGs target by dividing the world into eight regions, one of them being Eastern and South-Eastern Asia. At a glance, there seems to be a contrast between East Asian countries (which is dominated by higher income countries such as Japan, China, and South Korea) and Southeast Asian/ASEAN countries (which is dominated by middle income countries such as Indonesia, Thailand, and Viet Nam). Achieving the goal obviously requires tremendous resources, therefore it is justified to emphasize the study on ASEAN countries as they may need to narrow the gap in drinking water service level compared to higher income countries.

This data analysis project is created to explore how drinking water service level differs across ASEAN countries and how it correlates with their Gross Domestic Product (GDP) per capita as the most used tool by governments to measure the economic health of a country, in comparison to other SDG regions.

Methods

In this study, we’re using two data sets:

  1. The WHO/UNICEF Joint Monitoring Programme for Water Supply, Sanitation, and Hygiene (JMP) Global Database
  2. The World Bank and OECD National Accounts data files on GDP per capita (in current US$) for East Asia & Pacific Region

This study will analyze:

  1. the summary of 2022 JMP drinking water service ladder in the regional level,
  2. the 2022 JMP drinking water service ladder for each country in the ASEAN region,
  3. the relationship between GDP per capita and the levels of access to improved water service,
  4. and the relationship between GDP per capita and the levels of access to safely managed drinking water service.

There is currently no separate category that groups ASEAN countries in the JMP Global Database, as the United Nations (UN) only defined a more general “Eastern and South-Eastern Asia” region in its Report and Statistical Annex. Therefore, in order to make these analyses possible, a new regional system is defined in this study so ASEAN countries can be put into one separate “ASEAN” region.

Code
# Loading the packages
library(tidyverse)
library(readxl)
library(janitor)
library(rmarkdown)
library(ggplot2)
library(gt)
library(scales)

# Importing datasets
WLD_data_raw <- read_excel(here::here("data/raw/JMP_2023_WLD_.xlsx"))
GDPpercap_raw <- read_excel(here::here("data/raw/API_NY.GDP.PCAP.CD_DS2_en_excel_v2_6298460_.xlsx"))

# Tidying JMP datasets
WLD_data_noref <- WLD_data_raw[3:5361,] |> 
  mutate(id = row_number()) |> 
  relocate(id, .before = "DRINKING WATER") |>
  relocate(...43, .before = "DRINKING WATER") |> 
  rename(sdg_region = ...43) |> 
  rename(country = `DRINKING WATER`) |> 
  rename(year = Year) |> 
  rename(population_1000 = `Population(thousands)`) |> 
  rename(rural_basic = RURAL...6) |> 
  rename(rural_limited = ...7) |> 
  rename(rural_unimproved = ...8) |> 
  rename(rural_surfacewater = ...9) |> 
  rename(urban_basic = URBAN...11) |> 
  rename(urban_limited = ...12) |> 
  rename(urban_unimproved = ...13) |> 
  rename(urban_surfacewater = ...14) |> 
  rename(national_basic = TOTAL...16) |> 
  rename(national_limited = ...17) |> 
  rename(national_unimproved = ...18) |> 
  rename(national_surfacewater = ...19) |> 
  rename(rural_safelymanaged = RURAL...21) |> 
  relocate(rural_safelymanaged, .before = rural_basic) |> 
  rename(rural_piped = ...26) |> 
  rename(rural_nonpiped = ...27) |> 
  rename(urban_safelymanaged = URBAN...28) |> 
  relocate(urban_safelymanaged, .before = urban_basic) |> 
  rename(urban_piped = ...33) |> 
  rename(urban_nonpiped = ...34) |> 
  rename(national_safelymanaged = TOTAL...35) |> 
  relocate(national_safelymanaged, .before = national_basic) |> 
  rename(national_piped = ...40) |> 
  rename(national_nonpiped = ...41) |> 
  relocate(...10, .after = ...46) |> 
  relocate(...15, .after = ...46) |> 
  relocate(...20, .after = ...46) |> 
  relocate(...22, .after = ...46) |> 
  relocate(...23, .after = ...46) |>
  relocate(...24, .after = ...46) |> 
  relocate(...25, .after = ...46) |> 
  relocate(...29, .after = ...46) |> 
  relocate(...30, .after = ...46) |> 
  relocate(...31, .after = ...46) |> 
  relocate(...32, .after = ...46) |> 
  relocate(...36, .after = ...46) |> 
  relocate(...37, .after = ...46) |> 
  relocate(...38, .after = ...46) |> 
  relocate(...39, .after = ...46) |> 
  # Making sure there are no >99 and <1 in rural column
  mutate(rural_safelymanaged = case_when(
    rural_safelymanaged == ">99" ~ "99",
    rural_safelymanaged == "<1" ~ "1",
    TRUE ~ rural_safelymanaged)) |> 
  mutate(rural_basic = case_when(
    rural_basic == ">99" ~ "99",
    rural_basic == "<1" ~ "1",
    TRUE ~ rural_basic)) |>
  mutate(rural_unimproved = case_when(
    rural_unimproved == ">99" ~ "99",
    rural_unimproved == "<1" ~ "1",
    TRUE ~ rural_unimproved)) |>  
  mutate(rural_surfacewater = case_when(
    rural_surfacewater == ">99" ~ "99",
    rural_surfacewater == "<1" ~ "1",
    TRUE ~ rural_surfacewater)) |>  
  mutate(rural_piped = case_when(
    rural_piped == ">99" ~ "99",
    rural_piped == "<1" ~ "1",
    TRUE ~ rural_piped)) |>    
  mutate(rural_nonpiped = case_when(
    rural_nonpiped == ">99" ~ "99",
    rural_nonpiped == "<1" ~ "1",
    TRUE ~ rural_nonpiped)) |>
  # Making sure there are no >99 and <1 in urban column
  mutate(urban_safelymanaged = case_when(
    urban_safelymanaged == ">99" ~ "99",
    urban_safelymanaged == "<1" ~ "1",
    TRUE ~ urban_safelymanaged)) |> 
  mutate(urban_basic = case_when(
    urban_basic == ">99" ~ "99",
    urban_basic == "<1" ~ "1",
    TRUE ~ urban_basic)) |>
  mutate(urban_unimproved = case_when(
    urban_unimproved == ">99" ~ "99",
    urban_unimproved == "<1" ~ "1",
    TRUE ~ urban_unimproved)) |>  
  mutate(urban_surfacewater = case_when(
    urban_surfacewater == ">99" ~ "99",
    urban_surfacewater == "<1" ~ "1",
    TRUE ~ urban_surfacewater)) |>  
  mutate(urban_piped = case_when(
    urban_piped == ">99" ~ "99",
    urban_piped == "<1" ~ "1",
    TRUE ~ urban_piped)) |>    
  mutate(urban_nonpiped = case_when(
    urban_nonpiped == ">99" ~ "99",
    urban_nonpiped == "<1" ~ "1",
    TRUE ~ urban_nonpiped)) |>
  # Making sure there are no >99 and <1 in national column
  mutate(national_safelymanaged = case_when(
    national_safelymanaged == ">99" ~ "99",
    national_safelymanaged == "<1" ~ "1",
    TRUE ~ national_safelymanaged)) |> 
  mutate(national_basic = case_when(
    national_basic == ">99" ~ "99",
    national_basic == "<1" ~ "1",
    TRUE ~ national_basic)) |>
  mutate(national_unimproved = case_when(
    national_unimproved == ">99" ~ "99",
    national_unimproved == "<1" ~ "1",
    TRUE ~ national_unimproved)) |>  
  mutate(national_surfacewater = case_when(
    national_surfacewater == ">99" ~ "99",
    national_surfacewater == "<1" ~ "1",
    TRUE ~ national_surfacewater)) |>  
  mutate(national_piped = case_when(
    national_piped == ">99" ~ "99",
    national_piped == "<1" ~ "1",
    TRUE ~ national_piped)) |>    
  mutate(national_nonpiped = case_when(
    national_nonpiped == ">99" ~ "99",
    national_nonpiped == "<1" ~ "1",
    TRUE ~ national_nonpiped))
WLD_data_noref <- WLD_data_noref[,1:28]
WLD_iso3_year <- WLD_data_noref[,1:5] |> 
  unite(iso3_year, ISO3, year, sep = "_") |> 
  relocate(iso3_year, .after = "id")
WLD_iso3_year <- WLD_iso3_year[,1:2]
WLD_data <- WLD_data_noref |> 
  left_join(WLD_iso3_year, by = "id") |> 
  relocate("iso3_year", .after = year)


# Tidying World Bank GDP per capita dataset
GDPpercap_varnames <- c(GDPpercap_raw[3,])
GDPpercap <- GDPpercap_raw[4:269,]
names(GDPpercap) <- GDPpercap_varnames
GDPpercap <- GDPpercap |> 
  rename(country = `Country Name`) |> 
  rename(iso3 = `Country Code`) |> 
  rename(sdg_region = Region) |> 
  rename(levels_income = IncomeGroup) |> 
  relocate(`Indicator Name`, .before = country) |> 
  relocate(`Indicator Code`, .before = country)
GDPpercap_long_noref <- GDPpercap[,3:69] |> 
  pivot_longer(cols = "1960":"2022",
               names_to = "year",
               values_to = "GDPpercap") |> 
  relocate(year, .after = iso3) |> 
  mutate(id = row_number()) |> 
  relocate(id, .before = country)
GDP_iso3_year <- GDPpercap_long_noref[,1:4] |> 
  unite(iso3_year, iso3, year, sep = "_") |> 
  relocate("iso3_year", .after = "id")
GDPpercap_long <- GDPpercap_long_noref |> 
  left_join(GDP_iso3_year, by = "id") |> 
  relocate(sdg_region, .before = "country.x") |> 
  relocate("iso3_year", .after = "year")
GDPpercap_long <- GDPpercap_long[,6:8] |> 
  mutate(id = row_number()) |> 
  relocate("id", .before = "iso3_year")
  

# Merging JMP and GDP dataset into a new WaterService_vs_GDP object
WaterService_vs_GDP_wide <- WLD_data |> 
  left_join(GDPpercap_long, by = "iso3_year") |> 
  relocate(levels_income, .before = "population_1000") |> 
  relocate(GDPpercap, .before = "population_1000") |> 
  relocate("iso3_year", .after = national_nonpiped)
WaterService_vs_GDP_wide <- WaterService_vs_GDP_wide[,1:30] |> 
  rename(id = id.x)

WaterService_vs_GDP_long <- WaterService_vs_GDP_wide |> 
  # Converting the data frame into long-format data
  pivot_longer(cols = rural_safelymanaged:national_nonpiped,
               names_to = "residence_levelservice",
               values_to = "percentage") |> 
  separate_wider_delim(cols = "residence_levelservice",
                       names = c("residence","level_service"),
                       delim = "_") |> 
  # Tidying level of drinking water service
  mutate(method_waterservice = case_when(
    level_service == "piped" ~ "piped",
    level_service == "nonpiped" ~ "non-piped",
    TRUE ~ NA)) |> 
  mutate(levels_service_new = case_when(
    method_waterservice == "piped" ~ "improved",
    method_waterservice == "non-piped" ~ "improved",
    TRUE ~ level_service)) |> 
  mutate(levels_service = case_when(
    levels_service_new == "safelymanaged" ~ "safely managed",
    levels_service_new == "surfacewater" ~ "surface water",
    TRUE ~ levels_service_new)) |> 
  relocate(levels_service, .before = method_waterservice) |> 
  relocate(percentage, .after = method_waterservice) |> 
  relocate(level_service, .after = percentage) |> 
  mutate(id = row_number()) |> 
  rename(country_population_1000 = population_1000) |> 
  # Removing non-number values from GDPpercap and percentage variable 
  mutate(percentage = as.numeric(percentage)) |> 
  # Counting served population_1000 on national, urban, and rural level
    mutate(served_population_1000 = case_when(
      residence == "national" ~ country_population_1000 * (percentage/100),
      residence == "urban" ~ country_population_1000 * (`% urban`/100) * (percentage/100),
      residence == "rural" ~ country_population_1000 * ((100 - `% urban`)/100) * (percentage/100))) |> 
  relocate(served_population_1000, .after = percentage) |> 
  rename(served_percentage = percentage)
WaterService_vs_GDP_long <- WaterService_vs_GDP_long[,1:14]

# Establishing the level_income and level_service using factor
factor_income <- c("High income","Upper middle income", "Lower middle income", "Low income")
factor_waterservice <- c("safely managed", "improved", "basic", "limited", "unimproved", "surface water")
WaterService_vs_GDP_long <- WaterService_vs_GDP_long |> 
  mutate(levels_income = factor(levels_income, levels = factor_income)) |> 
  mutate(levels_service = factor(levels_service, levels = factor_waterservice)) |> 
  # Creating new ASEAN region
  mutate(new_region = case_when(
    ISO3 == "VNM" ~ "ASEAN",
    ISO3 == "THA" ~ "ASEAN",
    ISO3 == "SGP" ~ "ASEAN",
    ISO3 == "PHL" ~ "ASEAN",
    ISO3 == "MMR" ~ "ASEAN",
    ISO3 == "MYS" ~ "ASEAN",
    ISO3 == "LAO" ~ "ASEAN",
    ISO3 == "KHM" ~ "ASEAN",
    ISO3 == "BRN" ~ "ASEAN",
    ISO3 == "IDN" ~ "ASEAN",
    TRUE ~ NA)) |> 
  relocate(new_region, .after = sdg_region) |> 
  rename(urban_percentage = `% urban`) |> 
  mutate(GDPpercap = as.numeric(GDPpercap))

# Grouping each region so that we can compare the average of each region to ASEAN countries
WaterService_vs_GDP_refcolumn <- WaterService_vs_GDP_long |> 
  unite(refcolumn, sdg_region, year, residence, levels_service, method_waterservice, sep = "_") |> 
  relocate(refcolumn, .after = "id")
WaterService_vs_GDP_refcolumn <- WaterService_vs_GDP_refcolumn[,1:2]
WaterService_vs_GDP_regionAVG <- WaterService_vs_GDP_long |> 
  left_join(WaterService_vs_GDP_refcolumn, by = "id") |> 
  relocate(refcolumn, .after = "id") |> 
  mutate(GDPpercap = as.numeric(GDPpercap)) |> 
  group_by(refcolumn) |> 
  summarise(GDPpercap = median(GDPpercap, na.rm = TRUE),
            served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = sum(country_population_1000, na.rm = TRUE)) |> 
  rename(sdgregion_year_residence_levelsservice_methodservice = refcolumn) |> 
  separate_wider_delim(cols = sdgregion_year_residence_levelsservice_methodservice,
                       names = c("sdg_region", "year", "residence", "levels_service", "method_waterservice"),
                       delim = "_") |> 
  mutate(year = as.numeric(year)) |> 
  mutate(id = row_number()) |> 
  relocate(id, .before = sdg_region) |> 
  mutate(new_region = sdg_region) |> 
  relocate(new_region, .after = sdg_region)
# Calculating urban percentage and joining them to WaterService_vs_GDP_worldAVG object
WaterService_vs_GDP_region_urbanpercentage <- WaterService_vs_GDP_regionAVG |> 
  filter(residence == "urban",
         levels_service == "surface water" | levels_service == "unimproved" | levels_service == "limited" | levels_service == "basic") |> 
  group_by(sdg_region, year) |> 
  summarise(urban_population_1000 = sum(served_population_1000),
            country_population_1000 = max(country_population_1000)) |> 
  mutate(urban_percentage = urban_population_1000 / country_population_1000 * 100) |> 
  relocate(urban_percentage, .after = year) |> 
  unite(region_year, sdg_region, year, sep = "_")

# Biar WaterService_vs_GDP_regionAVG bisa dijoin sama WaterService_vs_GDP_region_urbanpercentage
WaterService_vs_GDP_regionAVG_refcolumn <- WaterService_vs_GDP_regionAVG[,1:4] |> 
  unite(region_year, sdg_region, year, sep = "_")
WaterService_vs_GDP_regionAVG <- WaterService_vs_GDP_regionAVG |> 
  left_join(WaterService_vs_GDP_regionAVG_refcolumn[,1:2], by = "id")
WaterService_vs_GDP_regionAVG <- WaterService_vs_GDP_regionAVG |> 
  left_join(WaterService_vs_GDP_region_urbanpercentage[,1:2], by = "region_year") |> 
  relocate(GDPpercap, .after = year) |> 
  relocate(country_population_1000, .after = GDPpercap) |> 
  relocate(urban_percentage, .after = country_population_1000) |> 
  mutate(served_percentage = served_population_1000 / country_population_1000 * 100) |> 
  relocate(served_percentage, .before = served_population_1000)
WaterService_vs_GDP_regionAVG <- WaterService_vs_GDP_regionAVG[,1:12]

# Counting world average so that we can compare service level average of the world to ASEAN countries
WaterService_vs_GDP_refcolumn2 <- WaterService_vs_GDP_long |> 
  unite(refcolumn, year, residence, levels_service, method_waterservice, sep = "_") |> 
  relocate(refcolumn, .after = "id") |> 
  relocate(served_population_1000, .after = refcolumn)
WaterService_vs_GDP_refcolumn2 <- WaterService_vs_GDP_refcolumn2[,1:2]
WaterService_vs_GDP_worldAVG <- WaterService_vs_GDP_long |> 
  left_join(WaterService_vs_GDP_refcolumn2, by = "id") |> 
  relocate(refcolumn, .after = "id") |>
  mutate(GDPpercap = as.numeric(GDPpercap)) |> 
  group_by(refcolumn) |>
  summarise(served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = sum(country_population_1000, na.rm = TRUE),
            GDPpercap = median(GDPpercap, na.rm = TRUE)) |>  
  rename(year_residence_levelsservice_methodservice = "refcolumn") |> 
  rename(population_1000 = served_population_1000) |>
  separate_wider_delim(cols = year_residence_levelsservice_methodservice,
                       names = c("year", "residence", "levels_service", "method_waterservice"),
                       delim = "_") |> 
  mutate(year = as.numeric(year)) |> 
  mutate(id = row_number()) |> 
  relocate(id, .before = year) |> 
  mutate(new_region = "World average") |> 
  relocate(new_region, .before = year)
# Calculating urban percentage and joining them to WaterService_vs_GDP_worldAVG object
WaterService_vs_GDP_world_urbanpercentage <- WaterService_vs_GDP_worldAVG |> 
  filter(residence == "urban",
         levels_service == "surface water" | levels_service == "unimproved" | levels_service == "limited" | levels_service == "basic") |> 
  group_by(year) |> 
  summarise(urban_population_1000 = sum(population_1000),
            country_population_1000 = max(country_population_1000)) |> 
  mutate(urban_percentage = urban_population_1000 / country_population_1000 * 100) |> 
  relocate(urban_percentage, .after = year)
WaterService_vs_GDP_worldAVG <- WaterService_vs_GDP_worldAVG |> 
  left_join(WaterService_vs_GDP_world_urbanpercentage[,1:2], by = "year") |> 
  relocate(GDPpercap, .after = "year") |> 
  relocate(country_population_1000, .after = GDPpercap) |> 
  rename(served_population_1000 = population_1000) |> 
  relocate(urban_percentage, .after = country_population_1000) |> 
  mutate(served_percentage = served_population_1000 / country_population_1000 * 100) |> 
  relocate(served_percentage, .before = served_population_1000)

# Binding region average and world average to WaterService_vs_GDP_region_worldAVG object
WaterService_vs_GDP_region_worldAVG <- bind_rows(WaterService_vs_GDP_regionAVG, WaterService_vs_GDP_worldAVG)
WaterService_vs_GDP_region_worldAVG <- WaterService_vs_GDP_region_worldAVG |> 
  relocate(sdg_region, .after = served_population_1000) |>
  rename(region = new_region) |>
  rename(levels_waterservice = levels_service) |> 
  mutate(levels_waterservice = factor(levels_waterservice, levels = factor_waterservice))
WaterService_vs_GDP_region_worldAVG <- WaterService_vs_GDP_region_worldAVG[,1:11]

# Creating WaterService_vs_GDP_ASEAN object containing the details of each country 
WaterService_vs_GDP_ASEAN <- WaterService_vs_GDP_long |> 
  filter(new_region == "ASEAN") |> 
  mutate(id = row_number()) |> 
  relocate(sdg_region, .after = served_population_1000) |>
  rename(region = new_region) |> 
  rename(levels_waterservice = levels_service) |> 
  mutate(levels_waterservice = factor(levels_waterservice, levels = factor_waterservice))
WaterService_vs_GDP_ASEAN <- WaterService_vs_GDP_ASEAN[,1:14]

# Writing WaterService_vs_GDP_region_worldAVG.csv from WaterService_vs_GDP_region_worldAVG object
write_csv(WaterService_vs_GDP_region_worldAVG, here::here("data/processed/WaterService_vs_GDP_region_worldAVG.csv"))

# Writing WaterService_vs_GDP_ASEAN.csv from  WaterService_vs_GDP_ASEAN object
write_csv(WaterService_vs_GDP_ASEAN, here::here("data/processed/WaterService_vs_GDP_ASEAN.csv"))

Results

Comparing water service level in the regional level

Code
# Filtering ASEAN's 2022 data on the national level of drinking water service levels
# Preparing ASEAN urban percentage
WaterService_vs_GDP_ASEAN_2022_nationalurban <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national" | residence == "urban",
         levels_waterservice != "safely managed" & levels_waterservice != "improved") |> 
  group_by(region, residence, levels_waterservice) |> 
  summarise(served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = sum(country_population_1000, na.rm = TRUE)) |> 
  group_by(region, residence) |> 
  summarise(served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = mean(country_population_1000, na.rm = TRUE)) |> 
  mutate(urban_percentage = served_population_1000 / country_population_1000 * 100) |> 
  relocate(urban_percentage, .after = region)
WaterService_vs_GDP_ASEANAVG_2022 <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice != "safely managed" & levels_waterservice != "improved") |> 
  group_by(region, year, residence, levels_waterservice) |> 
  summarise(served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = sum(country_population_1000, na.rm = TRUE),
            GDPpercap = median(GDPpercap, na.rm = TRUE)) |> 
  mutate(served_percentage = served_population_1000 / country_population_1000 * 100) |> 
  left_join(WaterService_vs_GDP_ASEAN_2022_nationalurban[2,1:2])
WaterService_vs_GDP_ASEAN_2022_safelymanaged <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice == "safely managed") |> 
  group_by(region, year, residence, levels_waterservice) |> 
  summarise(served_population_1000 = sum(served_population_1000, na.rm = TRUE),
            country_population_1000 = sum(country_population_1000, na.rm = TRUE),
            GDPpercap = median(GDPpercap, na.rm = TRUE)) |> 
  mutate(served_percentage = served_population_1000 / country_population_1000 * 100)
WaterService_vs_GDP_ASEANAVG_2022 <- WaterService_vs_GDP_ASEANAVG_2022 |> 
  bind_rows(WaterService_vs_GDP_ASEAN_2022_safelymanaged) |> 
  fill(urban_percentage)

# Filtering region and world average data of drinking water service levels
WaterService_vs_GDP_region_worldAVG_2022 <- WaterService_vs_GDP_region_worldAVG |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice != "improved")

# Data to be plotted
plot1 <- WaterService_vs_GDP_region_worldAVG_2022 |> 
  bind_rows(WaterService_vs_GDP_ASEANAVG_2022) |> 
  mutate(id = row_number())
plot1_basic <- plot1 |> 
  filter(levels_waterservice == "basic") |> 
  mutate(new_id = row_number())
plot1_safelymanaged <- plot1 |> 
  filter(levels_waterservice == "safely managed") |>
  rename(safelymanaged_percentage = served_percentage) |> 
  rename(safelymanaged_population_1000 = served_population_1000) |> 
  mutate(new_id = row_number())
plot1_basic_minus_safelymanaged <- plot1_basic |> 
  left_join(plot1_safelymanaged[,10:12], by = "new_id") |> 
  mutate(new_percentage = served_percentage - safelymanaged_percentage) |> 
  mutate(new_population_1000 = served_population_1000 - safelymanaged_population_1000) |> 
  relocate(id, .after = new_population_1000)
plot1_basic_minus_safelymanaged <- plot1_basic_minus_safelymanaged[,12:16] 
plot1_rank <- plot1_basic_minus_safelymanaged |> 
  arrange(desc(safelymanaged_percentage)) |> 
  left_join(plot1[,1:3], by = "id") |> 
  mutate(rank = row_number()) |> 
  relocate(rank, .after = "region")
plot1_rank <- plot1_rank[,6:7]

plot1 <- plot1 |> 
  left_join(plot1_basic_minus_safelymanaged, by = "id") |> 
  mutate(percentage = case_when(
    levels_waterservice == "basic" ~ new_percentage,
    TRUE ~ served_percentage)) |> 
  mutate(population_1000 = case_when(
    levels_waterservice == "basic" ~ new_population_1000,
    TRUE ~ served_population_1000)) |> 
  relocate(percentage, .after = method_waterservice) |> 
  relocate(population_1000, .after = percentage)
plot1 <- plot1[,1:11] |> 
  left_join(plot1_rank, by = "region") |> 
  rename(served_percentage = percentage) |> 
  rename(served_population_1000 = population_1000)

ggplot(data = plot1,
       mapping = aes(x = reorder(region, rank, decreasing = TRUE),
                     y = served_percentage,
                     fill = levels_waterservice)) +
  geom_col() +
  coord_flip() +
  labs(x = "Region", y = "% of served households") +
  geom_text(aes(label = round(served_percentage, 1)),
            position = position_stack(vjust = 0.5),
            size = 3,
            color = "white") +
  theme(legend.position = "bottom",
        legend.text = element_text(size = 9)) +
  guides(fill = guide_legend(title = NULL))

Figure 1: ASEAN drinking water service level, compared to other SDG regions and world average

Figure 1 shows that the drinking water service level in the ASEAN region is slightly better than the world average. Most households in ASEAN region already have access to at least basic drinking water service, and 39.8% of households already have access to safely managed drinking water service. However, there is still large gap in the percentage of households with access to safely managed drinking water service between ASEAN region and Latin America & the Caribbean region.

Comparing water service level for each ASEAN country

Code
plot2 <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice != "improved") |> 
  mutate(id = row_number())
plot2_basic <- plot2 |> 
  filter(levels_waterservice == "basic") |> 
  mutate(new_id = row_number())
plot2_safelymanaged <- plot2 |> 
  filter(levels_waterservice == "safely managed") |>
  rename(safelymanaged_percentage = served_percentage) |> 
  rename(safelymanaged_population_1000 = served_population_1000) |> 
  mutate(new_id = row_number())
plot2_basic_minus_safelymanaged <- plot2_basic |> 
  left_join(plot2_safelymanaged[,13:15], by = "new_id") |> 
  mutate(new_percentage = case_when(
    safelymanaged_percentage > 0 ~ served_percentage - safelymanaged_percentage,
    TRUE ~ served_percentage)) |> 
  mutate(new_population_1000 = case_when(
    safelymanaged_population_1000 > 0 ~ served_population_1000 - safelymanaged_population_1000,
    TRUE ~ served_population_1000)) |> 
  relocate(id, .after = new_population_1000)
plot2_basic_minus_safelymanaged <- plot2_basic_minus_safelymanaged[,15:19] 
plot2_rank <- plot2_basic_minus_safelymanaged |> 
  arrange(desc(safelymanaged_percentage)) |> 
  left_join(plot2[,1:3], by = "id") |> 
  mutate(rank = row_number()) |> 
  relocate(rank, .after = country)
plot2_rank <- plot2_rank[,7:8]
  
plot2 <- plot2 |> 
  left_join(plot2_basic_minus_safelymanaged, by = "id") |> 
  mutate(percentage = case_when(
    levels_waterservice == "basic" ~ new_percentage,
    TRUE ~ served_percentage)) |> 
  mutate(population_1000 = case_when(
    levels_waterservice == "basic" ~ new_population_1000,
    TRUE ~ served_population_1000)) |> 
  relocate(percentage, .after = method_waterservice) |> 
  relocate(population_1000, .after = percentage) |> 
  relocate(safelymanaged_percentage, .after = population_1000) |> 
  relocate(safelymanaged_population_1000, .after = safelymanaged_percentage)
plot2 <- plot2[,1:16] |> 
  left_join(plot2_rank, by = "country") |> 
  rename(served_percentage = percentage) |> 
  rename(served_population_1000 = population_1000)

ggplot(data = plot2,
       mapping = aes(x = reorder(country, rank, decreasing = TRUE),
                     y = served_percentage,
                     fill = levels_waterservice)) +
  geom_col() +
  coord_flip() +
  labs(x = "ASEAN country", y = "% of served households",
       caption = "Note: The JMP data has no estimation on safely managed drinking water level in Brunei Darussalam and Thailand") +
  geom_text(aes(label = round(served_percentage, 1)),
            position = position_stack(vjust = 0.5),
            size = 3,
            color = "white") +
  theme(legend.position = "bottom",
        legend.text = element_text(size = 9)) +
  guides(fill = guide_legend(title = NULL))

Figure 2: ASEAN countries drinking water service level

If we delve deeper and compare all countries in ASEAN region, as pictured in Figure 2, it is shown that Singapore and Malaysia hold the highest percentages of households with access to safely managed drinking water service, with their respective service level being 99% and 93.9%. On the contrary, Lao People’s Democratic Republic and Cambodia have the least access to safely managed drinking water service, with service level being 17.9% and 29.1%, respectively.

We can also highlight from Figure 2 that Myanmar and Cambodia have relatively lack of access in improved drinking water service on the national level. In 2022, 11.1% of households in Myanmar and 7.3% of households in Cambodia only use surface water as their daily source of drinking water.

How GDP per capita correlates with improved drinking water service level

Code
WaterService_vs_GDP_ASEAN_2022_improved <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice == "basic" | levels_waterservice == "limited") |> 
  group_by(country) |> 
  summarise(population_1000 = mean(country_population_1000, na.rm = TRUE),
            median_GDPpercap = median(GDPpercap, na.rm = TRUE),
            sum_served_population_1000 = sum(served_population_1000, na.rm = TRUE)) |> 
  mutate(region = "ASEAN") |> 
  mutate(served_percentage = sum_served_population_1000 / population_1000 * 100) |> 
  group_by(region) |> 
  summarise(count_country = n(),
            sum_population_1000 = sum(population_1000),
            min_GDPpercap = min(median_GDPpercap),
            max_GDPpercap = max(median_GDPpercap),
            median_GDPpercap = median(median_GDPpercap),
            min_served_percentage = min(served_percentage),
            max_served_percentage = max(served_percentage),
            sum_served_population_1000 = sum(sum_served_population_1000)) |> 
  mutate(mean_served_percentage = sum_served_population_1000 / sum_population_1000 * 100) |> 
  relocate(median_GDPpercap, .after = min_GDPpercap) |> 
  relocate(mean_served_percentage, .after = min_served_percentage)

WaterService_vs_GDP_region_worldAVG_2022_improved <- WaterService_vs_GDP_long |> 
  filter(year == 2022,
         residence == "national",
         levels_service == "basic" | levels_service == "limited") |> 
  group_by(sdg_region, country) |> 
  summarise(population_1000 = mean(country_population_1000, na.rm = TRUE),
            median_GDPpercap = median(GDPpercap, na.rm = TRUE),
            sum_served_population_1000 = ifelse(
              all(is.na(served_population_1000)), NA, 
              sum(served_population_1000, na.rm = TRUE))
            ) |>   
  mutate(served_percentage = sum_served_population_1000 / population_1000 * 100) |> 
  group_by(sdg_region) |> 
  summarise(count_country = n(),
            sum_population_1000 = sum(population_1000, na.rm = TRUE),
            min_GDPpercap = min(median_GDPpercap, na.rm = TRUE),
            max_GDPpercap = max(median_GDPpercap, na.rm = TRUE),
            median_GDPpercap = median(median_GDPpercap, na.rm = TRUE),
            min_served_percentage = min(served_percentage, na.rm = TRUE),
            max_served_percentage = max(served_percentage, na.rm = TRUE),
            sum_served_population_1000 = sum(sum_served_population_1000, na.rm = TRUE)) |> 
  mutate(mean_served_percentage = sum_served_population_1000 / sum_population_1000 * 100) |> 
  relocate(median_GDPpercap, .after = min_GDPpercap) |>
  relocate(mean_served_percentage, .after = min_served_percentage) |> 
  rename(region = sdg_region)

WaterService_vs_GDP_2022AVG_improved <- bind_rows(WaterService_vs_GDP_ASEAN_2022_improved, WaterService_vs_GDP_region_worldAVG_2022_improved) |> 
  arrange(desc(mean_served_percentage))

WaterService_vs_GDP_2022AVG_improved[,1:9] |> 
  rename("Region" = region) |> 
  rename("No. of countries" = count_country) |> 
  rename("Population (1000)" = sum_population_1000) |> 
  rename("Min. GDP per capita" = min_GDPpercap) |> 
  rename("Median GDP per capita" = median_GDPpercap) |> 
  rename("Max. GDP per capita" = max_GDPpercap) |> 
  rename("Min. service level" = min_served_percentage) |> 
  rename("Average service level" = mean_served_percentage) |> 
  rename("Max. service level" = max_served_percentage) |> 
  gt() |> 
  fmt_number(columns = "Population (1000)",
             use_seps = TRUE,
             decimals = 0) |>   
  fmt_currency(columns = "Min. GDP per capita":"Max. GDP per capita",
               currency = "USD",
               use_seps = TRUE,
               decimals = 0) |> 
  fmt_percent(columns = "Min. service level":"Max. service level",
              scale = 0,
              decimals = 1) |> 
  tab_options(column_labels.font.weight = "bold",
              table.font.size = px(13))
Table 1:

Comparison of all regions’ characteristics, GDP per capita,
and % of households with access to improved drinking water service

Region No. of countries Population (1000) Min. GDP per capita Median GDP per capita Max. GDP per capita Min. service level Average service level Max. service level
Australia and New Zealand 2 31,363 $48,419 $56,759 $65,100 99.0% 99.0% 99.0%
Europe and Northern America 52 1,118,593 $4,534 $29,675 $240,862 90.4% 98.1% 99.9%
Northern Africa and Western Asia 25 553,690 $650 $6,867 $87,661 89.1% 97.3% 100.0%
Eastern and South-Eastern Asia 18 2,344,325 $1,149 $6,910 $82,808 82.4% 96.9% 99.0%
Central and Southern Asia 14 2,084,590 $1,054 $2,550 $11,781 83.3% 96.1% 99.6%
ASEAN 10 679,784 $1,149 $4,476 $82,808 82.4% 94.9% 99.0%
Latin America and the Caribbean 50 660,269 $1,748 $12,264 $99,625 77.1% 89.6% 100.0%
Sub-Saharan Africa 51 1,166,766 $259 $1,471 $13,250 58.0% 78.1% 99.0%
Oceania 21 13,676 $1,702 $5,222 $35,745 52.6% 57.5% 99.0%
Code
plot3_allcountries <- WaterService_vs_GDP_long |> 
  filter(year == 2022,
         residence == "national",
         levels_service == "basic" | levels_service == "limited") |> 
  group_by(new_region, country) |> 
  summarise(population_1000 = mean(country_population_1000, na.rm = TRUE),
            GDPpercap = median(GDPpercap, na.rm = TRUE),
            sum_served_population_1000 = ifelse(
              all(is.na(served_population_1000)), NA, 
              sum(served_population_1000, na.rm = TRUE))
            ) |> 
  mutate(served_percentage = sum_served_population_1000 / population_1000) |> 
  rename(region = new_region) |> 
  mutate(region = case_when(
    region == "ASEAN" ~ region,
    TRUE ~ "Other regions"))
plot3_improved_rank <- plot3_allcountries |> 
  filter(region == "ASEAN") |> 
  arrange(desc(served_percentage)) |> 
  mutate(rank = row_number()) |> 
  relocate(country, .before = rank)
plot3_improved_rank <- plot3_improved_rank[6:7]
plot3 <- plot3_allcountries |> 
  left_join(plot3_improved_rank, by = "country")

# Calculating minimum GDP per capita a country need to provide improved drinking water service for all
plot3_minGDP <- plot3_allcountries |>
  filter(served_percentage == 0.99) |> 
  summarise(min_GDPpercap = min(GDPpercap, na.rm = TRUE)) |> 
  arrange(min_GDPpercap)

# Calculating Spearman's rank correlation coefficient
plot3_cor <-  cor.test(plot3$GDPpercap, plot3$served_percentage, use = "complete.obs", method = "spearman")
plot3_conclusion <- paste(
  case_when(plot3_cor$estimate >= 0.9 & plot3_cor$estimate <= 1 ~ "very strong",
            plot3_cor$estimate >= 0.7 & plot3_cor$estimate < 0.9 ~ "strong",
            plot3_cor$estimate >= 0.4 & plot3_cor$estimate < 0.7 ~ "moderate",
            plot3_cor$estimate >= 0.2 & plot3_cor$estimate < 0.4 ~ "weak",
            plot3_cor$estimate >= 0 & plot3_cor$estimate < 0.2 ~ "very weak"))
plot3_relation <- paste(
  case_when(plot3_cor$estimate > 0 & plot3_cor$estimate <= 1 ~ "positive",
            plot3_cor$estimate < 0 & plot3_cor$estimate >= -1 ~ "negative"))
plot3_caption <- paste(
  "Spearman's ρ was used to assess the relationship between GDP per capita and water service level ( ρ = ",
  sprintf("%.2f", plot3_cor$estimate), ", p = ", sprintf("%.3f", plot3_cor$p.value), "), showing a",
  plot3_conclusion, "and ", plot3_relation, "correlation between the two variables")
plot3_minGDP_print <- paste("US$", comma(min(plot3_minGDP$min_GDPpercap)))

ggplot(data = plot3,
       mapping = aes(x = GDPpercap,
                     y = served_percentage,
                     color = region,
                     size = region)) +
  geom_point() +
  scale_color_manual(values = c("ASEAN" = "red3", "Other regions" = "gray80")) +
  scale_size_manual(values = c("ASEAN" = 3, "Other regions" = 2)) +
  # Adding extra layers of geom_point so the ASEAN points can be on top of other regions' 
  geom_point(data = plot3 |>
               filter(region == "ASEAN"),
               color = "red3",
               size = 3) +
  geom_text(aes(label = case_when(
                          rank <= 2 ~ country,
                          rank >= 9 ~ country,
                          TRUE ~ "")),
            nudge_y = -0.025) +
  ggtitle("GDP per capita vs % of households with access\nto improved drinking water services") +
  labs(x = "GDP per capita", y = "percentage",
       caption = str_wrap(plot3_caption, width = 95)) +
  scale_x_continuous(labels = scales::dollar,
                     trans = "log10") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Figure 3: GDP per capita vs % of households with access to improved drinking water services

Table 1 shows that the ASEAN region ranks in 6th when it comes to providing access to improved drinking water service, with average water service level of 94.9%. On the regional level, the relationship between GDP per capita and the level of access to improved drinking water service remains unclear. However, if we plot the data on the country level using a scatter plot, as pictured in Figure 3, a strong, positive correlation exists[1] between the two variables. It appears that the countries able to provide all households with improved drinking water service have minimum GDP per capita of US$ 5,222.

How GDP per capita correlates with safely managed drinking water service level

Code
table2_ASEAN_2022_safelymanaged <- WaterService_vs_GDP_ASEAN |> 
  filter(year == 2022,
         residence == "national",
         levels_waterservice == "safely managed") |> 
  group_by(region) |> 
  summarise(count_country = n(),
            population_1000 = sum(country_population_1000),
            min_GDPpercap = min(GDPpercap),
            max_GDPpercap = max(GDPpercap),
            median_GDPpercap = median(GDPpercap),
            min_served_percentage = min(served_percentage, na.rm = TRUE),
            max_served_percentage = max(served_percentage, na.rm = TRUE),
            served_population_1000 = sum(served_population_1000, na.rm = TRUE)) |> 
  mutate(mean_served_percentage = served_population_1000 / population_1000 * 100) |> 
  relocate(median_GDPpercap, .after = min_GDPpercap) |> 
  relocate(mean_served_percentage, .after = min_served_percentage)

table2_region_worldAVG_2022_safelymanaged <- WaterService_vs_GDP_long |> 
  filter(year == 2022,
         residence == "national",
         levels_service == "safely managed") |>
  group_by(sdg_region) |> 
  summarise(count_country = n(),
            population_1000 = sum(country_population_1000, na.rm = TRUE),
            min_GDPpercap = min(GDPpercap, na.rm = TRUE),
            max_GDPpercap = max(GDPpercap, na.rm = TRUE),
            median_GDPpercap = median(GDPpercap, na.rm = TRUE),
            min_served_percentage = min(served_percentage, na.rm = TRUE),
            max_served_percentage = max(served_percentage, na.rm = TRUE),
            served_population_1000 = sum(served_population_1000, na.rm = TRUE)) |> 
  mutate(mean_served_percentage = served_population_1000 / population_1000 * 100) |> 
  relocate(median_GDPpercap, .after = min_GDPpercap) |>
  relocate(mean_served_percentage, .after = min_served_percentage) |> 
  rename(region = sdg_region)

table2 <- bind_rows(table2_ASEAN_2022_safelymanaged, table2_region_worldAVG_2022_safelymanaged) |> 
  arrange(desc(mean_served_percentage))

table2[,1:9] |> 
  rename("Region" = region) |> 
  rename("No. of countries" = count_country) |> 
  rename("Population (1000)" = population_1000) |> 
  rename("Min. GDP per capita" = min_GDPpercap) |> 
  rename("Median GDP per capita" = median_GDPpercap) |> 
  rename("Max. GDP per capita" = max_GDPpercap) |> 
  rename("Min. service level" = min_served_percentage) |> 
  rename("Average service level" = mean_served_percentage) |> 
  rename("Max. service level" = max_served_percentage) |> 
  gt() |> 
  fmt_number(columns = "Population (1000)",
             use_seps = TRUE,
             decimals = 0) |>   
  fmt_currency(columns = "Min. GDP per capita":"Max. GDP per capita",
               currency = "USD",
               use_seps = TRUE,
               decimals = 0) |> 
  fmt_percent(columns = "Min. service level":"Max. service level",
              scale = 0,
              decimals = 1) |> 
  tab_options(column_labels.font.weight = "bold",
              table.font.size = px(13))
Table 2:

Comparison of all regions’ characteristics, GDP per capita,
and % of households with access to safely managed drinking water service

Region No. of countries Population (1000) Min. GDP per capita Median GDP per capita Max. GDP per capita Min. service level Average service level Max. service level
Europe and Northern America 52 1,118,593 $4,534 $29,675 $240,862 70.7% 93.3% 99.0%
Latin America and the Caribbean 50 660,269 $1,748 $12,264 $99,625 43.0% 55.3% 99.0%
ASEAN 10 679,784 $1,149 $4,476 $82,808 17.9% 39.8% 99.0%
Northern Africa and Western Asia 25 553,690 $650 $6,867 $87,661 47.7% 26.5% 99.0%
Eastern and South-Eastern Asia 18 2,344,325 $1,149 $6,910 $82,808 17.9% 20.1% 99.0%
Central and Southern Asia 14 2,084,590 $1,054 $2,550 $11,781 16.1% 18.1% 94.9%
Australia and New Zealand 2 31,363 $48,419 $56,759 $65,100 99.0% 16.4% 99.0%
Sub-Saharan Africa 51 1,166,766 $259 $1,471 $13,250 6.1% 13.9% 95.8%
Oceania 21 13,676 $1,702 $5,222 $35,745 8.7% 9.9% 99.0%
Code
plot4_allcountries <- WaterService_vs_GDP_long |> 
  filter(year == 2022,
         residence == "national",
         levels_service == "safely managed") |> 
  group_by(new_region, country) |> 
  summarise(population_1000 = mean(country_population_1000, na.rm = TRUE),
            GDPpercap = median(GDPpercap, na.rm = TRUE),
            sum_served_population_1000 = ifelse(
              all(is.na(served_population_1000)), NA, 
              sum(served_population_1000, na.rm = TRUE))
            ) |> 
  mutate(served_percentage = sum_served_population_1000 / population_1000) |> 
  rename(region = new_region) |> 
  mutate(region = case_when(
    region == "ASEAN" ~ region,
    TRUE ~ "Other regions"))
  
plot4_improved_rank <- plot4_allcountries |> 
  filter(region == "ASEAN") |> 
  arrange(desc(served_percentage)) |> 
  mutate(rank = row_number()) |> 
  relocate(country, .before = rank)
plot4_improved_rank <- plot4_improved_rank[6:7]
plot4 <- plot4_allcountries |> 
  left_join(plot4_improved_rank, by = "country")

# Calculating minimum GDP per capita a country need to provide safely drinking water service for all
plot4_minGDP <- plot4_allcountries |>
  filter(served_percentage >= 0.99) |> 
  summarise(min_GDPpercap = min(GDPpercap, na.rm = TRUE)) |> 
  arrange(min_GDPpercap)
plot4_minGDP_print <- paste("US$", comma(min(plot4_minGDP$min_GDPpercap)))

# Calculating Spearman's rank correlation coefficient for plot 4
plot4_cor <-  cor.test(plot4$GDPpercap, plot4$served_percentage, use = "complete.obs", method = "spearman")
plot4_conclusion <- paste(
  case_when(plot4_cor$estimate >= 0.9 & plot4_cor$estimate <= 1 ~ "very strong",
            plot4_cor$estimate >= 0.7 & plot4_cor$estimate < 0.9 ~ "strong",
            plot4_cor$estimate >= 0.4 & plot4_cor$estimate < 0.7 ~ "moderate",
            plot4_cor$estimate >= 0.2 & plot4_cor$estimate < 0.4 ~ "weak",
            plot4_cor$estimate >= 0 & plot4_cor$estimate < 0.2 ~ "very weak"))
plot4_relation <- paste(
  case_when(plot4_cor$estimate > 0 & plot4_cor$estimate <= 1 ~ "positive",
            plot4_cor$estimate < 0 & plot4_cor$estimate >= -1 ~ "negative"))
plot4_caption <- paste(
  "Spearman's ρ was used to assess the relationship between GDP per capita and water service level ( ρ = ",
  sprintf("%.2f", plot4_cor$estimate), ", p = ", sprintf("%.3f", plot4_cor$p.value), "), showing a",
  plot4_conclusion, "and ", plot4_relation, "correlation between the two variables")

ggplot(data = plot4,
       mapping = aes(x = GDPpercap,
                     y = served_percentage,
                     color = region,
                     size = region)) +
  geom_point() +
  scale_color_manual(values = c("ASEAN" = "red3", "Other regions" = "gray80")) +
  scale_size_manual(values = c("ASEAN" = 3, "Other regions" = 2)) +
  # Adding extra layers of geom_point so the ASEAN points can be on top of other regions' 
  geom_point(data = plot4 |>
               filter(region == "ASEAN"),
               color = "red3",
               size = 3) +
  geom_text(aes(label = case_when(
                          rank <= 2 ~ country,
                          rank >= 9 ~ country,
                          TRUE ~ "")),
            nudge_y = -0.025) +
  ggtitle("GDP per capita vs % of households with access to\nsafely managed drinking water services") +
  labs(x = "GDP per capita", y = "percentage",
       caption = str_wrap(plot4_caption, width = 95)) +
  scale_x_continuous(labels = scales::dollar,
                     trans = "log10") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Figure 4: GDP per capita vs % of households with access to safely managed drinking water services

Table 2 attempts to take a glimpse on how all regions and countries progress towards the ambitious SDG target 6.1 and target 6.2. By region average, ASEAN countries place 3rd on providing safely managed drinking water service level. Figure 4 shows an even stronger correlation between GDP per capita and safely drinking water service level, and it appears the countries able to provide all households with safely drinking water service have minimum GDP per capita of US$ 18,390.

Further discussions

As it is established that the economic health of a country — represented by GDP per capita for the scope of this study — strongly correlates with drinking water service level, it is pivotal for all countries to maintain a healthy GDP growth to ensure their ability to achieve universal coverage of drinking water. The percentage of GDP allocated to improve drinking water service level may vary depends on the countries’ ambition for the goal, as providing safely managed drinking water services as targeted in the SDGs will be significantly more expensive than providing just the basic access as targeted in the MDGs[2]. Projections indicate that most countries in the Asia-Pacific region (including ASEAN countries) will need to allocate between 1-2% of GDP on water supply and sanitation infrastructure over the period of 2015-2030[3]. Based on the findings of this study, Myanmar and Cambodia will need to allocate greater share of their GDP to catch up with other countries in the ASEAN region.

Another important thing to note is to maintain the quality of open water sources as it intrinsically links to health and economic production of a country, and thus affects the country’s GDP. Research shows that when rivers in middle income countries become moderately polluted (BOD level between 2-8 mg/L), GDP growth is reduced by 1.76%, and when they become heavily polluted (BOD level >8 mg/L), GDP growth is reduced by 2.5%[4].

There are various GDP allocation strategy that countries can implement to achieve universal coverage of drinking water, including but not limited to (a) focusing on investments to extend access to unserved population and (b) focusing on investments on improving access level of the population with only access to unimproved and limited drinking water services. Future analyses should look into how the difference on strategies implemented in each country correlates on drinking water service level in each country.

Conclusions

From this study, we can conclude that:

  • On the regional level, ASEAN region ranks 6th of all regions in level of access to improved drinking water service, with the service level being 94.9% of its households. To break into more details based on the JMP drinking water ladder:
    • 39.8% of ASEAN households already have access to safely managed drinking water service (ranks 3rd of all regions),
    • 54.3% of ASEAN households have access to basic drinking water service,
    • and 0.8% of households have access to limited drinking water service.
  • Households in Singapore and Malaysia have the highest access to safely managed drinking water service in the ASEAN region, with service level being 99% and 93.9%, respectively.
  • A strong, positive correlation exists between ASEAN and other countries’ access level to improved drinking water service and their GDP per capita.
  • A positive, yet even stronger correlation exists between ASEAN and other countries’ access level to safely managed drinking water service and their GDP per capita.

References

1. Schober, P., Boer, C., & Schwarte, L. A. (2018). Correlation Coefficients: Appropriate Use and Interpretation. Anesthesia & Analgesia, 126(5), 1763–1768. https://doi.org/10.1213/ane.0000000000002864
2. Rozenberg, J., & Fay, M. (2019). Beyond the gap: How countries can afford the infrastructure they need while protecting the planet. Washington, DC: World Bank. https://doi.org/10.1596/978-1-4648-1363-4
3. Financing water security for sustainable growth in asia and the pacific. (2021). https://doi.org/10.1787/3bc15c5b-en
4. Russ, J., Zaveri, E., Desbureaux, S., Damania, R., & Rodella, A.-S. (2022). The impact of water quality on GDP growth: Evidence from around the world. Water Security, 17, 100130. https://doi.org/10.1016/j.wasec.2022.100130

Reuse

Citation

BibTeX citation:
@online{rafif wijayarso2024,
  author = {Rafif Wijayarso, Adnan},
  title = {Drinking {Water} {Service} {Level} and {Gross} {Domestic}
    {Product} {(GDP)} Per Capita in {ASEAN} {Countries:} {A}
    {Comparative} {Study}},
  date = {2024-02-13},
  url = {https://ds4owd-001.github.io/project-adnanwijayarso/},
  langid = {en},
  abstract = {The current Eastern and South-Eastern Asia region defined
    by the United Nations (UN) to report the progress towards
    Sustainable Development Goals (SDGs) target contains two contrasting
    groups of countries, in terms of income — therefore it is justified
    to emphasize the study on ASEAN countries as they may need to narrow
    the gap in drinking water service level compared to higher income
    countries. The study finds that the ASEAN region ranks 6th of all
    regions in level of access to improved drinking water service
    (94.9\% of households served) and 3rd of all regions in level of
    access to safely managed drinking water service (39.8\% of
    households served). Households in Singapore and Malaysia have the
    highest access to safely managed drinking water service in the ASEAN
    region, with service level being 99\% and 93.9\%, respectively. A
    strong, positive correlation (Spearman’s correlation coefficient ρ =
    0.72, p-value = 0.000) exists between ASEAN and other countries’
    access level to improved drinking water service and their GDP per
    capita. An even stronger correlation (Spearman’s correlation
    coefficient ρ = 0.88, p-value = 0.000) exists between ASEAN and
    other countries’ access level to safely managed drinking water
    service and their GDP per capita.}
}
For attribution, please cite this work as:
1. Rafif Wijayarso, A. (2024, February 13). Drinking Water Service Level and Gross Domestic Product (GDP) per capita in ASEAN Countries: A Comparative Study. https://ds4owd-001.github.io/project-adnanwijayarso/