Proportion of people living below 50 percent of median income (%)

Source: worldbank.org, 03.09.2025

Year: 2023

Flag Country Value Value change, % Rank
Argentina Argentina 20.1 +9.84% 5
Armenia Armenia 6.4 -7.25% 23
Bolivia Bolivia 17.1 -5.52% 13
Brazil Brazil 21.9 -0.455% 3
Colombia Colombia 21.4 -1.38% 4
Costa Rica Costa Rica 19.5 +4.28% 6
Dominican Republic Dominican Republic 14.9 +4.2% 15
Ecuador Ecuador 19 -4.04% 8
Georgia Georgia 14 +0.719% 18
Guatemala Guatemala 19.1 -3.05% 7
Honduras Honduras 23.6 -5.98% 1
Indonesia Indonesia 7.5 -8.54% 22
Iran Iran 12.6 +0.8% 19
Iraq Iraq 7.5 -1.32% 22
Panama Panama 22 +2.33% 2
Peru Peru 17.2 +4.88% 12
Philippines Philippines 10.6 -9.4% 20
Paraguay Paraguay 17.7 -3.28% 11
Palestinian Territories Palestinian Territories 14.7 +14.8% 16
El Salvador El Salvador 16.2 -4.14% 14
Thailand Thailand 9.4 -8.74% 21
Uruguay Uruguay 17.8 0% 10
United States United States 18.7 +2.75% 9
Uzbekistan Uzbekistan 14.4 +7.46% 17

The “Proportion of people living below 50 percent of median income” is a critical indicator for assessing income inequality and poverty levels within a population. By measuring the percentage of individuals whose income falls below half of the median income, this indicator provides a clear view of how widespread low income is relative to the overall economic status of a region. In 2023, the median value for this indicator stands at 19.25%, illustrating that a significant portion of the population in various countries is experiencing financial hardship.

Understanding the significance of this metric is vital for policymakers and social scientists. A higher proportion indicates a larger segment of the population living in poverty, which can lead to a multitude of socio-economic issues, including decreased access to healthcare, education, and other essential services. Such disparities can perpetuate cycles of poverty, undermining overall economic development and social stability.

Examining the top areas reveals Panama, Costa Rica, and Ecuador as having particularly high rates, with Panama at 22.0%, followed closely by Costa Rica at 19.5% and Ecuador at 19.0%. This suggests that over one-fifth of Panama's population lives below the 50% median income threshold, highlighting significant economic disparities and potential areas for intervention. These nations may struggle with high living costs, inadequate job opportunities, or systemic inequalities that inhibit social mobility.

On the other side of the spectrum, Indonesia, while appearing in both the top and bottom areas, shows lower levels of poverty relative to its median income with 7.5%. This indicates a more equitable income distribution, or potentially effective measures in poverty alleviation. However, the presence of Indonesia in the top areas indicates that even among nations performing relatively well, significant disparities can still exist. In summary, the variations in the data paint a complex picture of economic health within these nations, emphasizing that while some are experiencing improvements, others remain deeply entrenched in poverty.

The relationship between this indicator and other socio-economic factors cannot be overstated. Income inequality often correlates with a range of issues such as education quality, unemployment rates, and healthcare access. For instance, as the proportion of those living below the income threshold increases, education systems may suffer, resulting in lower overall educational attainment. This lack of education can limit job prospects and maintain the cycle of poverty. Similarly, higher rates of poverty often lead to poorer health outcomes, increasing healthcare costs for individuals and healthcare systems alike.

Several factors influence the proportion of people living below the 50% median income threshold. Economic growth, employment opportunities, and the effectiveness of social safety nets all play pivotal roles. Countries with robust economies and strong job markets tend to have lower rates, as individuals are able to earn sufficient incomes. Additionally, the strength of social welfare programs can bridge the gap for those living close to the poverty line, providing necessary support and resources to improve their standards of living. Conversely, economic downturns, natural disasters, or political instability can exacerbate poverty levels, leading to an increase in the proportion of people falling below this crucial income marker.

Implementing effective strategies and solutions is essential for reducing this proportion and improving economic inequality. Education and skills training programs can equip individuals with the necessary tools to increase their earning potential, while policies aimed at creating more jobs can further stimulate economic growth. Governments could also enhance social welfare programs to provide direct support for the lower-income population, ensuring that even the most vulnerable individuals receive assistance.

Moreover, promoting policies that foster inclusivity and equitable growth can significantly reduce income disparities. Collaboration between government, private sectors, and civil society can lead to innovations in employment opportunities and economic policies that prioritize underprivileged communities. Challenges like corruption, fragmented healthcare systems, and inefficient education systems can undermine these strategies. Therefore, continuous evaluation and reform are necessary to ensure that implemented strategies are yielding the intended outcomes.

Despite the hopeful data, it is important to acknowledge the flaws that can emerge when interpreting this indicator. A narrow focus on median income can sometimes obscure larger systemic issues at play. For instance, in nations experiencing rapid economic growth, income inequality may persist even if median income increases overall. This could lead to complacency among policymakers who may believe that economic indicators alone are sufficient measures of progress. Therefore, it is essential to consider this indicator alongside others, such as the Gini coefficient, which directly measures inequality, for a more comprehensive view of economic health.

Ultimately, the proportion of people living below 50 percent of median income is not just a number; it represents individual lives and communities facing various challenges. Policymakers and advocates must utilize this data to advocate for targeted interventions and bring about meaningful change. As the world progresses, investment in social infrastructure, equitable economic policies, and the prioritization of education will be essential steps in reducing poverty levels, benefiting society as a whole.

                    
# 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 = 'SI.DST.50MD'

# 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 <- 'SI.DST.50MD'

# 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))