Skip to content
VibeFormer
42 min

Network Analysis & Computational Thinking

How to actually do network analysis: nodes, the four centrality measures, community detection, and the co-bidding graph that finds a cartel. Plus the trap that invalidates most of it, and the habit of mind underneath.

Listen

0. Why this chapter

Network analysis is named in three places at once: as a technique agencies use, as one of Schrepel's three stated specialisms, and as the natural method for cartel detection. It is also the one technique where you can describe a concrete method without claiming to have built it.

1. The vocabulary, with a worked graph

TermPlain meaningIn a co-bidding graph
Node (vertex)A thingA firm
EdgeA relationship between two things*These two firms bid for the same tender*
Weighted edgeThe relationship has a strength*They co-bid 47 times*
Directed edgeThe relationship has a direction*A owns B* — ownership is directed, co-bidding is not
DegreeHow many edges a node hasHow many distinct firms this one has competed against
NeighbourhoodThe nodes one step awayThis firm's direct competitors
Path / shortest pathA route along edges; the shortest such routeHow many co-bidding steps separate two firms
ComponentA group where everyone is reachable from everyone, with no edges to outsideA regionally separated market — or a market-sharing agreement
CliqueA group where *every* member is connected to *every* otherThe shape a closed bidding ring makes
Bipartite graphTwo kinds of node, edges only between kinds, never withinFirms on one side, tenders on the other. This is what procurement data actually is
Adjacency matrixA table with nodes as rows and columns, and a 1 (or a weight) where an edge existsAn n-by-n grid. Mostly zeros, so stored sparse

One small graph, used for the rest of the chapter

Three features to notice, because they are the three things you look for in real data: a dense core where everyone bids against everyone, a separate component that may be a distinct market or a divided one, and a single node whose removal disconnects part of the graph. Each maps to a different theory of harm.

2. The four centrality measures — and they mean different things

*Central* is ambiguous, and the four standard measures answer four different questions. Choosing the wrong one is the most common error in applied network analysis, because they often rank nodes quite differently.

Cdeg(v)=deg⁡(v)n−1C_{\text{deg}}(v) = \frac{\deg(v)}{n-1}
Degree centrality is a node's number of connections, divided by the number of other nodes.The simplest: how many people you are connected to, scaled to sit between 0 and 1. In the worked graph Civic and Echo both score 4 over 7, about 0.57. Answers: who is busiest. Cheap to compute and often enough. Its blind spot: it treats all connections as equally valuable.
Cbtw(v)=∑s≠v≠tσst(v)σstC_{\text{btw}}(v) = \sum_{s \neq v \neq t} \frac{\sigma_{st}(v)}{\sigma_{st}}
Betweenness centrality sums, over every pair of other nodes, the fraction of shortest paths between that pair which run through this node.How often you sit on the route between other people. Sigma-s-t is the number of shortest paths from s to t; the numerator is how many of those pass through v. Answers: who is a broker or bottleneck. In the worked graph Echo has high betweenness because every path to Nadir goes through it. This is the measure that finds the hub in a hub-and-spoke cartel, and it is frequently the most legally interesting one — a broker can be central without being busy.
Cclo(v)=n−1∑u≠vd(v,u)C_{\text{clo}}(v) = \frac{n-1}{\sum_{u \neq v} d(v,u)}
Closeness centrality is the number of other nodes divided by the sum of the shortest-path distances from this node to all of them.How near you are to everyone else on average. High closeness means information or coordination reaches you quickly. Answers: who is well placed to coordinate. Caution: it is undefined or misleading across disconnected components, because the distance to an unreachable node is infinite — so compute it per component, which is the kind of detail that separates someone who has run this from someone who has read about it.
Ceig(v)=1λ∑u∈N(v)Ceig(u)C_{\text{eig}}(v) = \frac{1}{\lambda}\sum_{u \in \mathcal{N}(v)} C_{\text{eig}}(u)
Eigenvector centrality says a node's score is proportional to the sum of its neighbours' scores.Recursive: you are important if you are connected to important people. Formally it is the leading eigenvector of the adjacency matrix. PageRank is a variant with a damping factor that makes it behave on directed graphs. Answers: who is connected to the well-connected. A firm with three connections to the dense core can outrank one with ten connections to isolated firms. Note it is the only one of the four that is self-referential, which is why it needs linear algebra rather than counting.

3. Density, clustering and community detection

density=2mn(n−1)C(v)=2 ∣{edges among v’s neighbours}∣deg⁡(v) (deg⁡(v)−1)\text{density} = \frac{2m}{n(n-1)} \qquad\qquad C(v) = \frac{2 \, |\{\text{edges among } v\text{'s neighbours}\}|}{\deg(v)\,(\deg(v)-1)}
Density is twice the number of edges divided by the number of possible pairs. The local clustering coefficient of a node is the fraction of pairs among its neighbours that are themselves connected.Density: what share of all possible relationships actually exist. n(n−1)/2 is the number of possible pairs, so this runs from 0 to 1. Clustering coefficient: do your contacts know each other? If a firm's three competitors all also compete with each other, its clustering coefficient is 1. High clustering is the signature of a closed group — and it is also the measure that the trap in section 5 silently inflates.
Q=∑c[mcm−(dc2m)2]Q = \sum_{c} \left[ \frac{m_c}{m} - \left(\frac{d_c}{2m}\right)^{2} \right]
Modularity sums, over each detected community, the share of edges inside that community minus the share you would expect if edges were placed at random given the same node degrees.The subtraction is the whole idea. Any partition puts *some* edges inside groups; modularity asks whether it puts in more than chance would, holding degrees fixed. Roughly, Q above about 0.3 suggests real community structure. Louvain and Leiden are the standard algorithms that search for the partition maximising Q — Leiden is the better-behaved one. Its known weakness is a resolution limit: it can miss communities smaller than a certain size relative to the graph, which matters because a three-firm cartel in a large market is exactly that case.
MethodWhat it findsThe cartel shape it maps to
Connected componentsGroups with no edges at all to the outsideMarket sharing — firms that never compete across a boundary. Also just separate geographic markets, which is why this one needs context
Clique detectionGroups where every member is connected to every otherA closed bidding ring. The purest signal, and rare in raw form
k-core decompositionThe subgraph where every node has at least k connections *within* it. Peels the periphery awayExcellent first pass — it strips out the one-off bidders and leaves the persistent core. Cheap and interpretable
Louvain / Leiden modularityPartitions maximising internal against expected edgesSector or regional structure usually dominates, so this finds markets before it finds cartels. Useful as the thing you must control for
Structural holes / brokerageNodes bridging otherwise unconnected groupsHub-and-spoke coordination, and the natural companion to betweenness

4. How you would actually do it, start to finish

The pipeline, with the decision points marked

Steps 5 and 6 are what separate analysis from storytelling. Any real network has dense clusters and high-betweenness nodes; the question is whether it has *more* than a random graph with the same degrees would. Without a null model and without controlling for sector and geography, every finding is unfalsifiable.

5. The trap that invalidates most of this — and three others

TrapWhy it bitesWhat to do
Co-bidding is not collusionFirms in the same sector, size class and region co-bid constantly for entirely innocent reasons. The base rate of co-bidding among genuine competitors is very highCompare within sector-and-region strata, or include them in a model. An unconditional co-bidding network mostly recovers market structure, not conspiracy
The edge definition is the findingCo-bid once, or five times? Within a year, or ever? Per lot or per tender? Each choice yields a different graph and a different set of suspicious firmsState the definition, and report how the conclusion changes under alternatives. That sensitivity analysis is the same move as the market-definition point in the economic law chapter
Missing data distorts structure far more than it distorts averagesA firm absent from the data looks like a firm with no relationships. In a network, a missing node can create an apparent structural hole or break a real cluster — the error is not random noise, it changes topologyKnow the coverage of your source. Procurement data below threshold values is often simply not published, which systematically removes small firms
Guilt by associationA relational model scores a firm partly on who it is connected to, so a firm with no suspicious conduct of its own can be flagged by its neighbourhoodThis is Wisman's objection and it is the right one. It is close to what the UN Special Rapporteur criticised about SyRI — targeting by neighbourhood without individual suspicion. And the counterfactual explanation breaks: *had your turnover been lower* is actionable; *had your competitors been differently connected to each other* is not

6. Computational thinking — the habit underneath all of it

The phrase gets used loosely. It has a conventional four-part definition, and then a version adapted to what you would actually be doing — which is more useful.

The standard fourWhat it meansOn a cartel screen
DecompositionBreak a problem into parts you can solve separately*Detect bid rigging* becomes: assemble the data, define a relationship, find candidate groups, test against chance, control confounders, triangulate with prices
Pattern recognitionNotice that this problem has the shape of one you already knowRotation is a sequence problem. Co-bidding is a graph problem. Bid spread is a distribution problem. Recognising which shape determines the tool
AbstractionStrip away what does not matter and keep the structureA tender is not a legal document here — it is a set of firms and a vector of numbers. And knowing what you threw away is part of the abstraction
Algorithmic designSpecify steps precise enough that they could be executed without judgmentThe seven-step pipeline above. **If a step requires you to *look at it and decide*, it is not yet specified**

7. How this connects to ATLANTIS, and what is unexplored

ProjectThe questionMethod
A null model for enforcement networksAgencies run co-bidding analyses. Against what baseline? If dense clusters appear in random graphs with the same degree sequence, a cluster is not evidenceBuild the bipartite configuration-model null for real procurement data, and report how many *apparently* suspicious clusters survive it. Cheap, and it would either validate or undermine a technique already in use
The projection artefact, quantifiedHow much of the clustering in agency co-bidding graphs is manufactured by bipartite projection rather than present in the relationships?Compare clustering in projected graphs against the bipartite original across tender-size distributions. A purely methodological finding with direct enforcement consequences
Relational evidence and the rights of defenceA firm flagged because of its *neighbourhood* cannot act on that in the way it could act on its own attributes. Is a relational flag contestable at all?Doctrinal, paired with a demonstration: show that a counterfactual explanation for a relational model is either unavailable or not actionable by the firm. This is Wisman's objection turned into a paper

8. If you remember ten things

  1. Network analysis is descriptive statistics on a relational structure — no training, no labels. A graph *neural* network is the ML version and a different thing. Agencies use the first.
  2. Four centralities, four questions. Degree: who is busiest. Betweenness: who is a broker — this finds the hub. Closeness: who can coordinate. Eigenvector: who is connected to the well-connected.
  3. **Saying *we ran a centrality analysis* is not a method.** Saying which measure and why is.
  4. Procurement data is bipartite — firms and tenders — not a table.
  5. Bipartite projection manufactures cliques. A five-bidder tender becomes a five-way clique by construction, so clustering in a projected graph is partly an artefact. This is the one technical point to make.
  6. Modularity subtracts what chance would produce, holding degrees fixed. Q above roughly 0.3 suggests real structure. Louvain and Leiden find it; both have a resolution limit that can hide small cartels.
  7. Without a null model you have nothing. Dense clusters and high-betweenness nodes occur in random graphs too. Configuration model, degree-preserving.
  8. Co-bidding is not collusion. Same sector and region co-bid innocently and constantly. Control for it or you recover market structure, not conspiracy.
  9. The edge definition is the finding. State it, and report how conclusions change under alternatives.
  10. Computational thinking, your version: what shape is the question, what shape is the data really, what would this look like if nothing were going on, and what would change my mind. All four come from your own papers.