DATA 3210: Slavery Assignment

library(tidyverse)

Defining column types

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

Load the Data

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
)

Rename Columns for Readability

trans <- trans %>%
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_broad_region_slave_dis__name,
  dis_port = voyage_itinerary__imp_principal_port_slave_dis__name,
  country = voyage_ship__imputed_nationality__name
)

intra <- intra %>%
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_broad_region_slave_dis__name,
  dis_port = voyage_itinerary__imp_principal_port_slave_dis__name,
  country = voyage_ship__imputed_nationality__name
)

Display Column Names

names(trans)
##  [1] "id"                                                             
##  [2] "voyage_id"                                                      
##  [3] "year"                                                           
##  [4] "slaves_disembarked"                                             
##  [5] "slaves_embarked"                                                
##  [6] "voyage_dates__length_middle_passage_days"                       
##  [7] "voyage_dates__imp_length_home_to_disembark"                     
##  [8] "voyage_crew__crew_first_landing"                                
##  [9] "voyage_crew__crew_voyage_outset"                                
## [10] "voyage_ship__tonnage_mod"                                       
## [11] "voyage_slaves_numbers__imp_jamaican_cash_price"                 
## [12] "voyage_slaves_numbers__imp_mortality_ratio"                     
## [13] "voyage_slaves_numbers__percentage_women_among_embarked_slaves"  
## [14] "voyage_outcome__vessel_captured_outcome__name"                  
## [15] "country"                                                        
## [16] "voyage_itinerary__imp_region_voyage_begin__name"                
## [17] "voyage_ship__rig_of_vessel__name"                               
## [18] "voyage_itinerary__place_voyage_ended__name"                     
## [19] "voyage_dates__slave_purchase_began_sparsedate__month"           
## [20] "voyage_slaves_numbers__percentage_men"                          
## [21] "voyage_dates__voyage_completed_sparsedate__month"               
## [22] "voyage_itinerary__region_of_return__name"                       
## [23] "voyage_slaves_numbers__percentage_boy"                          
## [24] "voyage_itinerary__imp_principal_region_slave_dis__name"         
## [25] "voyage_itinerary__imp_principal_region_of_slave_purchase__name" 
## [26] "voyage_dates__date_departed_africa_sparsedate__month"           
## [27] "voyage_dates__voyage_began_sparsedate__month"                   
## [28] "voyage_itinerary__imp_port_voyage_begin__name"                  
## [29] "voyage_dates__first_dis_of_slaves_sparsedate__month"            
## [30] "dis_region"                                                     
## [31] "voyage_slaves_numbers__percentage_girl"                         
## [32] "voyage_outcome__particular_outcome__name"                       
## [33] "dis_port"                                                       
## [34] "voyage_slaves_numbers__percentage_child"                        
## [35] "voyage_slaves_numbers__percentage_women"                        
## [36] "voyage_dates__departure_last_place_of_landing_sparsedate__month"
## [37] "voyage_outcome__outcome_owner__name"                            
## [38] "voyage_outcome__outcome_slaves__name"                           
## [39] "voyage_itinerary__imp_principal_place_of_slave_purchase__name"  
## [40] "voyage_outcome__resistance__name"                               
## [41] "voyage_slaves_numbers__percentage_male"                         
## [42] "voyage_slaves_numbers__percentage_female"                       
## [43] "voyage_itinerary__imp_broad_region_voyage_begin__name"          
## [44] "voyage_itinerary__imp_broad_region_of_slave_purchase__name"     
## [45] "voyage_sources"                                                 
## [46] "enslavers"

Convert Year and Slave Counts to Numeric

trans <- trans %>%
mutate(
  year = as.integer(year),
  slaves_embarked = as.numeric(slaves_embarked),
  slaves_disembarked = as.numeric(slaves_disembarked)
)

intra <- intra %>%
mutate(
  year = as.integer(year),
  slaves_embarked = as.numeric(slaves_embarked),
  slaves_disembarked = as.numeric(slaves_disembarked)
)

Filter Out Incomplete Voyages keep only successful outcomes

trans <- trans %>%
  filter(!is.na(slaves_disembarked), slaves_disembarked > 0)

intra <- intra %>%
  filter(!is.na(slaves_disembarked), slaves_disembarked > 0)

Add Decade, Estimated Deaths, and US Indicator Columns

trans <- trans %>%
mutate(
  decade = floor(year/10)*10,
  estimated_deaths = slaves_embarked - slaves_disembarked,
  is_us = dis_region == "Mainland North America" | dis_port == "New Orleans"
)

intra <- intra %>%
mutate(
  decade = floor(year/10)*10,
  estimated_deaths = slaves_embarked - slaves_disembarked,
  is_us = dis_region == "Mainland North America" | dis_port == "New Orleans"
)

Combine

trans$source_type <- "Trans-Atlantic"
intra$source_type <- "Intra-American"

combined <- bind_rows(trans, intra)

Calculate Total Slaves Imported to the United States

us_total <- combined %>%
  filter(is_us == TRUE) %>%
  summarise(`Total Slaves in the US` = sum(slaves_disembarked, na.rm = TRUE))

us_total
## # A tibble: 1 × 1
##   `Total Slaves in the US`
##                      <dbl>
## 1                   439667

Calculate Total Slaves Embarked from Africa

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

total_africa
## [1] 10575764

Calculate Proportion of Africans Imported into the US

proportion_percent <- (us_total$`Total Slaves in the US` / total_africa) * 100

proportion_percent
## [1] 4.157307

Group US Imports by Decade

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

Plot: Slave Imports to the US by Decade

ggplot(us_decade, aes(x = decade, y = total_slaves)) +
  geom_col() +
  labs(
    title = "Slave Imports to the United States by Decade",
    x = "Decade",
    y = "Number of Enslaved Individuals"
  )

Create table

us_region_port <- combined %>%
  filter(is_us == TRUE) %>%
  group_by(decade, dis_region, dis_port) %>%
  summarise(total_slaves = sum(slaves_disembarked, na.rm = TRUE), .groups = "drop")

us_region_port
## # A tibble: 377 × 4
##    decade dis_region             dis_port                   total_slaves
##     <dbl> <chr>                  <chr>                             <dbl>
##  1   1610 Mainland North America Hampton                              29
##  2   1620 Mainland North America Virginia, port unspecified            3
##  3   1630 Mainland North America Boston                                7
##  4   1630 Mainland North America New York                             53
##  5   1630 Mainland North America Virginia, port unspecified           13
##  6   1640 Mainland North America New York                             69
##  7   1640 Mainland North America Virginia, port unspecified          435
##  8   1650 Mainland North America Maryland, port unspecified            5
##  9   1650 Mainland North America New York                            477
## 10   1650 Mainland North America Virginia, port unspecified          469
## # ℹ 367 more rows

Create State Variable from Port Names

us_region_port <- combined %>%
  filter(is_us == TRUE) %>%
  mutate(state = case_when(
    dis_port %in% c("New Orleans") ~ "Louisiana",
    dis_port %in% c("Charleston") ~ "South Carolina",
    dis_port %in% c("Savannah") ~ "Georgia",
    dis_port %in% c("Baltimore", "Annapolis") ~ "Maryland",
    dis_port %in% c("New York") ~ "New York",
    dis_port %in% c("Boston") ~ "Massachusetts",
    TRUE ~ "Other"
  ))

Summarize US Imports by Decade and State

us_state <- us_region_port %>%
  group_by(decade, state) %>%
  summarise(total_slaves = sum(slaves_disembarked, na.rm = TRUE), .groups = "drop")

Plot: Slave Imports to the US by State and Decade

ggplot(us_state, aes(x = decade, y = total_slaves)) +
  geom_col() +
  facet_wrap(~ state) +
  labs(
    title = "Slave Imports to the US by State and Decade",
    x = "Decade",
    y = "Number of Enslaved Individuals"
  )

Create Table of Exporting Countries by Decade

country_table <- trans %>%
  group_by(decade, country) %>%
  summarise(total_embarked = sum(slaves_embarked, na.rm = TRUE), .groups = "drop")

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

Summary

After cleaning and combining the data sets, I calculated total slave imports into the United States, the share of all Africans taken from Africa who ended up in the US, and how US imports changed over time. The combined data shows 439,667 enslaved people were imported into the US, which is about 4.16% of the 10,575,764 individuals embarked from Africa in the Trans‑Atlantic trade. US imports increased from the 1600s through the early 1800s. When broken down by state (using ports to approximate states), South Carolina and Louisiana received the largest volumes, while states like Maryland, New York, Massachusetts, and Georgia received smaller amounts. This shows that US arrivals were concentrated in a few major locations. For exports from Africa, grouping by decade and ship nationality shows that countries such as Portugal/Brazil, Spain/Uruguay, Great Britain, France, and the Netherlands dominated the trade, with some voyages having unknown nationality recorded as “0.”