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)
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
total_africa <- sum(trans_clean$slaves_embarked, na.rm = TRUE)
prop_us <- us_total$total / total_africa
prop_us
## [1] 0.04157307
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_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 <- 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
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.