This project is part of Clio Wired 3: Programming for Historians at George Mason University. It explores the kinship relations of the Mount Vernon enslaved community from 1786-1799 using network analysis in R. Currently, there is great interest in studying the enslaved community on George Washington’s estate, such as archaeology of the slave cemetery, the physical spaces in which the slaves lived, their labor, free time, and Washington’s role as a slave owner.[1] The Mount Vernon Historic Preservation and Collections department is currently building a slavery database, in which every mention of every slave that lived, worked, or had some part at Mount Vernon is entered. The documents include farm reports, wills, letters, diaries, censuses, etc. In order to track all of the unique people, they generated a spreadsheet compiling every census taken of the slaves.[2]
The census is relatively complete, with farm location, estimated age, skill, spouses, and mothers. This project draws from that data in order to explore the kinship relations from the two most complete censuses: 1786 and 1799. We can parse out parent and child, sibling, and spousal relationships. This project examines the network of known kinship relationships on the estate, the overall structure of the enslaved community, and how it changes in those thirteen years. This project uses the R programming language and network analysis through the igraph package to visualize these hundreds of kinship relationships and place them within space and time. Hopefully, a better and more complete picture of the Mount Vernon enslaved community will arise, as well as a list of new research questions to pursue.
In the historiography of eighteenth-century slavery, a few studies of kinship structures on Chesapeake plantations exist. Herbert G. Gutman explores more the nineteenth-century family structure on plantations in The Black Family in Slavey and Freedom, 1750-1925.[3] In his monograph, Slave Counterpoint: Black Culture in the Eighteenth-Century Chesapeake & Lowcountry, Philip D. Morgan argues that the number of slave kinship ties increased and grew more stable throughout the eighteenth-century. He and Gutman measured this stability mainly by the number of two-parent slave households and single slaves. Two-parent families dominated and single slaves decreased.[4] Mobility also affected this stabilization, as those slaves not moving long distances experienced more stable, local kinship ties. This family stability varies according to plantation size and the owner’s views on slavery, of course, but Morgan states that larger plantations experienced more stable relationships by the late eighteenth-century, especially if the owner no longer sold or bought any slaves, thereby not disrupting families.[5]
These slave kinship relations are difficult to study, because the source base is so minimal. If plantation censuses do exist, they are usually fragmentary. Because Washington kept a relatively complete record of his slaves’ information, we can learn quite a bit from studying the kinship network and community structure of the Mount Vernon slaves with R.
A note on definitions/ terms: Slaves could not legally marry.[6] A “husband” or “wife” listed on the census does not necessarily mean the same thing as a legal marriage, nor does it imply behaviors associated with legal marriage. A structure of two parents or a single parent with children does not necessarily constitute a traditional family, as perceived by a slave. Additionally, polygyny and polyandry were common.[7] We cannot assume blood relations or a slave’s perspective when no direct sources exist. However, in order to analyze the community, I have decided to call the ties “kinship or familial relationships” that make up “family structures”.
First, we load the necessary libraries.
library(igraph)
library(dplyr)
library(tidyr)
library(stringr)
library(historydata)
library(ggplot2)
I cleaned the data from the compiled census with Open Refine in order to make it amenable to computation.[8] If differing birth years existed, I chose the 1799 year. I created a new row or observation for each slave on each census, including any changes in skill or farm. Additionally, I only included those slaves known for certain on the two censuses.
The data for this project exists in three csv files. The first file contains every slave with at least one kinship relation on Mount Vernon, from 1786-1799 .
slaverel <- read.csv("~//Desktop/Clio-3/finalproject/slaveRelationships.csv", stringsAsFactors = FALSE)
head(slaverel)
## id id.1 relationship
## 1 Abbay A Barbary A Sibling
## 2 Abbay A George C Sibling
## 3 Abbay A Hannah A Sibling
## 4 Abbay A Jesse B Sibling
## 5 Abbay A Kate D Sibling
## 6 Abbay A Lawrence B Sibling
The second contains every slave and the respective static information, such as gender and owner, for 1786 and 1799.
total_slave <- read.csv("~//Desktop/Clio-3/finalproject/clean.csv", stringsAsFactors = FALSE) %>%
select(id, Gender, Birth.Year, Owner)
head(total_slave)
## id Gender Birth.Year Owner
## 1 Abbay A Female 1789 Custis Estate
## 2 Abram A Male NA Penelope French
## 3 Adam A Male 1792 George Washington
## 4 Agnes A Female 1763 Custis Estate
## 5 Agnes B Female 1774 George Washington
## 6 Alce A Female 1791 George Washington
The third file contains both the 1786 and 1799 censuses with the relevant slaves. This means the slaves present in both censuses are repeated but might have a different skill or farm.
slave_census <- read.csv("~//Desktop/Clio-3/finalproject/census.csv", stringsAsFactors = FALSE) %>%
select(id, Gender, Birth.Year, Skill, Farm, Census, Owner)
head(slave_census)
## id Gender Birth.Year Skill Farm Census
## 1 Abbay A Female 1789 Child Dogue Run 1799
## 2 Abram A Male NA Cultivator of the Soil Union Farm 1799
## 3 Adam A Male 1792 Child Muddy Hole 1799
## 4 Adam B Male NA Cultivator of the Soil River Farm 1786
## 5 Adam C Male NA Cultivator of the Soil Dogue Run 1786
## 6 Agnes A Female 1763 Cultivator of the Soil River Farm 1786
## Owner
## 1 Custis Estate
## 2 Penelope French
## 3 George Washington
## 4 George Washington
## 5 George Washington
## 6 Custis Estate
Next, we must separate out the two most important and complete censuses: 1786 and 1799. We use the dplyr package to filter out the census year and to select only the variables that change between the two censuses.
slave_1786 <- slave_census %>%
filter(Census == "1786") %>%
select(id, Census, Skill, Farm)
slave_1799 <- slave_census %>%
filter(Census == "1799") %>%
select(id, Census, Skill, Farm)
We can join the two censuses into one dataframe by the “id” variable (column name) in order to access that information on the network graph.
total_slave <- total_slave %>%
left_join(slave_1786, by = "id") %>%
left_join(slave_1799, by = "id")
head(total_slave)
## id Gender Birth.Year Owner Census.x
## 1 Abbay A Female 1789 Custis Estate NA
## 2 Abram A Male NA Penelope French NA
## 3 Adam A Male 1792 George Washington NA
## 4 Agnes A Female 1763 Custis Estate 1786
## 5 Agnes B Female 1774 George Washington 1786
## 6 Alce A Female 1791 George Washington NA
## Skill.x Farm.x Census.y Skill.y
## 1 <NA> <NA> 1799 Child
## 2 <NA> <NA> 1799 Cultivator of the Soil
## 3 <NA> <NA> 1799 Child
## 4 Cultivator of the Soil River Farm 1799 Cultivator of the Soil
## 5 Child Dogue Run 1799 Cultivator of the Soil
## 6 <NA> <NA> 1799 Child
## Farm.y
## 1 Dogue Run
## 2 Union Farm
## 3 Muddy Hole
## 4 River Farm
## 5 Dogue Run
## 6 Muddy Hole
We create a graph object of the slave relationships dataframe (slaverel) in order to graph the kinship relations between the slaves. Since this is a kinship network graph, it is undirected.
slave_graph <- graph.data.frame(slaverel, directed = "FALSE")
In order to add those slaves without kinship relations, we must add them as extra vertices to the graph object.
slave_graph <- slave_graph + vertex("Adam B", "Adam C", "Anthony A", "Austin A", "Bath A", "Bristol A", "Brunswick A", "Caesar A", "Cloe A", "Cupid A", "Daniel A", "Daphne D", "Doll A", "Doll E", "Essex A", "Frank B", "Giles A", "Hannah E", "Hercules A", "Isaac B", "Jack B", "Jack G", "Jack H", "Jack I", "James D", "Jenny B", "Jenny E", "Joe E", "Juba A", "Julius A", "London A", "Marcus A", "Matt A", "Milly C", "Moll A", "Molly A", "Morris B", "Moses C", "Murria A", "Nancy I", "Paris A", "Paul A", "Peter C", "Robin A", "Robin B", "Schomberg A", "Spencer A", "Sue A", "Tom D", "William Lee", "Will D", "Will F", "Will H")
Now, we create another dataframe that lists all the vertex attributes for each slave in order to visualize them on the network graph.
slave_vertex <- data_frame(name = V(slave_graph)$name) %>%
left_join(total_slave, by = c("name" = "id"))
head(slave_vertex)
## Source: local data frame [6 x 10]
##
## name Gender Birth.Year Owner Census.x
## 1 Abbay A Female 1789 Custis Estate NA
## 2 Abram A Male NA Penelope French NA
## 3 Adam A Male 1792 George Washington NA
## 4 Agnes A Female 1763 Custis Estate 1786
## 5 Agnes B Female 1774 George Washington 1786
## 6 Alce A Female 1791 George Washington NA
## Variables not shown: Skill.x (chr), Farm.x (chr), Census.y (int), Skill.y
## (chr), Farm.y (chr)
In order to create a more discernible network graph, set the vertex size to 3 and remove the vertex labels in the plot function. The set.seed function keeps the graph in the same position, so it does not rotate every time the graph is plotted.
igraph.options(vertex.size=3,
edge.arrow.size=.5)
set.seed(5)
plot(slave_graph, vertex.label = NA)
title("Slave Family Structures on Mount Vernon, 1786 - 1799")
Immediately, the overall kinship structure of the enslaved community is apparent. It seems that three family structures comprise one large family structure and several smaller structures exist, as well. Many slaves experienced no kinship relations (no known kinship relations) and some slaves were only connected to one or two other people. This graph provides a lot of information, but in order to analyze it further, we must be able to visualize the vertex attributes and the different kinship relationships.
In order to visualize the gender of the slaves, we can change the shape of each vertex accordingly. We use a simple ifelse function to iterate over the Gender attribute in the slave_vertex dataframe and assign circles or squares to the respective gender. The rectangle shape is added in case any gender is not listed as male or female, ie missing.
V(slave_graph)$shape <- ifelse(slave_vertex$Gender == "Female", "circle",
ifelse(slave_vertex$Gender == "Male", "square",
"rectangle"))
set.seed(5)
plot(slave_graph, vertex.label = NA)
title("Visualizing Gender")
This graph is more helpful, as it allows us to begin thinking about gender ratios on the farms. However, the edges between them are not meaningful unless we can visualize them.
In order to visualize the different kinships relations, we can colorize the edges according to type of relation with a function. We can adapt the lookup function for vertex attributes created by Lincoln Mullen to edge attributes. [9] It returns a color based on the relationship.
lookup_edge <- function(relationship) {
if(relationship == "Spouse") return("red")
if(relationship == "Child") return("orange")
if(relationship == "Sibling") return("blue")
return("gray")
}
lookup_edge <- Vectorize(lookup_edge, USE.NAMES = FALSE)
E(slave_graph)$color <- lookup_edge(E(slave_graph)$relationship)
set.seed(5)
plot(slave_graph,
vertex.label = NA,
vertex.size = 3)
title("Visualizing Kinship Relations")
legend("bottomleft", legend = c("Spouse", "Child", "Sibling"),
col = c("red", "orange", "blue"), pch = 19,
title = "Kinship Relation")
The network graph is easier to decipher. We can see that the one large family is connected by at least one slave marriage. Many of the two person family structures are slave marriages, while others are mother and child. With this graph, we can count the number of each relationship and know where they exist within each family.
Since both slave censuses taken by Washington list the farms that each slave lived and worked on, we can use that variable to locate the slave families within the estate. Five farms made up the estate: Mansion House, Muddy Hole, Dogue Run, Union Farm, and River Farm.[10] We use the lookup function again to colorize the vertices based on the farm:
lookup_color <- function(type) {
if(is.na(type)) return("gray")
if(type == "Mansion House") return("purple")
if(type == "Muddy Hole") return("blue")
if(type == "Dogue Run") return("green")
if(type == "Union Farm") return("orange")
if(type == "River Farm") return("yellow")
if(type == "Mr. Lears") return("brown")
if(type == "Mrs. Washington's") return("brown")
if(type == "Cedar Grove") return("brown")
return("gray")
}
lookup_color <- Vectorize(lookup_color, USE.NAMES = FALSE)
Some slaves married people living on other plantations. I colored them brown for non-local people. Most slaves married and had kinship relations within Washington’s slave community. The gray color represents slaves that were not active on each census, meaning that they were not born yet, had died, or have unknown locations.
We can graph only those family structures existing in 1786. This will allow us to examine change over time and to see if the stability of the enslaved community increases over time, following Morgan’s argument. We designate the 1786 census by accessing the Farm.x variable in the slave_vertex dataframe.
V(slave_graph)$color <- lookup_color(slave_vertex$Farm.x)
set.seed(5)
plot(slave_graph,
vertex.label = NA,
vertex.size = 3)
title("Slave Family Structures on Mount Vernon Farms in 1786")
legend("bottomleft", legend = c("Mansion House", "Muddy Hole", "Dogue Run", "Union Farm", "River Farm", "Other Farm", "Not Active"),
col = c("purple", "blue", "green", "orange", "yellow", "brown", "gray"), pch = 19,
title = "Farm")
This graph tells us a lot more information. We can place the slave families in space on the estate and organize the various family structures. Many slaves were not yet born.
From this graph, four types of family structures arise: singles, one parent, two parent, and couples with no known children. We can plot the numbers of each family structure for the entire estate, as well as the individual farms. We will use ggplot2 bar graphs to plot this information drawn from the network graph into a csv.
structures <- read.csv("~//Desktop/Clio-3/finalproject/FamilyStructures.csv", stringsAsFactors = FALSE)
head(structures)
## Farm Family.structure Number Total Percent Census
## 1 Estate single 29 109 26.61 Percent_1799
## 2 Estate one parent 22 109 20.18 Percent_1799
## 3 Estate two parent 40 109 36.70 Percent_1799
## 4 Estate couples (no known children) 18 109 16.51 Percent_1799
## 5 River Farm single 4 20 20.00 Percent_1799
## 6 River Farm one parent 4 20 20.00 Percent_1799
We can use a simple bar plot to show the percentages of each family structure:
structures_1786 <- structures %>%
filter(Census == "Percent_1786")
ggplot(data = structures_1786, aes(x = Family.structure, y = Percent)) + facet_wrap(~Farm) + geom_bar(stat = "identity", fill = "darkblue") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("1786 Family Structures")
From this plot, we can see that almost every farm and the entire estate had a majority of single person family structures. This seems to follow the same pattern that Morgan outlined, but we need to examine the 1799 network graph.
We can access the 1799 census information with the Farm.y variable.
V(slave_graph)$color <- lookup_color(slave_vertex$Farm.y)
set.seed(5)
plot(slave_graph,
vertex.label = NA,
vertex.size = 3)
title("Slave Family Structures on Mount Vernon Farms in 1799")
legend("bottomleft", legend = c("Mansion House", "Muddy Hole", "Dogue Run", "Union Farm", "River Farm", "Other Farm", "Not Active"),
col = c("purple", "blue", "green", "orange", "yellow", "brown", "gray"), pch = 19,
title = "Farm")
Immediately, we can see that many people were born between 1786 and 1799.
Let’s plot the four family structures for 1799 next to the 1786 figures in order to examine change over time. We can use the position dodge in ggplot to plot the two censuses next to each other on the chart.
ggplot(data = structures, aes(x = Family.structure, y = Percent, fill = Census)) + facet_wrap(~Farm) + geom_bar(stat = "identity", position = "dodge") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("1786 and 1799 Family Structures Compared")
The increase in the percentage of two-parent family strucutres in just thirteen years stands out. Single person structures still dominate on Mansion House and Union Farm, but every farm and the overall estate increases in two-parent families. These findings definitely follow Philip Morgan’s argument that by the late eighteenth-century, two-parent families dominated and single persons decreased.
Washington, in a letter written to John Mercer in November of 1786 said, “With respect to the negroes, I conclude it is not in my power to answer your wishes—because it is as much against my own inclination as it can be against your’s, to hurt the feelings of those unhappy people by a separation of man and wife, or of families.” He is clearly expressing a reluctance to separate the family structures on his estate through business transactions. Washington also expresses clear recognition of those familes.[11] This reluctance aligns with Morgan’s argument that most slave holders grew reluctant to separate their slave families toward the end of the eighteenth-century.
We can use the community detection methods in R in order to focus on each family grouping in 1799.
comm <- walktrap.community(slave_graph)
length(comm)
## [1] 119
The walktrap.community, according to the igraph documentation, “finds densely connected subgraphs” and calculates 119 slave family groups on Mount Vernon in 1799.[12] This is not completely accurate, as the largest family is counted as three groups. A more nuanced analysis of the number and definition of family groupings is needed for this data, but the exploring the individual groups is helpful. For this specific analysis, we would need a family structure detection algorithm to find what we have defined as a family structure.
We can calculate the size of each of the family groups.
sizes(comm)
## Community sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
## 9 15 9 11 9 15 10 6 3 11 10 9 10 6 3 3 3 4
## 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
## 7 5 7 7 8 5 7 8 6 6 8 2 2 5 4 4 2 2
## 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## 6 2 6 3 2 2 6 2 3 4 5 2 7 2 2 2 5 3
## 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## 6 5 5 6 3 2 2 2 2 4 2 3 1 1 1 1 1 1
## 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 109 110 111 112 113 114 115 116 117 118 119
## 1 1 1 1 1 1 1 1 1 1 1
We can inspect each community in the graph and list the names of each family member.
memb <- membership(comm)
names(memb[memb ==53])
## [1] "Daphne B" "Maria A" "Matilda B" "Polly A" "Simms A"
We can also show the kinship network graph colored by each family group.
set.seed(5)
plot(slave_graph, vertex.label = NA, vertex.color = memb, vertex.size = 3)
title("Families detected by walktrap.community()")
set.seed(5)
plot(comm, slave_graph, vertex.label = NA, vertex.size = 2)
title("Families detected by walktrap.community()")
In order to see how each slave is connected within a family, we can show a subgraph of the larger network graph in a different layout. We will use the large community comprised of community 4, 6 and 10 for this example.
induced.subgraph(slave_graph, which(membership(comm) %in% c(4,6,10))) %>%
plot(asp =0)
set.seed(30)
title("Communities 4, 6, and 10 among Mount Vernon")
legend("bottomright", legend = c("Spouse", "Child", "Sibling"),
col = c("red", "orange", "blue"), pch = 19,
title = "Relationship")
By graphing a smaller network graph and colorizing the vertex and edge attributes, we can see that this one large family is connected by two slave marriages. It is hard to decipher, but two of Kitty A’s daughters, Mima A and Alla A, married other slaves on Mansion House. The husbands also belonged to their own family structures on different farms. Mima A’s husband, Godfrey A, was a carter in 1799 and resided on Mansion House farm. He was born on Union Farm. Alla A’s husband, James B, was also a carter in 1799 on Mansion House farm. He was born on River Farm. Both Godfrey A and James B moved to Mansion House with their skill as a carter and married into Kitty A’s family on Mansion House, connecting all three family structures. Clearly, learning specific skills and moving to different local farms could improve family stability.
Additionally, Doll C is James B’s mother, and Betty A is Godfrey A’s mother. Godfrey A and Mima A had two children together, and one of Doll C’s daughters also had a child. This is a three-generational family for all three families. They all mainly reside on the same farm but are all connected through kinship and their working communities.
Let’s explore a smaller family. We can use the same induced.subgraph function to locate any family identified by the community detection methods:
induced.subgraph(slave_graph, which(membership(comm) == 53)) %>%
plot(layout = layout.reingold.tilford, vertex.label = names(memb[memb == 53]))
title("Community 53 among Mount Vernon")
legend("bottomleft", legend = c("Spouse", "Child", "Sibling"),
col = c("red", "orange", "blue"), pch = 19,
title = "Relationship")
This graph, though quite a bit smaller, shows that Daphne B and Simms A are spouses with three children: Maria A, Matilda B, and Polly A. The women live on Union Farm, but Simms A lives on Mansion House farm. This means that Daphne B and Simms A would have traveled across these two farms in order to see each other. Simms A belongs to two different communities: his family and the Mansion House working community. This small family follows Morgan’s pattern, as both spouses were local to Mount Vernon.
We can also produce summary statistics for marriages, children, and the gender ratio for each farm using the dplyr library.
In order to examine and visualize the marriages, combining both the two-parent and couples without children family structures, we can simply plug in the relevant data to code we used previously. We filter out the spouse relationship in the slaverel dataframe then convert that to a graph object. Next, we use left_join to merge the census information to the graph object. Then, we can change the shapes of the gender as before and colorize the vertices according to farm. We can explore how many marriages occurred on the same farm, how many occurred locally, and how many known marriages occurred across plantations.
marriages <- slaverel %>%
filter(relationship == "Spouse")
slave_graph_marriages <- graph.data.frame(marriages, directed = "FALSE")
slave_marriages_vertex <- data_frame(name = V(slave_graph_marriages)$name) %>%
left_join(total_slave, by = c("name" = "id"))
V(slave_graph_marriages)$shape <- ifelse(slave_marriages_vertex$Gender == "Female", "circle",
ifelse(slave_marriages_vertex$Gender == "Male", "square",
"rectangle"))
E(slave_graph_marriages)$color <- lookup_edge(E(slave_graph_marriages)$relationship)
V(slave_graph_marriages)$color <- lookup_color(slave_marriages_vertex$Farm.x)
plot(slave_graph_marriages, vertex.label = NA)
title("Slave Marriages on Mount Vernon, 1786")
legend("bottomleft", legend = c("Mansion House", "Muddy Hole", "Dogue Run", "Union Farm", "River Farm", "Other Farm", "Not Active"),
col = c("purple", "blue", "green", "orange", "yellow", "brown", "gray"), pch = 19,
title = "Farm")
By using walktrap.community again, we can calculate how many marriages of each type occurred in each census and examine change over time. These are, of course, only the known marriages identified so far by Washington in the censuses and by the Mount Vernon library staff in the George Washington papers.
mar <- walktrap.community(slave_graph_marriages)
length(mar)
## [1] 61
membmar <- membership(mar)
names(membmar[membmar ==61])
## [1] "Frank A" "Lucy C"
induced.subgraph(slave_graph_marriages, which(membership(mar) == 61)) %>% plot()
V(slave_graph_marriages)$color <- lookup_color(slave_marriages_vertex$Farm.y)
plot(slave_graph_marriages, vertex.label = NA)
title("Slave Marriages on Mount Vernon, 1799")
legend("bottomleft", legend = c("Mansion House", "Muddy Hole", "Dogue Run", "Union Farm", "River Farm", "Other Farm", "Not Active"),
col = c("purple", "blue", "green", "orange", "yellow", "brown", "gray"), pch = 19,
title = "Farm")
mar <- walktrap.community(slave_graph_marriages)
length(mar)
## [1] 61
membmar <- membership(mar)
names(membmar[membmar ==61])
## [1] "Frank A" "Lucy C"
induced.subgraph(slave_graph_marriages, which(membership(mar) == 61)) %>% plot()
marriages <- read.csv("~//Desktop/Clio-3/finalproject/marriages.csv", stringsAsFactors = FALSE)
ggplot(data = marriages, aes(x = marriage, y = percent, fill = year)) + geom_bar(position = position_dodge(), stat = "identity") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("Types of Marriages on Mount Vernon, 1786-1799")
This data is somewhat misleading, because I counted the unknown spouses as cross plantation marriages. This might not be true. We also do not know exactly when slaves married. Nevertheless, the important thing to draw from this graph is that the same farm and local farm marriages made up a majority of the slave marriages in the late eighteenth-century. Though the number of local farm marriages increased by 1799, local mobility was a factor in the stabilization of slave kinship relations. Marrying someone on another Mount Vernon farm implies relatively easy access on a regular basis. The decrease in the number of same farm marriages and increase in local farm marriages might result from George Washington renting those slaves from Penelope French in 1786 and introducing those people into the community.
In order to analyze the ratio of children on each farm, we can filter, group by, and select the number of children for each farm for each census. Next, we summarize the numbers per farm and mutate the percentage, or divide the number of children on each farm by the total number of children on the estate. The resulting number is the percent of the children population on each farm. We can examine this percentage over time by plotting the data to a simple bar chart in ggplot2.
children_1786 <- slave_1786 %>%
filter(Skill == "Child") %>%
group_by(Farm) %>%
summarize(Number = n()) %>%
mutate(Percent_1786 = Number/89 * 100)
children_1799 <- slave_1799 %>%
filter(Skill == "Child") %>%
group_by(Farm) %>%
summarize(Number = n()) %>%
mutate(Percent_1799 = Number/117 * 100) %>%
left_join(children_1786, by = "Farm") %>%
gather(census, percent, Percent_1786,Percent_1799)
ggplot(data = children_1799, aes(x = Farm, y = percent, fill = census)) + geom_bar(position = position_dodge(), stat = "identity") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("Ratio of Children on Mount Vernon Farms, 1786-1799")
For most farms, the ratio of children increases. The anomaly is River Farm, as it drastically decreases in the number of children. This might result from a high infant mortality rate or a high number of aging slaves on this particular farm. This is an avenue for further research.
We can also explore the gender ratio of adult slaves on the farms across time. We can use dplyr again for this data manipulation. First, filter out the appropriate censuses and deselect all of the children. Then filter that population by gender and summarize the numbers. We can then plot the results in a bar chart:
gender_1786_females <- slave_vertex %>%
filter(Census.x == "1786") %>%
filter(Skill.x != "Child") %>%
filter(Gender == "Female") %>%
group_by(Farm.x) %>%
summarize(Females = n())
gender_1786_males <- slave_vertex %>%
filter(Census.x == "1786") %>%
filter(Skill.x != "Child") %>%
filter(Gender == "Male") %>%
group_by(Farm.x) %>%
summarize(Males = n())
gender_1786 <- gender_1786_females %>%
left_join(gender_1786_males, by = "Farm.x") %>%
mutate(Total = Females + Males) %>%
mutate(Percent_of_Male = Males/Total * 100) %>%
mutate(Percent_of_Female = Females/Total * 100) %>%
gather(gender, percent, Percent_of_Male:Percent_of_Female)
ggplot(data = gender_1786, aes(x = Farm.x, y = percent, fill = gender)) + geom_bar(position = position_dodge(), stat = "identity") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("Gender Ratio on Mount Vernon Farms in 1786")
gender_1799_females <- slave_vertex %>%
filter(Census.y == "1799") %>%
filter(Skill.y != "Child") %>%
filter(Gender == "Female") %>%
filter(Farm.y != "NA") %>%
group_by(Farm.y) %>%
summarize(Females = n())
gender_1799_males <- slave_vertex %>%
filter(Census.y == "1799") %>%
filter(Skill.y != "Child") %>%
filter(Gender == "Male") %>%
filter(Farm.y != "NA") %>%
group_by(Farm.y) %>%
summarize(Males = n())
gender_1799 <- gender_1799_females %>%
left_join(gender_1799_males, by = "Farm.y") %>%
mutate(Total = Females + Males) %>%
mutate(Percent_of_Male = Males/Total * 100) %>%
mutate(Percent_of_Female = Females/Total * 100) %>%
gather(gender, percent, Percent_of_Male:Percent_of_Female)
ggplot(data = gender_1799, aes(x = Farm.y, y = percent, fill = gender)) + geom_bar(position = position_dodge(), stat = "identity") + theme(axis.text.x=element_text(angle = 90, hjust = 0)) + ggtitle("Gender Ratio on Mount Vernon Farms in 1799")
The first observation to note is that every farm has a higher number of females than males, except Mansion House farm. This exception is due to the economy of Mount Vernon. Most of the tradesmen lived and worked on Mansion House farm, such as the carpenters, blacksmiths, and bricklayers. These jobs were mostly, if not all, held by men. The relatively high number of females on the four outlying farms makes sense in examining the increase in children on the farms.
This analysis is not complete nor as accurate as it could be, because the slavery database at Mount Vernon will not be finished for two years. This project does show the possibilities of using network analysis in R for kinship relations and from this initial exploration, the Mount Vernon enslaved community seems to follow the same pattern as other eighteenth-century Chesapeake plantations.
Using digital methodology, specifically programming in R, for this project allowed me to visualize the kinship network in a meaningful way and to make sense of the connections. Because over 800 relationships already exist for only thirteen years, scale is an important factor in considering this network analysis. I could not have created the same graphs or considered new research questions without the use of R’s network analysis.
Once the database is finished, it will include every slave, possibly from before Washington was born in 1732, to at least 1833 when the executor accounts stop paying to care for his freed slaves. That is at least one hundred years of slave genealogy and kinship relationships that will be available to study- a great resource. It will be fascinating to visualize the kinship network over that extended time in R and to analyze the family structures of the Mount Vernon enslaved community more conclusively. This project could additionally benefit from integrating D3.js in making the network graph interactive, especially for a public audience. It would be helpful to explore the individual family structures of the larger network through tool tips and to interactively view the change over time.