[1] "metadata" "connections"
The BBC’s The Traitors has thoroughly captured the public attention in the UK, or at at least me and my friends. I feel I cannot miss it or I will get spoilers!
The premise is as followed: a group of players is sent up to the Castle in Scotland where they compete for a monetary prize. They build up the prize by winning tasks. Yet, a small number of players are Traitors. They can murder Faithfuls in the group overnight. Every night before the Traitors meet, there is a roundtable discussion where the players discuss, accuse, and then vote put who they think is a Traitor. All is hosted by Claudia Winkleman in the UK.
Last week, the second series of the Celebrity Traitors began with the first two episodes being aired, drawing approximately 9 million viewers which is pretty good for modern standards. The original game involves strangers who have to judge if other players are telling the truth or lying about being faithful or a traitor. However the Celebrity version is different for several reasons:
They are playing for charity rather than their own pocket (however I suspect they get a rather nice appearance fee).
They know each other, or at the very least have met each other.
So I decided to piece together a network of who knows who, and maybe this will help me predict who will be the most influential or not in the castle though probably not! Sources for the network come from the BBC article and from the Tab. This is definitely a under-estimate of real-world relationships and no weighting between the different types. If I was to extend I would cross-reference IMBD with all Celebrities and then work out how long these relationships have been around for. Separately, I would also recommend the excellent video from Hannah Fry on her strategy, or Alan Turning’s, in the castle.
Celebrity Data
First I made a table of connections and information about each celebrity including their occupation. You can explore it here (and please let me know if there is anything to add!):
# A tibble: 28 × 4
PairA PairB `Link title` `Link description`
<chr> <chr> <chr> <chr>
1 Joe Lycett James Acaster Friends <NA>
2 Joe Lycett Rob Beckett TV show Last one laughing
3 Joe Lycett Joanne McNally Friends <NA>
4 Joanne McNally Romesh Ranganathan TV show Unacceptable
5 Romesh Ranganathan James Acaster Podcast <NA>
6 Maya Jama Romesh Ranganathan Podcast <NA>
7 Maya Jama James Blunt Award Show <NA>
8 Amol Rajan Michael Sheen Radio show Radio 2 Breakfast
9 Amol Rajan Joe Lycett Radio show Radio 2 Breakfast
10 Amol Rajan Romesh Ranganathan Radio show BBC Asian Network
# ℹ 18 more rows
# A tibble: 21 × 2
name occupation
<chr> <chr>
1 Joe Lycett Comedian
2 James Acaster Comedian
3 Joanne McNally Comedian
4 Miranda Hart Comedian, Actor
5 Rob Beckett Comedian
6 Romesh Ranganathan Comedian
7 Amol Rajan Journalist, Broadcaster
8 Bella Ramsey Actor
9 James Blunt Singer
10 Jerry Hall Model, Actor
# ℹ 11 more rows
Building a network from connection data
Okay cool we have data! Let’s change the connections into a network. The connection data is an edge list. There are two methods for this using base R and using igraph. One is very much simpler than the other! I show the first step of the base R version here where we begin to construct our adjacency matrix. A celebrity is a row and a column. If they have a connection to another celebrity you place a 1, otherwise a 0. It is a mirror image for the bottom half to the top.
celeb_adj_matrix <- matrix(0, nrow = 21, ncol = 21)
# assign names
rownames(celeb_adj_matrix) <- celeb_traitors_metadata$name
colnames(celeb_adj_matrix) <- celeb_traitors_metadata$name
# sneak peak of first three rows
head(celeb_adj_matrix, n = 3) Joe Lycett James Acaster Joanne McNally Miranda Hart Rob Beckett
Joe Lycett 0 0 0 0 0
James Acaster 0 0 0 0 0
Joanne McNally 0 0 0 0 0
Romesh Ranganathan Amol Rajan Bella Ramsey James Blunt
Joe Lycett 0 0 0 0
James Acaster 0 0 0 0
Joanne McNally 0 0 0 0
Jerry Hall Julie Hesmondhalgh Richard E. Grant King Kenny
Joe Lycett 0 0 0 0
James Acaster 0 0 0 0
Joanne McNally 0 0 0 0
Leigh-Anne Pinnock Maya Jama Michael Sheen Myha'la Hannah Fry
Joe Lycett 0 0 0 0 0
James Acaster 0 0 0 0 0
Joanne McNally 0 0 0 0 0
Ross Kemp Sebastian Croft Sharon Rooney
Joe Lycett 0 0 0
James Acaster 0 0 0
Joanne McNally 0 0 0
This has made a super sad matrix where no one is connected to anyone, no one has any friends. We then continue on.
g <- graph_from_data_frame(
as.matrix(celeb_traitors_connections[, c("PairA", "PairB")]),
directed = FALSE,
vertices = data.frame(name = celeb_traitors_metadata$name)
)
celeb_adj_matrix <- as_adjacency_matrix(g, sparse = FALSE)# Edge-list names to matrix positions
a <- match(celeb_traitors_connections$PairA, rownames(celeb_adj_matrix))
b <- match(celeb_traitors_connections$PairB, rownames(nodes))
# Add edges and make undirected so do opposite
celeb_adj_matrix[cbind(a, b)] <- 1
celeb_adj_matrix[cbind(b, a)] <- 1Now we have our celebrity adjacency matrix! Let’s test this has worked, as the lower and upper triangle of the adjacency matrix should be the same.
isSymmetric(celeb_adj_matrix)[1] TRUE
Great it is symmetrical. I made an initial plot using {ggraph}.
Code
graph <- as_tbl_graph(celeb_adj_matrix, directed = FALSE)
ggraph(graph) +
geom_node_point() +
geom_edge_bend() +
theme_void()Using "stress" as default layout

Looks very bendy! However… I do not know who is who as the nodes, the dots, are not labelled. So next, I need to add labels to each node.

Nice, That looks alright but the labels are not the clearest. let’s also add what type of connection there is between the celebrities. This requires adding data to each edge.
Code
# using tidygraph add the data of nodes and edges
graph <- graph %>%
activate(nodes) %>%
mutate(occupation = celeb_traitors_metadata$occupation) %>%
activate(edges) %>%
mutate(link_type = celeb_traitors_connections$"Link title",2)
ggraph(graph) +
geom_edge_bend(aes(colour = link_type)) +
geom_node_point(size = 2.5) +
geom_node_label(aes(label = name),
alpha = 0.7, colour = "black", fill = "white",
nudge_y = 0.1,vjust = -0.2,
label.padding = unit(0.15,"lines"), label.r = unit(0.25,"lines")) +
theme_void()Using "stress" as default layout

A little better, but the now the legend overlaps the graph! I want to tidy this up and try a different layout.
Code
ggraph(graph, layout = "nicely") +
geom_edge_bend(aes(colour = link_type)) +
geom_node_point(size = 2.5) +
geom_node_label(aes(label = name),
alpha = 0.7, colour = "black", fill = "white",
nudge_y = 0.1,vjust = -0.2, linewidth = 0,
label.padding = unit(0.15,"lines"), label.r = unit(0.25,"lines")) +
ggraph::scale_edge_colour_manual(values = prism_colour_pal(palette = "candy_soft")(8)) +
guides(edge_colour = guide_legend(title = "Link type", nrow = 2,
override.aes = list(shape = 16, size = 5))) +
theme_void() +
theme(
legend.position = "bottom",
legend.direction = "horizontal",
legend.title.position = "top",
legend.justification = "center",
legend.title = element_text(hjust = 0.5)
)
Hmmm. Looking at it I want to see how it would look with the connection type on the connections.
Code
ggraph(graph, layout = "nicely") +
geom_edge_arc(aes(colour = link_type, label = link_type),
strength = 0.2,
angle_calc = "along",
label_dodge = unit(2, "mm"), label_colour = NA, # use edge colour
label_size = 3,
show.legend = FALSE, check_overlap = TRUE) +
geom_node_point(size = 2.5) +
geom_node_label(aes(label = name),
alpha = 0.7, colour = "black", fill = "white",
nudge_y = 0.1,vjust = -0.2, linewidth = 0,
label.padding = unit(0.15,"lines"), label.r = unit(0.25,"lines")) +
ggraph::scale_edge_colour_manual(values = prism_colour_pal(palette = "candy_bright")(8)) +
guides(edge_colour = guide_legend(title = "Link type", nrow = 2,
override.aes = list(shape = 16, size = 5))) +
scale_x_continuous(expand = expansion(mult = 0.15)) +
scale_y_continuous(expand = expansion(mult = 0.15)) +
theme_void() +
theme(
legend.position = "bottom",
legend.direction = "horizontal",
legend.title.position = "top",
legend.justification = "center",
legend.title = element_text(hjust = 0.5)
)
Occupation: does what the celebrity do change where they are?
The tricky thing with occupation is some celebrities have multiple occupations. To visualise this I have added dots below each name. To prevent this becoming an overwhelming plot I have turn the edges/connections to black

Looking at the plot it seems like being a comedian is at the center of the network with actors very distributed. Again this is an approximate network.
So what? Who will be pivotal in this series?
So who will be pivotal in this series? There are three aspects I think we should consider: who has the most connections, who is the most central, and who acts as bridge between different parts of the network?
These can be answered by finding degree, eigenvector centrality and betweeness of each celeb.
Degree: who has the most connections?
degree
Romesh Ranganathan 8
Amol Rajan 6
Joe Lycett 5
Bella Ramsey 5
Maya Jama 5
James Acaster 4
James Blunt 4
Richard E. Grant 3
Joanne McNally 2
Rob Beckett 2
Julie Hesmondhalgh 2
Leigh-Anne Pinnock 2
Michael Sheen 2
Sebastian Croft 2
Miranda Hart 1
Jerry Hall 1
King Kenny 1
Ross Kemp 1
Myha'la 0
Hannah Fry 0
Sharon Rooney 0
The celebrity with the most connections is Romesh Ranganathan who has interviewed, been on a show or generally friends with 7 known celebrities in the Castle. Second is Amol Rajan a journalist and joint third is Joe Lycett, Bella Ramsey and Maya Jama.
I am a bit surprised that James Blunt is so well-connected, knowing 4 other celebrities, but not about James Acaster.
Eigenvector centrality: who is the most central individual?
eigenvector
Romesh Ranganathan 1.00
Maya Jama 0.80
James Acaster 0.75
Joe Lycett 0.72
Amol Rajan 0.68
Bella Ramsey 0.65
James Blunt 0.58
Joanne McNally 0.41
Rob Beckett 0.41
Leigh-Anne Pinnock 0.33
Julie Hesmondhalgh 0.29
King Kenny 0.24
Michael Sheen 0.23
Richard E. Grant 0.22
Sebastian Croft 0.21
Miranda Hart 0.16
Ross Kemp 0.16
Jerry Hall 0.05
Myha'la 0.00
Hannah Fry 0.00
Sharon Rooney 0.00
Eigenvector centrality is a measure of how central an individual is and is influenced by the number of connections a celebrity has but also who those celebrities are connected to. This pushes up Maya Jama in the list, with Romesh Ranganathan still at the top of the table.
Betweeness: who acts connects different celebrities?
betweenness
Romesh Ranganathan 0.31
Amol Rajan 0.23
Bella Ramsey 0.23
James Blunt 0.09
Richard E. Grant 0.08
Joe Lycett 0.06
Maya Jama 0.05
James Acaster 0.03
Julie Hesmondhalgh 0.02
Michael Sheen 0.01
Joanne McNally 0.00
Miranda Hart 0.00
Rob Beckett 0.00
Jerry Hall 0.00
King Kenny 0.00
Leigh-Anne Pinnock 0.00
Myha'la 0.00
Hannah Fry 0.00
Ross Kemp 0.00
Sebastian Croft 0.00
Sharon Rooney 0.00
Betweeness is technically a measure of how often an individual is inbetween paths beteen other individuals. It is a “bridge” measure of who is connecting different individuals in the network. Again Romesh is top, with Amol and Bella second. With betweeness scores of roughly ~0.2 this means these individuals are moderately good at connecting different areas of the network.
Conclusion

I think Romesh is the one to watch. He is the most embedded in the network across these three measures (though there are many network measures!). We will see who makes the final! and Though how embedded you are may not be an advantage, as if people do not know you, you may be able to influence them more (I am looking at you Sharon Rooney, Myhal’la and Hannah Fry). Conversely, if you are a traitor and people feel they know you as honest, then it may be in your favour. The others to watch, in my opinion, are Bella Ramsey, Maya Jama and Joe Lycett.
Let me know what you think of this rough analysis! It was a fun distraction from the DPhil. In the UK, it cna be watched on BBC One or iPlayer.

