Hands_On_Ex05

Installing Packages

pacman::p_load(igraph, tidygraph, ggraph, 
               visNetwork, lubridate, clock,
               tidyverse, graphlayouts)

Importing data from Files

GAStech_nodes <- read_csv('data/GAStech_email_node.csv')
GAStech_edges <- read_csv("data/GAStech_email_edge-v2.csv")

Reviewing the imported Data

glimpse(GAStech_edges)
Rows: 9,063
Columns: 8
$ source      <dbl> 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 26, 26, 26…
$ target      <dbl> 41, 40, 51, 52, 53, 45, 44, 46, 48, 49, 47, 54, 27, 28, 29…
$ SentDate    <chr> "6/1/2014", "6/1/2014", "6/1/2014", "6/1/2014", "6/1/2014"…
$ SentTime    <time> 08:39:00, 08:39:00, 08:58:00, 08:58:00, 08:58:00, 08:58:0…
$ Subject     <chr> "GT-SeismicProcessorPro Bug Report", "GT-SeismicProcessorP…
$ MainSubject <chr> "Work related", "Work related", "Work related", "Work rela…
$ sourceLabel <chr> "Sven.Flecha", "Sven.Flecha", "Kanon.Herrero", "Kanon.Herr…
$ targetLabel <chr> "Isak.Baza", "Lucas.Alcazar", "Felix.Resumir", "Hideki.Coc…

Wrangling Time

GAStech_edges <- GAStech_edges %>%
  mutate(SendDate = dmy(SentDate)) %>%
  mutate(Weekday = wday(SentDate, label=TRUE, abbr=FALSE))
GAStech_edges_aggregated <- GAStech_edges %>%
  filter(MainSubject == "Work related") %>%
  group_by(source,target,Weekday) %>%
    summarise(Weight = n()) %>%
  filter(source!=target) %>%
  filter(Weight>1) %>%
  ungroup() 

Creating network objects using tidygarph

GAStech_graph <- tbl_graph(nodes = GAStech_nodes,
                           edges = GAStech_edges_aggregated, directed = TRUE)
GAStech_graph
# A tbl_graph: 54 nodes and 1372 edges
#
# A directed multigraph with 1 component
#
# A tibble: 54 × 4
     id label               Department     Title                                
  <dbl> <chr>               <chr>          <chr>                                
1     1 Mat.Bramar          Administration Assistant to CEO                     
2     2 Anda.Ribera         Administration Assistant to CFO                     
3     3 Rachel.Pantanal     Administration Assistant to CIO                     
4     4 Linda.Lagos         Administration Assistant to COO                     
5     5 Ruscella.Mies.Haber Administration Assistant to Engineering Group Manag…
6     6 Carla.Forluniau     Administration Assistant to IT Group Manager        
# ℹ 48 more rows
#
# A tibble: 1,372 × 4
   from    to Weekday Weight
  <int> <int> <ord>    <int>
1     1     2 Sunday       5
2     1     2 Monday       2
3     1     2 Tuesday      3
# ℹ 1,369 more rows
GAStech_graph %>% activate(edges) %>% arrange(desc(Weight))
# A tbl_graph: 54 nodes and 1372 edges
#
# A directed multigraph with 1 component
#
# A tibble: 1,372 × 4
   from    to Weekday  Weight
  <int> <int> <ord>     <int>
1    40    41 Saturday     13
2    41    43 Monday       11
3    35    31 Tuesday      10
4    40    41 Monday       10
5    40    43 Monday       10
6    36    32 Sunday        9
# ℹ 1,366 more rows
#
# A tibble: 54 × 4
     id label           Department     Title           
  <dbl> <chr>           <chr>          <chr>           
1     1 Mat.Bramar      Administration Assistant to CEO
2     2 Anda.Ribera     Administration Assistant to CFO
3     3 Rachel.Pantanal Administration Assistant to CIO
# ℹ 51 more rows
ggraph(GAStech_graph) + geom_edge_link() + geom_node_point()

g <- ggraph(GAStech_graph)+ geom_edge_link(aes()) + geom_node_point(aes())
g + theme_graph()

g <- ggraph(GAStech_graph)+ geom_edge_link(aes(color = 'white')) + geom_node_point(aes(color='white'))
g + theme_graph(background='black', text_colour = 'white')

g <- ggraph(GAStech_graph,
            layout = 'fr')+
  geom_edge_link(aes())+ geom_node_point(aes())
g + theme_graph()

g <- ggraph(GAStech_graph, layout="nicely")+
  geom_edge_link(aes())+
  geom_node_point(aes(color=Department, size=3))
g+theme_graph()

g <- ggraph(GAStech_graph, 
            layout = "nicely") +
  geom_edge_link(aes(width=Weight), 
                 alpha=0.2) +
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour = Department), 
                  size = 3)

g + theme_graph()

Working with facet_edges()

set_graph_style()
g <- ggraph(GAStech_graph,
            layout='nicely')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2) +
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=Department),
                  size=2)
g + facet_edges(~Weekday)

set_graph_style()
g <- ggraph(GAStech_graph,
            layout='nicely')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2) +
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=Department),
                  size=2)+
  theme(legend.position = 'bottom')

g + facet_edges(~Weekday)

set_graph_style()

g_2 <- ggraph(GAStech_graph,
            layout='nicely')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2)+
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=Department),
                  size=2)
g_2 + facet_edges(~Weekday)+
  th_foreground(foreground='lightblue',
                border=TRUE)+
  theme(legend.position = 'bottom')

set_graph_style()

g_2 <- ggraph(GAStech_graph,
            layout='nicely')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2)+
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=Department),
                  size=2)
g_2 + facet_nodes(~Department)+
  th_foreground(foreground='lightblue',
                border=TRUE)+
  theme(legend.position = 'bottom')

Network Metrics Analysis

Computing centrality indices

g <- GAStech_graph %>%
  mutate(betweenness_centrality = centrality_betweenness()) %>%
  ggraph(layout = 'fr')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2)+
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=Department,
                      size=betweenness_centrality))
g+theme_graph()

g <- GAStech_graph %>%
  ggraph(layout = "fr") + 
  geom_edge_link(aes(width=Weight), 
                 alpha=0.2) +
  scale_edge_width(range = c(0.1, 5)) +
  geom_node_point(aes(colour = Department, 
                      size = centrality_betweenness()))
g + theme_graph()

Visualising Community

g <- GAStech_graph %>%
  mutate(community=as.factor(group_edge_betweenness(weights=Weight,directed = TRUE))) %>%
  ggraph(layout='fr')+
  geom_edge_link(aes(width=Weight),
                 alpha=0.2)+
  scale_edge_width(range=c(0.1,5))+
  geom_node_point(aes(colour=community))
g+theme_graph()

Building Interactive Network Graph with visNetwork

Date Preparation

GAStech_edges_aggregated <- GAStech_edges %>%
  left_join(GAStech_nodes, by=c('sourceLabel'='label')) %>%
  rename(from=id) %>%
  left_join(GAStech_nodes, by=c('targetLabel'='label')) %>%
  rename(to = id) %>%
  filter(MainSubject=='Work related') %>%
  group_by(from,to) %>%
  summarise(weight=n()) %>%
  filter(from!=to) %>%
  filter(weight>1) %>%
  ungroup()

Plotting the first interactive network graph

visNetwork(GAStech_nodes,
           GAStech_edges_aggregated) %>%
  visIgraphLayout(layout='layout_with_fr')

Working with visual attributes - Nodes

GAStech_nodes <- GAStech_nodes %>%
  rename(group=Department)
visNetwork(GAStech_nodes,
           GAStech_edges_aggregated) %>%
  visIgraphLayout(layout='layout_with_fr') %>%
  visLegend() %>%
  visLayout(randomSeed = 123)

Working with visual attributes - Edges

visNetwork(GAStech_nodes,
           GAStech_edges_aggregated) %>%
  visIgraphLayout(layout = 'layout_with_fr') %>%
  visEdges(arrows = 'to',
           smooth = list(enables=TRUE,
                         type='curvedCW'))%>%
  visLegend() %>%
  visLayout(randomSeed=123)

Interactivity

visNetwork(GAStech_nodes,
           GAStech_edges_aggregated) %>%
  visIgraphLayout(layout='layout_with_fr') %>%
  visOptions(highlightNearest = TRUE,
             nodesIdSelection = TRUE) %>%
  visLegend() %>%
  visLayout(randomSeed = 22)