Who matters, how far apart we are, and what breaks when they're gone
Four ways to ask "who's important," a general shortest-path explorer, a node-removal
fragmentation test, and the tightest cliques in the network — every number checked against a
degree-preserving-shuffle null before it gets to call itself a finding.
"Important" is not one thing. A character can be important because a lot of other characters
link to them, because they sit close to everyone else, because they're the bridge that holds
two otherwise-unconnected parts of the story together, or because the important
characters happen to be the ones linking to them. Those are four different, precisely defined
questions — and on this network they don't always agree on an answer.
Everything below runs on the same 303-character, 1,784-edge frozen snapshot from
data/week1/ that Week 1 and Week 2 used. No new data, no team or decade labels —
just paths, four centrality measures plus PageRank, degree-preserving-shuffle null models,
node removal, and maximal cliques, computed offline in
analysis/build_week3.py and loaded frozen from
data/week3/week3_summary.json. The three big interactives below recompute nothing
expensive live — they look numbers up and draw them; the one live computation left in the
browser is the shortest-path search in the Six Degrees explorer, which is cheap enough to run
per click.
Five measures, five different definitions of "matters." Switch between them below — the
ranking changes every time, because each one is answering a different question. Every
measure can be computed on two graphs: the undirected giant component
(277 characters, treating a link either direction as a connection) and the
full directed network (303 characters, following Wikipedia's links
exactly as written). Use the Measure and Scope switches together to compare.
Measure
Undirected giant component
Scope
The top 15 by the selected measure, on the left; the same characters sized and colored on the
network, on the right (the rest of the 277-character giant component sits dim in the
background so the shape stays stable across measures). Click a name — in the list or on the
network — to inspect that character, including a null-model comparison where one was computed.
Click a character above to inspect their numbers.
Values computed once, offline, in analysis/build_week3.py — every measure in
both scopes with NetworkX: undirected variants on the giant component, directed variants
on the full graph (degree as in+out total, closeness/harmonic following arrows outward),
PageRank (α = 0.85) both ways — and loaded frozen from
data/week3/week3_summary.json.
Directed vs. undirected: it depends which way you look
Wikipedia links have a direction, and treating the network as undirected throws that away.
Spider-Man's article is linked from 106 other characters' pages but itself links
out to only — a huge asymmetry that
changes the answer once "importance" has to follow arrows.
Recomputing betweenness with arrows respected — a shortest path only counts if it can actually
be walked in the link direction — reshuffles the ranking. Wolverine and Hercules both move
ahead of Spider-Man:
PageRank surfaces characters outside the in-degree top 10
That second list is PageRank's actual mechanism showing through: Spider-Man links out to only
characters, so each one inherits an
unusually large slice of his vote — which is how characters like Black Cat and Mayday Parker
outrank characters with a higher raw in-degree.
Reading this right: neither ranking is "more correct" — they're answers to
different questions. Undirected betweenness asks who bridges the story treating every mention
as mutual; directed betweenness asks who bridges it exactly as written, link by link.
Pick any two characters from the 277-character giant component (the other 26 sit outside it —
see Week 1) and find the shortest chain between them. Switch between treating links as mutual
or following them exactly as written; the two modes can disagree, including about whether a
path exists at all.
From
To
Mode
Treat connections as mutual when finding paths.
Click a node to set "From"; right-click a node to set "To".
The network below colors every character by BFS distance from the source (0, 1, 2, 3…); once a
target is chosen, the shortest path between them animates in and the rest of the network fades
back. Everything here is computed live in your browser from the raw Week 1 edge list — a
single BFS on a 277-node graph is effectively instant.
Choose a source character above.
Character list, positions and adjacency all come from data/week1/; the layout
coordinates come from the same seeded spring_layout precomputed in
analysis/build_week3.py that every network view on this page reuses, so the shape
stays stable as you explore.
High centrality and structural importance aren't automatically the same thing — a character
can rack up connections without their removal actually breaking anything. To test it directly:
remove characters one at a time, in order of degree, in order of betweenness, or at random, and
watch the giant component shrink.
Removal strategy
Playback
removed =0
Precomputed offline for every strategy, all 277 removal steps — the browser only plays the
numbers back and redraws. The chart shows all three strategies at once for comparison; the
network shows the currently-selected strategy, with removed characters faded out.
Removal orders and the resulting giant-component size at every step come from
fragmentation in data/week3/week3_summary.json, computed once offline.
Interactive game · same 303-character network
A clique is a group where everyone is directly connected to everyone else —
for k members, that's k(k−1)/2 links, all of them present. A maximal
clique is one that can't be grown any further: no other character is connected to every single
member. NetworkX's find_cliques() only ever returns maximal cliques, so picking
"4-cliques" below means groups that max out at exactly 4 — never a 4-member slice carved out of
a bigger group (a slice like that could always be grown back, so it would never come back as
its own maximal clique).
Clique size
Every maximal clique of the selected size is highlighted at once, in the same color; hover or
click one in the list to bring just that clique forward. The rest of the giant component stays
visible, dimmed, for context.
Hover or click a clique to see its members.
Maximal cliques enumerated once offline with networkx.find_cliques() on the
undirected giant component, stored in data/week3/week3_summary.json.
Degree, closeness, harmonic and betweenness agree on a core of seven characters in all four
top-10s (Spider-Man, Hulk, Wolverine, Doctor Strange, Deadpool, She-Hulk, Phoenix) — but
disagree below that, and diverge sharply once direction is respected: Wolverine and Hercules
both out-rank Spider-Man on directed betweenness.
Against 200 degree-preserving shuffles, Spider-Man's betweenness (z ≈ 3.7)
and Hercules's (z ≈ 3.5) both sit meaningfully above what their degree alone
predicts — genuine brokers, not degree artifacts. Rockman's near-identical betweenness,
by contrast, lands almost exactly on the shuffle mean (z ≈ 0): it's fully
explained by sitting between one well-connected neighbor and one degree-1 pendant, a
structural fact about that shape that survives literally any degree-preserving rewiring.
Removing Spider-Man alone — the top character by both degree and betweenness — fragments
the giant component more than removing anyone else, confirming the two rankings agree on the
single biggest structural point of failure here. But the effect is modest: 277 characters
drop to 271, a 2% shrink, with only 13 articulation points in the whole giant component. This
network does not hinge on one hub the way its centrality numbers alone might suggest.
The largest cliques are all 8-member, all drawn from the same X-Men-associated core
(Betsy Braddock, Cyclops, Emma Frost, Jean Grey, Rachel Summers, Wolverine common to every
one) — a real, nameable team, visible from the character names alone without needing any
team-affiliation data this dataset doesn't have.
Interpretation:
Different centrality measures are not competing estimates of one true "importance" — they are
different, equally valid questions, and a network with a heavy-tailed degree distribution will
always show large disagreements between them precisely where that distribution is most extreme
(its handful of hubs). Directedness is not a footnote here: it changes who counts as a broker,
because Wikipedia's own linking behavior is itself asymmetric (see Spider-Man's 9 outgoing
links against 106 incoming).
Limitations:
This is still a citation network built from one encyclopedia's editorial choices, not the
comics' actual social structure — an untouched hero with a short article will always look
structurally unimportant here regardless of their role in the fiction.
Null-model z-scores test against a degree-preserving shuffle specifically — they say a
value is unusual given the degree sequence, not unusual in any absolute sense, and a
heavy-tailed degree sequence already constrains how assortative or disassortative the network
could possibly be.
No team or decade attribute data was added for this analysis — the clique section's "X-Men"
label is a read of the character names, not a tested homophily claim.
📎 Reproducing this: every number above comes from analysis/build_week3.py, run
against the same frozen data/week1/ Week 1 and Week 2 use, writing
data/week3/week3_summary.json. The centrality, fragmentation and clique
interactives read that file directly; the Six Degrees explorer is the one piece that
recomputes live, straight from the raw edge list, since it has to answer an arbitrary
character pair chosen in the browser.