Specialist surgical workforce (per 100,000 population)

Source: worldbank.org, 01.09.2025

Year: 2018

Flag Country Value Value change, % Rank
Andorra Andorra 83.1 +37.9% 3
Argentina Argentina 50.1 +378% 8
Burundi Burundi 0.4 +135% 19
Bangladesh Bangladesh 2.91 -3.64% 17
Bulgaria Bulgaria 113 -6.72% 1
Brazil Brazil 55.5 +59.7% 6
Costa Rica Costa Rica 25.5 +14.2% 11
Cyprus Cyprus 84.4 +5.75% 2
Fiji Fiji 5.43 -6.38% 15
Grenada Grenada 12.6 +11% 14
Ireland Ireland 72 +45.2% 4
Cambodia Cambodia 4.2 16
Mozambique Mozambique 0.53 -5.36% 18
Paraguay Paraguay 20.5 +42.8% 13
Slovakia Slovakia 53.9 -5.72% 7
Slovenia Slovenia 66.7 -8.4% 5
Seychelles Seychelles 48.6 +7.43% 9
Tuvalu Tuvalu 26.1 +40.9% 10
St. Vincent & Grenadines St. Vincent & Grenadines 23.6 +83.7% 12
Specialist Surgical Workforce

The specialist surgical workforce, measured as the number of specialists per 100,000 population, provides profound insights into the healthcare infrastructure of a country. This indicator serves as a vital benchmark for assessing the ability of healthcare systems to provide timely, effective surgical care, an essential component of modern healthcare. The presence of a robust specialist surgical workforce is vital for improving patient outcomes, reducing mortality rates, and ensuring access to necessary surgical interventions.

In 2018, the global median for the specialist surgical workforce was recorded at 26.07 per 100,000 population. This figure underscores significant disparities in surgical capacity worldwide, drawing attention to the pressing need for enhanced healthcare resources in various regions. The top five countries starkly illustrate these disparities: Bulgaria with 112.71 specialists per 100,000 population, Cyprus at 84.42, Andorra at 83.11, Ireland with 71.97, and Slovenia at 66.7 highlight where resources are heavily allocated towards developing a robust surgical workforce.

On the opposite end, the bottom five countries—Burundi at 0.4, Mozambique at 0.53, Bangladesh at 2.91, Cambodia at 4.2, and Fiji at 5.43—paint a concerning picture of severe shortages. In these countries, the lack of specialist surgical services can have dire consequences for patient health, leading to increased mortality rates and preventable complications. The significant variations in the workforce availability between wealthier nations and those facing economic challenges illustrate how resource allocation, healthcare funding, and socioeconomic conditions intricately influence the number of specialist surgeons available to communities.

The variation in surgical workforce numbers is directly tied to multiple underlying factors. Firstly, a country's economic stability plays a crucial role. Wealthier nations often allocate higher budgets towards healthcare infrastructure, thus being able to train and retain more specialists. In contrast, lower-income countries struggle to fund sufficient medical education and infrastructure, resulting in fewer trained surgeons and facilities equipped for surgical care.

Secondly, geographic disparities also affect the distribution of surgical specialists. Urban centers typically have greater access to healthcare facilities and attract more specialists due to the availability of advanced medical training and better salaries. Conversely, rural regions may face acute shortages, as specialists prefer to work in urban environments where their skills can be utilized fully and compensated accordingly.

Moreover, educational opportunities and training infrastructure are crucial in developing a capable surgical workforce. Countries with established medical schools and residency programs are better positioned to cultivate skilled surgical professionals. In many regions, particularly in low-income countries, a lack of access to medical education means significant gaps in surgical capabilities persist.

To address the challenges posed by disparities in the surgical workforce, comprehensive strategies must be implemented. Increasing investment in medical training and education can elevate the number of trained specialists. Establishing partnerships between richer and poorer nations can facilitate knowledge-sharing and resources, helping to build local capacities in surgical care.

Furthermore, incentivizing medical professionals to work in underserved areas can help mitigate the geographical imbalance. Offering scholarships and loan forgiveness for medical students who commit to working in rural or low-income communities is one effective solution. Additionally, telemedicine has emerged as a promising tool to extend surgical expertise remotely, providing consultations and support that can aid surgical practitioners in areas with limited resources.

While the strategies mentioned can lead to improvements, several flaws may impede progress. Mismanagement of resources, political instability, and corruption may divert funding intended for healthcare improvement projects. Additionally, an overemphasis on training large numbers of specialists without enhancing the overall healthcare system—such as improving surgical facilities and ensuring proper support systems—can result in an imbalance in the healthcare ecosystem.

As highlighted by the data, global averages from 2015 showed a figure of 30.24 for specialist surgical workforce per 100,000 population, suggesting slight but notable progress in workforce availability over the subsequent years but also highlighting the ongoing gaps. The key to improving this indicator lies in recognizing the interplay of various factors and mobilizing effective strategies to create equitable healthcare access for all populations.

In conclusion, the specialist surgical workforce indicator serves as a critical reminder of the disparities in healthcare access. By fostering a deeper understanding of the complexities affecting surgical workforce distribution, stakeholders can implement targeted strategies that improve access to surgical care in underserved regions, ultimately enhancing the health outcomes of populations worldwide.

                    
# Install missing packages
import sys
import subprocess

def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])

# Required packages
for package in ['wbdata', 'country_converter']:
try:
__import__(package)
except ImportError:
install(package)

# Import libraries
import wbdata
import country_converter as coco
from datetime import datetime

# Define World Bank indicator code
dataset_code = 'SH.MED.SAOP.P5'

# Download data from World Bank API
data = wbdata.get_dataframe({dataset_code: 'value'},
date=(datetime(1960, 1, 1), datetime.today()),
parse_dates=True,
keep_levels=True).reset_index()

# Extract year
data['year'] = data['date'].dt.year

# Convert country names to ISO codes using country_converter
cc = coco.CountryConverter()
data['iso2c'] = cc.convert(names=data['country'], to='ISO2', not_found=None)
data['iso3c'] = cc.convert(names=data['country'], to='ISO3', not_found=None)

# Filter out rows where ISO codes could not be matched — likely not real countries
data = data[data['iso2c'].notna() & data['iso3c'].notna()]

# Sort for calculation
data = data.sort_values(['iso3c', 'year'])

# Calculate YoY absolute and percent change
data['value_change'] = data.groupby('iso3c')['value'].diff()
data['value_change_percent'] = data.groupby('iso3c')['value'].pct_change() * 100

# Calculate ranks (higher GDP per capita = better rank)
data['rank'] = data.groupby('year')['value'].rank(ascending=False, method='dense')

# Calculate rank change from previous year
data['rank_change'] = data.groupby('iso3c')['rank'].diff()

# Select desired columns
final_df = data[['country', 'iso2c', 'iso3c', 'year', 'value',
'value_change', 'value_change_percent', 'rank', 'rank_change']].copy()

# Optional: Add labels as metadata (could be useful for export or UI)
column_labels = {
'country': 'Country name',
'iso2c': 'ISO 2-letter country code',
'iso3c': 'ISO 3-letter country code',
'year': 'Year',
'value': 'GDP per capita (current US$)',
'value_change': 'Year-over-Year change in value',
'value_change_percent': 'Year-over-Year percent change in value',
'rank': 'Country rank by GDP per capita (higher = richer)',
'rank_change': 'Change in rank from previous year'
}

# Display first few rows
print(final_df.head(10))

# Optional: Save to CSV
#final_df.to_csv("gdp_per_capita_cleaned.csv", index=False)
                    
                
                    
# Check and install required packages
required_packages <- c("WDI", "countrycode", "dplyr")

for (pkg in required_packages) {
  if (!requireNamespace(pkg, quietly = TRUE)) {
    install.packages(pkg)
  }
}

# Load the necessary libraries
library(WDI)
library(dplyr)
library(countrycode)

# Define the dataset code (World Bank indicator code)
dataset_code <- 'SH.MED.SAOP.P5'

# Download data using WDI package
dat <- WDI(indicator = dataset_code)

# Filter only countries using 'is_country' from countrycode
# This uses iso2c to identify whether the entry is a recognized country
dat <- dat %>%
  filter(countrycode(iso2c, origin = 'iso2c', destination = 'country.name', warn = FALSE) %in%
           countrycode::codelist$country.name.en)

# Ensure dataset is ordered by country and year
dat <- dat %>%
  arrange(iso3c, year)

# Rename the dataset_code column to "value" for easier manipulation
dat <- dat %>%
  rename(value = !!dataset_code)

# Calculate year-over-year (YoY) change and percentage change
dat <- dat %>%
  group_by(iso3c) %>%
  mutate(
    value_change = value - lag(value),                              # Absolute change from previous year
    value_change_percent = 100 * (value - lag(value)) / lag(value) # Percent change from previous year
  ) %>%
  ungroup()

# Calculate rank by year (higher value => higher rank)
dat <- dat %>%
  group_by(year) %>%
  mutate(rank = dense_rank(desc(value))) %>% # Rank countries by descending value
  ungroup()

# Calculate rank change (positive = moved up, negative = moved down)
dat <- dat %>%
  group_by(iso3c) %>%
  mutate(rank_change = rank - lag(rank)) %>% # Change in rank compared to previous year
  ungroup()

# Select and reorder final columns
final_data <- dat %>%
  select(
    country,
    iso2c,
    iso3c,
    year,
    value,
    value_change,
    value_change_percent,
    rank,
    rank_change
  )

# Add labels (variable descriptions)
attr(final_data$country, "label") <- "Country name"
attr(final_data$iso2c, "label") <- "ISO 2-letter country code"
attr(final_data$iso3c, "label") <- "ISO 3-letter country code"
attr(final_data$year, "label") <- "Year"
attr(final_data$value, "label") <- "GDP per capita (current US$)"
attr(final_data$value_change, "label") <- "Year-over-Year change in value"
attr(final_data$value_change_percent, "label") <- "Year-over-Year percent change in value"
attr(final_data$rank, "label") <- "Country rank by GDP per capita (higher = richer)"
attr(final_data$rank_change, "label") <- "Change in rank from previous year"

# Print the first few rows of the final dataset
print(head(final_data, 10))