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.4 ✔ 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
# Load required library
library(tidyverse)
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(), # Force as 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 datasets
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)
trans_renamed <- trans %>%
transmute(
id,
voyage_id,
year = voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year,
slaves_embarked = voyage_slaves_numbers__imp_total_num_slaves_embarked,
slaves_disembarked = voyage_slaves_numbers__imp_total_num_slaves_disembarked,
dis_broad = voyage_itinerary__imp_broad_region_slave_dis__name,
dis_region = voyage_itinerary__imp_principal_region_slave_dis__name,
dis_port = voyage_itinerary__imp_principal_port_slave_dis__name,
outcome = voyage_outcome__outcome_slaves__name,
country = voyage_ship__imputed_nationality__name
)
intra_renamed <- intra %>%
transmute(
id,
voyage_id,
year = voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year,
slaves_embarked = voyage_slaves_numbers__imp_total_num_slaves_embarked,
slaves_disembarked = voyage_slaves_numbers__imp_total_num_slaves_disembarked,
dis_broad = voyage_itinerary__imp_broad_region_slave_dis__name,
dis_region = voyage_itinerary__imp_principal_region_slave_dis__name,
dis_port = voyage_itinerary__imp_principal_port_slave_dis__name,
outcome = voyage_outcome__outcome_slaves__name,
country = voyage_ship__imputed_nationality__name
)
clean_common <- function(df) {
df %>%
mutate(
year = as.integer(year),
slaves_embarked = as.numeric(slaves_embarked),
slaves_disembarked = as.numeric(slaves_disembarked)
) %>%
filter(!is.na(slaves_disembarked), slaves_disembarked > 0) %>%
mutate(
decade = floor(year / 10) * 10,
estimated_deaths = slaves_embarked - slaves_disembarked,
is_us = dis_broad == "Mainland North America" |
dis_port %in% c("New Orleans","Charleston","Savannah","Norfolk","Baltimore","New York")
)
}
trans_clean <- clean_common(trans_renamed)
intra_clean <- clean_common(intra_renamed)
nrow(trans_renamed)
## [1] 36340
nrow(intra_renamed)
## [1] 37777
nrow(trans_clean)
## [1] 34412
nrow(intra_clean)
## [1] 37773
trans_clean <- trans_clean %>% mutate(source_type = "Trans-Atlantic")
intra_clean <- intra_clean %>% mutate(source_type = "Intra-American")
all_data <- bind_rows(trans_clean, intra_clean)
nrow(all_data)
## [1] 72185
trans_clean <- trans_clean %>% mutate(source_type = "Trans-Atlantic")
intra_clean <- intra_clean %>% mutate(source_type = "Intra-American")
all_data <- bind_rows(trans_clean, intra_clean)
nrow(all_data)
## [1] 72185
table(all_data$is_us, useNA = "ifany")
##
## FALSE TRUE
## 62386 9799
us_total <- all_data %>%
filter(is_us) %>%
summarise(total_imported = sum(slaves_disembarked, na.rm = TRUE))
us_total
## # A tibble: 1 × 1
## total_imported
## <dbl>
## 1 439667
total_africa <- trans_clean %>%
summarise(total_embarked = sum(slaves_embarked, na.rm = TRUE))
prop_us <- us_total$total_imported / total_africa$total_embarked
total_africa
## # A tibble: 1 × 1
## total_embarked
## <dbl>
## 1 10575764
prop_us
## [1] 0.04157307
us_by_decade <- all_data %>%
filter(is_us) %>%
group_by(decade) %>%
summarise(total_imported = sum(slaves_disembarked, na.rm = TRUE))
us_by_decade <- all_data %>%
filter(is_us) %>%
group_by(decade) %>%
summarise(total_imported = sum(slaves_disembarked, na.rm = TRUE))
library(ggplot2)
ggplot(us_by_decade, aes(x = decade, y = total_imported)) +
geom_bar(stat = "identity") +
labs(
title = "Slave Imports to the United States by Decade",
x = "Decade",
y = "Number of Enslaved People"
) +
theme_minimal()

us_region <- all_data %>%
filter(is_us) %>%
group_by(decade, dis_region, dis_port) %>%
summarise(total_imported = sum(slaves_disembarked, na.rm = TRUE))
ggplot(us_region, aes(x = decade, y = total_imported)) +
geom_bar(stat = "identity") +
facet_wrap(~ dis_region) +
labs(
title = "Slave Imports to the US by Decade and Region",
x = "Decade",
y = "Number of Enslaved People"
) +
theme_minimal()

export_countries <- trans_clean %>%
group_by(decade, country) %>%
summarise(
total_embarked = sum(slaves_embarked, na.rm = TRUE),
voyages = n()
)
export_countries
## # A tibble: 229 × 4
## # Groups: decade [36]
## decade country total_embarked voyages
## <dbl> <chr> <dbl> <int>
## 1 1510 0 223 9
## 2 1510 Portugal / Brazil 624 2
## 3 1510 Spain / Uruguay 144 8
## 4 1520 0 597 3
## 5 1520 Spain / Uruguay 1043 3
## 6 1530 0 1777 9
## 7 1530 Portugal / Brazil 919 3
## 8 1530 Spain / Uruguay 224 1
## 9 1540 0 19385 61
## 10 1540 Portugal / Brazil 160 1
## # ℹ 219 more rows
This analysis examined slave trade data from both the Trans-Atlantic
and Intra-American slave trade datasets. After cleaning and combining
the data, the results show that approximately 439,667 enslaved people
were imported into the United States, representing about 4.16% of all
enslaved Africans transported across the Atlantic. The decade-level
visualization shows that imports increased significantly during the late
1700s and early 1800s before declining after the abolition of the
trans-Atlantic slave trade in 1808. The regional analysis also
highlights that ports in the southern United States received the
majority of enslaved people during this period.