library(tidyverse)
library(igraph)                    # This is the package to analyze the network
library(visNetwork)                # Creates visualizations of the network
library(DT)
library(plotly)

In this R notebook, I want to look at the communication networks between the terrorists known to have been involved in the 9/11 attacks. For this purpose, I will use libraries called visNetwork and igraph. One goal is to display this data in network diagrams.

  1. First, I will load the data sets into R.
terrorist_nodes <- read_csv("Sept11_nodes.csv")
Parsed with column specification:
cols(
  id = col_double(),
  name = col_character()
)
terrorist_links <- read_csv("Sept11_links.csv")
Parsed with column specification:
cols(
  from = col_double(),
  to = col_double()
)

The code below sets the stage for graphing the data.

terrorist_network <- graph_from_data_frame(terrorist_links, 
                                           vertices = terrorist_nodes, 
                                           directed = F)
  1. There is a mathematical procedure that produces a number which can be used to describe the “density” of the network. Sparing the finer details, the higher the number is, the more directly inter-connected all of the individual terrorists are. I will now tell R to calculate the density for us.
terrorist_network %>% 
  edge_density()
[1] 0.07985193
  1. Now I want to show a histogram of the distances (shortest paths between nodes, which each represent one of the terrorists) in the network.

The code below does the leg work.

terrorist_network %>% 
  distances() %>% 
  datatable()

And now this code actually creates the histogram.

terrorist_network %>% 
  distances() %>% 
  as.vector() %>%              # these two lines convert the distances matrix
  as_tibble() %>%              # to something plotly can graph
  plot_ly(x = ~value) %>% 
  add_histogram()

The histogram above shows us basically how many “hops” there are in between nodes (that is, between terrorists). Most of the terrorist are 3 hops away from each other.

  1. Now I want to find the legnth of the diameter of the network. This basically describes the longest number of “hops” between the two terrorists most distant from each other in the network.
terrorist_network %>% 
  get_diameter() %>% 
  length()
[1] 6
  1. In order to create the network diagrams, I have to add some columns to the data first. I use mutate code in R to do.

First, I will add a column called label. Yes, it creats a redundant column which just echoes the names of the terrorists again. But this is a necessary logisitical step, because it allows for the name of each terrorist to appear next to its corresponding node on the network diagram we will soon create.

terrorist_nodes <- terrorist_nodes %>% 
  mutate(label = name)

terrorist_nodes %>% 
  datatable()

Now I will add a column called title, the same way as before. This will allow for the eventual diagram to display the terrorist names when the user hovers over the nodes with their mouse. This is a nice touch.

terrorist_nodes <- terrorist_nodes %>%
  mutate(title = name)

terrorist_nodes

Now I want to prepare R to analyze the degrees in the terrorist network. Degree refers to the number of links per person.

terrorist_network %>%
  degree()

Next, I will add a column called degree.

terrorist_nodes <- terrorist_nodes %>%
  mutate(degree = degree(terrorist_network))


terrorist_nodes %>% 
  arrange(-degree) %>% 
  datatable()

Finally, I want to set the value to degree.

terrorist_nodes <- terrorist_nodes %>% 
  mutate(value = degree)
  1. Now I will add a column betweenness into the links data, and set it to value. Betweenness refers to the shortest paths that use a certain link.
terrorist_network %>% 
  edge_betweenness()
terrorist_links <- terrorist_links %>%
  mutate(betweenness = edge_betweenness(terrorist_network)) %>%
  mutate(value = betweenness)

terrorist_links
  1. Now I will create the long-awaited network diagram, complete with a drop-down menu with various options.
visNetwork(terrorist_nodes, 
           terrorist_links, 
           main = "Network of Terrorists involved in the 9/11 Terrorist Attacks") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visOptions(highlightNearest = T, nodesIdSelection = T)
  1. Finally, I want to visualize some communities occuring in the terrorist network data. Communities are groups of individuals that have many connections between them. The long chain of R code below sets the stage.
terrorist_network %>% 
  infomap.community()
terrorist_network %>% 
  infomap.community() %>% 
  membership()
terrorist_nodes <- terrorist_nodes %>% 
  mutate(group = membership(infomap.community(terrorist_network)))

terrorist_nodes %>% 
  datatable()

At last, now comes the code to display color network diagram of various communities, with a drop-down menu to select each group or individual terrorist.

visNetwork(terrorist_nodes, 
           terrorist_links, 
           main = "Network of Terrorists involved in the 9/11 terrorist attacks") %>% 
  visIgraphLayout(layout = "layout_nicely") %>% 
  visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")

NA
LS0tCnRpdGxlOiAiVGVycm9yaXN0IE5ldHdvcmsgQW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpZ3JhcGgpICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIHBhY2thZ2UgdG8gYW5hbHl6ZSB0aGUgbmV0d29yawpsaWJyYXJ5KHZpc05ldHdvcmspICAgICAgICAgICAgICAgICMgQ3JlYXRlcyB2aXN1YWxpemF0aW9ucyBvZiB0aGUgbmV0d29yawpsaWJyYXJ5KERUKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgpJbiB0aGlzIFIgbm90ZWJvb2ssIEkgd2FudCB0byBsb29rIGF0IHRoZSBjb21tdW5pY2F0aW9uIG5ldHdvcmtzIGJldHdlZW4gdGhlIHRlcnJvcmlzdHMga25vd24gdG8gaGF2ZSBiZWVuIGludm9sdmVkIGluIHRoZSA5LzExIGF0dGFja3MuIEZvciB0aGlzIHB1cnBvc2UsIEkgd2lsbCB1c2UgbGlicmFyaWVzIGNhbGxlZCB2aXNOZXR3b3JrIGFuZCBpZ3JhcGguIE9uZSBnb2FsIGlzIHRvIGRpc3BsYXkgdGhpcyBkYXRhIGluIG5ldHdvcmsgZGlhZ3JhbXMuIAoKCjEuIEZpcnN0LCBJIHdpbGwgbG9hZCB0aGUgZGF0YSBzZXRzIGludG8gUi4gCgpgYGB7cn0KdGVycm9yaXN0X25vZGVzIDwtIHJlYWRfY3N2KCJTZXB0MTFfbm9kZXMuY3N2IikKdGVycm9yaXN0X2xpbmtzIDwtIHJlYWRfY3N2KCJTZXB0MTFfbGlua3MuY3N2IikKYGBgCgpUaGUgY29kZSBiZWxvdyBzZXRzIHRoZSBzdGFnZSBmb3IgZ3JhcGhpbmcgdGhlIGRhdGEuIAoKYGBge3J9CnRlcnJvcmlzdF9uZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSh0ZXJyb3Jpc3RfbGlua3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXMgPSB0ZXJyb3Jpc3Rfbm9kZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0ZWQgPSBGKQoKYGBgCgoKMi4gVGhlcmUgaXMgYSBtYXRoZW1hdGljYWwgcHJvY2VkdXJlIHRoYXQgcHJvZHVjZXMgYSBudW1iZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlICJkZW5zaXR5IiBvZiB0aGUgbmV0d29yay4gU3BhcmluZyB0aGUgZmluZXIgZGV0YWlscywgdGhlIGhpZ2hlciB0aGUgbnVtYmVyIGlzLCB0aGUgbW9yZSBkaXJlY3RseSBpbnRlci1jb25uZWN0ZWQgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIHRlcnJvcmlzdHMgYXJlLiBJIHdpbGwgbm93IHRlbGwgUiB0byBjYWxjdWxhdGUgdGhlIGRlbnNpdHkgZm9yIHVzLiAgIAoKYGBge3J9CnRlcnJvcmlzdF9uZXR3b3JrICU+JSAKICBlZGdlX2RlbnNpdHkoKQpgYGAKCgozLiBOb3cgSSB3YW50IHRvIHNob3cgYSBoaXN0b2dyYW0gb2YgdGhlIGRpc3RhbmNlcyAoc2hvcnRlc3QgcGF0aHMgYmV0d2VlbiBub2Rlcywgd2hpY2ggZWFjaCByZXByZXNlbnQgb25lIG9mIHRoZSB0ZXJyb3Jpc3RzKSBpbiB0aGUgbmV0d29yay4gCgpUaGUgY29kZSBiZWxvdyBkb2VzIHRoZSBsZWcgd29yay4gCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGRpc3RhbmNlcygpICU+JSAKICBkYXRhdGFibGUoKQpgYGAKCkFuZCBub3cgdGhpcyBjb2RlIGFjdHVhbGx5IGNyZWF0ZXMgdGhlIGhpc3RvZ3JhbS4gCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGRpc3RhbmNlcygpICU+JSAKICBhcy52ZWN0b3IoKSAlPiUgICAgICAgICAgICAgICMgdGhlc2UgdHdvIGxpbmVzIGNvbnZlcnQgdGhlIGRpc3RhbmNlcyBtYXRyaXgKICBhc190aWJibGUoKSAlPiUgICAgICAgICAgICAgICMgdG8gc29tZXRoaW5nIHBsb3RseSBjYW4gZ3JhcGgKICBwbG90X2x5KHggPSB+dmFsdWUpICU+JSAKICBhZGRfaGlzdG9ncmFtKCkKYGBgCgpUaGUgaGlzdG9ncmFtIGFib3ZlIHNob3dzIHVzIGJhc2ljYWxseSBob3cgbWFueSAiaG9wcyIgdGhlcmUgYXJlIGluIGJldHdlZW4gbm9kZXMgKHRoYXQgaXMsIGJldHdlZW4gdGVycm9yaXN0cykuIE1vc3Qgb2YgdGhlIHRlcnJvcmlzdCBhcmUgMyBob3BzIGF3YXkgZnJvbSBlYWNoIG90aGVyLiAKCgo0LiBOb3cgSSB3YW50IHRvIGZpbmQgdGhlIGxlZ250aCBvZiB0aGUgZGlhbWV0ZXIgb2YgdGhlIG5ldHdvcmsuIFRoaXMgYmFzaWNhbGx5IGRlc2NyaWJlcyB0aGUgbG9uZ2VzdCBudW1iZXIgb2YgImhvcHMiIGJldHdlZW4gdGhlIHR3byB0ZXJyb3Jpc3RzIG1vc3QgZGlzdGFudCBmcm9tIGVhY2ggb3RoZXIgaW4gdGhlIG5ldHdvcmsuICAgCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGdldF9kaWFtZXRlcigpICU+JSAKICBsZW5ndGgoKQpgYGAKCgo1LiBJbiBvcmRlciB0byBjcmVhdGUgdGhlIG5ldHdvcmsgZGlhZ3JhbXMsIEkgaGF2ZSB0byBhZGQgc29tZSBjb2x1bW5zIHRvIHRoZSBkYXRhIGZpcnN0LiBJIHVzZSBtdXRhdGUgY29kZSBpbiBSIHRvIGRvLiAKCkZpcnN0LCBJIHdpbGwgYWRkIGEgY29sdW1uIGNhbGxlZCBsYWJlbC4gWWVzLCBpdCBjcmVhdHMgYSByZWR1bmRhbnQgY29sdW1uIHdoaWNoIGp1c3QgZWNob2VzIHRoZSBuYW1lcyBvZiB0aGUgdGVycm9yaXN0cyBhZ2Fpbi4gQnV0IHRoaXMgaXMgYSBuZWNlc3NhcnkgbG9naXNpdGljYWwgc3RlcCwgYmVjYXVzZSBpdCBhbGxvd3MgZm9yIHRoZSBuYW1lIG9mIGVhY2ggdGVycm9yaXN0IHRvIGFwcGVhciBuZXh0IHRvIGl0cyBjb3JyZXNwb25kaW5nIG5vZGUgb24gdGhlIG5ldHdvcmsgZGlhZ3JhbSB3ZSB3aWxsIHNvb24gY3JlYXRlLiAKCmBgYHtyfQp0ZXJyb3Jpc3Rfbm9kZXMgPC0gdGVycm9yaXN0X25vZGVzICU+JSAKICBtdXRhdGUobGFiZWwgPSBuYW1lKQoKdGVycm9yaXN0X25vZGVzICU+JSAKICBkYXRhdGFibGUoKQpgYGAKCk5vdyBJIHdpbGwgYWRkIGEgY29sdW1uIGNhbGxlZCB0aXRsZSwgdGhlIHNhbWUgd2F5IGFzIGJlZm9yZS4gVGhpcyB3aWxsIGFsbG93IGZvciB0aGUgZXZlbnR1YWwgZGlhZ3JhbSB0byBkaXNwbGF5IHRoZSB0ZXJyb3Jpc3QgbmFtZXMgd2hlbiB0aGUgdXNlciBob3ZlcnMgb3ZlciB0aGUgbm9kZXMgd2l0aCB0aGVpciBtb3VzZS4gVGhpcyBpcyBhIG5pY2UgdG91Y2guIAoKYGBge3J9CnRlcnJvcmlzdF9ub2RlcyA8LSB0ZXJyb3Jpc3Rfbm9kZXMgJT4lCiAgbXV0YXRlKHRpdGxlID0gbmFtZSkKCnRlcnJvcmlzdF9ub2RlcwpgYGAKCk5vdyBJIHdhbnQgdG8gcHJlcGFyZSBSIHRvIGFuYWx5emUgdGhlIGRlZ3JlZXMgaW4gdGhlIHRlcnJvcmlzdCBuZXR3b3JrLiBEZWdyZWUgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgbGlua3MgcGVyIHBlcnNvbi4gCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lCiAgZGVncmVlKCkKYGBgCgpOZXh0LCBJIHdpbGwgYWRkIGEgY29sdW1uIGNhbGxlZCBkZWdyZWUuCgpgYGB7cn0KdGVycm9yaXN0X25vZGVzIDwtIHRlcnJvcmlzdF9ub2RlcyAlPiUKICBtdXRhdGUoZGVncmVlID0gZGVncmVlKHRlcnJvcmlzdF9uZXR3b3JrKSkKCgp0ZXJyb3Jpc3Rfbm9kZXMgJT4lIAogIGFycmFuZ2UoLWRlZ3JlZSkgJT4lIAogIGRhdGF0YWJsZSgpCmBgYAoKRmluYWxseSwgSSB3YW50IHRvIHNldCB0aGUgdmFsdWUgdG8gZGVncmVlLiAKCmBgYHtyfQp0ZXJyb3Jpc3Rfbm9kZXMgPC0gdGVycm9yaXN0X25vZGVzICU+JSAKICBtdXRhdGUodmFsdWUgPSBkZWdyZWUpCmBgYAoKCjYuIE5vdyBJIHdpbGwgYWRkIGEgY29sdW1uIGJldHdlZW5uZXNzIGludG8gdGhlIGxpbmtzIGRhdGEsIGFuZCBzZXQgaXQgdG8gdmFsdWUuIEJldHdlZW5uZXNzIHJlZmVycyB0byB0aGUgc2hvcnRlc3QgcGF0aHMgdGhhdCB1c2UgYSBjZXJ0YWluIGxpbmsuCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGVkZ2VfYmV0d2Vlbm5lc3MoKQoKYGBgCgpgYGB7cn0KdGVycm9yaXN0X2xpbmtzIDwtIHRlcnJvcmlzdF9saW5rcyAlPiUKICBtdXRhdGUoYmV0d2Vlbm5lc3MgPSBlZGdlX2JldHdlZW5uZXNzKHRlcnJvcmlzdF9uZXR3b3JrKSkgJT4lCiAgbXV0YXRlKHZhbHVlID0gYmV0d2Vlbm5lc3MpCgp0ZXJyb3Jpc3RfbGlua3MKYGBgCgoKNy4gTm93IEkgd2lsbCBjcmVhdGUgdGhlIGxvbmctYXdhaXRlZCBuZXR3b3JrIGRpYWdyYW0sIGNvbXBsZXRlIHdpdGggYSBkcm9wLWRvd24gbWVudSB3aXRoIHZhcmlvdXMgb3B0aW9ucy4gCgpgYGB7cn0KdmlzTmV0d29yayh0ZXJyb3Jpc3Rfbm9kZXMsIAogICAgICAgICAgIHRlcnJvcmlzdF9saW5rcywgCiAgICAgICAgICAgbWFpbiA9ICJOZXR3b3JrIG9mIFRlcnJvcmlzdHMgaW52b2x2ZWQgaW4gdGhlIDkvMTEgVGVycm9yaXN0IEF0dGFja3MiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IFQsIG5vZGVzSWRTZWxlY3Rpb24gPSBUKQpgYGAKCjguIEZpbmFsbHksIEkgd2FudCB0byB2aXN1YWxpemUgc29tZSBjb21tdW5pdGllcyBvY2N1cmluZyBpbiB0aGUgdGVycm9yaXN0IG5ldHdvcmsgZGF0YS4gQ29tbXVuaXRpZXMgYXJlIGdyb3VwcyBvZiBpbmRpdmlkdWFscyB0aGF0IGhhdmUgbWFueSBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZW0uIFRoZSBsb25nIGNoYWluIG9mIFIgY29kZSBiZWxvdyBzZXRzIHRoZSBzdGFnZS4gCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGluZm9tYXAuY29tbXVuaXR5KCkKYGBgCgpgYGB7cn0KdGVycm9yaXN0X25ldHdvcmsgJT4lIAogIGluZm9tYXAuY29tbXVuaXR5KCkgJT4lIAogIG1lbWJlcnNoaXAoKQpgYGAKCmBgYHtyfQp0ZXJyb3Jpc3Rfbm9kZXMgPC0gdGVycm9yaXN0X25vZGVzICU+JSAKICBtdXRhdGUoZ3JvdXAgPSBtZW1iZXJzaGlwKGluZm9tYXAuY29tbXVuaXR5KHRlcnJvcmlzdF9uZXR3b3JrKSkpCgp0ZXJyb3Jpc3Rfbm9kZXMgJT4lIAogIGRhdGF0YWJsZSgpCgpgYGAKCkF0IGxhc3QsIG5vdyBjb21lcyB0aGUgY29kZSB0byBkaXNwbGF5IGNvbG9yIG5ldHdvcmsgZGlhZ3JhbSBvZiB2YXJpb3VzIGNvbW11bml0aWVzLCB3aXRoIGEgZHJvcC1kb3duIG1lbnUgdG8gc2VsZWN0IGVhY2ggZ3JvdXAgb3IgaW5kaXZpZHVhbCB0ZXJyb3Jpc3QuIAoKYGBge3J9CnZpc05ldHdvcmsodGVycm9yaXN0X25vZGVzLCAKICAgICAgICAgICB0ZXJyb3Jpc3RfbGlua3MsIAogICAgICAgICAgIG1haW4gPSAiTmV0d29yayBvZiBUZXJyb3Jpc3RzIGludm9sdmVkIGluIHRoZSA5LzExIHRlcnJvcmlzdCBhdHRhY2tzIikgJT4lIAogIHZpc0lncmFwaExheW91dChsYXlvdXQgPSAibGF5b3V0X25pY2VseSIpICU+JSAKICB2aXNPcHRpb25zKGhpZ2hsaWdodE5lYXJlc3QgPSBULCBub2Rlc0lkU2VsZWN0aW9uID0gVCwgc2VsZWN0ZWRCeSA9ICJncm91cCIpCgpgYGA=