Bonus Post: Social Network Analysis with the Battles of A Song of Ice and Fire

[This article was first published on Deeply Trivial, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Network Analysis with A Song of Ice and Fire As promised, here’s the network analysis and graph from the Battles dataset I introduced in this post. I based on my code on code available in this post. First up, we’ll load the Battles dataset.

library(tidyverse)

## Warning: package 'tidyverse' was built under R version 3.4.4

## -- Attaching packages ----------------------------------------------------------- tidyverse 1.2.1 --

## v ggplot2 2.2.1     v purrr   0.2.4
## v tibble  1.4.2     v dplyr   0.7.4
## v tidyr   0.8.0     v stringr 1.2.0
## v readr   1.1.1     v forcats 0.2.0

## Warning: package 'tibble' was built under R version 3.4.4

## Warning: package 'tidyr' was built under R version 3.4.4

## Warning: package 'purrr' was built under R version 3.4.4

## -- Conflicts -------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Battles<-read_csv('https://raw.githubusercontent.com/chrisalbon/war_of_the_five_kings_dataset/master/5kings_battles_v1.csv')

## Parsed with column specification:
## cols(
##   .default = col_character(),
##   year = col_integer(),
##   battle_number = col_integer(),
##   major_death = col_integer(),
##   major_capture = col_integer(),
##   attacker_size = col_integer(),
##   defender_size = col_integer(),
##   summer = col_integer()
## )

## See spec(...) for full column specifications.

Next, we'll prepare our data for the network model, which involves extracting the attacker and defender kings, and labeling them as such.

attacker_king<-Battles %>%
  distinct(attacker_king) %>%
  rename(label=attacker_king)

defender_king<-Battles %>%
  distinct(defender_king) %>%
  rename(label=defender_king)

nodes<-full_join(attacker_king,defender_king,by="label")

nodes<-nodes %>% rowid_to_column("id")

Now we can create the object that will be used to create the figure. We want the figure to contain each of the kings, with lines between them indicating that they battled each other. The thickness of the line will be determined by the number of battles involving those kings.

per_battles<-Battles %>%
  group_by(attacker_king,defender_king) %>%
  summarise(weight=n()) %>%
  ungroup()

edges<-per_battles %>%
  left_join(nodes, by=c("attacker_king" = "label")) %>%
  rename(from=id)

edges<-edges %>%
  left_join(nodes,by=c("defender_king" = "label")) %>%
  rename(to=id)

edges<-select(edges,from,to,weight)

We have the data we need. Last step is to put it into a table used by the figure, which is created with ggraph.

library(tidygraph)

## Warning: package 'tidygraph' was built under R version 3.4.4

## 
## Attaching package: 'tidygraph'

## The following object is masked from 'package:stats':
## 
##     filter

library(ggraph)

## Warning: package 'ggraph' was built under R version 3.4.4

battles_tidy<-tbl_graph(nodes=nodes, edges=edges, directed=TRUE)
battles_tidy %>%
  activate(edges) %>%
  arrange(desc(weight))

## # A tbl_graph: 7 nodes and 14 edges
## #
## # A directed multigraph with 1 component
## #
## # Edge Data: 14 x 3 (active)
##    from    to weight
##   <int> <int>  <int>
## 1     1     2     10
## 2     2     1      9
## 3     3     2      4
## 4     3     1      2
## 5     1     4      2
## 6     4     1      2
## # ... with 8 more rows
## #
## # Node Data: 7 x 2
##      id label                   
##   <int> <chr>                   
## 1     1 Joffrey/Tommen Baratheon
## 2     2 Robb Stark              
## 3     3 Balon/Euron Greyjoy     
## # ... with 4 more rows

ggraph(battles_tidy, layout = "graphopt") +
  geom_node_point() +
  geom_edge_link(aes(width = weight), alpha = 0.8) +
  scale_edge_width(range = c(0.2, 2)) +
  geom_node_text(aes(label = label), repel = TRUE) +
  labs(edge_width = "Battles") +
  theme_graph()

Most of the battles in the dataset were between Joffrey/Tommen and Robb Stark. We have a blank spot in our figure; this refers to a handful of battles not involving kings, as well as one between Joffrey/Tommen and the Brave Companions. Here's the figure again, without the NAs.

To leave a comment for the author, please follow the link and comment on their blog: Deeply Trivial.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)