Network analysis practical: networks of cities

Author

Emmanouil Tranos

Published

October 12, 2026

Resources

Some of the materials for this tutorial have been adapted from:

Philosophy of this RMarkdown document

As you can see this is a long .Rmd document, which has a dual objective. On one hand, it will help you achieve the unit learning outcomes as it provides an implementation of most of the concepts and ideas we discuss for this unit. On the other hand this is almost a representation of a ‘real world’ workflow. Instead of breaking the code in shorter and maybe more digestible .Rmd documents I decided to provide you with a working sequence of all actions I would have taken in order to analyse a network with spatial dimensions such as the network of commuting flows in \(2011\). You can use this workflow as the basis for building your own approach and, consequently, code in order to complete this session’s project.

To begin with, create a new RStudio Project as a new directory (File > New Project…) and within it create a source and data directory to store the code and the data accordingly. Instructions on how to create such a project, can be found here. Then, create a new RMarkdown document to implement all the below.

Install and load packages

We will use quite a few packages for this tutorial. Most of the code is based on the tidyverse logic – see here for more info. But the main package we will use for network data wrangling and analysis is igraph – more info here.

Important

The below code snippet assumes that all the packages are installed. If you are using a university PC they are probably not. If they are not installed, you need to do so by using install.packages("package.name").

library(igraph)
library(knitr)
library(corrplot)
library(tidyverse)
library(stplanr)
library(leaflet)
library(rprojroot)
library(kableExtra)
library(sf)

knitr::opts_chunk$set(echo = TRUE)

# This is the project path
path <- find_rstudio_root_file()

Commuting data and networks

For this tutorial we will use travel to work data from the 2011 UK Census. The data is available online, but it requires an academic login. After you log in, download the WU03UK element, save the .csv on your working directory under a /data directory and unzip it. We will use the:

Location of usual residence and place of work by method of travel to work

for

Census Merged local authority districts in England and Wales, Council areas in Scotland, Local government districts in Northern Ireland.

The below code loads the data.

path.data <- paste0(path, "/data/wu03uk_v3/wu03uk_v3.csv")
commuting <- read_csv(path.data)
glimpse(commuting)

As you may have noticed, the commuting object includes only the codes for the local authorities. Let’s try to see these codes.

First for the origins.

commuting %>% distinct(`Area of usual residence`)
# A tibble: 404 × 1
   `Area of usual residence`
   <chr>                    
 1 95AA                     
 2 95BB                     
 3 95CC                     
 4 95DD                     
 5 95EE                     
 6 95FF                     
 7 95GG                     
 8 95HH                     
 9 95II                     
10 95JJ                     
# ℹ 394 more rows

And the same for the destinations (results omitted).

commuting %>% distinct(`Area of workplace`)

Question: Can you guess the countries these codes refer to?

You might have observe some weird codes (OD0000001, OD0000002, OD0000003 and OD0000004). With some simple Google searching we can find the 2011 Census Origin-Destination Data User Guide, which indicates that these codes do not refer to local authorities:

  • OD0000001 = Mainly work at or from home

  • OD0000002 = Offshore installation

  • OD0000003 = No fixed place

  • OD0000004 = Outside UK

For the sake of simplicity we will remove these non-geographical nodes.

non.la <- c("OD0000001", "OD0000002", "OD0000003", "OD0000004")
commuting <- commuting %>% 
  filter(!`Area of workplace` %in% non.la)

Check the %in% operator. Also ! represents negation.

Now let’s do some clean-up of the commuting data frame. Let’s remind ourselves how the data look like.

glimpse(commuting)
Rows: 108,546
Columns: 14
$ `Area of usual residence`                  <chr> "95AA", "95AA", "95AA", "95…
$ `Area of workplace`                        <chr> "95AA", "95BB", "95CC", "95…
$ `All categories: Method of travel to work` <dbl> 9465, 107, 42, 1485, 35, 18…
$ `Work mainly at or from home`              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ `Underground, metro, light rail, tram`     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ Train                                      <dbl> 12, 0, 0, 11, 0, 0, 165, 1,…
$ `Bus, minibus or coach`                    <dbl> 243, 1, 1, 84, 1, 0, 434, 1…
$ Taxi                                       <dbl> 421, 2, 0, 13, 0, 0, 14, 0,…
$ `Motorcycle, scooter or moped`             <dbl> 58, 0, 0, 8, 0, 0, 23, 0, 0…
$ `Driving a car or van`                     <dbl> 5376, 68, 29, 1111, 25, 12,…
$ `Passenger in a car or van`                <dbl> 1721, 20, 9, 241, 9, 4, 830…
$ Bicycle                                    <dbl> 196, 5, 0, 2, 0, 0, 11, 0, …
$ `On foot`                                  <dbl> 1403, 9, 3, 13, 0, 2, 46, 1…
$ `Other method of travel to work`           <dbl> 35, 2, 0, 2, 0, 0, 6, 0, 1,…

We are only keeping the English and Wales local authorities by keeping the observations with a local authority code starting from E (for England) and W (for Wales).

commuting <- commuting %>% filter(startsWith(`Area of usual residence`, "E") |
                                  startsWith(`Area of usual residence`, "W")) %>% 
                           filter(startsWith(`Area of workplace`, "E") |
                                  startsWith(`Area of workplace`, "W")) %>% 
  glimpse()
Rows: 93,034
Columns: 14
$ `Area of usual residence`                  <chr> "E41000001", "E41000001", "…
$ `Area of workplace`                        <chr> "E41000001", "E41000002", "…
$ `All categories: Method of travel to work` <dbl> 20777, 1591, 534, 3865, 433…
$ `Work mainly at or from home`              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ `Underground, metro, light rail, tram`     <dbl> 6, 1, 0, 1, 0, 0, 0, 0, 0, …
$ Train                                      <dbl> 26, 32, 0, 49, 11, 0, 0, 0,…
$ `Bus, minibus or coach`                    <dbl> 1922, 140, 21, 167, 7, 0, 0…
$ Taxi                                       <dbl> 527, 11, 4, 20, 1, 0, 0, 0,…
$ `Motorcycle, scooter or moped`             <dbl> 107, 6, 6, 23, 4, 0, 0, 0, …
$ `Driving a car or van`                     <dbl> 11788, 1225, 448, 3144, 360…
$ `Passenger in a car or van`                <dbl> 1965, 99, 36, 365, 33, 0, 0…
$ Bicycle                                    <dbl> 593, 13, 1, 29, 2, 0, 0, 0,…
$ `On foot`                                  <dbl> 3789, 60, 16, 60, 15, 0, 0,…
$ `Other method of travel to work`           <dbl> 54, 4, 2, 7, 0, 0, 0, 0, 0,…

We can also see we many rows we dropped with glimpse().

It is very important to distinguish between intra- and inter-local authority flows. In network analysis terms, these are the values we find on the diagonal of an adjacency matrix and refer to the commuting flows within a specific local authority or between different ones. For this exercise we are dropping the intra-local authority flows. Although not used here, we also create a new object with the intra-local authority flows.

commuting.intra <- commuting %>%
  filter(`Area of usual residence` == `Area of workplace`)
commuting <- commuting %>%
  filter(`Area of usual residence` != `Area of workplace`) %>% 
  glimpse()
Rows: 92,688
Columns: 14
$ `Area of usual residence`                  <chr> "E41000001", "E41000001", "…
$ `Area of workplace`                        <chr> "E41000002", "E41000003", "…
$ `All categories: Method of travel to work` <dbl> 1591, 534, 3865, 433, 5, 2,…
$ `Work mainly at or from home`              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ `Underground, metro, light rail, tram`     <dbl> 1, 0, 1, 0, 0, 0, 0, 0, 0, …
$ Train                                      <dbl> 32, 0, 49, 11, 0, 0, 0, 0, …
$ `Bus, minibus or coach`                    <dbl> 140, 21, 167, 7, 0, 0, 0, 1…
$ Taxi                                       <dbl> 11, 4, 20, 1, 0, 0, 0, 0, 0…
$ `Motorcycle, scooter or moped`             <dbl> 6, 6, 23, 4, 0, 0, 0, 0, 0,…
$ `Driving a car or van`                     <dbl> 1225, 448, 3144, 360, 5, 2,…
$ `Passenger in a car or van`                <dbl> 99, 36, 365, 33, 0, 0, 0, 0…
$ Bicycle                                    <dbl> 13, 1, 29, 2, 0, 0, 0, 0, 0…
$ `On foot`                                  <dbl> 60, 16, 60, 15, 0, 0, 0, 0,…
$ `Other method of travel to work`           <dbl> 4, 2, 7, 0, 0, 0, 0, 0, 0, …

Please note the constant use of glimpse() to keep control of how many observations we have and check if we missed anything.

Also, take a note of the commuting object, which includes multiple types of commuting flows. Therefore, we will build \(3\) different networks:

  1. one for all the commuting flows

  2. one only for train flows

  3. one only for bicycle flows.

commuting.all <- commuting %>%
  select(`Area of usual residence`,
                `Area of workplace`,
                `All categories: Method of travel to work`) %>%
  rename(o = `Area of usual residence`,     # Area of usual residence is annoyingly
         d = `Area of workplace`,           # long, so I am remaining theses columns.
         weight = `All categories: Method of travel to work`)

# just FYI this is how you could have achieved the same output using base R
# instead of dplyr of the tidyverse ecosystem
# commuting.all <- commuting[,1:3]
# names(commuting.all)[1] <- "o"
# names(commuting.all)[2] <- "d"
# names(commuting.all)[3] <- "weight"

commuting.train <- commuting %>%
  select(`Area of usual residence`,
         `Area of workplace`,
         `All categories: Method of travel to work`,
         `Train`) %>%
  rename(o = `Area of usual residence`,
         d = `Area of workplace`,
         weight = `Train`) %>%
  # The below code drops all the lines with 0 train flows in order to exclude
  # these edges from the network.
  filter(weight!=0)

commuting.bicycle <- commuting %>%
  select(`Area of usual residence`,
                `Area of workplace`,
                `All categories: Method of travel to work`,
                `Bicycle`) %>%
  rename(o = `Area of usual residence`,
         d = `Area of workplace`,
         weight = `Bicycle`) %>%
  # The below code drops all the lines with 0 bicycle flows in order to exclude
  # these edges from the network.
  filter(weight!=0)

Unless you know the local authority codes by hard, it might be useful to also add the corresponding local authority names. These can be easily obtained from the ONS’s Open Geography portal. The below code directly downloads a GeoJSON file with the local authorities in England and Wales. If you don’t know what a GeoJSON file is, have a look here. Boundary data can also be obtained by UK Data Service.

For the time being we are only interested in the local authority names and codes. We will use the spatial object later.

Tip: the below code downloads the GeoJSON file over the web. If you want to run the code multiple times, it might be faster to download the file ones, save it on your hard drive and the point this location to st_read().

la <-st_read("https://services1.arcgis.com/ESMARspQHYMw9BZ9/arcgis/rest/services/CMLAD_Dec_2011_SGCB_GB_2022/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson")
glimpse(la) 

la.names <- as.data.frame(la) %>% 
  select(cmlad11cd, cmlad11nm)    # all we need is the LA names and codes

The next step is to actually create the network objects. The below code creates the igraph network objects using the graph_from_data_frame() function as we already have all the necessary data in data frames (commuting.all, commuting.train and commuting.bicycle). We then attach the local authority names as an attribute to these networks.

net.all <-graph_from_data_frame(commuting.all, directed = TRUE, vertices = la.names)

net.train <-graph_from_data_frame(commuting.train, directed = TRUE, vertices = la.names)

net.bicycle <-graph_from_data_frame(commuting.bicycle, directed = TRUE, vertices = la.names)

Network attributes

The below igraph functions illustrate some attributes of the network with all the flows.

# It provides information about the type of the net.all object. Not surprisingly,
# it is an igraph network.
class(net.all)
[1] "igraph"
# It displays the network file, the number of nodes and edges (345 and 92,688
# in this case).
net.all
IGRAPH e790ff1 DNW- 346 92688 -- 
+ attr: name (v/c), cmlad11nm (v/c), weight (e/n)
+ edges from e790ff1 (vertex names):
 [1] E41000001->E41000002 E41000001->E41000003 E41000001->E41000004
 [4] E41000001->E41000005 E41000001->E41000006 E41000001->E41000007
 [7] E41000001->E41000009 E41000001->E41000010 E41000001->E41000011
[10] E41000001->E41000012 E41000001->E41000013 E41000001->E41000014
[13] E41000001->E41000015 E41000001->E41000016 E41000001->E41000017
[16] E41000001->E41000018 E41000001->E41000019 E41000001->E41000020
[19] E41000001->E41000021 E41000001->E41000022 E41000001->E41000023
[22] E41000001->E41000025 E41000001->E41000026 E41000001->E41000029
+ ... omitted several edges
# It displays the vertices (aka nodes)
V(net.all)
+ 346/346 vertices, named, from e790ff1:
  [1] E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 E41000007
  [8] E41000008 E41000009 E41000010 E41000011 E41000012 E41000013 E41000014
 [15] E41000015 E41000016 E41000017 E41000018 E41000019 E41000020 E41000021
 [22] E41000022 E41000023 E41000024 E41000025 E41000026 E41000027 E41000028
 [29] E41000029 E41000030 E41000031 E41000032 E41000033 E41000034 E41000035
 [36] E41000036 E41000037 E41000038 E41000039 E41000040 E41000041 E41000042
 [43] E41000043 E41000044 E41000045 E41000046 E41000047 E41000048 E41000049
 [50] E41000050 E41000051 E41000052 E41000053 E41000054 E41000055 E41000056
 [57] E41000057 E41000058 E41000059 E41000060 E41000061 E41000062 E41000063
 [64] E41000064 E41000065 E41000066 E41000067 E41000068 E41000069 E41000070
+ ... omitted several vertices
# It displays the vertex attributes. In this case the local authority codes.
vertex_attr(net.all) %>% glimpse()
List of 2
 $ name     : chr [1:346] "E41000001" "E41000002" "E41000003" "E41000004" ...
 $ cmlad11nm: chr [1:346] "Hartlepool" "Middlesbrough" "Redcar and Cleveland" "Stockton-on-Tees" ...
# the output of vertex_attr() is quite long, this is why I chained it with glimpse()

# It displays the edges.
E(net.all) %>% glimpse()
 'igraph.es' int [1:92688] 1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, "is_all")= logi TRUE
 - attr(*, "vnames")= chr [1:92688] "E41000001|E41000002" "E41000001|E41000003" "E41000001|E41000004" "E41000001|E41000005" ...
 - attr(*, "env")=<weakref> 
 - attr(*, "graph")= chr "e790ff1a-5970-4572-b0e7-1116822bb9d5"
# the output of E() is quite long, this is why I chained it with glimpse()

# It displays the weights for each edge. In our case the weights represent commuters.
edge.attributes(net.all)$weight %>% glimpse()
 num [1:92688] 1591 534 3865 433 5 ...
# as above re: glimpse()

# Asks whether the network is weighted or not
is.weighted(net.all)
Warning: `is.weighted()` was deprecated in igraph 2.0.0.
ℹ Please use `is_weighted()` instead.
[1] TRUE

Question: How many nodes and edges are there for the other types of networks? What do these differences mean?

Network measures

The below igraph functions calculate some simple network measures. Have a look at the lecture slides and the reference list to remind yourselves.

# Network diameter. We do not consider the weights because it affects the measurement.
d.all <- diameter(net.all, directed = TRUE, weights = NA)
d.all
[1] 2
# Average path length
mean_dist.all <- mean_distance(net.all, weights = NA)
mean_dist.all
[1] 1.223523
# Network density
dens.all <- edge_density(net.all)
dens.all
[1] 0.7764765
# Clustering Coefficient or Transitivity
trans.all <- transitivity(net.all)
trans.all
[1] 0.9221811
# Reciprocity
rec.all <- reciprocity(net.all)
rec.all
[1] 0.8297298
# Assortativity
ass.all <- assortativity_degree(net.all, directed = T)
ass.all
[1] -0.08068428

Question: Do the same for the other types of commuting networks and compare the different measures. Why do we observe these differences?

Centralities

Now we are moving from network-level measures to some node-level ones. Specifically, we will calculate different centrality measures.

# Binary in-degree centrality.
in.degree <- degree(net.all, mode = "in")
head(in.degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
      111       214       118       216       237       275 
# Binary out-degree centrality.
out.degree <- degree(net.all, mode = "out")
head(out.degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
      231       250       242       292       258       274 
# Binary degree centrality.
degree <- degree(net.all, mode = "all")
head(degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
      342       464       360       508       495       549 
# The function strength() calculates the weighted degree centrality.

# Weighted in-degree centrality.
w.in.degree <- strength(net.all, mode = "in")
head(w.in.degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
     8360     30038     12786     29986     18445     23080 
# Weighted out-degree centrality.
w.out.degree <- strength(net.all, mode = "out")
head(w.out.degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
    11261     20664     21904     29329     15036     22981 
# Weighted degree centrality.
w.degree <- strength(net.all, mode = "all")
head(w.degree)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
    19621     50702     34690     59315     33481     46061 
# The function betweenness() calculates betweenness centrality. As before.
btwnss <- betweenness(net.all, weights = NA)
head(btwnss)
E41000001 E41000002 E41000003 E41000004 E41000005 E41000006 
 21.38152  53.13953  23.46728  65.89576  63.64096  82.81950 
# Eigenvector centrality.
eigen <- eigen_centrality(net.all)

# Be careful, eigen has a more complicated structure. Use ?eigen_central to read more. 
# Before going forward, let's see the structure of eigen.
str(eigen)
List of 3
 $ vector : Named num [1:346] 0.00039 0.000679 0.000459 0.0011 0.000703 ...
  ..- attr(*, "names")= chr [1:346] "E41000001" "E41000002" "E41000003" "E41000004" ...
 $ value  : num 2e+05
 $ options:List of 20
  ..$ bmat   : chr "I"
  ..$ n      : int 346
  ..$ which  : chr "LA"
  ..$ nev    : int 1
  ..$ tol    : num 0
  ..$ ncv    : int 0
  ..$ ldv    : int 0
  ..$ ishift : int 1
  ..$ maxiter: int 3000
  ..$ nb     : int 1
  ..$ mode   : int 1
  ..$ start  : int 1
  ..$ sigma  : num 0
  ..$ sigmai : num 0
  ..$ info   : int 0
  ..$ iter   : int 2
  ..$ nconv  : int 1
  ..$ numop  : int 30
  ..$ numopb : int 0
  ..$ numreo : int 21
# We are interested in eigen$vector.
head(eigen$vector)
   E41000001    E41000002    E41000003    E41000004    E41000005    E41000006 
0.0003901039 0.0006790253 0.0004593193 0.0010995296 0.0007032769 0.0012432240 
# page rank centrality.
prank <- page_rank(net.all, directed = T)
str(prank) # as before
List of 3
 $ vector : Named num [1:346] 0.00109 0.00296 0.00178 0.00318 0.00181 ...
  ..- attr(*, "names")= chr [1:346] "E41000001" "E41000002" "E41000003" "E41000004" ...
 $ value  : num 1
 $ options: NULL
head(prank$vector)
  E41000001   E41000002   E41000003   E41000004   E41000005   E41000006 
0.001088677 0.002963743 0.001784703 0.003183087 0.001807346 0.002157680 

Now that we understood how the above works, let’s chain them together to create a centralities tibble.

centralities <- tibble(
  names = vertex_attr(net.all)[[2]],
  # The above creates a vector with the nodes names (i.e. the local authority names).
  # We are interested in the second elements of the vertex_attr() as the first one 
  # includes the local authority codes. Try str(vertex_attr(net.all)) to see why.
  # the double squared brackets [[]] brings the vertex, while the single one []
  # would have brought a list.
  in.degree = degree(net.all, mode = "in"),
  out.degree = degree(net.all, mode = "out"),
  degree = degree(net.all, mode = "all"),
  w.in.degree = strength(net.all, mode = "in"),
  w.out.degree = strength(net.all, mode = "out"),
  w.degree = strength(net.all, mode = "all"),
  btwnss = betweenness(net.all, weights = NA),
  eigen = eigen_centrality(net.all)$vector,  # note the $vector
  prank = page_rank(net.all, directed = T)$vector) %>% 
  glimpse()
Rows: 346
Columns: 10
$ names        <chr> "Hartlepool", "Middlesbrough", "Redcar and Cleveland", "S…
$ in.degree    <dbl> 111, 214, 118, 216, 237, 275, 326, 204, 178, 292, 292, 21…
$ out.degree   <dbl> 231, 250, 242, 292, 258, 274, 302, 245, 246, 298, 326, 28…
$ degree       <dbl> 342, 464, 360, 508, 495, 549, 628, 449, 424, 590, 618, 50…
$ w.in.degree  <dbl> 8360, 30038, 12786, 29986, 18445, 23080, 49172, 23988, 19…
$ w.out.degree <dbl> 11261, 20664, 21904, 29329, 15036, 22981, 34607, 19666, 1…
$ w.degree     <dbl> 19621, 50702, 34690, 59315, 33481, 46061, 83779, 43654, 3…
$ btwnss       <dbl> 21.38152, 53.13953, 23.46728, 65.89576, 63.64096, 82.8195…
$ eigen        <dbl> 0.0003901039, 0.0006790253, 0.0004593193, 0.0010995296, 0…
$ prank        <dbl> 0.001088677, 0.002963743, 0.001784703, 0.003183087, 0.001…

Or, if you want a nicer table, you can use kable(). Tip check out the kableExtra package for more options

centralities %>% kable(caption = "Centralities") %>% 
  # The following `kableExtra` function introduces a scroll box
  scroll_box(width = "100%", height = "300px")       
Centralities
names in.degree out.degree degree w.in.degree w.out.degree w.degree btwnss eigen prank
Hartlepool 111 231 342 8360 11261 19621 21.38152 0.0003901 0.0010887
Middlesbrough 214 250 464 30038 20664 50702 53.13953 0.0006790 0.0029637
Redcar and Cleveland 118 242 360 12786 21904 34690 23.46728 0.0004593 0.0017847
Stockton-on-Tees 216 292 508 29986 29329 59315 65.89576 0.0010995 0.0031831
Darlington 237 258 495 18445 15036 33481 63.64096 0.0007033 0.0018073
Halton 275 274 549 23080 22981 46061 82.81950 0.0012432 0.0021577
Warrington 326 302 628 49172 34607 83779 124.18728 0.0028033 0.0038653
Blackburn with Darwen 204 245 449 23988 19666 43654 46.17387 0.0006750 0.0024693
Blackpool 178 246 424 19835 17775 37610 43.94347 0.0005901 0.0025846
Kingston upon Hull, City of 292 298 590 38602 24199 62801 102.14345 0.0012955 0.0025353
East Riding of Yorkshire 292 326 618 30194 54386 84580 120.56251 0.0020021 0.0031038
North East Lincolnshire 219 286 505 11562 10600 22162 65.06108 0.0007256 0.0013687
North Lincolnshire 249 297 546 14755 15493 30248 83.06742 0.0007716 0.0016239
York 304 310 614 25651 21058 46709 117.86975 0.0023097 0.0026595
Derby 316 308 624 41670 29802 71472 113.83201 0.0029402 0.0032790
Leicester 328 311 639 67191 41007 108198 121.94219 0.0045364 0.0060454
Rutland 223 225 448 6776 6446 13222 40.36699 0.0012338 0.0010011
Nottingham 336 315 651 89650 38180 127830 134.64542 0.0039334 0.0059435
Herefordshire, County of 306 292 598 10786 13434 24220 103.12522 0.0019351 0.0013338
Telford and Wrekin 324 296 620 23376 18322 41698 109.90081 0.0018745 0.0020630
Stoke-on-Trent 313 309 622 40031 33667 73698 114.84293 0.0015778 0.0029178
Bath and North East Somerset 318 289 607 29241 23945 53186 106.11349 0.0063148 0.0031748
Bristol, City of 338 324 662 80907 54120 135027 146.21380 0.0085801 0.0081482
North Somerset 288 309 597 18813 32553 51366 106.51079 0.0033370 0.0024983
South Gloucestershire 342 315 657 59359 53569 112928 143.90381 0.0071708 0.0067618
Plymouth 332 300 632 25793 20138 45931 124.45365 0.0015797 0.0032944
Torbay 191 252 443 8569 12764 21333 46.76698 0.0007531 0.0015136
Bournemouth 248 283 531 25210 32998 58208 72.37210 0.0044016 0.0028426
Poole 314 276 590 32048 24563 56611 87.92048 0.0045316 0.0030996
Swindon 334 293 627 23868 24439 48307 112.57493 0.0066072 0.0024599
Peterborough 337 294 631 32552 19136 51688 111.41706 0.0080528 0.0029620
Luton 341 293 634 34348 33348 67696 117.08185 0.0292726 0.0026121
Southend-on-Sea 247 260 507 20661 29749 50410 57.62656 0.0460325 0.0012049
Thurrock 281 268 549 21804 34873 56677 75.03469 0.0589668 0.0013440
Medway 308 312 620 22710 50453 73163 109.01019 0.0533814 0.0015706
Bracknell Forest 336 263 599 28503 31002 59505 84.64837 0.0181350 0.0026867
West Berkshire 340 277 617 33558 28003 61561 103.72536 0.0157734 0.0033439
Reading 332 289 621 42267 32715 74982 112.58266 0.0227425 0.0040357
Slough 335 271 606 39282 31753 71035 94.80244 0.0380361 0.0041691
Windsor and Maidenhead 341 273 614 36971 34482 71453 99.72553 0.0372343 0.0038264
Wokingham 340 269 609 30764 42810 73574 90.37405 0.0237476 0.0032668
Milton Keynes 344 307 651 44450 27780 72230 122.22514 0.0253813 0.0035232
Brighton and Hove 297 287 584 31879 36938 68817 88.44945 0.0325543 0.0022023
Portsmouth 343 288 631 41272 27862 69134 115.85177 0.0059324 0.0032274
Southampton 321 300 621 41891 41234 83125 115.21255 0.0069496 0.0036577
Isle of Wight 219 244 463 2083 4544 6627 44.65755 0.0019493 0.0006276
County Durham 316 328 644 35081 64602 99683 136.76168 0.0025184 0.0033631
Northumberland 287 310 597 22254 43011 65265 105.96942 0.0024251 0.0023084
Cheshire East 331 334 665 53260 51773 105033 153.00249 0.0049410 0.0044883
Cheshire West and Chester 323 324 647 50910 51970 102880 141.77478 0.0034742 0.0039760
Shropshire 336 330 666 29111 34424 63535 148.35300 0.0036140 0.0027990
Cornwall,Isles of Scilly 341 330 671 11163 18567 29730 155.46166 0.0032429 0.0016854
Wiltshire 345 331 676 39717 55625 95342 160.51941 0.0150479 0.0040658
Bedford 314 297 611 21392 22483 43875 100.59431 0.0154519 0.0018139
Central Bedfordshire 343 312 655 32469 66131 98600 129.24999 0.0390917 0.0028629
Aylesbury Vale 330 303 633 19831 34981 54812 113.28702 0.0227757 0.0020113
Chiltern 253 234 487 13391 22558 35949 44.70020 0.0301093 0.0015106
South Bucks 310 223 533 20603 20381 40984 55.75605 0.0262182 0.0023714
Wycombe 339 283 622 27246 32323 59569 100.06675 0.0304376 0.0027075
Cambridge 312 250 562 51240 16062 67302 73.34194 0.0134464 0.0046020
East Cambridgeshire 216 247 463 8216 20939 29155 41.75094 0.0043745 0.0012342
Fenland 179 265 444 10010 16271 26281 41.16076 0.0024054 0.0013423
Huntingdonshire 310 302 612 20270 31621 51891 102.90672 0.0132382 0.0023001
South Cambridgeshire 328 284 612 34916 39466 74382 98.77528 0.0143335 0.0042710
Allerdale 188 203 391 6436 11733 18169 33.91827 0.0002556 0.0019898
Barrow-in-Furness 144 173 317 5100 4715 9815 20.75604 0.0002271 0.0014106
Carlisle 306 242 548 9904 5953 15857 78.20939 0.0005917 0.0021074
Copeland 162 185 347 7919 5986 13905 26.13944 0.0001593 0.0017038
Eden 225 187 412 6209 4666 10875 41.29631 0.0002394 0.0016928
South Lakeland 234 235 469 9651 8994 18645 56.17406 0.0005490 0.0020873
Amber Valley 281 271 552 21778 25962 47740 77.94638 0.0014457 0.0019987
Bolsover 242 243 485 15315 20347 35662 54.66120 0.0006313 0.0014976
Chesterfield 242 256 498 21349 17107 38456 56.87320 0.0007520 0.0017426
Derbyshire Dales 201 251 452 13161 11828 24989 42.88387 0.0009256 0.0013577
Erewash 200 275 475 16623 28395 45018 50.97433 0.0012799 0.0017058
High Peak 188 255 443 7663 17319 24982 45.93415 0.0008832 0.0009999
North East Derbyshire 172 274 446 13414 28664 42078 42.70590 0.0007958 0.0014644
South Derbyshire 216 276 492 14306 28077 42383 53.41385 0.0011521 0.0016710
East Devon 315 261 576 12430 18130 30560 83.85873 0.0015576 0.0029037
Exeter 248 241 489 37151 10809 47960 57.60331 0.0011451 0.0047422
Mid Devon 163 220 383 5569 13667 19236 31.82063 0.0007052 0.0015827
North Devon 261 233 494 7735 4645 12380 56.35792 0.0007480 0.0012730
South Hams 282 235 517 16938 13322 30260 65.87841 0.0012274 0.0025189
Teignbridge 232 252 484 12250 20987 33237 58.11052 0.0010440 0.0023279
Torridge 116 196 312 3575 8288 11863 14.07664 0.0003644 0.0009993
West Devon 125 208 333 4593 8149 12742 22.82693 0.0005090 0.0009780
Christchurch 175 192 367 10677 10213 20890 24.36314 0.0012017 0.0012651
East Dorset 197 234 431 13531 19487 33018 37.02858 0.0023127 0.0016371
North Dorset 254 216 470 6962 9997 16959 47.73131 0.0018001 0.0011060
Purbeck 226 186 412 7634 8732 16366 33.64330 0.0010481 0.0011865
West Dorset 235 238 473 18059 11425 29484 49.90794 0.0017699 0.0020121
Weymouth and Portland 206 209 415 3447 11981 15428 35.60819 0.0005798 0.0008754
Eastbourne 204 227 431 12373 12830 25203 36.12422 0.0054015 0.0010266
Hastings 164 236 400 8006 11732 19738 29.94627 0.0049038 0.0009044
Lewes 202 224 426 14403 19800 34203 34.92845 0.0104541 0.0011926
Rother 182 215 397 9630 15054 24684 27.26210 0.0074697 0.0010183
Wealden 258 261 519 14989 30274 45263 58.96939 0.0186274 0.0013393
Basildon 321 282 603 36071 36057 72128 92.09181 0.0612035 0.0019214
Braintree 270 277 547 15184 31582 46766 74.27107 0.0271398 0.0013120
Brentwood 289 223 512 17745 19995 37740 52.37953 0.0409946 0.0012340
Castle Point 154 236 390 7467 23473 30940 28.09746 0.0251378 0.0007424
Chelmsford 293 275 568 30575 34222 64797 83.33582 0.0512377 0.0018830
Colchester 327 270 597 22968 24545 47513 94.70758 0.0235711 0.0016488
Epping Forest 290 251 541 21509 35475 56984 68.68786 0.0711352 0.0015571
Harlow 294 232 526 15994 16492 32486 57.74732 0.0195485 0.0013293
Maldon 210 210 420 6513 13689 20202 33.49157 0.0119064 0.0007505
Rochford 178 239 417 10411 24351 34762 35.41168 0.0271557 0.0008385
Tendring 229 257 486 6763 17203 23966 51.10530 0.0091833 0.0008516
Uttlesford 307 240 547 17618 17973 35591 63.70076 0.0202609 0.0014814
Cheltenham 293 272 565 24125 19592 43717 85.00521 0.0025958 0.0030665
Cotswold 293 254 547 15685 13651 29336 71.25964 0.0041576 0.0018831
Forest of Dean 206 248 454 6007 14512 20519 48.05798 0.0008705 0.0010042
Gloucester 290 276 566 26099 23463 49562 85.55168 0.0014927 0.0030158
Stroud 289 267 556 13241 20326 33567 83.56128 0.0024767 0.0018481
Tewkesbury 322 249 571 25184 20469 45653 87.05614 0.0015420 0.0030289
Basingstoke and Deane 338 280 618 25401 30492 55893 101.39306 0.0181075 0.0025112
East Hampshire 328 268 596 15462 25476 40938 93.84842 0.0120776 0.0016435
Eastleigh 309 260 569 32465 33798 66263 81.90592 0.0056096 0.0029667
Fareham 310 264 574 24609 29734 54343 76.99256 0.0039958 0.0022174
Gosport 272 237 509 7327 20473 27800 58.39117 0.0018505 0.0010068
Hart 328 253 581 18470 26300 44770 78.77749 0.0156487 0.0018362
Havant 211 248 459 17666 26401 44067 43.23830 0.0039611 0.0018958
New Forest 302 279 581 22744 29791 52535 86.90241 0.0054670 0.0022859
Rushmoor 334 258 592 25017 26056 51073 89.27181 0.0143124 0.0022710
Test Valley 318 256 574 22956 24789 47745 79.16895 0.0075231 0.0021833
Winchester 327 270 597 41929 23369 65298 89.55948 0.0114415 0.0035121
Broxbourne 317 249 566 18151 25440 43591 73.49505 0.0391390 0.0015310
Dacorum 338 286 624 23817 30858 54675 104.58269 0.0370314 0.0020320
East Hertfordshire 297 274 571 22122 35988 58110 79.93959 0.0446914 0.0018916
Hertsmere 316 242 558 25251 28231 53482 69.43996 0.0558631 0.0022121
North Hertfordshire 293 273 566 20355 32707 53062 77.54596 0.0292122 0.0018191
St Albans 318 271 589 26809 36418 63227 81.85818 0.0619411 0.0023555
Stevenage 314 254 568 20748 18525 39273 72.02250 0.0171373 0.0017124
Three Rivers 322 253 575 18584 27115 45699 76.96263 0.0380419 0.0018902
Watford 332 248 580 28799 24774 53573 78.54169 0.0405963 0.0024651
Welwyn Hatfield 336 271 607 38496 22907 61403 90.64350 0.0389517 0.0029540
Ashford 255 254 509 15035 17786 32821 59.60893 0.0139988 0.0012927
Canterbury 234 274 508 19479 18121 37600 61.96377 0.0115107 0.0014501
Dartford 306 248 554 32588 27117 59705 69.01172 0.0545483 0.0016458
Dover 234 249 483 9959 16669 26628 48.35895 0.0045037 0.0010274
Gravesham 212 258 470 10155 25676 35831 42.33955 0.0298471 0.0008559
Maidstone 296 278 574 29979 31058 61037 76.04405 0.0296875 0.0018485
Sevenoaks 274 246 520 20929 30420 51349 58.51716 0.0566217 0.0013925
Shepway 232 250 482 10992 14806 25798 48.02087 0.0065689 0.0010662
Swale 237 274 511 12599 22875 35474 59.86629 0.0186895 0.0010335
Thanet 188 242 430 5846 13348 19194 36.05674 0.0056380 0.0007948
Tonbridge and Malling 270 254 524 30765 30473 61238 56.01878 0.0379614 0.0018185
Tunbridge Wells 227 240 467 20116 22147 42263 47.12165 0.0336823 0.0014347
Burnley 159 222 381 14595 15150 29745 33.54753 0.0003922 0.0016247
Chorley 168 261 429 14994 26851 41845 43.70430 0.0007779 0.0016512
Fylde 230 223 453 21711 13080 34791 52.67556 0.0005238 0.0027609
Hyndburn 130 203 333 12702 17380 30082 20.42098 0.0002830 0.0015889
Lancaster 209 274 483 8091 11592 19683 59.97534 0.0006400 0.0015040
Pendle 178 212 390 10432 15013 25445 34.52029 0.0003655 0.0013588
Preston 288 270 558 44352 21146 65498 84.42626 0.0011831 0.0042716
Ribble Valley 187 190 377 14075 12870 26945 29.07366 0.0004309 0.0018088
Rossendale 152 218 370 7571 16019 23590 28.52086 0.0004274 0.0010012
South Ribble 233 256 489 23544 30099 53643 59.66094 0.0007475 0.0026508
West Lancashire 214 266 480 19805 21733 41538 56.65700 0.0009294 0.0015818
Wyre 157 226 383 10819 21156 31975 33.40469 0.0005131 0.0018022
Blaby 304 264 568 31649 27848 59497 78.31709 0.0018932 0.0034461
Charnwood 292 317 609 23040 34580 57620 107.91161 0.0024076 0.0026228
Harborough 273 265 538 19547 21344 40891 64.82323 0.0026586 0.0022494
Hinckley and Bosworth 256 283 539 15677 26835 42512 75.05241 0.0014834 0.0018541
Melton 175 223 398 6142 10160 16302 26.91873 0.0009008 0.0009814
North West Leicestershire 331 267 598 26666 19081 45747 95.63833 0.0013247 0.0024521
Oadby and Wigston 162 215 377 11870 17102 28972 20.71941 0.0010987 0.0016922
Boston 144 211 355 7495 7088 14583 23.15199 0.0004174 0.0010821
East Lindsey 272 280 552 8351 12695 21046 85.42615 0.0007084 0.0012323
Lincoln 229 261 490 25583 14947 40530 51.75565 0.0008666 0.0022827
North Kesteven 308 295 603 16326 22631 38957 103.67317 0.0014144 0.0020627
South Holland 212 265 477 8955 11472 20427 50.29864 0.0015531 0.0013288
South Kesteven 275 303 578 14185 23275 37460 94.80642 0.0039822 0.0018098
West Lindsey 180 265 445 9169 19863 29032 46.25926 0.0006861 0.0013060
Breckland 246 281 527 12378 23016 35394 65.43999 0.0018253 0.0015886
Broadland 181 251 432 18858 32823 51681 39.50570 0.0019036 0.0026217
Great Yarmouth 198 220 418 9250 9511 18761 38.18528 0.0007335 0.0012681
King's Lynn and West Norfolk 299 290 589 11047 14664 25711 94.66804 0.0025603 0.0013157
North Norfolk 187 238 425 8506 11750 20256 34.85599 0.0013520 0.0011684
Norwich 283 259 542 48392 21251 69643 63.73725 0.0026206 0.0041001
South Norfolk 263 258 521 22671 28315 50986 60.76567 0.0026761 0.0027300
Corby 202 239 441 9176 8734 17910 38.33096 0.0013677 0.0012179
Daventry 269 284 553 17275 18078 35353 79.04507 0.0033339 0.0020310
East Northamptonshire 244 274 518 10043 22265 32308 68.11886 0.0038892 0.0013554
Kettering 268 284 552 13980 18491 32471 70.87864 0.0030991 0.0016957
Northampton 337 307 644 39498 27141 66639 118.08045 0.0088677 0.0036166
South Northamptonshire 289 293 582 13977 25354 39331 92.12130 0.0062021 0.0017508
Wellingborough 318 262 580 14948 16857 31805 80.21191 0.0036900 0.0016290
Craven 163 202 365 8901 9015 17916 30.47052 0.0005107 0.0011944
Hambleton 275 248 523 17621 13906 31527 74.05896 0.0009081 0.0022288
Harrogate 325 282 607 19366 18342 37708 110.93138 0.0023168 0.0024481
Richmondshire 324 234 558 7255 7057 14312 93.34512 0.0007768 0.0011037
Ryedale 168 188 356 7047 6445 13492 28.82552 0.0004876 0.0011190
Scarborough 184 244 428 5058 6783 11841 46.02664 0.0005090 0.0008944
Selby 213 264 477 13235 20848 34083 52.54992 0.0010276 0.0015011
Ashfield 273 272 545 25763 27847 53610 76.99274 0.0010518 0.0022554
Bassetlaw 251 280 531 16161 16975 33136 73.46786 0.0009655 0.0015236
Broxtowe 251 280 531 18998 33183 52181 68.09294 0.0015889 0.0019933
Gedling 178 275 453 15434 34039 49473 46.03025 0.0014039 0.0018589
Mansfield 200 267 467 15911 23109 39020 47.93428 0.0008000 0.0015661
Newark and Sherwood 226 288 514 17327 20763 38090 62.46194 0.0015555 0.0017440
Rushcliffe 256 288 544 20897 30122 51019 76.63440 0.0020342 0.0022778
Cherwell 332 298 630 23167 26000 49167 111.31845 0.0082417 0.0026410
Oxford 333 287 620 45775 15693 61468 107.32489 0.0113616 0.0045709
South Oxfordshire 337 268 605 23589 31775 55364 88.07716 0.0151645 0.0028817
Vale of White Horse 336 272 608 24697 25427 50124 98.46835 0.0082747 0.0030820
West Oxfordshire 333 260 593 11768 19990 31758 83.83685 0.0051550 0.0017197
Mendip 250 247 497 11450 15842 27292 64.75602 0.0021761 0.0015764
Sedgemoor 232 259 491 9209 16894 26103 60.36191 0.0010367 0.0015783
South Somerset 321 277 598 15164 15892 31056 101.23392 0.0020952 0.0022205
Taunton Deane 277 243 520 15713 9820 25533 66.05293 0.0012006 0.0022342
West Somerset 165 153 318 2780 3167 5947 18.02491 0.0004053 0.0007693
Cannock Chase 239 267 506 14864 23408 38272 57.70909 0.0009774 0.0013914
East Staffordshire 294 291 585 23275 18822 42097 101.32347 0.0012667 0.0020181
Lichfield 292 277 569 20396 24559 44955 84.24212 0.0020662 0.0019028
Newcastle-under-Lyme 261 285 546 21455 29382 50837 79.24630 0.0011395 0.0019857
South Staffordshire 240 290 530 17575 34347 51922 72.56398 0.0015476 0.0015857
Stafford 314 294 608 23835 20934 44769 105.13228 0.0018028 0.0020109
Staffordshire Moorlands 200 270 470 10201 22847 33048 49.71024 0.0007831 0.0011897
Tamworth 272 268 540 11312 19185 30497 75.84114 0.0011977 0.0014167
Babergh 237 243 480 11616 18040 29656 49.49746 0.0069612 0.0013146
Forest Heath 224 206 430 13035 11543 24578 33.10973 0.0015872 0.0014177
Ipswich 236 255 491 27497 21192 48689 53.76366 0.0057598 0.0023529
Mid Suffolk 273 247 520 13930 20713 34643 63.35687 0.0042169 0.0016024
St Edmundsbury 313 271 584 19511 17447 36958 88.32277 0.0039806 0.0018960
Suffolk Coastal 285 239 524 15143 18880 34023 59.27719 0.0052585 0.0016880
Waveney 193 239 432 8325 11675 20000 39.78191 0.0012538 0.0012324
Elmbridge 305 245 550 27029 35122 62151 62.72055 0.0685952 0.0024269
Epsom and Ewell 254 224 478 15227 22939 38166 43.36186 0.0395024 0.0013033
Guildford 334 258 592 38372 30423 68795 85.17198 0.0361713 0.0030977
Mole Valley 315 217 532 23768 19616 43384 53.14222 0.0298856 0.0020016
Reigate and Banstead 333 262 595 32483 35696 68179 89.77510 0.0537983 0.0024743
Runnymede 335 250 585 30604 21324 51928 82.53407 0.0279868 0.0027531
Spelthorne 309 235 544 21043 30107 51150 57.35777 0.0369474 0.0021774
Surrey Heath 328 243 571 23260 24154 47414 70.25703 0.0172171 0.0021745
Tandridge 246 240 486 13937 22538 36475 59.01705 0.0367740 0.0011585
Waverley 283 258 541 20886 27655 48541 68.70357 0.0272366 0.0019656
Woking 321 232 553 20273 27207 47480 59.27815 0.0340234 0.0020659
North Warwickshire 277 248 525 25282 16883 42165 58.55078 0.0017477 0.0024229
Nuneaton and Bedworth 246 269 515 15037 29798 44835 52.50267 0.0019273 0.0018603
Rugby 320 280 600 17523 20443 37966 101.36753 0.0031786 0.0020217
Stratford-on-Avon 323 296 619 25409 22594 48003 113.24263 0.0043159 0.0028345
Warwick 341 290 631 33726 25353 59079 112.36995 0.0056245 0.0035936
Adur 179 194 373 9348 16454 25802 20.54255 0.0046602 0.0009409
Arun 221 276 497 8962 27174 36136 58.30258 0.0058173 0.0010559
Chichester 300 253 553 24254 16115 40369 73.41119 0.0088457 0.0017499
Crawley 335 246 581 43108 18998 62106 72.56600 0.0248586 0.0029446
Horsham 297 265 562 16707 26654 43361 75.17375 0.0180015 0.0015769
Mid Sussex 306 263 569 20393 31709 52102 80.30516 0.0306906 0.0017534
Worthing 218 236 454 16690 17756 34446 42.16681 0.0062165 0.0012322
Bromsgrove 252 274 526 18870 25995 44865 66.89830 0.0023463 0.0020102
Malvern Hills 199 255 454 10947 14054 25001 46.11698 0.0010464 0.0013943
Redditch 262 259 521 13741 17512 31253 61.69639 0.0013303 0.0016096
Worcester 277 269 546 21134 17845 38979 75.86830 0.0012321 0.0020818
Wychavon 264 290 554 20602 24629 45231 83.46586 0.0017334 0.0021899
Wyre Forest 168 266 434 8628 17456 26084 40.84484 0.0008476 0.0010503
Bolton 291 302 593 33985 42018 76003 106.68833 0.0021221 0.0027325
Bury 261 290 551 26895 41317 68212 83.76982 0.0021060 0.0024213
Manchester 345 333 678 179517 72365 251882 161.42941 0.0081722 0.0134337
Oldham 241 296 537 29113 36102 65215 80.47174 0.0019906 0.0025758
Rochdale 258 286 544 25139 36507 61646 81.99142 0.0017133 0.0022337
Salford 327 304 631 59144 51900 111044 118.37394 0.0039354 0.0053232
Stockport 320 314 634 47968 58798 106766 127.30501 0.0044807 0.0047446
Tameside 243 299 542 23571 45702 69273 84.14139 0.0023514 0.0023393
Trafford 316 299 615 70188 50717 120905 113.06647 0.0048473 0.0068569
Wigan 311 316 627 27578 59356 86934 126.87502 0.0023235 0.0024079
Knowsley 221 273 494 30613 34820 65433 60.35691 0.0015454 0.0025930
Liverpool 301 333 634 91162 50759 141921 130.03027 0.0042335 0.0055228
St. Helens 259 283 542 22077 35479 57556 81.68252 0.0013260 0.0018928
Sefton 217 316 533 28443 46950 75393 77.79284 0.0022610 0.0025645
Wirral 241 324 565 17244 44072 61316 97.57457 0.0024890 0.0017127
Barnsley 242 302 544 17314 37625 54939 78.98661 0.0015289 0.0016357
Doncaster 291 314 605 26494 32298 58792 105.97681 0.0019361 0.0022314
Rotherham 287 312 599 36886 43598 80484 110.48375 0.0018907 0.0027850
Sheffield 337 337 674 63693 45426 109119 160.95208 0.0033646 0.0042047
Gateshead 200 279 479 42942 42399 85341 51.61637 0.0017757 0.0035313
Newcastle upon Tyne 320 292 612 89811 38300 128111 104.36164 0.0030717 0.0057526
North Tyneside 256 283 539 32439 43079 75518 78.16212 0.0019184 0.0030158
South Tyneside 149 271 420 14369 27022 41391 39.24558 0.0009407 0.0014669
Sunderland 254 294 548 40830 34827 75657 81.87235 0.0018640 0.0028891
Birmingham 345 343 688 166056 100223 266279 174.73617 0.0144646 0.0127334
Coventry 339 321 660 50577 39493 90070 145.23539 0.0058079 0.0048386
Dudley 318 318 636 38796 57172 95968 126.70449 0.0042945 0.0031201
Sandwell 330 322 652 58716 61446 120162 138.97124 0.0058632 0.0045497
Solihull 333 320 653 51374 49120 100494 133.30159 0.0075356 0.0053752
Walsall 333 313 646 41782 48755 90537 130.19952 0.0039666 0.0033192
Wolverhampton 314 305 619 44388 40094 84482 112.57007 0.0032852 0.0030924
Bradford 337 318 655 50336 55040 105376 142.38026 0.0043787 0.0048884
Calderdale 319 293 612 26978 28593 55571 123.10999 0.0019020 0.0022845
Kirklees 318 323 641 34538 59527 94065 133.83505 0.0034612 0.0032210
Leeds 340 340 680 121087 65369 186456 166.23405 0.0072535 0.0092803
Wakefield 297 322 619 45101 45316 90417 120.17849 0.0029064 0.0038373
Barking and Dagenham 259 278 537 28989 45584 74573 74.07906 0.0947743 0.0016538
Barnet 335 295 630 53143 94328 147471 107.29323 0.2678205 0.0053627
Bexley 297 282 579 28684 63899 92583 81.72835 0.1419983 0.0016966
Brent 324 306 630 54353 86120 140473 115.73294 0.2552967 0.0066587
Bromley 322 288 610 40897 80537 121434 104.05368 0.2233553 0.0022546
Camden 345 282 627 227171 62784 289955 116.18251 0.4715192 0.0277070
Croydon 306 302 608 39884 92094 131978 100.31073 0.2122394 0.0026456
Ealing 342 296 638 63429 95217 158646 121.88623 0.2424303 0.0072984
Enfield 314 294 608 41313 73140 114453 105.61314 0.1777036 0.0031087
Greenwich 316 289 605 39593 70802 110395 97.80635 0.1959638 0.0024311
Hackney 325 282 607 60542 75197 135739 104.27664 0.2704059 0.0068321
Hammersmith and Fulham 340 273 613 90212 64765 154977 103.70858 0.3005236 0.0118080
Haringey 300 286 586 37279 80177 117456 93.22087 0.2386431 0.0032502
Harrow 311 287 598 28680 68538 97218 92.42766 0.1476876 0.0030209
Havering 286 283 569 31769 59870 91639 80.88612 0.1240316 0.0018851
Hillingdon 345 303 648 96119 61002 157121 123.20678 0.1448890 0.0086205
Hounslow 339 298 637 73977 71624 145601 113.12328 0.1694069 0.0072375
Islington 342 277 619 132028 70981 203009 102.43241 0.3661235 0.0151687
Kensington and Chelsea 334 256 590 86860 50799 137659 87.89829 0.3011796 0.0144531
Kingston upon Thames 317 272 589 35923 45101 81024 88.78187 0.1066740 0.0027264
Lambeth 339 295 634 87037 115419 202456 120.60327 0.4329508 0.0086193
Lewisham 273 288 561 32829 89663 122492 81.85742 0.2550396 0.0023540
Merton 309 280 589 38381 67646 106027 87.42231 0.1894013 0.0028738
Newham 331 305 636 49198 77274 126472 118.87240 0.2181891 0.0037221
Redbridge 266 289 555 32064 77588 109652 80.78754 0.1798939 0.0020014
Richmond upon Thames 316 273 589 38600 58964 97564 87.93170 0.1564364 0.0037355
Southwark 343 297 640 132137 95381 227518 120.54708 0.4190788 0.0124909
Sutton 323 268 591 29841 55030 84871 82.50370 0.1105433 0.0019988
Tower Hamlets 340 296 636 185467 70808 256275 119.14147 0.4108055 0.0210011
Waltham Forest 300 284 584 30367 71912 102279 87.15664 0.1866278 0.0023823
Wandsworth 327 305 632 63894 124029 187923 121.44261 0.4178796 0.0058755
Westminster,City of London 345 289 634 866007 42018 908025 109.10666 1.0000000 0.0736260
Isle of Anglesey 156 203 359 3104 8796 11900 31.56061 0.0002621 0.0008721
Gwynedd 198 256 454 11022 7125 18147 50.38462 0.0004746 0.0014136
Conwy 144 244 388 7404 12011 19415 30.74925 0.0005230 0.0012531
Denbighshire 168 231 399 11688 11327 23015 36.51620 0.0004665 0.0014354
Flintshire 284 278 562 23770 25459 49229 87.62641 0.0012318 0.0021949
Wrexham 263 264 527 13956 16546 30502 73.76438 0.0008075 0.0014989
Ceredigion 119 211 330 4114 4008 8122 21.56446 0.0003086 0.0009089
Pembrokeshire 242 245 487 4107 4992 9099 63.15133 0.0005744 0.0008883
Carmarthenshire 169 269 438 10881 17404 28285 44.90724 0.0008303 0.0017942
Swansea 279 300 579 27777 19589 47366 98.91703 0.0014553 0.0027418
Neath Port Talbot 146 248 394 15691 22974 38665 32.14387 0.0006626 0.0020202
Bridgend 192 261 453 17241 17783 35024 49.79841 0.0007512 0.0018916
The Vale of Glamorgan 250 276 526 13263 26340 39603 77.19142 0.0014653 0.0018653
Cardiff 321 310 631 73041 32252 105293 126.18715 0.0032443 0.0056728
Rhondda Cynon Taf 239 289 528 19349 36305 55654 72.07335 0.0012933 0.0023061
Caerphilly 244 278 522 15975 34600 50575 73.20084 0.0010057 0.0019126
Blaenau Gwent 122 185 307 5439 11664 17103 18.05921 0.0002741 0.0008538
Torfaen 149 222 371 13902 15181 29083 27.77521 0.0005208 0.0016802
Monmouthshire 199 262 461 12988 17540 30528 50.15730 0.0012077 0.0015550
Newport 251 264 515 30393 21238 51631 68.26980 0.0012649 0.0030589
Powys 225 274 499 8116 11453 19569 63.48931 0.0009664 0.0011444
Merthyr Tydfil 93 179 272 8549 8716 17265 14.11701 0.0003200 0.0010095

Question: Can you try to interpret these different centrality measures in the context of our data?

This is helpful, but we might also be interested in discussing the rankings: Which one is the most central local authority in the commuting network? Instead of reading from the table, we can just calculate the ranks.

To begin with, let’s do a test.

test <- centralities %>%
  mutate(rank.test = dense_rank(desc(in.degree))) %>% # We are interested in dense ranking:
                                                      # i.e. two lines with the same value will
                                                      # have the same ranking.
                                                      # desc stands for descending order.
  arrange(rank.test) %>%                              # Arranges the data frame based on rank.test.
  glimpse()
Rows: 346
Columns: 11
$ names        <chr> "Wiltshire", "Manchester", "Birmingham", "Camden", "Hilli…
$ in.degree    <dbl> 345, 345, 345, 345, 345, 345, 344, 343, 343, 343, 342, 34…
$ out.degree   <dbl> 331, 333, 343, 282, 303, 289, 307, 288, 312, 297, 315, 29…
$ degree       <dbl> 676, 678, 688, 627, 648, 634, 651, 631, 655, 640, 657, 63…
$ w.in.degree  <dbl> 39717, 179517, 166056, 227171, 96119, 866007, 44450, 4127…
$ w.out.degree <dbl> 55625, 72365, 100223, 62784, 61002, 42018, 27780, 27862, …
$ w.degree     <dbl> 95342, 251882, 266279, 289955, 157121, 908025, 72230, 691…
$ btwnss       <dbl> 160.51941, 161.42941, 174.73617, 116.18251, 123.20678, 10…
$ eigen        <dbl> 0.015047862, 0.008172246, 0.014464632, 0.471519182, 0.144…
$ prank        <dbl> 0.004065817, 0.013433702, 0.012733372, 0.027707044, 0.008…
$ rank.test    <int> 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, …
ranks <- centralities %>%
  mutate_at(vars(in.degree:prank), 
            funs(dense_rank(desc(.)))) # . for all the selected variables
Warning: `funs()` was deprecated in dplyr 0.8.0.
ℹ Please use a list of either functions or lambdas:

# Simple named list: list(mean = mean, median = median)

# Auto named with `tibble::lst()`: tibble::lst(mean, median)

# Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
# Adds a prefix r_ before each column name to indicate the ranks
colnames(ranks) <- paste("r", colnames(ranks), sep = "_")

Question: Can you quickly compare the ranks with the centralities object based on the rankings?

head(centralities)
# A tibble: 6 × 10
  names     in.degree out.degree degree w.in.degree w.out.degree w.degree btwnss
  <chr>         <dbl>      <dbl>  <dbl>       <dbl>        <dbl>    <dbl>  <dbl>
1 Hartlepo…       111        231    342        8360        11261    19621   21.4
2 Middlesb…       214        250    464       30038        20664    50702   53.1
3 Redcar a…       118        242    360       12786        21904    34690   23.5
4 Stockton…       216        292    508       29986        29329    59315   65.9
5 Darlingt…       237        258    495       18445        15036    33481   63.6
6 Halton          275        274    549       23080        22981    46061   82.8
# ℹ 2 more variables: eigen <dbl>, prank <dbl>
head(ranks)
# A tibble: 6 × 10
  r_names         r_in.degree r_out.degree r_degree r_w.in.degree r_w.out.degree
  <chr>                 <int>        <int>    <int>         <int>          <int>
1 Hartlepool              160          101      200           308            315
2 Middlesbrough           113           82      150           101            215
3 Redcar and Cle…         158           90      195           263            199
4 Stockton-on-Te…         112           40      122           102            132
5 Darlington               95           74      129           200            282
6 Halton                   64           58       89           154            186
# ℹ 4 more variables: r_w.degree <int>, r_btwnss <int>, r_eigen <int>,
#   r_prank <int>
# So, because both dataframes have the same structure and order we can just use
# cbind().

centralities <- cbind(centralities, ranks) %>% 
  arrange(w.in.degree) %>% 
  select(-r_names) %>% 
  glimpse()
Rows: 346
Columns: 19
$ names          <chr> "Isle of Wight", "West Somerset", "Isle of Anglesey", "…
$ in.degree      <dbl> 219, 165, 156, 206, 116, 242, 119, 125, 184, 144, 122, …
$ out.degree     <dbl> 244, 153, 203, 209, 196, 245, 211, 208, 244, 173, 185, …
$ degree         <dbl> 463, 318, 359, 415, 312, 487, 330, 333, 428, 317, 307, …
$ w.in.degree    <dbl> 2083, 2780, 3104, 3447, 3575, 4107, 4114, 4593, 5058, 5…
$ w.out.degree   <dbl> 4544, 3167, 8796, 11981, 8288, 4992, 4008, 8149, 6783, …
$ w.degree       <dbl> 6627, 5947, 11900, 15428, 11863, 9099, 8122, 12742, 118…
$ btwnss         <dbl> 44.65755, 18.02491, 31.56061, 35.60819, 14.07664, 63.15…
$ eigen          <dbl> 0.0019493428, 0.0004052957, 0.0002620964, 0.0005797550,…
$ prank          <dbl> 0.0006276137, 0.0007693002, 0.0008720594, 0.0008753942,…
$ r_in.degree    <int> 109, 142, 148, 119, 159, 91, 157, 155, 132, 153, 156, 1…
$ r_out.degree   <int> 88, 131, 119, 116, 121, 87, 114, 117, 88, 130, 128, 108…
$ r_degree       <int> 151, 203, 196, 177, 205, 135, 202, 201, 170, 204, 206, …
$ r_w.in.degree  <int> 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, …
$ r_w.out.degree <int> 343, 345, 325, 302, 329, 339, 344, 330, 334, 340, 308, …
$ r_w.degree     <int> 345, 346, 338, 330, 339, 343, 344, 336, 340, 342, 325, …
$ r_btwnss       <int> 285, 344, 321, 308, 346, 218, 337, 336, 281, 339, 343, …
$ r_eigen        <int> 207, 333, 342, 316, 337, 317, 339, 324, 325, 345, 341, …
$ r_prank        <int> 346, 343, 337, 336, 328, 335, 332, 330, 334, 272, 339, …
# It combines the centralities (centralities) and ranks (ranks) objects by columns.
# You can imagine it as stacking the columns of ranks after the columns of centralities.
# Since both objects refer to the same observations (i.e. the same rows), we can
# just combine them.


# And this is a nicer table of centralities:
centralities %>% kable(caption = "Centralities") %>% 
  scroll_box(width = "100%", height = "300px")       #Again the `kableExtra` function
Centralities
names in.degree out.degree degree w.in.degree w.out.degree w.degree btwnss eigen prank r_in.degree r_out.degree r_degree r_w.in.degree r_w.out.degree r_w.degree r_btwnss r_eigen r_prank
Isle of Wight 219 244 463 2083 4544 6627 44.65755 0.0019493 0.0006276 109 88 151 346 343 345 285 207 346
West Somerset 165 153 318 2780 3167 5947 18.02491 0.0004053 0.0007693 142 131 203 345 345 346 344 333 343
Isle of Anglesey 156 203 359 3104 8796 11900 31.56061 0.0002621 0.0008721 148 119 196 344 325 338 321 342 337
Weymouth and Portland 206 209 415 3447 11981 15428 35.60819 0.0005798 0.0008754 119 116 177 343 302 330 308 316 336
Torridge 116 196 312 3575 8288 11863 14.07664 0.0003644 0.0009993 159 121 205 342 329 339 346 337 328
Pembrokeshire 242 245 487 4107 4992 9099 63.15133 0.0005744 0.0008883 91 87 135 341 339 343 218 317 335
Ceredigion 119 211 330 4114 4008 8122 21.56446 0.0003086 0.0009089 157 114 202 340 344 344 337 339 332
West Devon 125 208 333 4593 8149 12742 22.82693 0.0005090 0.0009780 155 117 201 339 330 336 336 324 330
Scarborough 184 244 428 5058 6783 11841 46.02664 0.0005090 0.0008944 132 88 170 338 334 340 281 325 334
Barrow-in-Furness 144 173 317 5100 4715 9815 20.75604 0.0002271 0.0014106 153 130 204 337 340 342 339 345 272
Blaenau Gwent 122 185 307 5439 11664 17103 18.05921 0.0002741 0.0008538 156 128 206 336 308 325 343 341 339
Mid Devon 163 220 383 5569 13667 19236 31.82063 0.0007052 0.0015827 144 108 187 335 291 316 320 306 246
Thanet 188 242 430 5846 13348 19194 36.05674 0.0056380 0.0007948 130 90 168 334 294 317 307 134 342
Forest of Dean 206 248 454 6007 14512 20519 48.05798 0.0008705 0.0010042 119 84 154 333 287 306 271 287 324
Melton 175 223 398 6142 10160 16302 26.91873 0.0009008 0.0009814 138 106 181 332 319 328 331 285 329
Eden 225 187 412 6209 4666 10875 41.29631 0.0002394 0.0016928 105 126 178 331 341 341 295 344 225
Allerdale 188 203 391 6436 11733 18169 33.91827 0.0002556 0.0019898 130 119 184 330 305 320 313 343 182
Maldon 210 210 420 6513 13689 20202 33.49157 0.0119064 0.0007505 117 115 174 329 290 309 316 104 344
Tendring 229 257 486 6763 17203 23966 51.10530 0.0091833 0.0008516 102 75 136 328 260 299 261 109 340
Rutland 223 225 448 6776 6446 13222 40.36699 0.0012338 0.0010011 107 104 158 327 335 335 298 257 326
North Dorset 254 216 470 6962 9997 16959 47.73131 0.0018001 0.0011060 80 111 147 326 320 326 274 221 311
Ryedale 168 188 356 7047 6445 13492 28.82552 0.0004876 0.0011190 141 125 197 325 336 334 326 326 310
Richmondshire 324 234 558 7255 7057 14312 93.34512 0.0007768 0.0011037 21 98 81 324 333 332 105 296 312
Gosport 272 237 509 7327 20473 27800 58.39117 0.0018505 0.0010068 67 95 121 323 216 280 236 218 323
Conwy 144 244 388 7404 12011 19415 30.74925 0.0005230 0.0012531 153 88 186 322 301 315 322 320 295
Castle Point 154 236 390 7467 23473 30940 28.09746 0.0251378 0.0007424 149 96 185 321 179 262 328 77 345
Boston 144 211 355 7495 7088 14583 23.15199 0.0004174 0.0010821 153 114 198 320 332 331 335 332 314
Rossendale 152 218 370 7571 16019 23590 28.52086 0.0004274 0.0010012 150 109 192 319 274 300 327 331 325
Purbeck 226 186 412 7634 8732 16366 33.64330 0.0010481 0.0011865 104 127 178 318 327 327 314 272 306
High Peak 188 255 443 7663 17319 24982 45.93415 0.0008832 0.0009999 130 77 162 317 259 295 282 286 327
North Devon 261 233 494 7735 4645 12380 56.35792 0.0007480 0.0012730 75 99 130 316 342 337 246 301 292
Copeland 162 185 347 7919 5986 13905 26.13944 0.0001593 0.0017038 145 128 199 315 337 333 332 346 222
Hastings 164 236 400 8006 11732 19738 29.94627 0.0049038 0.0009044 143 96 179 314 306 311 324 142 333
Lancaster 209 274 483 8091 11592 19683 59.97534 0.0006400 0.0015040 118 58 139 313 309 312 226 312 259
Powys 225 274 499 8116 11453 19569 63.48931 0.0009664 0.0011444 105 58 126 312 312 314 216 279 309
East Cambridgeshire 216 247 463 8216 20939 29155 41.75094 0.0043745 0.0012342 112 85 151 311 210 275 294 151 296
Waveney 193 239 432 8325 11675 20000 39.78191 0.0012538 0.0012324 127 93 166 310 307 310 299 255 298
East Lindsey 272 280 552 8351 12695 21046 85.42615 0.0007084 0.0012323 67 52 86 309 300 304 128 305 299
Hartlepool 111 231 342 8360 11261 19621 21.38152 0.0003901 0.0010887 160 101 200 308 315 313 338 335 313
North Norfolk 187 238 425 8506 11750 20256 34.85599 0.0013520 0.0011684 131 94 172 307 304 308 311 246 307
Merthyr Tydfil 93 179 272 8549 8716 17265 14.11701 0.0003200 0.0010095 161 129 207 306 328 324 345 338 322
Torbay 191 252 443 8569 12764 21333 46.76698 0.0007531 0.0015136 129 80 162 305 299 303 276 298 257
Wyre Forest 168 266 434 8628 17456 26084 40.84484 0.0008476 0.0010503 141 66 165 304 255 286 297 289 317
Craven 163 202 365 8901 9015 17916 30.47052 0.0005107 0.0011944 144 120 194 303 323 322 323 323 303
South Holland 212 265 477 8955 11472 20427 50.29864 0.0015531 0.0013288 115 67 144 302 311 307 264 233 285
Arun 221 276 497 8962 27174 36136 58.30258 0.0058173 0.0010559 108 56 128 301 146 229 237 131 316
West Lindsey 180 265 445 9169 19863 29032 46.25926 0.0006861 0.0013060 135 67 160 300 225 277 277 308 289
Corby 202 239 441 9176 8734 17910 38.33096 0.0013677 0.0012179 121 93 163 299 326 323 302 245 301
Sedgemoor 232 259 491 9209 16894 26103 60.36191 0.0010367 0.0015783 100 73 132 298 264 285 224 275 248
Great Yarmouth 198 220 418 9250 9511 18761 38.18528 0.0007335 0.0012681 125 108 175 297 322 318 303 303 293
Adur 179 194 373 9348 16454 25802 20.54255 0.0046602 0.0009409 136 122 190 296 270 287 341 144 331
Rother 182 215 397 9630 15054 24684 27.26210 0.0074697 0.0010183 133 112 182 295 281 296 330 119 321
South Lakeland 234 235 469 9651 8994 18645 56.17406 0.0005490 0.0020873 98 97 148 294 324 319 247 318 163
Carlisle 306 242 548 9904 5953 15857 78.20939 0.0005917 0.0021074 39 90 90 293 338 329 165 314 162
Dover 234 249 483 9959 16669 26628 48.35895 0.0045037 0.0010274 98 83 139 292 267 283 270 147 319
Fenland 179 265 444 10010 16271 26281 41.16076 0.0024054 0.0013423 136 67 161 291 271 284 296 191 281
East Northamptonshire 244 274 518 10043 22265 32308 68.11886 0.0038892 0.0013554 89 58 115 290 197 255 203 164 279
Gravesham 212 258 470 10155 25676 35831 42.33955 0.0298471 0.0008559 115 74 147 289 161 231 292 67 338
Staffordshire Moorlands 200 270 470 10201 22847 33048 49.71024 0.0007831 0.0011897 123 62 147 288 191 250 268 294 305
Rochford 178 239 417 10411 24351 34762 35.41168 0.0271557 0.0008385 137 93 176 287 175 239 309 73 341
Pendle 178 212 390 10432 15013 25445 34.52029 0.0003655 0.0013588 137 113 185 286 283 291 312 336 277
Christchurch 175 192 367 10677 10213 20890 24.36314 0.0012017 0.0012651 138 123 193 285 318 305 333 262 294
Herefordshire, County of 306 292 598 10786 13434 24220 103.12522 0.0019351 0.0013338 39 40 54 284 293 298 82 209 283
Wyre 157 226 383 10819 21156 31975 33.40469 0.0005131 0.0018022 147 103 187 283 206 256 317 322 210
Carmarthenshire 169 269 438 10881 17404 28285 44.90724 0.0008303 0.0017942 140 63 164 282 257 279 283 290 211
Malvern Hills 199 255 454 10947 14054 25001 46.11698 0.0010464 0.0013943 124 77 154 281 288 293 279 273 273
Shepway 232 250 482 10992 14806 25798 48.02087 0.0065689 0.0010662 100 82 140 280 285 288 272 125 315
Gwynedd 198 256 454 11022 7125 18147 50.38462 0.0004746 0.0014136 125 76 154 279 331 321 263 327 271
King's Lynn and West Norfolk 299 290 589 11047 14664 25711 94.66804 0.0025603 0.0013157 45 42 62 278 286 289 103 185 286
Cornwall,Isles of Scilly 341 330 671 11163 18567 29730 155.46166 0.0032429 0.0016854 5 7 6 277 238 271 6 174 228
Tamworth 272 268 540 11312 19185 30497 75.84114 0.0011977 0.0014167 67 64 97 276 232 266 177 264 270
Mendip 250 247 497 11450 15842 27292 64.75602 0.0021761 0.0015764 84 85 128 275 276 281 212 199 250
North East Lincolnshire 219 286 505 11562 10600 22162 65.06108 0.0007256 0.0013687 109 46 125 274 317 302 210 304 276
Babergh 237 243 480 11616 18040 29656 49.49746 0.0069612 0.0013146 95 89 141 273 246 272 269 122 287
Denbighshire 168 231 399 11688 11327 23015 36.51620 0.0004665 0.0014354 141 101 180 272 314 301 305 328 267
West Oxfordshire 333 260 593 11768 19990 31758 83.83685 0.0051550 0.0017197 13 72 58 271 224 258 136 140 218
Oadby and Wigston 162 215 377 11870 17102 28972 20.71941 0.0010987 0.0016922 145 112 189 270 262 278 340 270 226
Teignbridge 232 252 484 12250 20987 33237 58.11052 0.0010440 0.0023279 100 80 138 269 209 248 238 274 136
Eastbourne 204 227 431 12373 12830 25203 36.12422 0.0054015 0.0010266 120 102 167 268 298 292 306 138 320
Breckland 246 281 527 12378 23016 35394 65.43999 0.0018253 0.0015886 88 51 106 267 185 235 209 219 244
East Devon 315 261 576 12430 18130 30560 83.85873 0.0015576 0.0029037 30 71 71 266 243 263 135 231 87
Swale 237 274 511 12599 22875 35474 59.86629 0.0186895 0.0010335 95 58 120 265 190 234 227 85 318
Hyndburn 130 203 333 12702 17380 30082 20.42098 0.0002830 0.0015889 154 119 201 264 258 269 342 340 243
Redcar and Cleveland 118 242 360 12786 21904 34690 23.46728 0.0004593 0.0017847 158 90 195 263 199 240 334 329 212
Monmouthshire 199 262 461 12988 17540 30528 50.15730 0.0012077 0.0015550 124 70 152 262 253 264 265 261 254
Forest Heath 224 206 430 13035 11543 24578 33.10973 0.0015872 0.0014177 106 118 168 261 310 297 318 228 269
Derbyshire Dales 201 251 452 13161 11828 24989 42.88387 0.0009256 0.0013577 122 81 156 260 303 294 290 283 278
Selby 213 264 477 13235 20848 34083 52.54992 0.0010276 0.0015011 114 68 144 259 212 244 256 276 260
Stroud 289 267 556 13241 20326 33567 83.56128 0.0024767 0.0018481 53 65 82 258 221 246 138 188 202
The Vale of Glamorgan 250 276 526 13263 26340 39603 77.19142 0.0014653 0.0018653 84 56 107 257 155 210 170 240 197
Chiltern 253 234 487 13391 22558 35949 44.70020 0.0301093 0.0015106 81 98 135 256 194 230 284 65 258
North East Derbyshire 172 274 446 13414 28664 42078 42.70590 0.0007958 0.0014644 139 58 159 255 133 200 291 293 265
East Dorset 197 234 431 13531 19487 33018 37.02858 0.0023127 0.0016371 126 98 167 254 231 251 304 196 236
Redditch 262 259 521 13741 17512 31253 61.69639 0.0013303 0.0016096 74 73 112 253 254 260 222 247 241
Torfaen 149 222 371 13902 15181 29083 27.77521 0.0005208 0.0016802 151 107 191 252 279 276 329 321 229
Mid Suffolk 273 247 520 13930 20713 34643 63.35687 0.0042169 0.0016024 66 85 113 251 214 241 217 155 242
Tandridge 246 240 486 13937 22538 36475 59.01705 0.0367740 0.0011585 88 92 136 250 195 228 232 58 308
Wrexham 263 264 527 13956 16546 30502 73.76438 0.0008075 0.0014989 73 68 106 249 268 265 184 291 261
South Northamptonshire 289 293 582 13977 25354 39331 92.12130 0.0062021 0.0017508 53 39 66 248 166 211 108 128 214
Kettering 268 284 552 13980 18491 32471 70.87864 0.0030991 0.0016957 70 48 86 247 240 254 196 176 224
Ribble Valley 187 190 377 14075 12870 26945 29.07366 0.0004309 0.0018088 131 124 189 246 297 282 325 330 208
South Kesteven 275 303 578 14185 23275 37460 94.80642 0.0039822 0.0018098 64 30 70 245 183 226 100 158 207
South Derbyshire 216 276 492 14306 28077 42383 53.41385 0.0011521 0.0016710 112 56 131 244 138 196 252 266 230
South Tyneside 149 271 420 14369 27022 41391 39.24558 0.0009407 0.0014669 151 61 174 243 150 204 301 281 264
Lewes 202 224 426 14403 19800 34203 34.92845 0.0104541 0.0011926 121 105 171 242 226 243 310 108 304
Burnley 159 222 381 14595 15150 29745 33.54753 0.0003922 0.0016247 146 107 188 241 280 270 315 334 239
North Lincolnshire 249 297 546 14755 15493 30248 83.06742 0.0007716 0.0016239 85 35 92 240 278 268 141 297 240
Cannock Chase 239 267 506 14864 23408 38272 57.70909 0.0009774 0.0013914 94 65 124 239 181 218 240 278 275
Wellingborough 318 262 580 14948 16857 31805 80.21191 0.0036900 0.0016290 27 70 68 238 266 257 156 165 238
Wealden 258 261 519 14989 30274 45263 58.96939 0.0186274 0.0013393 77 71 114 237 122 180 233 86 282
Chorley 168 261 429 14994 26851 41845 43.70430 0.0007779 0.0016512 141 71 169 236 151 201 287 295 232
Ashford 255 254 509 15035 17786 32821 59.60893 0.0139988 0.0012927 79 78 121 235 249 252 229 100 291
Nuneaton and Bedworth 246 269 515 15037 29798 44835 52.50267 0.0019273 0.0018603 88 63 117 234 127 185 257 210 198
Suffolk Coastal 285 239 524 15143 18880 34023 59.27719 0.0052585 0.0016880 57 93 109 233 236 245 231 139 227
South Somerset 321 277 598 15164 15892 31056 101.23392 0.0020952 0.0022205 24 55 54 232 275 261 89 202 152
Braintree 270 277 547 15184 31582 46766 74.27107 0.0271398 0.0013120 68 55 91 231 114 173 181 74 288
Epsom and Ewell 254 224 478 15227 22939 38166 43.36186 0.0395024 0.0013033 80 105 143 230 188 219 288 48 290
Bolsover 242 243 485 15315 20347 35662 54.66120 0.0006313 0.0014976 91 89 137 229 220 232 250 313 262
Gedling 178 275 453 15434 34039 49473 46.03025 0.0014039 0.0018589 137 57 155 228 97 159 280 244 199
East Hampshire 328 268 596 15462 25476 40938 93.84842 0.0120776 0.0016435 17 64 56 227 162 206 104 103 235
Hinckley and Bosworth 256 283 539 15677 26835 42512 75.05241 0.0014834 0.0018541 78 49 98 226 152 195 179 239 200
Cotswold 293 254 547 15685 13651 29336 71.25964 0.0041576 0.0018831 49 78 91 225 292 274 195 156 195
Neath Port Talbot 146 248 394 15691 22974 38665 32.14387 0.0006626 0.0020202 152 84 183 224 187 216 319 311 171
Taunton Deane 277 243 520 15713 9820 25533 66.05293 0.0012006 0.0022342 63 89 113 223 321 290 206 263 148
Mansfield 200 267 467 15911 23109 39020 47.93428 0.0008000 0.0015661 123 65 149 222 184 213 273 292 252
Caerphilly 244 278 522 15975 34600 50575 73.20084 0.0010057 0.0019126 89 54 111 221 91 155 189 277 186
Harlow 294 232 526 15994 16492 32486 57.74732 0.0195485 0.0013293 48 100 107 220 269 253 239 84 284
Bassetlaw 251 280 531 16161 16975 33136 73.46786 0.0009655 0.0015236 83 52 103 219 263 249 186 280 256
North Kesteven 308 295 603 16326 22631 38957 103.67317 0.0014144 0.0020627 37 37 51 218 192 215 81 243 167
Erewash 200 275 475 16623 28395 45018 50.97433 0.0012799 0.0017058 123 57 145 217 135 182 262 252 221
Worthing 218 236 454 16690 17756 34446 42.16681 0.0062165 0.0012322 110 96 154 216 252 242 293 127 300
Horsham 297 265 562 16707 26654 43361 75.17375 0.0180015 0.0015769 46 67 79 215 153 194 178 89 249
South Hams 282 235 517 16938 13322 30260 65.87841 0.0012274 0.0025189 60 97 116 214 295 267 208 260 116
Bridgend 192 261 453 17241 17783 35024 49.79841 0.0007512 0.0018916 128 71 155 213 250 237 267 300 192
Wirral 241 324 565 17244 44072 61316 97.57457 0.0024890 0.0017127 92 10 78 212 59 107 98 187 219
Daventry 269 284 553 17275 18078 35353 79.04507 0.0033339 0.0020310 69 48 85 211 245 236 160 171 169
Barnsley 242 302 544 17314 37625 54939 78.98661 0.0015289 0.0016357 91 31 94 210 74 128 161 237 237
Newark and Sherwood 226 288 514 17327 20763 38090 62.46194 0.0015555 0.0017440 104 44 118 209 213 220 220 232 216
Rugby 320 280 600 17523 20443 37966 101.36753 0.0031786 0.0020217 25 52 52 208 218 221 87 175 170
South Staffordshire 240 290 530 17575 34347 51922 72.56398 0.0015476 0.0015857 93 42 104 207 95 142 191 234 245
Uttlesford 307 240 547 17618 17973 35591 63.70076 0.0202609 0.0014814 38 92 91 206 247 233 214 83 263
Hambleton 275 248 523 17621 13906 31527 74.05896 0.0009081 0.0022288 64 84 110 205 289 259 183 284 151
Havant 211 248 459 17666 26401 44067 43.23830 0.0039611 0.0018958 116 84 153 204 154 188 289 161 189
Brentwood 289 223 512 17745 19995 37740 52.37953 0.0409946 0.0012340 53 106 119 203 223 222 258 46 297
West Dorset 235 238 473 18059 11425 29484 49.90794 0.0017699 0.0020121 97 94 146 202 313 273 266 223 173
Broxbourne 317 249 566 18151 25440 43591 73.49505 0.0391390 0.0015310 28 83 77 201 164 192 185 49 255
Darlington 237 258 495 18445 15036 33481 63.64096 0.0007033 0.0018073 95 74 129 200 282 247 215 307 209
Hart 328 253 581 18470 26300 44770 78.77749 0.0156487 0.0018362 17 79 67 199 156 186 162 93 203
Three Rivers 322 253 575 18584 27115 45699 76.96263 0.0380419 0.0018902 23 79 72 198 149 178 173 52 193
North Somerset 288 309 597 18813 32553 51366 106.51079 0.0033370 0.0024983 54 24 55 197 106 147 69 170 118
Broadland 181 251 432 18858 32823 51681 39.50570 0.0019036 0.0026217 134 81 166 196 103 145 300 212 109
Bromsgrove 252 274 526 18870 25995 44865 66.89830 0.0023463 0.0020102 82 58 107 195 159 184 205 193 176
Broxtowe 251 280 531 18998 33183 52181 68.09294 0.0015889 0.0019933 83 52 103 194 101 139 204 227 181
Rhondda Cynon Taf 239 289 528 19349 36305 55654 72.07335 0.0012933 0.0023061 94 43 105 193 78 125 193 251 138
Harrogate 325 282 607 19366 18342 37708 110.93138 0.0023168 0.0024481 20 50 48 192 241 223 60 195 124
Canterbury 234 274 508 19479 18121 37600 61.96377 0.0115107 0.0014501 98 58 122 191 244 225 221 105 266
St Edmundsbury 313 271 584 19511 17447 36958 88.32277 0.0039806 0.0018960 32 61 65 190 256 227 117 159 188
Harborough 273 265 538 19547 21344 40891 64.82323 0.0026586 0.0022494 66 67 99 189 201 207 211 182 147
West Lancashire 214 266 480 19805 21733 41538 56.65700 0.0009294 0.0015818 113 66 141 188 200 203 245 282 247
Aylesbury Vale 330 303 633 19831 34981 54812 113.28702 0.0227757 0.0020113 16 30 27 187 86 129 50 81 174
Blackpool 178 246 424 19835 17775 37610 43.94347 0.0005901 0.0025846 137 86 173 186 251 224 286 315 112
Tunbridge Wells 227 240 467 20116 22147 42263 47.12165 0.0336823 0.0014347 103 92 149 185 198 197 275 61 268
Huntingdonshire 310 302 612 20270 31621 51891 102.90672 0.0132382 0.0023001 35 31 43 184 113 143 83 102 139
Woking 321 232 553 20273 27207 47480 59.27815 0.0340234 0.0020659 24 100 85 183 145 170 230 60 165
North Hertfordshire 293 273 566 20355 32707 53062 77.54596 0.0292122 0.0018191 49 59 77 182 105 137 169 70 204
Mid Sussex 306 263 569 20393 31709 52102 80.30516 0.0306906 0.0017534 39 69 75 181 112 140 155 63 213
Lichfield 292 277 569 20396 24559 44955 84.24212 0.0020662 0.0019028 50 55 75 180 172 183 133 203 187
Wychavon 264 290 554 20602 24629 45231 83.46586 0.0017334 0.0021899 72 42 84 179 170 181 139 225 157
South Bucks 310 223 533 20603 20381 40984 55.75605 0.0262182 0.0023714 35 106 101 178 219 205 249 75 131
Southend-on-Sea 247 260 507 20661 29749 50410 57.62656 0.0460325 0.0012049 87 72 123 177 129 156 241 44 302
Stevenage 314 254 568 20748 18525 39273 72.02250 0.0171373 0.0017124 31 78 76 176 239 212 194 91 220
Waverley 283 258 541 20886 27655 48541 68.70357 0.0272366 0.0019656 59 74 96 175 144 163 200 72 184
Rushcliffe 256 288 544 20897 30122 51019 76.63440 0.0020342 0.0022778 78 44 94 174 123 151 174 204 143
Sevenoaks 274 246 520 20929 30420 51349 58.51716 0.0566217 0.0013925 65 86 113 173 121 148 235 38 274
Spelthorne 309 235 544 21043 30107 51150 57.35777 0.0369474 0.0021774 36 97 94 172 124 149 243 57 159
Worcester 277 269 546 21134 17845 38979 75.86830 0.0012321 0.0020818 63 63 92 171 248 214 176 258 164
Chesterfield 242 256 498 21349 17107 38456 56.87320 0.0007520 0.0017426 91 76 127 170 261 217 244 299 217
Bedford 314 297 611 21392 22483 43875 100.59431 0.0154519 0.0018139 31 35 44 169 196 189 90 94 206
Newcastle-under-Lyme 261 285 546 21455 29382 50837 79.24630 0.0011395 0.0019857 75 47 92 168 131 153 158 268 183
Epping Forest 290 251 541 21509 35475 56984 68.68786 0.0711352 0.0015571 52 81 96 167 84 121 201 33 253
Fylde 230 223 453 21711 13080 34791 52.67556 0.0005238 0.0027609 101 106 155 166 296 238 255 319 96
Amber Valley 281 271 552 21778 25962 47740 77.94638 0.0014457 0.0019987 61 61 86 165 160 168 167 242 180
Thurrock 281 268 549 21804 34873 56677 75.03469 0.0589668 0.0013440 61 64 89 164 87 122 180 37 280
St. Helens 259 283 542 22077 35479 57556 81.68252 0.0013260 0.0018928 76 49 95 163 83 120 151 248 190
East Hertfordshire 297 274 571 22122 35988 58110 79.93959 0.0446914 0.0018916 46 58 74 162 81 118 157 45 191
Northumberland 287 310 597 22254 43011 65265 105.96942 0.0024251 0.0023084 55 23 55 161 62 95 72 189 137
South Norfolk 263 258 521 22671 28315 50986 60.76567 0.0026761 0.0027300 73 74 112 160 136 152 223 181 100
Medway 308 312 620 22710 50453 73163 109.01019 0.0533814 0.0015706 37 21 36 159 50 75 64 42 251
New Forest 302 279 581 22744 29791 52535 86.90241 0.0054670 0.0022859 42 53 67 158 128 138 126 137 140
Test Valley 318 256 574 22956 24789 47745 79.16895 0.0075231 0.0021833 27 76 73 157 168 167 159 118 158
Colchester 327 270 597 22968 24545 47513 94.70758 0.0235711 0.0016488 18 62 55 156 173 169 102 80 233
Charnwood 292 317 609 23040 34580 57620 107.91161 0.0024076 0.0026228 50 16 46 155 92 119 65 190 108
Halton 275 274 549 23080 22981 46061 82.81950 0.0012432 0.0021577 64 58 89 154 186 175 142 256 161
Cherwell 332 298 630 23167 26000 49167 111.31845 0.0082417 0.0026410 14 34 30 153 158 161 59 114 107
Surrey Heath 328 243 571 23260 24154 47414 70.25703 0.0172171 0.0021745 17 89 74 152 177 171 197 90 160
East Staffordshire 294 291 585 23275 18822 42097 101.32347 0.0012667 0.0020181 48 41 64 151 237 199 88 253 172
Telford and Wrekin 324 296 620 23376 18322 41698 109.90081 0.0018745 0.0020630 21 36 36 150 242 202 62 216 166
South Ribble 233 256 489 23544 30099 53643 59.66094 0.0007475 0.0026508 99 76 134 149 125 132 228 302 105
Tameside 243 299 542 23571 45702 69273 84.14139 0.0023514 0.0023393 90 33 95 148 54 82 134 192 135
South Oxfordshire 337 268 605 23589 31775 55364 88.07716 0.0151645 0.0028817 9 64 50 147 110 127 118 95 89
Mole Valley 315 217 532 23768 19616 43384 53.14222 0.0298856 0.0020016 30 110 102 146 228 193 253 66 177
Flintshire 284 278 562 23770 25459 49229 87.62641 0.0012318 0.0021949 58 54 79 145 163 160 122 259 156
Dacorum 338 286 624 23817 30858 54675 104.58269 0.0370314 0.0020320 8 46 33 144 117 130 75 56 168
Stafford 314 294 608 23835 20934 44769 105.13228 0.0018028 0.0020109 31 38 47 143 211 187 74 220 175
Swindon 334 293 627 23868 24439 48307 112.57493 0.0066072 0.0024599 12 39 32 142 174 164 55 124 122
Blackburn with Darwen 204 245 449 23988 19666 43654 46.17387 0.0006750 0.0024693 120 87 157 141 227 191 278 310 120
Cheltenham 293 272 565 24125 19592 43717 85.00521 0.0025958 0.0030665 49 60 78 140 229 190 130 184 75
Chichester 300 253 553 24254 16115 40369 73.41119 0.0088457 0.0017499 44 79 85 139 272 209 187 111 215
Fareham 310 264 574 24609 29734 54343 76.99256 0.0039958 0.0022174 35 68 73 138 130 131 172 157 153
Vale of White Horse 336 272 608 24697 25427 50124 98.46835 0.0082747 0.0030820 10 60 47 137 165 157 96 113 74
Rushmoor 334 258 592 25017 26056 51073 89.27181 0.0143124 0.0022710 12 74 59 136 157 150 114 99 144
Rochdale 258 286 544 25139 36507 61646 81.99142 0.0017133 0.0022337 77 46 94 135 76 103 145 226 149
Tewkesbury 322 249 571 25184 20469 45653 87.05614 0.0015420 0.0030289 23 83 74 134 217 179 125 236 77
Bournemouth 248 283 531 25210 32998 58208 72.37210 0.0044016 0.0028426 86 49 103 133 102 117 192 149 92
Hertsmere 316 242 558 25251 28231 53482 69.43996 0.0558631 0.0022121 29 90 81 132 137 135 198 39 154
North Warwickshire 277 248 525 25282 16883 42165 58.55078 0.0017477 0.0024229 63 84 108 131 265 198 234 224 127
Basingstoke and Deane 338 280 618 25401 30492 55893 101.39306 0.0181075 0.0025112 8 52 38 130 118 124 86 88 117
Stratford-on-Avon 323 296 619 25409 22594 48003 113.24263 0.0043159 0.0028345 22 36 37 129 193 165 51 152 93
Lincoln 229 261 490 25583 14947 40530 51.75565 0.0008666 0.0022827 102 71 133 128 284 208 259 288 142
York 304 310 614 25651 21058 46709 117.86975 0.0023097 0.0026595 41 23 41 127 208 174 42 197 104
Ashfield 273 272 545 25763 27847 53610 76.99274 0.0010518 0.0022554 66 60 93 126 142 133 171 271 145
Plymouth 332 300 632 25793 20138 45931 124.45365 0.0015797 0.0032944 14 32 28 125 222 176 26 229 60
Gloucester 290 276 566 26099 23463 49562 85.55168 0.0014927 0.0030158 52 56 77 124 180 158 127 238 79
Doncaster 291 314 605 26494 32298 58792 105.97681 0.0019361 0.0022314 51 19 50 123 108 116 71 208 150
North West Leicestershire 331 267 598 26666 19081 45747 95.63833 0.0013247 0.0024521 15 65 54 122 234 177 99 249 123
St Albans 318 271 589 26809 36418 63227 81.85818 0.0619411 0.0023555 27 61 62 121 77 99 148 35 132
Bury 261 290 551 26895 41317 68212 83.76982 0.0021060 0.0024213 75 42 87 120 66 86 137 201 128
Calderdale 319 293 612 26978 28593 55571 123.10999 0.0019020 0.0022845 26 39 43 119 134 126 29 213 141
Elmbridge 305 245 550 27029 35122 62151 62.72055 0.0685952 0.0024269 40 87 88 118 85 101 219 34 126
Wycombe 339 283 622 27246 32323 59569 100.06675 0.0304376 0.0027075 7 49 34 117 107 111 92 64 102
Ipswich 236 255 491 27497 21192 48689 53.76366 0.0057598 0.0023529 96 77 132 116 205 162 251 133 134
Wigan 311 316 627 27578 59356 86934 126.87502 0.0023235 0.0024079 34 17 32 115 34 57 23 194 129
Swansea 279 300 579 27777 19589 47366 98.91703 0.0014553 0.0027418 62 32 69 114 230 172 94 241 98
Sefton 217 316 533 28443 46950 75393 77.79284 0.0022610 0.0025645 111 17 101 113 53 69 168 198 114
Bracknell Forest 336 263 599 28503 31002 59505 84.64837 0.0181350 0.0026867 10 69 53 112 116 112 131 87 103
Harrow 311 287 598 28680 68538 97218 92.42766 0.1476876 0.0030209 34 45 54 111 22 48 107 26 78
Bexley 297 282 579 28684 63899 92583 81.72835 0.1419983 0.0016966 46 50 69 110 28 52 150 28 223
Watford 332 248 580 28799 24774 53573 78.54169 0.0405963 0.0024651 14 84 68 109 169 134 163 47 121
Barking and Dagenham 259 278 537 28989 45584 74573 74.07906 0.0947743 0.0016538 76 54 100 108 55 71 182 32 231
Shropshire 336 330 666 29111 34424 63535 148.35300 0.0036140 0.0027990 10 7 7 107 94 98 8 166 94
Oldham 241 296 537 29113 36102 65215 80.47174 0.0019906 0.0025758 92 36 100 106 79 96 154 206 113
Bath and North East Somerset 318 289 607 29241 23945 53186 106.11349 0.0063148 0.0031748 27 43 48 105 178 136 70 126 67
Sutton 323 268 591 29841 55030 84871 82.50370 0.1105433 0.0019988 22 64 60 104 40 59 144 30 179
Maidstone 296 278 574 29979 31058 61037 76.04405 0.0296875 0.0018485 47 54 73 103 115 109 175 68 201
Stockton-on-Tees 216 292 508 29986 29329 59315 65.89576 0.0010995 0.0031831 112 40 122 102 132 114 207 269 66
Middlesbrough 214 250 464 30038 20664 50702 53.13953 0.0006790 0.0029637 113 82 150 101 215 154 254 309 82
East Riding of Yorkshire 292 326 618 30194 54386 84580 120.56251 0.0020021 0.0031038 50 9 38 100 41 60 35 205 70
Waltham Forest 300 284 584 30367 71912 102279 87.15664 0.1866278 0.0023823 44 48 65 99 17 43 124 21 130
Newport 251 264 515 30393 21238 51631 68.26980 0.0012649 0.0030589 83 68 117 98 204 146 202 254 76
Chelmsford 293 275 568 30575 34222 64797 83.33582 0.0512377 0.0018830 49 57 76 97 96 97 140 43 196
Runnymede 335 250 585 30604 21324 51928 82.53407 0.0279868 0.0027531 11 82 64 96 202 141 143 71 97
Knowsley 221 273 494 30613 34820 65433 60.35691 0.0015454 0.0025930 108 59 130 95 89 93 225 235 111
Wokingham 340 269 609 30764 42810 73574 90.37405 0.0237476 0.0032668 6 63 46 94 63 74 111 79 62
Tonbridge and Malling 270 254 524 30765 30473 61238 56.01878 0.0379614 0.0018185 68 78 109 93 119 108 248 54 205
Blaby 304 264 568 31649 27848 59497 78.31709 0.0018932 0.0034461 41 68 76 92 141 113 164 214 56
Havering 286 283 569 31769 59870 91639 80.88612 0.1240316 0.0018851 56 49 75 91 32 53 152 29 194
Brighton and Hove 297 287 584 31879 36938 68817 88.44945 0.0325543 0.0022023 46 45 65 90 75 84 116 62 155
Poole 314 276 590 32048 24563 56611 87.92048 0.0045316 0.0030996 31 56 61 89 171 123 120 146 71
Redbridge 266 289 555 32064 77588 109652 80.78754 0.1798939 0.0020014 71 43 83 88 12 34 153 22 178
North Tyneside 256 283 539 32439 43079 75518 78.16212 0.0019184 0.0030158 78 49 98 87 61 68 166 211 80
Eastleigh 309 260 569 32465 33798 66263 81.90592 0.0056096 0.0029667 36 72 75 86 98 91 146 136 81
Central Bedfordshire 343 312 655 32469 66131 98600 129.24999 0.0390917 0.0028629 3 21 12 85 24 46 21 50 91
Reigate and Banstead 333 262 595 32483 35696 68179 89.77510 0.0537983 0.0024743 13 70 57 84 82 87 112 41 119
Peterborough 337 294 631 32552 19136 51688 111.41706 0.0080528 0.0029620 9 38 29 83 233 144 58 116 83
Dartford 306 248 554 32588 27117 59705 69.01172 0.0545483 0.0016458 39 84 84 82 148 110 199 40 234
Lewisham 273 288 561 32829 89663 122492 81.85742 0.2550396 0.0023540 66 44 80 81 8 25 149 13 133
West Berkshire 340 277 617 33558 28003 61561 103.72536 0.0157734 0.0033439 6 55 39 80 139 104 79 92 58
Warwick 341 290 631 33726 25353 59079 112.36995 0.0056245 0.0035936 5 42 29 79 167 115 57 135 52
Bolton 291 302 593 33985 42018 76003 106.68833 0.0021221 0.0027325 51 31 58 78 65 66 68 200 99
Luton 341 293 634 34348 33348 67696 117.08185 0.0292726 0.0026121 5 39 26 77 100 88 43 69 110
Kirklees 318 323 641 34538 59527 94065 133.83505 0.0034612 0.0032210 27 11 20 76 33 51 17 168 65
South Cambridgeshire 328 284 612 34916 39466 74382 98.77528 0.0143335 0.0042710 17 48 43 75 71 72 95 98 38
County Durham 316 328 644 35081 64602 99683 136.76168 0.0025184 0.0033631 29 8 19 74 27 45 15 186 57
Kingston upon Thames 317 272 589 35923 45101 81024 88.78187 0.1066740 0.0027264 28 60 62 73 58 64 115 31 101
Basildon 321 282 603 36071 36057 72128 92.09181 0.0612035 0.0019214 24 50 51 72 80 77 109 36 185
Rotherham 287 312 599 36886 43598 80484 110.48375 0.0018907 0.0027850 55 21 53 71 60 65 61 215 95
Windsor and Maidenhead 341 273 614 36971 34482 71453 99.72553 0.0372343 0.0038264 5 59 41 70 93 79 93 55 47
Exeter 248 241 489 37151 10809 47960 57.60331 0.0011451 0.0047422 86 91 134 69 316 166 242 267 32
Haringey 300 286 586 37279 80177 117456 93.22087 0.2386431 0.0032502 44 46 63 68 11 29 106 15 63
Guildford 334 258 592 38372 30423 68795 85.17198 0.0361713 0.0030977 12 74 59 67 120 85 129 59 72
Merton 309 280 589 38381 67646 106027 87.42231 0.1894013 0.0028738 36 52 62 66 23 38 123 20 90
Welwyn Hatfield 336 271 607 38496 22907 61403 90.64350 0.0389517 0.0029540 10 61 48 65 189 106 110 51 84
Richmond upon Thames 316 273 589 38600 58964 97564 87.93170 0.1564364 0.0037355 29 59 62 64 35 47 119 25 48
Kingston upon Hull, City of 292 298 590 38602 24199 62801 102.14345 0.0012955 0.0025353 50 34 61 63 176 100 85 250 115
Dudley 318 318 636 38796 57172 95968 126.70449 0.0042945 0.0031201 27 15 25 62 37 49 24 153 68
Slough 335 271 606 39282 31753 71035 94.80244 0.0380361 0.0041691 11 61 49 61 111 80 101 53 40
Northampton 337 307 644 39498 27141 66639 118.08045 0.0088677 0.0036166 9 26 19 60 147 90 41 110 51
Greenwich 316 289 605 39593 70802 110395 97.80635 0.1959638 0.0024311 29 43 50 59 21 33 97 19 125
Wiltshire 345 331 676 39717 55625 95342 160.51941 0.0150479 0.0040658 1 6 4 58 38 50 5 96 42
Croydon 306 302 608 39884 92094 131978 100.31073 0.2122394 0.0026456 39 31 47 57 7 21 91 18 106
Stoke-on-Trent 313 309 622 40031 33667 73698 114.84293 0.0015778 0.0029178 32 24 34 56 99 73 48 230 86
Sunderland 254 294 548 40830 34827 75657 81.87235 0.0018640 0.0028891 80 38 90 55 88 67 147 217 88
Bromley 322 288 610 40897 80537 121434 104.05368 0.2233553 0.0022546 23 44 45 54 10 26 78 16 146
Portsmouth 343 288 631 41272 27862 69134 115.85177 0.0059324 0.0032274 3 44 29 53 140 83 45 129 64
Enfield 314 294 608 41313 73140 114453 105.61314 0.1777036 0.0031087 31 38 47 52 15 30 73 23 69
Derby 316 308 624 41670 29802 71472 113.83201 0.0029402 0.0032790 29 25 33 51 126 78 49 178 61
Walsall 333 313 646 41782 48755 90537 130.19952 0.0039666 0.0033192 13 20 18 50 52 54 19 160 59
Southampton 321 300 621 41891 41234 83125 115.21255 0.0069496 0.0036577 24 32 35 49 67 63 47 123 50
Winchester 327 270 597 41929 23369 65298 89.55948 0.0114415 0.0035121 18 62 55 48 182 94 113 106 55
Reading 332 289 621 42267 32715 74982 112.58266 0.0227425 0.0040357 14 43 35 47 104 70 54 82 43
Gateshead 200 279 479 42942 42399 85341 51.61637 0.0017757 0.0035313 123 53 142 46 64 58 260 222 53
Crawley 335 246 581 43108 18998 62106 72.56600 0.0248586 0.0029446 11 86 67 45 235 102 190 78 85
Preston 288 270 558 44352 21146 65498 84.42626 0.0011831 0.0042716 54 62 81 44 207 92 132 265 37
Wolverhampton 314 305 619 44388 40094 84482 112.57007 0.0032852 0.0030924 31 28 37 43 69 61 56 172 73
Milton Keynes 344 307 651 44450 27780 72230 122.22514 0.0253813 0.0035232 2 26 15 42 143 76 30 76 54
Wakefield 297 322 619 45101 45316 90417 120.17849 0.0029064 0.0038373 46 12 37 41 57 55 37 179 46
Oxford 333 287 620 45775 15693 61468 107.32489 0.0113616 0.0045709 13 45 36 40 277 105 66 107 34
Stockport 320 314 634 47968 58798 106766 127.30501 0.0044807 0.0047446 25 19 26 39 36 37 22 148 31
Norwich 283 259 542 48392 21251 69643 63.73725 0.0026206 0.0041001 59 73 95 38 203 81 213 183 41
Warrington 326 302 628 49172 34607 83779 124.18728 0.0028033 0.0038653 19 31 31 37 90 62 27 180 45
Newham 331 305 636 49198 77274 126472 118.87240 0.2181891 0.0037221 15 28 25 36 13 24 39 17 49
Bradford 337 318 655 50336 55040 105376 142.38026 0.0043787 0.0048884 9 15 12 35 39 39 12 150 29
Coventry 339 321 660 50577 39493 90070 145.23539 0.0058079 0.0048386 7 13 10 34 70 56 10 132 30
Cheshire West and Chester 323 324 647 50910 51970 102880 141.77478 0.0034742 0.0039760 22 10 17 33 44 42 13 167 44
Cambridge 312 250 562 51240 16062 67302 73.34194 0.0134464 0.0046020 33 82 79 32 273 89 188 101 33
Solihull 333 320 653 51374 49120 100494 133.30159 0.0075356 0.0053752 13 14 13 31 51 44 18 117 26
Barnet 335 295 630 53143 94328 147471 107.29323 0.2678205 0.0053627 11 37 30 30 6 14 67 11 27
Cheshire East 331 334 665 53260 51773 105033 153.00249 0.0049410 0.0044883 15 4 8 29 46 41 7 141 36
Brent 324 306 630 54353 86120 140473 115.73294 0.2552967 0.0066587 21 27 30 28 9 17 46 12 19
Sandwell 330 322 652 58716 61446 120162 138.97124 0.0058632 0.0045497 16 12 14 27 30 28 14 130 35
Salford 327 304 631 59144 51900 111044 118.37394 0.0039354 0.0053232 18 29 29 26 45 32 40 162 28
South Gloucestershire 342 315 657 59359 53569 112928 143.90381 0.0071708 0.0067618 4 18 11 25 43 31 11 121 18
Hackney 325 282 607 60542 75197 135739 104.27664 0.2704059 0.0068321 20 50 48 24 14 19 77 10 17
Ealing 342 296 638 63429 95217 158646 121.88623 0.2424303 0.0072984 4 36 23 23 5 11 32 14 14
Sheffield 337 337 674 63693 45426 109119 160.95208 0.0033646 0.0042047 9 3 5 22 56 35 4 169 39
Wandsworth 327 305 632 63894 124029 187923 121.44261 0.4178796 0.0058755 18 28 28 21 1 9 33 5 22
Leicester 328 311 639 67191 41007 108198 121.94219 0.0045364 0.0060454 17 22 22 20 68 36 31 145 20
Trafford 316 299 615 70188 50717 120905 113.06647 0.0048473 0.0068569 29 33 40 19 49 27 53 143 16
Cardiff 321 310 631 73041 32252 105293 126.18715 0.0032443 0.0056728 24 23 29 18 109 40 25 173 24
Hounslow 339 298 637 73977 71624 145601 113.12328 0.1694069 0.0072375 7 34 24 17 18 15 52 24 15
Bristol, City of 338 324 662 80907 54120 135027 146.21380 0.0085801 0.0081482 8 10 9 16 42 20 9 112 13
Kensington and Chelsea 334 256 590 86860 50799 137659 87.89829 0.3011796 0.0144531 12 76 61 15 47 18 121 8 5
Lambeth 339 295 634 87037 115419 202456 120.60327 0.4329508 0.0086193 7 37 26 14 2 8 34 3 12
Nottingham 336 315 651 89650 38180 127830 134.64542 0.0039334 0.0059435 10 18 15 13 73 23 16 163 21
Newcastle upon Tyne 320 292 612 89811 38300 128111 104.36164 0.0030717 0.0057526 25 40 43 12 72 22 76 177 23
Hammersmith and Fulham 340 273 613 90212 64765 154977 103.70858 0.3005236 0.0118080 6 59 42 11 26 13 80 9 9
Liverpool 301 333 634 91162 50759 141921 130.03027 0.0042335 0.0055228 43 5 26 10 48 16 20 154 25
Hillingdon 345 303 648 96119 61002 157121 123.20678 0.1448890 0.0086205 1 30 16 9 31 12 28 27 11
Leeds 340 340 680 121087 65369 186456 166.23405 0.0072535 0.0092803 6 2 2 8 25 10 2 120 10
Islington 342 277 619 132028 70981 203009 102.43241 0.3661235 0.0151687 4 55 37 7 19 7 84 7 4
Southwark 343 297 640 132137 95381 227518 120.54708 0.4190788 0.0124909 3 35 21 6 4 6 36 4 8
Birmingham 345 343 688 166056 100223 266279 174.73617 0.0144646 0.0127334 1 1 1 5 3 3 1 97 7
Manchester 345 333 678 179517 72365 251882 161.42941 0.0081722 0.0134337 1 5 3 4 16 5 3 115 6
Tower Hamlets 340 296 636 185467 70808 256275 119.14147 0.4108055 0.0210011 6 36 25 3 20 4 38 6 3
Camden 345 282 627 227171 62784 289955 116.18251 0.4715192 0.0277070 1 50 32 2 29 2 44 2 2
Westminster,City of London 345 289 634 866007 42018 908025 109.10666 1.0000000 0.0736260 1 43 26 1 65 1 63 1 1

Compare centralities

The below code provides a correlograms of the different centrality measures.

cor.mat <- cor(centralities[,c(2:10)])
corrplot(cor.mat, type="upper")

Question: Discuss the differences between the different centrality measures in the context of the commuting network.

Community detection

To begin with, we need to convert our network to an undirected one, as the fast_greedy algorithm we are using can only be applied to such networks.

net.all.und <- as.undirected(net.all,
                             mode=c("mutual"),
                             edge.attr.comb = igraph_opt("edge.attr.comb"))
Warning: `as.undirected()` was deprecated in igraph 2.1.0.
ℹ Please use `as_undirected()` instead.
communities.net.all <- cluster_fast_greedy(net.all.und)

# This provides a summary of the community algorithm:
print(communities.net.all)
IGRAPH clustering fast greedy, groups: 11, mod: 0.69
+ groups:
  $`1`
   [1] "E41000033" "E41000034" "E41000035" "E41000098" "E41000100" "E41000101"
   [7] "E41000102" "E41000104" "E41000106" "E41000107" "E41000127" "E41000130"
  [13] "E41000137" "E41000138" "E41000139" "E41000140" "E41000141" "E41000142"
  [19] "E41000143" "E41000144" "E41000145" "E41000146" "E41000147" "E41000148"
  [25] "E41000228" "E41000229" "E41000231" "E41000232" "E41000233" "E41000234"
  [31] "E41000236" "E41000293" "E41000294" "E41000295" "E41000296" "E41000297"
  [37] "E41000298" "E41000299" "E41000300" "E41000301" "E41000302" "E41000303"
  [43] "E41000304" "E41000305" "E41000306" "E41000307" "E41000308" "E41000309"
  [49] "E41000310" "E41000311" "E41000312" "E41000313" "E41000314" "E41000315"
  + ... omitted several groups/vertices
# To see how many communities we have, run the below:
length(communities.net.all)
[1] 11
# And these are the community sizes:
sizes(communities.net.all)
Community sizes
 1  2  3  4  5  6  7  8  9 10 11 
63 46 29 31 16 47 27 14 29 22 22 
# Now, let's create a new object with the community membership
#communities.net.all_membership <- membership(communities.net.all)

# And convert it to a data.frame

communities.net.all_membership <- membership(communities.net.all) %>%
  unclass %>%                          # we first need to unclass the object
  as.data.frame %>%                    # we convert it to a dataframe
  rename(community = ".") %>%          # rename the community column
  rownames_to_column("cmlad11cd") %>%  # we 'move' the rownames to a
                                       # new column in order to do a merge below
  left_join(la.names) %>%              # and now we can merge it with the LA names
  arrange(community) %>%               # arrange based on the community membership
  glimpse()
Rows: 346
Columns: 3
$ cmlad11cd <chr> "E41000033", "E41000034", "E41000035", "E41000098", "E410001…
$ community <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ cmlad11nm <chr> "Southend-on-Sea", "Thurrock", "Medway", "Basildon", "Brentw…
# this is just a test to see if the `left_join` led to any NAs
sapply(communities.net.all_membership, function(x) sum(is.na(x)))
cmlad11cd community cmlad11nm 
        0         0         0 

Let’s try now to map our output. We need the local authorities shape file we have already loaded.

# First we merge the `la` object with the community membership
la <- merge(la, communities.net.all_membership, by = "cmlad11cd")
# Please note that I used base R for the above. I could have easily used the dplyr
# equivalent. Which function would this be?

# just a check to see how the merge worked
sapply(la, function(x) sum(is.na(x))) 
    cmlad11cd      OBJECTID   cmlad11nm.x    cmlad11nmw   Shape__Area 
            0             0             0             0             0 
Shape__Length      GlobalID     community   cmlad11nm.y      geometry 
            0             0             0             0             0 
# And this is our map
ggplot(la, aes(fill = as.factor(community))) + 
  geom_sf() +
  ggtitle("Communities using the 'fast and greedy' algorithm")

Question: What do you think about the output? Can we learn anything? Can you try different community algorithms? Check igraph’s manual and Javed et al (2018).

Network Visualisation

The below chunks of code offer some intro to plotting network data. Have a look to see how the code works.

plot(net.all, # the graph to be plotted
     layout=layout.fruchterman.reingold, # the layout method. see the igraph documentation for details
     main='My first graph in R', # specifies the title
     vertex.label.dist=0.5, # puts the name labels slightly off the dots
     vertex.frame.color='blue', # the colour of the border of the dots
     vertex.label.color='black', # the colour of the name labels
     vertex.label.font=2, # the font of the name labels
     vertex.label=V(net.all)$id, # specifies the labels of the vertices. in this case the 'name' attribute is used
     vertex.label.cex=.5,   # specifies the size of the font of the labels. can also be made to vary
     edge.arrow.size=0.1) # specifies the arrow size

Not a very nice outcome :( Let’s remove some information

plot(net.all, # the graph to be plotted
     layout=layout.fruchterman.reingold, # the layout method. see the igraph documentation for details
     main='My second graph in R',   # specifies the title
     vertex.frame.color='blue', # the colour of the border of the dots
     vertex.label.font=2,   # the font of the name labels
     vertex.label=NA,   # no labels for the vertices
     edge.arrow.size=0, # specifies the arrow size
     vertex.size=5) # vertex size

Let’s try to only plot nodes with high weighted degree centrality.

# The below gives us the 90th percentile:
q <- quantile(strength(net.all), .9)

# Then, we create a network with the nodes we DON'T want to plot. In this case the lowest 90%
low_nodes <- V(net.all)[strength(net.all) < q] # 108659 is the 90% percentile. Feel free to play with different numbers

# And this is the network with the 10% of the most central nodes
net.all.central <- delete_vertices(net.all, low_nodes)

# The below uses the node degree centrality to plot the node size.
# Pay attention to the 0.0001 factor.

plot(net.all.central, # the graph to be plotted
     layout=layout.fruchterman.reingold, # the layout method. see the igraph documentation for details
     main='My third graph in R', # specifies the title
     vertex.frame.color='blue', # the colour of the border of the dots
     vertex.label.font=2,   # the font of the name labels
     vertex.label=V(net.all.central)$id, # no labels for the vertices
     vertex.label.font=1, # the font type of the name labels (1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol)
     vertex.label.cex=.5,   # specifies the size of the font of the labels. can also be made to vary
     edge.arrow.size=0, # specifies the arrow size
     vertex.size=strength(net.all.central)*0.0001) # defines the node size based on weighted degree centrality

Not very nice either…

For the next time:

  1. spend some time browsing the igraph’s manual,

  2. search for code online to plot large networks in R using igraph, and

  3. use the following tutorials

in order to produce more meaningful network visualisations of the UK commuting network.

I am interesting in one or multiple plots with:

  • all or a subset of the nodes and edges. How could you select such a subset?

  • the communities you detected.

  • varying size of nodes based on a centrality measure. Again, you can decide to plot a subset of the network based on some network characteristics.

  • an appropriate to the network layout.

Mapping

Until now we focused mostly on the topology of the network and we ignored its spatial dimension. However, this is an important attribute of the commuting network and we should necessarily consider it and incorporate it in our analysis. To begin with we will map these commuting flows. Bear in mind that this is not a trivial process as, in essence, we need to attach the geographical coordinates to the network nodes and plot the network based on these coordinates. Given the size of our network this might be computationally expensive. It is also challenging to create a meaningful map given the size of the network.

The local authorities spatial object is necessary in order to use the od2line() function from the stplanr package. This is a very useful function transforms origin to destination (OD) tables to linear spatial objects. In order for this function to work we need the above spatial object with the zones of the origin and destination flows. Importantly it needs to only include the zone codes (i.e. the local authority codes), which should match with the origin and destination codes.This is the la spatial object of the local authorities in England and Wales, which has already been loaded in R.

The below code just plots the boundaries of local authorities.

ggplot(la) + 
  geom_sf() +
  ggtitle("Local authorities")

Now let’s do some clean-up of the commuting.all data frame in order to convert it to a spatial object using the od2line() function.

# We start by plotting a histogram of the data. We are using ggplot() as the output
# is nicer, but the simpler hist() could also be used

options(scipen=999) # It prevents R from using scientific notation for numbers
ggplot(commuting.all,
       aes(x=weight)) +
  geom_histogram() +
  geom_vline(aes(xintercept=mean(weight)), # This line of code adds a vertical line to represent the mean
             color="blue", linetype="dashed", linewidth = 1)

As you can see the flow data is very skewed. So, let’s truncate the data and plot a histogram for flows between origin and destinations will less than 1000 people.

ggplot(commuting.all[commuting.all$weight < 1000,],
       aes(x=weight)) +
  geom_histogram() +
  geom_vline(aes(xintercept=mean(weight)),
             color="blue",
             linetype="dashed",
             size=1)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

There is a very large number of local authority pairs with very few people commuting between these OD pairs. So, in order to decrease the data and the mapping complexity we will keep only the OD pairs with more than 5 commuters.

commuting.all.truncated <- commuting.all %>% 
  filter(weight > 5) %>% 
  glimpse()
Rows: 41,659
Columns: 3
$ o      <chr> "E41000001", "E41000001", "E41000001", "E41000001", "E41000001"…
$ d      <chr> "E41000002", "E41000003", "E41000004", "E41000005", "E41000010"…
$ weight <dbl> 1591, 534, 3865, 433, 8, 24, 6, 30, 6, 6, 10, 8, 6, 7, 7, 7, 9,…

Question: How many lines did we filter out?

The next chunk of code converts the origin-destination table to a spatial object using the corresponding zones spatial object (la) that we have already loaded.

# od2line() has some strict requirement regarding data structure. 
# Check ?od2line
# Therefore, we kept only the local authority code and name.
# The actual requirement is to have the the zone code as the 
# first column of the zone object. 
# If you remember, we run the following when we loaded the la object: 
# la.names <- as.data.frame(la) %>% 
#   select(cmlad11cd, cmlad11nm) # all we need is the LA names and codes

travel_network <- od2line(flow = commuting.all.truncated, 
                          zones = la)

# Just to see the class of the new spatial object
class(travel_network)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"
plot(travel_network)

This is a naive plot of the spatial network. We can guess the shape of England and Wales, but this is like a hairball network and far from being useful. In order to produce a more useful visualisation we will employ the leaflet package, which produces interactive maps using JavaScript Libraries.

# this is the colour pallet we are going to use based on 5 quantiles
Flow_pal <- colorQuantile("YlOrBr", domain = travel_network$weight, n=5)

leaflet() %>%
  addTiles() %>%
  addPolylines(
    data = travel_network,
    weight = .1,
    color = ~Flow_pal(weight),
    opacity = .6) %>%
    addLegend("topright",
              pal = Flow_pal,
              values = travel_network$weight,
              title = "Commuting flows in 2011")

Let’s try now to create an interactive map showing only the flows originating from Bristol and Birmingham.

# To begin with let's find out the local authority codes for Bristol and Birmingham
# Look up the grep() function. Very useful!
la.names[grep("Bristol", la.names$cmlad11nm),]
   cmlad11cd        cmlad11nm
23 E41000023 Bristol, City of
la.names[grep("Birmingham", la.names$cmlad11nm),]
    cmlad11cd  cmlad11nm
281 E41000281 Birmingham
# These are E41000023 and E41000281 respectively.

# Next we will create the 'groups' of local authorities
travel_network$la.groups = "Rest"
travel_network$la.groups[travel_network$o == "E41000023"] = "Bristol"
travel_network$la.groups[travel_network$o == "E41000281"] = "Birmingham"

leaflet() %>%
  addTiles() %>%
  addPolylines(
    data = travel_network,
    weight = 1, # Notice the different value for better visual effect when zoom in
    color = ~Flow_pal(weight),
    opacity = .8, # as above
    group = travel_network$la.groups) %>%
  addLayersControl(
    position = "bottomleft",
    overlayGroups = unique(travel_network$la.groups),
    options = layersControlOptions(
      collapsed = FALSE)) %>%
  addLegend("topright",
          pal = Flow_pal,
          values = travel_network$weight,
          title = "Commuting flows in 2011")