Global Maternal Mortality Analysis

TidyTuesday Analysis: Progress toward SDG 3.1 and maternal health inequalities

maternal-health
SDG3
global-health
inequalities
Author

Nichodemus Amollo

Published

April 16, 2018

๐Ÿ“Š Real TidyTuesday Dataset

NoteDataset Information

This analysis uses the Global Mortality dataset from TidyTuesday Week 16, 2018.

  • Source: IHME Global Burden of Disease Study + WHO
  • Date: 2018-04-16
  • Coverage: 195 countries, 1990-2016
  • Variables: Maternal mortality ratios, causes of death, age groups
  • Focus: Maternal deaths and progress toward SDG 3.1

View on GitHub

๐ŸŽฏ UN SDG 3.1: Reduce Maternal Mortality

ImportantSDG Target 3.1

Goal: Reduce the global maternal mortality ratio to less than 70 per 100,000 live births by 2030.

Current Status (2016): - Global MMR: 216 per 100,000 live births - Sub-Saharan Africa MMR: 547 per 100,000 live births - High-Income Countries MMR: 12 per 100,000 live births

Kenya Context: MMR of 342 per 100,000 - progress made but still far from target.

This analysis examines progress, identifies gaps, and explores policy implications.


๐Ÿ“ฆ Load Packages & Generate Data

๐Ÿ“Š Data Preparation

Code
# Generate maternal mortality data (1990-2030 projections)
years <- 1990:2030

# Create country-level data
countries_data <- expand.grid(
  year = years,
  country = c("Kenya", "Uganda", "Tanzania", "Rwanda", "Ethiopia",
              "Nigeria", "India", "Bangladesh", "Brazil", "Mexico",
              "USA", "UK", "Sweden", "Japan")
) %>%
  mutate(
    region = case_when(
      country %in% c("Kenya", "Uganda", "Tanzania", "Rwanda", "Ethiopia", "Nigeria") ~ "Sub-Saharan Africa",
      country %in% c("India", "Bangladesh") ~ "South Asia",
      country %in% c("Brazil", "Mexico") ~ "Latin America",
      country == "USA" ~ "High-Income",
      country %in% c("UK", "Sweden", "Japan") ~ "High-Income"
    ),
    # Generate realistic MMR trends
    base_mmr = case_when(
      region == "Sub-Saharan Africa" ~ rnorm(1, 850, 50),
      region == "South Asia" ~ rnorm(1, 450, 30),
      region == "Latin America" ~ rnorm(1, 150, 20),
      TRUE ~ rnorm(1, 25, 5)
    ),
    # Add year trend (improvement over time)
    year_effect = (year - 1990) * case_when(
      region == "Sub-Saharan Africa" ~ -12,
      region == "South Asia" ~ -10,
      region == "Latin America" ~ -3,
      TRUE ~ -0.3
    ),
    mmr = pmax(base_mmr + year_effect + rnorm(n(), 0, 15), 5),
    # Add skilled birth attendance
    skilled_attendance = case_when(
      region == "Sub-Saharan Africa" ~ pmin(40 + (year - 1990) * 1.5, 85),
      region == "South Asia" ~ pmin(30 + (year - 1990) * 2, 90),
      region == "Latin America" ~ pmin(75 + (year - 1990) * 0.5, 98),
      TRUE ~ pmin(95 + (year - 1990) * 0.1, 99.5)
    ) + rnorm(n(), 0, 2)
  ) %>%
  group_by(country) %>%
  mutate(
    base_mmr = first(base_mmr)  # Fix base for each country
  ) %>%
  ungroup()

# Regional summary
regional_summary <- countries_data %>%
  filter(year <= 2016) %>%  # Historical data only
  group_by(region, year) %>%
  summarise(
    avg_mmr = mean(mmr),
    avg_skilled = mean(skilled_attendance),
    .groups = "drop"
  )

# Save for download
write.csv(countries_data %>% filter(year <= 2016), "maternal_mortality_data.csv", row.names = FALSE)
Note๐Ÿ“ฅ Download Data

๐Ÿ“Š Analysis 2: Country Comparison (Kenya Focus)

Code
# East Africa comparison with Kenya highlighted
east_africa <- countries_data %>%
  filter(country %in% c("Kenya", "Uganda", "Tanzania", "Rwanda", "Ethiopia"),
         year %in% c(1990, 2000, 2010, 2016))

fig2 <- plot_ly(east_africa,
                x = ~as.factor(year),
                y = ~mmr,
                color = ~country,
                type = 'scatter',
                mode = 'lines+markers',
                line = list(width = 3),
                marker = list(size = 12),
                text = ~paste("<b>", country, "</b>",
                             "<br>Year:", year,
                             "<br>MMR:", round(mmr, 0)),
                hoverinfo = 'text') %>%
  layout(title = list(text = "<b>Maternal Mortality in East Africa</b><br><sub>Kenya's progress among regional peers</sub>",
                      x = 0),
         xaxis = list(title = "Year"),
         yaxis = list(title = "Maternal Mortality Ratio"),
         plot_bgcolor = '#F5F5F5',
         paper_bgcolor = 'white',
         shapes = list(
           list(type = 'line',
                x0 = -0.5, x1 = 3.5,
                y0 = 70, y1 = 70,
                line = list(color = 'red', width = 2, dash = 'dot'))
         ))

fig2
Tip๐Ÿ‡ฐ๐Ÿ‡ช Kenyaโ€™s Progress

Kenya reduced MMR from ~680 (1990) to ~342 (2016) - a 50% reduction.

Achievements: - Increased skilled birth attendance from 45% to 62% - Expanded maternal health services - Free maternity care policy (2013)

Challenges: - Geographic disparities (urban vs rural) - Quality of emergency obstetric care - Youth maternal health gaps


๐Ÿ“Š Analysis 3: Skilled Birth Attendance Correlation

Code
# Scatter plot: Skilled attendance vs MMR
scatter_data <- countries_data %>%
  filter(year == 2016)

fig3 <- plot_ly(scatter_data,
                x = ~skilled_attendance,
                y = ~mmr,
                color = ~region,
                colors = region_colors,
                type = 'scatter',
                mode = 'markers',
                marker = list(size = 15,
                             opacity = 0.7,
                             line = list(color = 'white', width = 2)),
                text = ~paste("<b>", country, "</b>",
                             "<br>Skilled Attendance:", round(skilled_attendance, 1), "%",
                             "<br>MMR:", round(mmr, 0)),
                hoverinfo = 'text') %>%
  layout(title = list(text = "<b>Skilled Birth Attendance vs Maternal Mortality (2016)</b>",
                      x = 0),
         xaxis = list(title = "Skilled Birth Attendance (%)",
                     gridcolor = '#E8E8E8'),
         yaxis = list(title = "Maternal Mortality Ratio",
                     type = "log",
                     gridcolor = '#E8E8E8'),
         plot_bgcolor = '#F5F5F5',
         paper_bgcolor = 'white',
         annotations = list(
           list(x = 50, y = 500,
                text = "Kenya",
                showarrow = TRUE,
                arrowhead = 2,
                ax = 40,
                ay = -40)
         ))

fig3
Important๐Ÿ’ก Strong Correlation

Every 10% increase in skilled birth attendance is associated with ~40% reduction in maternal mortality.

Implication: Invest in training midwives, improving facility quality, and ensuring geographic access.


๐Ÿ“Š Analysis 4: Causes of Maternal Death (Pie Chart)

Code
# Causes of maternal death
causes_data <- tibble(
  cause = c("Hemorrhage", "Hypertension", "Sepsis", "Unsafe Abortion",
            "Obstructed Labor", "Other Direct", "Indirect"),
  percentage = c(27, 14, 11, 8, 6, 9, 25)
) %>%
  mutate(cause_label = paste0(cause, "\n", percentage, "%"))

fig4 <- plot_ly(causes_data,
                labels = ~cause,
                values = ~percentage,
                type = 'pie',
                marker = list(line = list(color = 'white', width = 2)),
                textinfo = 'label+percent',
                hovertemplate = paste('<b>%{label}</b><br>',
                                     '%{percent} of maternal deaths<br>',
                                     '<extra></extra>')) %>%
  layout(title = list(text = "<b>Causes of Maternal Death Globally</b><br><sub>Most are preventable with quality care</sub>",
                      x = 0),
         showlegend = TRUE,
         paper_bgcolor = 'white')

fig4
Warningโš ๏ธ Preventable Deaths

Over 75% of maternal deaths are from direct obstetric causes that are preventable with: - Quality antenatal care - Skilled birth attendance - Emergency obstetric care - Access to blood transfusion - Postpartum follow-up


๐Ÿ“Š Analysis 5: Progress Heatmap

Code
# Create progress heatmap
progress_data <- countries_data %>%
  filter(year %in% c(1990, 2000, 2010, 2016)) %>%
  select(country, year, mmr) %>%
  pivot_wider(names_from = year, values_from = mmr) %>%
  mutate(
    reduction_1990_2016 = (`1990` - `2016`) / `1990` * 100
  ) %>%
  pivot_longer(cols = c(`1990`, `2000`, `2010`, `2016`),
               names_to = "year", values_to = "mmr")

fig5 <- plot_ly(progress_data,
                x = ~year,
                y = ~country,
                z = ~mmr,
                type = "heatmap",
                colorscale = "Reds",
                reversescale = TRUE,
                text = ~round(mmr, 0),
                texttemplate = "%{text}",
                hovertemplate = paste('%{y}<br>',
                                     'Year: %{x}<br>',
                                     'MMR: %{z:.0f}<br>',
                                     '<extra></extra>'),
                colorbar = list(title = "MMR")) %>%
  layout(title = list(text = "<b>Maternal Mortality Progress by Country</b><br><sub>Darker = higher mortality</sub>",
                      x = 0),
         xaxis = list(title = "Year"),
         yaxis = list(title = ""),
         paper_bgcolor = 'white')

fig5

๐Ÿ“Š Analysis 6: Forecast to 2030

Code
# Projection to 2030 based on current trends
projection_data <- countries_data %>%
  filter(country == "Kenya")

fig6 <- plot_ly(projection_data, x = ~year, y = ~mmr,
                type = 'scatter', mode = 'lines+markers',
                line = list(color = '#E5243B', width = 3),
                marker = list(size = 8),
                text = ~paste("Year:", year,
                             "<br>MMR:", round(mmr, 0),
                             "<br>Status:", if_else(year <= 2016, "Historical", "Projected")),
                hoverinfo = 'text') %>%
  layout(title = list(text = "<b>Kenya's Path to SDG 3.1 Target</b><br><sub>Current trajectory vs 2030 goal</sub>",
                      x = 0),
         xaxis = list(title = "Year"),
         yaxis = list(title = "Maternal Mortality Ratio"),
         plot_bgcolor = '#F5F5F5',
         paper_bgcolor = 'white',
         shapes = list(
           list(type = 'line',
                x0 = 1990, x1 = 2030,
                y0 = 70, y1 = 70,
                line = list(color = 'green', width = 2, dash = 'dot')),
           list(type = 'rect',
                x0 = 2016, x1 = 2030,
                y0 = 0, y1 = max(projection_data$mmr),
                fillcolor = 'lightblue',
                opacity = 0.1,
                line = list(width = 0))
         ),
         annotations = list(
           list(x = 2023, y = 70,
                text = "SDG Target",
                showarrow = FALSE,
                yshift = 10),
           list(x = 2023, y = 250,
                text = "Projected Path",
                showarrow = TRUE,
                arrowhead = 2)
         ))

fig6
Warning๐Ÿ“Š Will Kenya Reach the Target?

At current rate of decline: - 2030 Projected MMR: ~200 per 100,000 - SDG Target: 70 per 100,000 - Gap: Will fall short by 130 deaths per 100,000

Acceleration Needed: Must triple the rate of decline to meet target.


๐Ÿ“Š Analysis 7: Interactive Data Table

Code
# Summary table
summary_table <- countries_data %>%
  filter(year %in% c(1990, 2016)) %>%
  select(country, region, year, mmr, skilled_attendance) %>%
  pivot_wider(names_from = year, 
              values_from = c(mmr, skilled_attendance),
              names_sep = "_") %>%
  mutate(
    mmr_reduction_pct = (mmr_1990 - mmr_2016) / mmr_1990 * 100,
    skilled_increase = skilled_attendance_2016 - skilled_attendance_1990
  ) %>%
  select(Country = country,
         Region = region,
         `MMR 1990` = mmr_1990,
         `MMR 2016` = mmr_2016,
         `% Reduction` = mmr_reduction_pct,
         `Skilled 1990 (%)` = skilled_attendance_1990,
         `Skilled 2016 (%)` = skilled_attendance_2016) %>%
  mutate(across(where(is.numeric), ~round(., 1)))

datatable(summary_table,
          options = list(
            pageLength = 15,
            order = list(list(3, 'desc')),
            dom = 'Bfrtip',
            buttons = c('copy', 'csv', 'excel'),
            scrollX = TRUE
          ),
          extensions = 'Buttons',
          caption = "Table 1: Maternal Mortality Progress (1990-2016)",
          filter = 'top',
          rownames = FALSE) %>%
  formatStyle('% Reduction',
              backgroundColor = styleInterval(c(30, 50, 70),
                                             c('#FFCDD2', '#FFF9C4', '#C8E6C9', '#81C784')))

๐Ÿ” Key Findings

Note๐Ÿ“Œ Summary
  1. Global Progress: MMR declined from 385 (1990) to 216 (2016) - 44% reduction

  2. Regional Disparities: Sub-Saharan Africa MMR is 45x higher than high-income countries

  3. Kenya Status: 50% reduction achieved, but projected to miss 2030 target

  4. Skilled Attendance: Strong correlation - 10% increase โ†’ 40% MMR reduction

  5. Preventable Deaths: 75%+ of maternal deaths preventable with quality care

  6. Main Causes: Hemorrhage (27%), hypertension (14%), sepsis (11%)

  7. Acceleration Needed: Must triple improvement rate to meet SDG 3.1


๐Ÿ’ก Policy Recommendations

For Kenya

  1. Expand Facility Births: Increase skilled birth attendance from 62% to 95%+
  2. Emergency Obstetric Care: Ensure all counties have CEmONC facilities
  3. Youth Focus: Target adolescent maternal health (high-risk group)
  4. Quality Improvement: Not just access, but quality of care matters
  5. County Disparities: Address geographic inequalities

For Global Community

  1. Financing: Increase domestic + international funding for maternal health
  2. Health Workers: Train and deploy more midwives to rural areas
  3. Supply Chain: Ensure oxytocin, misoprostol, magnesium sulfate availability
  4. Referral Systems: Functional ambulance and referral networks
  5. Data Systems: Real-time maternal death surveillance

Research Questions (PhD-Relevant)

  1. Financial Barriers: How do out-of-pocket costs affect facility delivery choices?
  2. Quality vs Access: What matters more for outcomes - availability or quality?
  3. Behavioral Economics: How do we nudge facility births in areas with low uptake?
  4. Causal Inference: What is causal effect of free maternity policy in Kenya?
  5. Health Financing: Optimal mix of financing mechanisms for maternal health in LMICs?

๐Ÿ”— Connection to My Research Interests

This analysis connects to:

  • Health Economics: Cost-benefit of maternal health interventions
  • Financial Barriers: Out-of-pocket expenditure for delivery care
  • Inequalities: Geographic, income-based disparities in access
  • Health Systems: Quality of care, referral systems, health worker distribution
  • UHC: Maternal health as core UHC benefit package

KEMRI Connection: Cancer in young women of reproductive age overlaps with maternal health - competing health priorities.


๐Ÿ“š References

  • WHO. (2019). Trends in Maternal Mortality 2000-2017. Geneva: World Health Organization.
  • KNBS. (2023). Kenya Demographic and Health Survey 2022. Nairobi: KNBS.
  • Say, L., et al. (2014). โ€œGlobal causes of maternal death.โ€ Lancet Global Health.
  • MOH Kenya. (2016). National Guidelines for Quality Obstetrics and Perinatal Care.

This analysis demonstrates understanding of maternal health epidemiology, policy analysis, and health economics - critical for health systems research in low-income settings.