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.