Code
!pip install -q polars pyarrow plotnine quarto-cli > /dev/null 2>&1
indicator = pl.read_csv("unicef_indicator_2.csv")
metadata = pl.read_csv("unicef_metadata.csv")!pip install -q polars pyarrow plotnine quarto-cli > /dev/null 2>&1
indicator = pl.read_csv("unicef_indicator_2.csv")
metadata = pl.read_csv("unicef_metadata.csv")Diarrhoea remains one of the leading causes of death among children under five, even though effective treatment is simple, inexpensive, and widely recommended. Oral rehydration salts and zinc can prevent severe dehydration and save lives, yet many children still do not receive them.
Behind these missed treatments are thousands of preventable deaths each year. While progress has been made, access to life saving care remains deeply unequal, making childhood diarrhoea not only a health issue, but also a story of inequality.

More than 500,000 children under five die each year from diarrhoea related illnesses, even though simple, inexpensive treatment could prevent many of these deaths.
UNICEF measures the percentage of children under five with diarrhoea who receive both oral rehydration salts (ORS) and zinc between 2005 and 2024. Treatment coverage varies widely across countries. While the average rate is approximately 16 percent, most countries report much lower levels, with a median of just 10.7 percent. Reported values range from 0 percent in Sri Lanka to 60.2 percent in Bolivia, highlighting the large differences in access to life saving treatment.
from IPython.display import display, HTML
import polars as pl
# Keep only the latest available treatment value for each country
latest_country = (
indicator
.filter(pl.col("sex") == "Total")
.sort("time_period")
.group_by("country")
.agg([
pl.col("time_period").last().alias("year"),
pl.col("obs_value").last().alias("obs_value")
])
)
summary_stats = (
latest_country.select([
pl.col("obs_value").mean().round(1).alias("Average treatment rate"),
pl.col("obs_value").median().round(1).alias("Median treatment rate"),
pl.col("obs_value").min().round(1).alias("Minimum treatment rate"),
pl.col("obs_value").max().round(1).alias("Maximum treatment rate")
])
)
styled_table = (
summary_stats.to_pandas()
.style
.format("{:.1f}")
.hide(axis="index")
.set_properties(**{
"background-color": "#e8f5e9",
"color": "#1b5e20",
"border": "1px solid #c8e6c9",
"text-align": "center",
"font-size": "14px"
})
.set_table_styles([
{
"selector": "th",
"props": [
("background-color", "#2e7d32"),
("color", "white"),
("font-weight", "bold"),
("text-align", "center")
]
}
])
)
HTML(styled_table.to_html())| Average treatment rate | Median treatment rate | Minimum treatment rate | Maximum treatment rate |
|---|---|---|---|
| 16.0 | 10.7 | 0.0 | 60.2 |
The map reveals striking differences in access to life saving treatment across countries. Some countries report relatively high levels of treatment coverage, while others continue to provide treatment to only a small share of children with diarrhoea. Large areas of the world also have no available data, highlighting that many children remain invisible within global health statistics.
Treatment coverage does not follow a clear geographic pattern and often differs even between neighbouring countries. This suggests that access is shaped not only by wealth, but also by differences in health services, public health priorities, and the availability of oral rehydration salts and zinc.
Darker green countries have higher levels of treatment coverage among children with diarrhoea. Lighter countries indicate lower coverage, while grey countries have no available data.
import geopandas as gpd
import matplotlib.pyplot as plt
# Keep only the latest available treatment value for each country
latest_country = (
indicator
.filter(pl.col("sex") == "Total")
.sort("time_period")
.group_by("country")
.agg([
pl.col("time_period").last().alias("year"),
pl.col("obs_value").last().alias("obs_value")
])
)
latest_map = latest_country.to_pandas()
world = gpd.read_file(
"https://naturalearth.s3.amazonaws.com/110m_cultural/ne_110m_admin_0_countries.zip"
)
# Merge treatment data with world boundaries for mapping
world_data = world.merge(
latest_map,
left_on="NAME",
right_on="country",
how="left"
)
world_data_clean = world_data[world_data["NAME"] != "Antarctica"]
fig, ax = plt.subplots(figsize=(10, 7))
world_data_clean.plot(
column="obs_value",
cmap="YlGn",
edgecolor="white",
linewidth=0.45,
legend=True,
legend_kwds={
"label": "Treatment coverage (%)",
"shrink": 0.7
},
missing_kwds={
"color": "#e0e0e0",
"label": "No data"
},
ax=ax
)
# Label the highest-coverage countries for emphasis
top5 = (
world_data_clean[world_data_clean["country"] != "Bhutan"]
.nlargest(5, "obs_value")
)
for _, row in top5.iterrows():
point = row.geometry.representative_point()
ax.text(
point.x,
point.y + 2,
row["country"],
fontsize=8,
fontweight="bold",
ha="center",
color="#1b5e20",
bbox=dict(
facecolor="white",
alpha=0.9,
edgecolor="#b7d7b0",
linewidth=0.4,
boxstyle="round,pad=0.25"
)
)
ax.set_title(
"Global Access to ORS and Zinc Treatment",
fontsize=18,
fontweight="bold",
color="#1b5e20",
pad=20
)
ax.set_xlim(-150, 175)
ax.set_ylim(-50, 82)
ax.axis("off")
plt.tight_layout()
plt.show()highest = (
latest_country
.sort("obs_value", descending=True)
.head(3)
.select(["country", "obs_value"])
)
highest
| country | obs_value |
|---|---|
| Bolivia | 60.2 |
| Sierra Leone | 53.4 |
| Korea, Democratic People's Republic of | 45.0 |
Bolivia reports the highest treatment coverage at 60.2 percent, followed by Sierra Leone at 53.4 percent. Both countries stand out for achieving much higher coverage than most others, showing that strong progress is possible even in lower income settings.
While treatment coverage remains low in many countries, a small number stand out for achieving much higher rates. The chart below shows the ten countries with the highest reported coverage of oral rehydration salts and zinc treatment in 2024, highlighting how access to life saving care differs across countries.
from plotnine import (
ggplot, aes, geom_col, coord_flip, scale_fill_gradient,
labs, theme_minimal, element_text, theme, element_blank
)
# Select the ten countries with the highest treatment coverage
top10 = (
latest_country
.sort("obs_value", descending=True)
.head(10)
)
(
ggplot(
top10.to_pandas(),
aes(
x="reorder(country, obs_value)",
y="obs_value",
fill="obs_value"
)
)
+ geom_col(show_legend=True)
+ coord_flip()
+ scale_fill_gradient(low="#C7E9C0", high="#238B45")
+ labs(
title="Top 10 Countries for Diarrhoea Treatment Coverage",
x="Country",
y="Percentage of children receiving treatment",
fill="Coverage (%)",
caption="Source: UNICEF Indicator 2"
)
+ theme_minimal()
+ theme(
figure_size=(7, 4),
plot_title=element_text(size=12, weight="bold"),
axis_title=element_text(size=10),
axis_text_y=element_text(size=10),
axis_text_x=element_text(size=9),
legend_position="right",
panel_grid_minor=element_blank(),
panel_grid_major_y=element_blank()
)
)The chart shows that Bolivia and Sierra Leone lead all other countries in treatment coverage, with rates above 50 percent. However, even among the top ten countries, coverage remains below 60 percent, meaning that a large share of children with diarrhoea still do not receive recommended treatment. The presence of countries such as South Sudan, Bangladesh, and Bhutan among the highest performers suggests that strong treatment coverage is possible across a wide range of contexts.

Higher national income is often assumed to improve access to healthcare, but this relationship is not always straightforward. By combining treatment coverage data with GDP per capita for the same year, it is possible to examine whether children in wealthier countries are more likely to receive oral rehydration salts and zinc treatment.
from plotnine import (
ggplot, aes, geom_point, geom_smooth, labs,
theme_minimal, element_text, theme
)
# Combine treatment coverage with GDP data for the same country and year
scatter_data = (
latest_country
.join(
metadata,
on=["country", "year"],
how="inner"
)
.drop_nulls([
"GDP per capita (constant 2015 US$)",
"obs_value"
])
)
# Create a scatterplot to examine whether higher GDP is linked to better treatment coverage
(
ggplot(
scatter_data.to_pandas(),
aes(
x="GDP per capita (constant 2015 US$)",
y="obs_value"
)
)
+ geom_point(size=3, color="#238B45", alpha=0.7)
+ geom_smooth(method="lm", se=False, color="#74C476", size=1.2)
+ labs(
title="The Relationship Between GDP and Treatment Coverage",
x="GDP per capita (constant 2015 US$)",
y="Percentage of children receiving treatment",
caption="Source: UNICEF Indicator 2 and metadata"
)
+ theme_minimal()
+ theme(
figure_size=(6, 4),
plot_title=element_text(size=10, weight="bold"),
axis_title=element_text(size=9),
axis_text=element_text(size=9)
)
)The scatterplot shows a weak relationship between GDP per capita and treatment coverage. Some lower income countries achieve relatively high treatment rates, while several wealthier countries continue to report lower coverage. This suggests that income alone does not determine whether children receive life saving treatment. Differences in public health policy, healthcare access, and investment in child health appear to matter just as much, if not more.
Treatment coverage has not improved at the same pace across countries. The final chart follows Lesotho, Mali, and Zambia because each represents a different pattern of change over time. Together, they show that progress in access to life saving treatment is often uneven.
from plotnine import (
ggplot, aes, geom_line, geom_point, labs,
theme_minimal, element_text, theme, scale_x_continuous
)
# Select three countries with contrasting trends in treatment coverage over time
selected = (
indicator
.filter(
(pl.col("sex") == "Total") &
(pl.col("country").is_in(["Zambia", "Lesotho", "Mali"]))
)
.select(["country", "time_period", "obs_value"])
)
# Compare how treatment coverage changed across the three countries
(
ggplot(
selected.to_pandas(),
aes(
x="time_period",
y="obs_value",
color="country",
group="country"
)
)
+ geom_line(size=1.2)
+ geom_point(size=3)
+ scale_x_continuous(breaks=[2013, 2015, 2018, 2019, 2024])
+ labs(
title="Diarrhoea Treatment Coverage Over Time",
x="Year",
y="Percentage of children receiving treatment",
color="Country",
caption="Source: UNICEF Indicator 2"
)
+ theme_minimal()
+ theme(
figure_size=(6, 4),
plot_title=element_text(size=10, weight="bold"),
axis_title=element_text(size=9),
axis_text=element_text(size=9),
legend_position="right"
)
)Zambia shows a steady increase in treatment coverage, rising from 33.5 percent in 2019 to 38.4 percent in 2024. In contrast, Lesotho and Mali both experienced declines over the same period. These differing trends highlight that progress is not guaranteed and can vary considerably between countries. Changes in healthcare investment, government priorities, public awareness, and access to basic treatment may all influence whether coverage improves or worsens over time.

Myth: Wealthier countries always provide better treatment.
Reality: Several lower income countries report higher treatment coverage than wealthier nations.
Strengthen access to basic healthcare services
Countries with low treatment coverage may need greater access to clinics, healthcare workers, and essential medicines.
Increase the availability of ORS and zinc
Ensuring that oral rehydration salts and zinc are affordable and widely available could save more children’s lives.
Raise public awareness about treatment
Governments and health organisations should continue to educate families about the importance of early treatment.
Despite being simple, inexpensive, and highly effective, oral rehydration salts and zinc remain out of reach for many children. The data show that access to treatment varies widely across countries, with some making strong progress while others continue to leave many children without care.
Ultimately, improving child survival depends not simply on how wealthy a country is, but on whether governments prioritise affordable treatment, strong healthcare systems, and early access to care. Ensuring that every child receives life saving treatment will require continued investment, stronger public health efforts, and greater attention to the inequalities revealed in the data.