knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.0     ✔ readr     2.1.6
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
col_types_spec <- cols_only(
  id = col_integer(),
  voyage_id = col_integer(),
  voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year = col_double(),
  voyage_slaves_numbers__imp_total_num_slaves_disembarked = col_double(),
  voyage_slaves_numbers__imp_total_num_slaves_embarked = col_double(),
  voyage_dates__length_middle_passage_days = col_double(),
  voyage_dates__imp_length_home_to_disembark = col_double(),
  voyage_crew__crew_first_landing = col_double(),
  voyage_crew__crew_voyage_outset = col_double(),
  voyage_ship__tonnage_mod = col_double(),
  voyage_slaves_numbers__imp_jamaican_cash_price = col_double(),
  voyage_slaves_numbers__imp_mortality_ratio = col_double(),
  voyage_slaves_numbers__percentage_women_among_embarked_slaves = col_double(),
  voyage_outcome__vessel_captured_outcome__name = col_character(),
  voyage_ship__imputed_nationality__name = col_character(),
  voyage_itinerary__imp_region_voyage_begin__name = col_character(),
  voyage_ship__rig_of_vessel__name = col_character(),
  voyage_itinerary__place_voyage_ended__name = col_character(),
  voyage_dates__slave_purchase_began_sparsedate__month = col_double(),
  voyage_slaves_numbers__percentage_men = col_double(),
  voyage_dates__voyage_completed_sparsedate__month = col_double(),
  voyage_itinerary__region_of_return__name = col_character(),
  voyage_slaves_numbers__percentage_boy = col_double(),
  voyage_itinerary__imp_principal_region_slave_dis__name = col_character(),
  voyage_itinerary__imp_principal_region_of_slave_purchase__name = col_character(),
  voyage_dates__date_departed_africa_sparsedate__month = col_double(),
  voyage_dates__voyage_began_sparsedate__month = col_double(),
  voyage_itinerary__imp_port_voyage_begin__name = col_character(),
  voyage_dates__first_dis_of_slaves_sparsedate__month = col_double(),
  voyage_itinerary__imp_broad_region_slave_dis__name = col_character(),
  voyage_slaves_numbers__percentage_girl = col_double(),
  voyage_outcome__particular_outcome__name = col_character(),
  voyage_itinerary__imp_principal_port_slave_dis__name = col_character(),
  voyage_slaves_numbers__percentage_child = col_double(),
  voyage_slaves_numbers__percentage_women = col_double(),
  voyage_dates__departure_last_place_of_landing_sparsedate__month = col_double(),
  voyage_outcome__outcome_owner__name = col_character(),
  voyage_outcome__outcome_slaves__name = col_character(),
  voyage_itinerary__imp_principal_place_of_slave_purchase__name = col_character(),
  voyage_outcome__resistance__name = col_character(),
  voyage_slaves_numbers__percentage_male = col_double(),
  voyage_slaves_numbers__percentage_female = col_double(),
  voyage_itinerary__imp_broad_region_voyage_begin__name = col_character(),
  voyage_itinerary__imp_broad_region_of_slave_purchase__name = col_character(),
  voyage_sources = col_character(),
  enslavers = col_character()
)

trans <- read_csv(
  "https://raw.githubusercontent.com/imowerman-prog/data-3210/refs/heads/main/Data/trans-atlantic.csv",
  col_types = col_types_spec
)

intra <- read_csv(
  "https://raw.githubusercontent.com/imowerman-prog/data-3210/refs/heads/main/Data/intra-american.csv",
  col_types = col_types_spec
)

clean_data <- function(df, source_name){
  df %>%
    rename(
      year = voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year,
      slaves_disembarked = voyage_slaves_numbers__imp_total_num_slaves_disembarked,
      slaves_embarked = voyage_slaves_numbers__imp_total_num_slaves_embarked,
      dis_region = voyage_itinerary__imp_principal_region_slave_dis__name,
      dis_port = voyage_itinerary__imp_principal_port_slave_dis__name,
      dis_broad = voyage_itinerary__imp_broad_region_slave_dis__name,
      country = voyage_ship__imputed_nationality__name
    ) %>%
    mutate(
      year = as.integer(year),
      slaves_embarked = as.numeric(slaves_embarked),
      slaves_disembarked = as.numeric(slaves_disembarked),
      decade = floor(year/10)*10,
      estimated_deaths = slaves_embarked - slaves_disembarked,
      is_us = dis_broad == "Mainland North America" |
              str_detect(tolower(dis_port), "new orleans"),
      source_type = source_name
    ) %>%
    filter(!is.na(slaves_disembarked), slaves_disembarked > 0)
}

trans_clean <- clean_data(trans, "Trans-Atlantic")
intra_clean <- clean_data(intra, "Intra-American")

all_data <- bind_rows(trans_clean, intra_clean)

Total slaves imported to the US

us_total <- all_data %>%
  filter(is_us) %>%
  summarise(total = sum(slaves_disembarked, na.rm = TRUE))

us_total
## # A tibble: 1 × 1
##    total
##    <dbl>
## 1 439667

Proportion of enslaved people taken from Africa that went to the US

total_africa <- sum(trans_clean$slaves_embarked, na.rm = TRUE)

prop_us <- us_total$total / total_africa

prop_us
## [1] 0.04157307

US slave imports by decade

us_decade <- all_data %>%
  filter(is_us) %>%
  group_by(decade) %>%
  summarise(imports = sum(slaves_disembarked, na.rm = TRUE))

ggplot(us_decade, aes(x = factor(decade), y = imports)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "US Slave Imports by Decade",
       x = "Decade",
       y = "Slaves Disembarked")

US imports by decade and region

us_region <- all_data %>%
  filter(is_us) %>%
  group_by(decade, dis_region) %>%
  summarise(imports = sum(slaves_disembarked, na.rm = TRUE))

ggplot(us_region, aes(x = factor(decade), y = imports)) +
  geom_bar(stat = "identity", fill = "darkorange") +
  facet_wrap(~dis_region) +
  labs(title = "US Imports by Decade and Region",
       x = "Decade",
       y = "Slaves Disembarked")

Countries participating in export from Africa

countries <- trans_clean %>%
  group_by(decade, country) %>%
  summarise(
    voyages = n_distinct(voyage_id),
    slaves = sum(slaves_embarked, na.rm = TRUE)
  ) %>%
  arrange(decade, desc(slaves))

countries
## # A tibble: 229 × 4
## # Groups:   decade [36]
##    decade country           voyages slaves
##     <dbl> <chr>               <int>  <dbl>
##  1   1510 Portugal / Brazil       2    624
##  2   1510 0                       9    223
##  3   1510 Spain / Uruguay         8    144
##  4   1520 Spain / Uruguay         3   1043
##  5   1520 0                       3    597
##  6   1530 0                       9   1777
##  7   1530 Portugal / Brazil       3    919
##  8   1530 Spain / Uruguay         1    224
##  9   1540 0                      61  19385
## 10   1540 Portugal / Brazil       1    160
## # ℹ 219 more rows

Summary

This analysis combined trans-Atlantic and intra-American slave trade datasets to examine patterns of enslaved people imported into the United States. After cleaning the data and filtering incomplete voyages, the results show the total number of enslaved people disembarked in the US and the proportion relative to the total number embarked from Africa. The decade-level visualization reveals how the scale of imports changed over time. Breaking imports down by region further highlights where enslaved people were most commonly disembarked within the US. Finally, examining ship nationality by decade shows which countries were most involved in transporting enslaved people from Africa during the trans-Atlantic trade.