A model of the global economy is, by its very nature, an unwieldy object to work with. There are 40 countries (we want more; that’s coming next) and the economy of each country is described by the economic activity of 35 sectors.
Each sector in each country interacts with each other sector in each other country creating close to two million interactions.
This is great for wowing potential users of the model with the sheer scale and size of thing, but it makes life pretty hard if you want to ask a question like “what effect has a certain change had on… well, everything?”
This is hard because “everything” here encompasses two million numbers some of which will have gone up and others of which will have gone down.
If you don’t put any effort into visualisation, the output of the model looks absolutely horrible:
Needless to say, picking interesting information out of such a mass of numbers involves some careful thought. (For the interested, what you’re seeing here is dollar-valued commodity flows between sectors within the Australian economy, the sectors being numbered 1 to 35.)
The paper I’m writing at the moment asks an even trickier question than “what’s going on?”. I’m trying to work out how our model compares with other, more standard, ways of doing this kind of thing. This means making the same change in two models and comparing the results.
One way to boil down lots of information into a far smaller number of ‘things’ is to rank the numbers you’re analysing. This just means putting the numbers into order then saying which number is biggest, which is second-biggest etc.
So in our case, if we make a change to the global economy, instead of looking at a horrifying table of numbers we can just say “Australia was the country most affected by the change. Netherlands was second, Spain tenth, Bulgaria 39th…” and so on.
The advantage to this approach is that, when comparing the results of two models, you can just compare the ranks of the countries and see if they’re similar. If they are, you might be justified in concluding that the models are doing more-or-less the same thing.
It also allows for some nice visualisation. If we write down all the countries in one column in the order of their rank (most-affected by some change we’ve made, to least-affected) using one model, and make a second column where the countries are ordered according to their rank using the other model, we can quickly see where the differences are, particularly if we draw nice lines between the countries to show how their position has changed.
Here’s the outcome of such an experiment:
The design for this visualisation was inspired by a similar thing in the work of Hidalgo and Hausmann, see here on p4!
It shows the results of reducing demand for Chinese vehicles by $1M on the global economy in 2010. The left-hand column shows the results using a traditional model (for the interested: it’s called a Multi-Region Input-Output model, or MRIO). The most-affected countries are at the top and the least-affected at the bottom. The right-hand column is the same but for our model.
With the exception of Slovakia, the results look pretty good. The ranks are generally pretty similar which is encouraging. We’re currently trying to find out what’s going on with Slovakia, and I’ll post here if we ever find out!
(Note that Taiwan is not in our model, because the UN doesn’t report trade data for it, as it deems it to be a part of China. I won’t be delving into this international controversy here!)
Anyone who’s done any work in the vicinity of network science or, more specifically, seen social scientists attempting network science, will have seen plenty of images such as this:
which add little scientific input, but merely dazzle the reader with the complexity and sheer magnitude of the networks being analysed. At a recent talk in Cambridge I heard the legendary Mark Newman refer to these network spaghetti-servings as “ridiculograms”. I know researchers who have been asked specifically to produce such diagrams to impress the difficulty of their project onto an adoring lay-crowd.
Well, I’m hoping to do a little more with a network visualisation. It’s not because I’m better than the people who made those diagrams (apologies to the researchers in question; I’m not meaning to be rude.) but just because I’ve got a lot of time to dedicate to painfully learning the tools we have available for turning spaghetti into scientific knowledge. (Caution: this pasta metaphor may have overstepped its usefulness.)
The tool of choice for the modern networks visualiser is called Gephi and it really is one of the n wonders of the open-source software world. Which makes me feel guilty about saying that I hate it, but I do. It’s amazing and brilliant but, at least on Windows 64-bit, it’s buggy as hell, and does all sorts of crazy stuff when you’re least expecting it*. Christ knows that if it were up to me to develop all of open-source, the world would be a much, much worse place.
But here’s my friendly guide to untangling that ridiculogram step-by-step, without losing too much sleep in the process:
Here’s how every network visualisation you’ve ever seen has started life. This is what you get when you import your graph into Gephi:
This particular graph happens to be a version of a trade network. Each node is an economic sector in a particular country, and the edges (lines) represent the size of the flow between sectors. The truth is a bit more detailed than that. Actually this graph shows the response of the trade network to a $1M reduction in demand for Chinese vehicles.
The first thing to do is lay those bad-boys out. I’ve gone for the Yifan Hu layout, because it visually separates clusters.
This then lays the ground-work for the more visually pleasing “Force Atlas 2” layout. Here I’ve gone for “Dissuade Hubs”, “LinLog mode” and “Prevent Overlap” with Scaling=5.0 and Gravity=4.0:
Now let’s colour the nodes by country, to see if the clusters match to countries. It looks like they broadly do (which makes sense because sectors interact most with domestic sectors):
To do this in Gephi, go the the Partition tab at the top right and select Nodes. Click on the refresh button and pick the variable you want to partition by. This will set random colours to each group.
There are rather too many countries showing here, making the colours all a bit similar, and the clusters not all that clear. Let’s wrestle with Gephi filters. (This is hard, boring and severally counterintuitive.) To filter by country, go to Filters > Attributes > Equal and select ‘country’. To filter for just China, you’d simply enter CHN into the pattern box, but our life is a bit more difficult, because we want to filter in a number of countries. To do this we use the regular expression ‘or’ concept, which is a vertical bar: ‘|’. So my pattern looks like ‘CHN|JPN|DEU|USA|KOR|FRA|AUS|ITA|GBR|BRA’. Tick the Use regex box and click OK. Now click Filter and the filter will be applied:
This is starting to look a bit nicer, but we need to resize the nodes to show which are the most important. I usually size by node centrality (basically a measure of how ‘important’ the node is in the network.) To do this, go to the Statistics tab, and click Run next to Eignvector Centrality. This adds the centrality of each node as a property. To set the size of the nodes, go to Ranking at the top-left, and click the red diamond which, for some reason, stands for node size. Select Eigenvector Centrality from the list and click apply:
So this is ok, but the China nodes (in green) are all so much more significant that everything else is basically invisible. The node sizes can be fine-tuned using the Spline… link. I set my spline like this, which gives a some definition to all the big values and allows lots of medium values to come through:
which looks much better.
Now time to label the nodes. An almost invisible button at the bottom-right of the screen is actually an up-arrow behind which hides the labelling dialog. (Note that this is definitely the single-worst piece of UI design I’ve ever seen.) If you’re lucky enough to find this, set node labels on and adjust the size slider until you can see them. If the attribute you want for the label isn’t already selected, click Configure… and change it in there.
We now have:
We’re almost finished with the layout, but let’s space the clusters out a bit, so we can see what’s going on within countries. The ‘Noverlap’ layout isn’t installed by default, but you can install it easily from the Plugins menu. This is really useful for spreading out clusters of nodes. I ran it with a ratio of 2.0 and a margin of 20.0. I then also ran the Expansion layout followed by the Label Adjust layout. This combination of layouts seems to get everything looking peachy:
Now that the layout is complete, we can filter out some of the smaller edges. Edges are great for laying out accurately, but you don’t want to see every one on the finished diagram. To add another filter to the country filter we’ve already go, we need to add it as a subfilter. More crazy counter-intuitiveness. My completed set of filters looked like this:
Note that to set the range, you can double-click on the number and type it in. Saves messing with that stupid slider.
Now that the graph is nicely layed out, and filtered, time to switch to the Preview pane. This pane doesn’t redraw unless you click Refresh after every change. After selecting Nodes > Show Labels and Edges > Rescale weight, the default preview looks like this, already pretty nice:
I’ve changed the font (at least on my system, you have to do this by just typing the name and size into the Font box. I’ve typed “Tahoma 12” here.) and massively up the thickness. This means that the biggest flows are ridiculously thick, but it’s a fair trade-off to get some of the smaller flows to show up too:
For a few final flourishes, export your preview to an SVG, and open it in a vector-graphics editor. (I’m using the free and totally brilliant Inkscape, but feel free to pay a million pounds for Illustrator.) I’ve used the editor to add some country labels, and move a few of the sector labels to make them more readable and less cluttered. I’ve also deleted a few nodes for visual clarity’s sake. Here’s the finished product. Pretty good I reckon, and certainly a world away from the hairball-style ridiculogram we started with:
Here’s a list of Gephi bugs that have had me smashing my completely innocent keyboard in frustration: 1) when you save you work, then close the application, it worryingly asks you if you want to save. (Which makes me feel that something is amiss.) An insanely large number of times, the resulting file is then corrupted somehow and won’t open. 2) Hand-wrought queries you’ve spent ages writing are not saved, so you have to make ’em from scratch every time. Ugh. 3) The export to SVG option often results in a terse little “NullPointerException” error message and no SVG is produced.