Network Analysis with NetworkX#
In this series of lessons, we’re going to learn about network analysis. Network analysis will help us better understand the complex relationships between groups of people, fictional characters, and other kinds of things.
Dataset#
Game of Thrones#
Lucky it might be, and red it certainly was, but Ygritte’s hair was such a tangle that Jon was tempted to ask her if she only brushed it at the changing of the seasons.
-George R. R. Martin, A Song of Ice and Fire
Network Basics#
Install NetworkX#
!pip install networkx
Requirement already satisfied: networkx in /Users/melaniewalsh/opt/anaconda3/lib/python3.7/site-packages (2.4)
Requirement already satisfied: decorator>=4.3.0 in /Users/melaniewalsh/opt/anaconda3/lib/python3.7/site-packages (from networkx) (4.4.2)
Import Libraries#
import networkx
import pandas as pd
pd.set_option('max_rows', 400)
import matplotlib.pyplot as plt
Game of Thrones Network#
The network data that we’re going to use in this lesson is taken from Andrew Beveridge and Jie Shan’s paper, “Network of Thrones.”
These researchers calculated how many times each Game of Thrones character appeared within 15 words of another character in A Storm of Swords, the third book in the series.
Network Element |
GOT |
|---|---|
Node |
GOT character |
Edge |
Mutually mentioned within 15 words |
Float |
Decimal Numbers |
Boolean |
True/False |
For example, the following sentence counts as an “edge” or connection between Jon Snow and Sam Tarly:
“It was the bastard Jon Snow who had taken that from him, him and his fat friend Sam Tarly.”
“Lucky it might be, and red it certainly was, but Ygritte’s hair was such a tangle that Jon was tempted to ask her if she only brushed it at the changing of the seasons.”
“Arya gave Gendry a sideways look. He said it with me, like Jon used to do, back in Winterfell. She missed Jon Snow the most of all her brothers.””
Pandas Review
Do you need a refresher or introduction to the Python data analysis library Pandas? Be sure to check out Pandas Basics (1-3) in this textbook!
got_df = pd.read_csv('../data/got-edges.csv')
got_df
| Source | Target | Weight | |
|---|---|---|---|
| 0 | Aemon | Grenn | 5 |
| 1 | Aemon | Samwell | 31 |
| 2 | Aerys | Jaime | 18 |
| 3 | Aerys | Robert | 6 |
| 4 | Aerys | Tyrion | 5 |
| 5 | Aerys | Tywin | 8 |
| 6 | Alliser | Mance | 5 |
| 7 | Amory | Oberyn | 5 |
| 8 | Arya | Anguy | 11 |
| 9 | Arya | Beric | 23 |
| 10 | Arya | Bran | 9 |
| 11 | Arya | Brynden | 6 |
| 12 | Arya | Cersei | 5 |
| 13 | Arya | Gendry | 43 |
| 14 | Arya | Gregor | 7 |
| 15 | Arya | Jaime | 11 |
| 16 | Arya | Joffrey | 6 |
| 17 | Arya | Jon | 7 |
| 18 | Arya | Rickon | 8 |
| 19 | Arya | Robert | 4 |
| 20 | Arya | Roose | 5 |
| 21 | Arya | Sandor | 46 |
| 22 | Arya | Thoros | 18 |
| 23 | Arya | Tyrion | 5 |
| 24 | Balon | Loras | 4 |
| 25 | Belwas | Barristan | 18 |
| 26 | Belwas | Illyrio | 10 |
| 27 | Beric | Anguy | 4 |
| 28 | Beric | Gendry | 4 |
| 29 | Beric | Thoros | 21 |
| 30 | Bran | Hodor | 96 |
| 31 | Bran | Jojen | 46 |
| 32 | Bran | Jon | 12 |
| 33 | Bran | Luwin | 4 |
| 34 | Bran | Meera | 54 |
| 35 | Bran | Nan | 14 |
| 36 | Bran | Rickon | 35 |
| 37 | Bran | Samwell | 11 |
| 38 | Bran | Theon | 11 |
| 39 | Brienne | Loras | 7 |
| 40 | Bronn | Gregor | 5 |
| 41 | Bronn | Podrick | 19 |
| 42 | Brynden | Lothar | 4 |
| 43 | Brynden | Walder | 5 |
| 44 | Catelyn | Bran | 4 |
| 45 | Catelyn | Brienne | 7 |
| 46 | Catelyn | Brynden | 8 |
| 47 | Catelyn | Cersei | 4 |
| 48 | Catelyn | Edmure | 16 |
| 49 | Catelyn | Hoster | 9 |
| 50 | Catelyn | Jaime | 19 |
| 51 | Catelyn | Jeyne | 10 |
| 52 | Catelyn | Lysa | 8 |
| 53 | Catelyn | Petyr | 5 |
| 54 | Catelyn | Robb | 43 |
| 55 | Catelyn | Roose | 4 |
| 56 | Catelyn | Roslin | 6 |
| 57 | Catelyn | Sansa | 8 |
| 58 | Catelyn | Stannis | 4 |
| 59 | Catelyn | Tyrion | 5 |
| 60 | Catelyn | Walder | 19 |
| 61 | Cersei | Brienne | 5 |
| 62 | Cersei | Bronn | 4 |
| 63 | Cersei | Elia | 4 |
| 64 | Cersei | Gregor | 6 |
| 65 | Cersei | Ilyn | 7 |
| 66 | Cersei | Jaime | 36 |
| 67 | Cersei | Joffrey | 23 |
| 68 | Cersei | Meryn | 10 |
| 69 | Cersei | Pycelle | 4 |
| 70 | Cersei | Robert | 16 |
| 71 | Cersei | Sandor | 6 |
| 72 | Cersei | Shae | 4 |
| 73 | Cersei | Tyrion | 46 |
| 74 | Cersei | Varys | 4 |
| 75 | Craster | Karl | 6 |
| 76 | Daario | Drogo | 4 |
| 77 | Daario | Irri | 5 |
| 78 | Daenerys | Aegon | 8 |
| 79 | Daenerys | Barristan | 20 |
| 80 | Daenerys | Belwas | 26 |
| 81 | Daenerys | Daario | 14 |
| 82 | Daenerys | Drogo | 18 |
| 83 | Daenerys | Irri | 17 |
| 84 | Daenerys | Jorah | 47 |
| 85 | Daenerys | Kraznys | 10 |
| 86 | Daenerys | Missandei | 26 |
| 87 | Daenerys | Rakharo | 7 |
| 88 | Daenerys | Rhaegar | 12 |
| 89 | Daenerys | Robert | 5 |
| 90 | Daenerys | Viserys | 8 |
| 91 | Daenerys | Worm | 14 |
| 92 | Davos | Cressen | 4 |
| 93 | Davos | Salladhor | 16 |
| 94 | Eddard | Arya | 18 |
| 95 | Eddard | Beric | 8 |
| 96 | Eddard | Bran | 15 |
| 97 | Eddard | Catelyn | 5 |
| 98 | Eddard | Cersei | 6 |
| 99 | Eddard | Jaime | 6 |
| 100 | Eddard | Jon | 8 |
| 101 | Eddard | Rickon | 8 |
| 102 | Eddard | Robb | 13 |
| 103 | Eddard | Robert | 10 |
| 104 | Eddard | Sandor | 5 |
| 105 | Eddard | Sansa | 6 |
| 106 | Eddison | Grenn | 8 |
| 107 | Edmure | Brynden | 7 |
| 108 | Edmure | Lothar | 4 |
| 109 | Edmure | Roslin | 16 |
| 110 | Edmure | Walder | 9 |
| 111 | Gendry | Thoros | 7 |
| 112 | Gilly | Craster | 17 |
| 113 | Gregor | Elia | 9 |
| 114 | Gregor | Ilyn | 7 |
| 115 | Gregor | Meryn | 7 |
| 116 | Gregor | Oberyn | 24 |
| 117 | Gregor | Sandor | 12 |
| 118 | Hodor | Jojen | 35 |
| 119 | Hodor | Meera | 41 |
| 120 | Hoster | Edmure | 9 |
| 121 | Irri | Drogo | 7 |
| 122 | Jaime | Balon | 6 |
| 123 | Jaime | Barristan | 4 |
| 124 | Jaime | Brienne | 88 |
| 125 | Jaime | Edmure | 5 |
| 126 | Jaime | Elia | 4 |
| 127 | Jaime | Gregor | 6 |
| 128 | Jaime | Joffrey | 15 |
| 129 | Jaime | Loras | 16 |
| 130 | Jaime | Meryn | 11 |
| 131 | Jaime | Qyburn | 11 |
| 132 | Jaime | Renly | 7 |
| 133 | Jaime | Robert | 17 |
| 134 | Jaime | Stannis | 5 |
| 135 | Jaime | Tommen | 8 |
| 136 | Jaime | Tyrion | 31 |
| 137 | Janos | Alliser | 9 |
| 138 | Janos | Bowen | 5 |
| 139 | Janos | Mance | 4 |
| 140 | Joffrey | Gregor | 5 |
| 141 | Joffrey | Ilyn | 4 |
| 142 | Joffrey | Kevan | 8 |
| 143 | Joffrey | Loras | 7 |
| 144 | Joffrey | Margaery | 28 |
| 145 | Joffrey | Meryn | 5 |
| 146 | Joffrey | Myrcella | 5 |
| 147 | Joffrey | Oberyn | 4 |
| 148 | Joffrey | Sandor | 14 |
| 149 | Joffrey | Stannis | 10 |
| 150 | Joffrey | Tommen | 9 |
| 151 | Joffrey | Tyrion | 54 |
| 152 | Jojen | Meera | 33 |
| 153 | Jojen | Samwell | 11 |
| 154 | Jon | Aemon | 30 |
| 155 | Jon | Alliser | 15 |
| 156 | Jon | Craster | 7 |
| 157 | Jon | Dalla | 6 |
| 158 | Jon | Eddison | 4 |
| 159 | Jon | Gilly | 9 |
| 160 | Jon | Grenn | 25 |
| 161 | Jon | Janos | 8 |
| 162 | Jon | Mance | 69 |
| 163 | Jon | Meera | 4 |
| 164 | Jon | Melisandre | 7 |
| 165 | Jon | Orell | 6 |
| 166 | Jon | Qhorin | 31 |
| 167 | Jon | Rattleshirt | 20 |
| 168 | Jon | Robert | 5 |
| 169 | Jon | Samwell | 52 |
| 170 | Jon | Stannis | 9 |
| 171 | Jon | Styr | 16 |
| 172 | Jon | Theon | 8 |
| 173 | Jon | Val | 12 |
| 174 | Jon | Ygritte | 54 |
| 175 | Jon Arryn | Lysa | 5 |
| 176 | Jon Arryn | Robert | 6 |
| 177 | Jorah | Barristan | 11 |
| 178 | Jorah | Belwas | 13 |
| 179 | Jorah | Daario | 7 |
| 180 | Jorah | Drogo | 6 |
| 181 | Kevan | Lancel | 7 |
| 182 | Kevan | Varys | 5 |
| 183 | Loras | Margaery | 9 |
| 184 | Loras | Olenna | 5 |
| 185 | Lothar | Roslin | 4 |
| 186 | Luwin | Nan | 4 |
| 187 | Lysa | Cersei | 4 |
| 188 | Lysa | Hoster | 6 |
| 189 | Lysa | Marillion | 10 |
| 190 | Lysa | Petyr | 29 |
| 191 | Lysa | Robert Arryn | 9 |
| 192 | Lysa | Tyrion | 5 |
| 193 | Lysa | Tywin | 4 |
| 194 | Mance | Craster | 11 |
| 195 | Mance | Dalla | 8 |
| 196 | Mance | Gilly | 7 |
| 197 | Mance | Qhorin | 10 |
| 198 | Mance | Rattleshirt | 9 |
| 199 | Mance | Styr | 7 |
| 200 | Mance | Val | 8 |
| 201 | Mance | Ygritte | 12 |
| 202 | Meera | Samwell | 7 |
| 203 | Melisandre | Davos | 30 |
| 204 | Melisandre | Samwell | 5 |
| 205 | Meryn | Ilyn | 5 |
| 206 | Missandei | Irri | 4 |
| 207 | Myrcella | Tommen | 5 |
| 208 | Myrcella | Tyrion | 4 |
| 209 | Oberyn | Ellaria | 6 |
| 210 | Oberyn | Mace | 6 |
| 211 | Podrick | Margaery | 4 |
| 212 | Rattleshirt | Qhorin | 6 |
| 213 | Renly | Loras | 8 |
| 214 | Renly | Margaery | 7 |
| 215 | Renly | Varys | 4 |
| 216 | Rhaegar | Barristan | 5 |
| 217 | Rhaegar | Elia | 7 |
| 218 | Rhaegar | Jorah | 5 |
| 219 | Rhaegar | Robert | 6 |
| 220 | Rickard | Brynden | 4 |
| 221 | Rickon | Theon | 8 |
| 222 | Robb | Arya | 15 |
| 223 | Robb | Balon | 6 |
| 224 | Robb | Bran | 23 |
| 225 | Robb | Brienne | 6 |
| 226 | Robb | Brynden | 17 |
| 227 | Robb | Edmure | 32 |
| 228 | Robb | Hodor | 5 |
| 229 | Robb | Jaime | 15 |
| 230 | Robb | Jeyne | 18 |
| 231 | Robb | Joffrey | 10 |
| 232 | Robb | Jon | 14 |
| 233 | Robb | Lothar | 10 |
| 234 | Robb | Petyr | 5 |
| 235 | Robb | Ramsay | 4 |
| 236 | Robb | Rickard | 7 |
| 237 | Robb | Rickon | 15 |
| 238 | Robb | Roose | 4 |
| 239 | Robb | Sansa | 15 |
| 240 | Robb | Stannis | 4 |
| 241 | Robb | Theon | 11 |
| 242 | Robb | Tyrion | 12 |
| 243 | Robb | Tywin | 12 |
| 244 | Robb | Walder | 26 |
| 245 | Robert | Aemon | 4 |
| 246 | Robert | Barristan | 5 |
| 247 | Robert | Renly | 4 |
| 248 | Robert | Stannis | 5 |
| 249 | Robert | Thoros | 4 |
| 250 | Robert Arryn | Marillion | 4 |
| 251 | Roose | Brienne | 4 |
| 252 | Samwell | Bowen | 6 |
| 253 | Samwell | Craster | 34 |
| 254 | Samwell | Eddison | 12 |
| 255 | Samwell | Gilly | 36 |
| 256 | Samwell | Grenn | 43 |
| 257 | Samwell | Janos | 6 |
| 258 | Samwell | Mance | 10 |
| 259 | Samwell | Qhorin | 5 |
| 260 | Sandor | Beric | 15 |
| 261 | Sandor | Gendry | 5 |
| 262 | Sandor | Ilyn | 4 |
| 263 | Sandor | Meryn | 4 |
| 264 | Sandor | Robert | 6 |
| 265 | Sandor | Thoros | 10 |
| 266 | Sansa | Arya | 22 |
| 267 | Sansa | Bran | 10 |
| 268 | Sansa | Brienne | 5 |
| 269 | Sansa | Cersei | 16 |
| 270 | Sansa | Jaime | 10 |
| 271 | Sansa | Joffrey | 35 |
| 272 | Sansa | Jon | 4 |
| 273 | Sansa | Kevan | 5 |
| 274 | Sansa | Loras | 14 |
| 275 | Sansa | Lysa | 28 |
| 276 | Sansa | Margaery | 36 |
| 277 | Sansa | Marillion | 9 |
| 278 | Sansa | Myrcella | 4 |
| 279 | Sansa | Olenna | 7 |
| 280 | Sansa | Petyr | 28 |
| 281 | Sansa | Podrick | 8 |
| 282 | Sansa | Renly | 4 |
| 283 | Sansa | Rickon | 7 |
| 284 | Sansa | Robert | 5 |
| 285 | Sansa | Robert Arryn | 6 |
| 286 | Sansa | Sandor | 6 |
| 287 | Sansa | Shae | 8 |
| 288 | Sansa | Tyrion | 77 |
| 289 | Shae | Chataya | 4 |
| 290 | Shae | Varys | 8 |
| 291 | Shireen | Davos | 5 |
| 292 | Stannis | Aemon | 4 |
| 293 | Stannis | Balon | 4 |
| 294 | Stannis | Davos | 32 |
| 295 | Stannis | Melisandre | 20 |
| 296 | Stannis | Renly | 15 |
| 297 | Stannis | Samwell | 13 |
| 298 | Tommen | Margaery | 5 |
| 299 | Tyrion | Balon | 4 |
| 300 | Tyrion | Bronn | 31 |
| 301 | Tyrion | Chataya | 5 |
| 302 | Tyrion | Doran | 5 |
| 303 | Tyrion | Elia | 5 |
| 304 | Tyrion | Ellaria | 4 |
| 305 | Tyrion | Gregor | 22 |
| 306 | Tyrion | Ilyn | 5 |
| 307 | Tyrion | Janos | 5 |
| 308 | Tyrion | Kevan | 11 |
| 309 | Tyrion | Loras | 6 |
| 310 | Tyrion | Mace | 9 |
| 311 | Tyrion | Margaery | 7 |
| 312 | Tyrion | Meryn | 5 |
| 313 | Tyrion | Oberyn | 25 |
| 314 | Tyrion | Petyr | 12 |
| 315 | Tyrion | Podrick | 28 |
| 316 | Tyrion | Pycelle | 11 |
| 317 | Tyrion | Renly | 6 |
| 318 | Tyrion | Robert | 9 |
| 319 | Tyrion | Sandor | 4 |
| 320 | Tyrion | Shae | 21 |
| 321 | Tyrion | Stannis | 6 |
| 322 | Tyrion | Varys | 18 |
| 323 | Tywin | Balon | 5 |
| 324 | Tywin | Brynden | 4 |
| 325 | Tywin | Cersei | 16 |
| 326 | Tywin | Gregor | 7 |
| 327 | Tywin | Jaime | 13 |
| 328 | Tywin | Joffrey | 13 |
| 329 | Tywin | Kevan | 14 |
| 330 | Tywin | Mace | 5 |
| 331 | Tywin | Oberyn | 6 |
| 332 | Tywin | Petyr | 4 |
| 333 | Tywin | Podrick | 5 |
| 334 | Tywin | Pycelle | 5 |
| 335 | Tywin | Robert | 11 |
| 336 | Tywin | Stannis | 15 |
| 337 | Tywin | Tommen | 4 |
| 338 | Tywin | Tyrion | 39 |
| 339 | Tywin | Val | 4 |
| 340 | Tywin | Varys | 6 |
| 341 | Tywin | Walder | 4 |
| 342 | Val | Dalla | 7 |
| 343 | Varys | Pycelle | 4 |
| 344 | Viserys | Rhaegar | 7 |
| 345 | Viserys | Tyrion | 4 |
| 346 | Walder | Lothar | 12 |
| 347 | Walder | Petyr | 6 |
| 348 | Walder | Roslin | 6 |
| 349 | Walton | Jaime | 10 |
| 350 | Ygritte | Qhorin | 7 |
| 351 | Ygritte | Rattleshirt | 9 |
Create a Network From a Pandas DataFrame#
G = networkx.from_pandas_edgelist(got_df, 'Source', 'Target', 'Weight')
Output a Network File#
networkx.write_graphml(G, 'GOT-network.graphml')
Draw a Simple Network#
networkx.draw(G)
plt.figure(figsize=(8,8))
networkx.draw(G, with_labels=True, node_color='skyblue', width=.3, font_size=8)
Calculate Degree#
Who has the most number of connections in the network?
networkx.degree(G)
DegreeView({'Aemon': 5, 'Grenn': 4, 'Samwell': 15, 'Aerys': 4, 'Jaime': 24, 'Robert': 18, 'Tyrion': 36, 'Tywin': 22, 'Alliser': 3, 'Mance': 12, 'Amory': 1, 'Oberyn': 7, 'Arya': 19, 'Anguy': 2, 'Beric': 6, 'Bran': 14, 'Brynden': 8, 'Cersei': 20, 'Gendry': 4, 'Gregor': 12, 'Joffrey': 18, 'Jon': 26, 'Rickon': 6, 'Roose': 4, 'Sandor': 13, 'Thoros': 5, 'Balon': 6, 'Loras': 9, 'Belwas': 4, 'Barristan': 6, 'Illyrio': 1, 'Hodor': 4, 'Jojen': 4, 'Luwin': 2, 'Meera': 5, 'Nan': 2, 'Theon': 4, 'Brienne': 7, 'Bronn': 4, 'Podrick': 5, 'Lothar': 5, 'Walder': 8, 'Catelyn': 18, 'Edmure': 8, 'Hoster': 3, 'Jeyne': 2, 'Lysa': 10, 'Petyr': 7, 'Robb': 25, 'Roslin': 4, 'Sansa': 26, 'Stannis': 14, 'Elia': 5, 'Ilyn': 6, 'Meryn': 7, 'Pycelle': 4, 'Shae': 5, 'Varys': 7, 'Craster': 5, 'Karl': 1, 'Daario': 4, 'Drogo': 4, 'Irri': 4, 'Daenerys': 14, 'Aegon': 1, 'Jorah': 6, 'Kraznys': 1, 'Missandei': 2, 'Rakharo': 1, 'Rhaegar': 6, 'Viserys': 3, 'Worm': 1, 'Davos': 5, 'Cressen': 1, 'Salladhor': 1, 'Eddard': 12, 'Eddison': 3, 'Gilly': 4, 'Qyburn': 1, 'Renly': 8, 'Tommen': 5, 'Janos': 6, 'Bowen': 2, 'Kevan': 6, 'Margaery': 7, 'Myrcella': 4, 'Dalla': 3, 'Melisandre': 4, 'Orell': 1, 'Qhorin': 5, 'Rattleshirt': 4, 'Styr': 2, 'Val': 4, 'Ygritte': 4, 'Jon Arryn': 2, 'Lancel': 1, 'Olenna': 2, 'Marillion': 3, 'Robert Arryn': 3, 'Ellaria': 2, 'Mace': 3, 'Rickard': 2, 'Ramsay': 1, 'Chataya': 2, 'Shireen': 1, 'Doran': 1, 'Walton': 1})
Make the degree values a dictionary, then add it as a network “attribute” with networkx.set_node_attributes()
degrees = dict(networkx.degree(G))
networkx.set_node_attributes(G, name='degree', values=degrees)
Make a Pandas dataframe from the degree data G.nodes(data='degree'), then sort from highest to lowest
degree_df = pd.DataFrame(G.nodes(data='degree'), columns=['node', 'degree'])
degree_df = degree_df.sort_values(by='degree', ascending=False)
degree_df
| node | degree | |
|---|---|---|
| 6 | Tyrion | 36 |
| 21 | Jon | 26 |
| 50 | Sansa | 26 |
| 48 | Robb | 25 |
| 4 | Jaime | 24 |
| 7 | Tywin | 22 |
| 17 | Cersei | 20 |
| 12 | Arya | 19 |
| 42 | Catelyn | 18 |
| 5 | Robert | 18 |
| 20 | Joffrey | 18 |
| 2 | Samwell | 15 |
| 63 | Daenerys | 14 |
| 15 | Bran | 14 |
| 51 | Stannis | 14 |
| 24 | Sandor | 13 |
| 9 | Mance | 12 |
| 75 | Eddard | 12 |
| 19 | Gregor | 12 |
| 46 | Lysa | 10 |
| 27 | Loras | 9 |
| 16 | Brynden | 8 |
| 41 | Walder | 8 |
| 43 | Edmure | 8 |
| 79 | Renly | 8 |
| 37 | Brienne | 7 |
| 54 | Meryn | 7 |
| 57 | Varys | 7 |
| 47 | Petyr | 7 |
| 84 | Margaery | 7 |
| 11 | Oberyn | 7 |
| 29 | Barristan | 6 |
| 69 | Rhaegar | 6 |
| 83 | Kevan | 6 |
| 81 | Janos | 6 |
| 14 | Beric | 6 |
| 53 | Ilyn | 6 |
| 22 | Rickon | 6 |
| 26 | Balon | 6 |
| 65 | Jorah | 6 |
| 52 | Elia | 5 |
| 56 | Shae | 5 |
| 58 | Craster | 5 |
| 72 | Davos | 5 |
| 89 | Qhorin | 5 |
| 80 | Tommen | 5 |
| 0 | Aemon | 5 |
| 40 | Lothar | 5 |
| 39 | Podrick | 5 |
| 34 | Meera | 5 |
| 25 | Thoros | 5 |
| 77 | Gilly | 4 |
| 62 | Irri | 4 |
| 28 | Belwas | 4 |
| 93 | Ygritte | 4 |
| 90 | Rattleshirt | 4 |
| 23 | Roose | 4 |
| 85 | Myrcella | 4 |
| 31 | Hodor | 4 |
| 18 | Gendry | 4 |
| 32 | Jojen | 4 |
| 60 | Daario | 4 |
| 61 | Drogo | 4 |
| 3 | Aerys | 4 |
| 87 | Melisandre | 4 |
| 55 | Pycelle | 4 |
| 36 | Theon | 4 |
| 1 | Grenn | 4 |
| 38 | Bronn | 4 |
| 49 | Roslin | 4 |
| 92 | Val | 4 |
| 86 | Dalla | 3 |
| 44 | Hoster | 3 |
| 76 | Eddison | 3 |
| 98 | Robert Arryn | 3 |
| 70 | Viserys | 3 |
| 97 | Marillion | 3 |
| 100 | Mace | 3 |
| 8 | Alliser | 3 |
| 91 | Styr | 2 |
| 94 | Jon Arryn | 2 |
| 96 | Olenna | 2 |
| 99 | Ellaria | 2 |
| 101 | Rickard | 2 |
| 103 | Chataya | 2 |
| 45 | Jeyne | 2 |
| 13 | Anguy | 2 |
| 35 | Nan | 2 |
| 33 | Luwin | 2 |
| 82 | Bowen | 2 |
| 67 | Missandei | 2 |
| 10 | Amory | 1 |
| 66 | Kraznys | 1 |
| 105 | Doran | 1 |
| 104 | Shireen | 1 |
| 102 | Ramsay | 1 |
| 59 | Karl | 1 |
| 64 | Aegon | 1 |
| 68 | Rakharo | 1 |
| 95 | Lancel | 1 |
| 30 | Illyrio | 1 |
| 71 | Worm | 1 |
| 73 | Cressen | 1 |
| 74 | Salladhor | 1 |
| 78 | Qyburn | 1 |
| 88 | Orell | 1 |
| 106 | Walton | 1 |
Plot the nodes with the highest degree values
num_nodes_to_inspect = 10
degree_df[:num_nodes_to_inspect].plot(x='node', y='degree', kind='barh').invert_yaxis()
Calculate Weighted Degree#
Who has the most number of connections in the network (if you factor in edge weight)?
networkx.degree(G, weight='Weight')
DegreeView({'Aemon': 74, 'Grenn': 81, 'Samwell': 282, 'Aerys': 37, 'Jaime': 372, 'Robert': 128, 'Tyrion': 551, 'Tywin': 204, 'Alliser': 29, 'Mance': 160, 'Amory': 5, 'Oberyn': 76, 'Arya': 269, 'Anguy': 15, 'Beric': 75, 'Bran': 344, 'Brynden': 55, 'Cersei': 226, 'Gendry': 59, 'Gregor': 117, 'Joffrey': 255, 'Jon': 442, 'Rickon': 81, 'Roose': 17, 'Sandor': 137, 'Thoros': 60, 'Balon': 29, 'Loras': 76, 'Belwas': 67, 'Barristan': 63, 'Illyrio': 10, 'Hodor': 177, 'Jojen': 125, 'Luwin': 8, 'Meera': 139, 'Nan': 18, 'Theon': 38, 'Brienne': 122, 'Bronn': 59, 'Podrick': 64, 'Lothar': 34, 'Walder': 87, 'Catelyn': 184, 'Edmure': 98, 'Hoster': 24, 'Jeyne': 28, 'Lysa': 108, 'Petyr': 89, 'Robb': 342, 'Roslin': 32, 'Sansa': 383, 'Stannis': 146, 'Elia': 29, 'Ilyn': 32, 'Meryn': 47, 'Pycelle': 24, 'Shae': 45, 'Varys': 49, 'Craster': 75, 'Karl': 6, 'Daario': 30, 'Drogo': 35, 'Irri': 33, 'Daenerys': 232, 'Aegon': 8, 'Jorah': 89, 'Kraznys': 10, 'Missandei': 30, 'Rakharo': 7, 'Rhaegar': 42, 'Viserys': 19, 'Worm': 14, 'Davos': 87, 'Cressen': 4, 'Salladhor': 16, 'Eddard': 108, 'Eddison': 24, 'Gilly': 69, 'Qyburn': 11, 'Renly': 55, 'Tommen': 31, 'Janos': 37, 'Bowen': 11, 'Kevan': 50, 'Margaery': 96, 'Myrcella': 18, 'Dalla': 21, 'Melisandre': 62, 'Orell': 6, 'Qhorin': 59, 'Rattleshirt': 44, 'Styr': 23, 'Val': 31, 'Ygritte': 82, 'Jon Arryn': 11, 'Lancel': 7, 'Olenna': 12, 'Marillion': 23, 'Robert Arryn': 19, 'Ellaria': 10, 'Mace': 20, 'Rickard': 11, 'Ramsay': 4, 'Chataya': 9, 'Shireen': 5, 'Doran': 5, 'Walton': 10})
Make the weighted degree values a dictionary, then add it as a network “attribute” with networkx.set_node_attributes()
weighted_degrees = dict(networkx.degree(G, weight='Weight'))
networkx.set_node_attributes(G, name='weighted_degree', values=weighted_degrees)
Make a Pandas dataframe from the degree data G.nodes(data='weighted_degree'), then sort from highest to lowest
weighted_degree_df = pd.DataFrame(G.nodes(data='weighted_degree'), columns=['node', 'weighted_degree'])
weighted_degree_df = weighted_degree_df.sort_values(by='weighted_degree', ascending=False)
weighted_degree_df
| node | weighted_degree | |
|---|---|---|
| 6 | Tyrion | 551 |
| 21 | Jon | 442 |
| 50 | Sansa | 383 |
| 4 | Jaime | 372 |
| 15 | Bran | 344 |
| 48 | Robb | 342 |
| 2 | Samwell | 282 |
| 12 | Arya | 269 |
| 20 | Joffrey | 255 |
| 63 | Daenerys | 232 |
| 17 | Cersei | 226 |
| 7 | Tywin | 204 |
| 42 | Catelyn | 184 |
| 31 | Hodor | 177 |
| 9 | Mance | 160 |
| 51 | Stannis | 146 |
| 34 | Meera | 139 |
| 24 | Sandor | 137 |
| 5 | Robert | 128 |
| 32 | Jojen | 125 |
| 37 | Brienne | 122 |
| 19 | Gregor | 117 |
| 46 | Lysa | 108 |
| 75 | Eddard | 108 |
| 43 | Edmure | 98 |
| 84 | Margaery | 96 |
| 47 | Petyr | 89 |
| 65 | Jorah | 89 |
| 72 | Davos | 87 |
| 41 | Walder | 87 |
| 93 | Ygritte | 82 |
| 1 | Grenn | 81 |
| 22 | Rickon | 81 |
| 11 | Oberyn | 76 |
| 27 | Loras | 76 |
| 14 | Beric | 75 |
| 58 | Craster | 75 |
| 0 | Aemon | 74 |
| 77 | Gilly | 69 |
| 28 | Belwas | 67 |
| 39 | Podrick | 64 |
| 29 | Barristan | 63 |
| 87 | Melisandre | 62 |
| 25 | Thoros | 60 |
| 38 | Bronn | 59 |
| 89 | Qhorin | 59 |
| 18 | Gendry | 59 |
| 79 | Renly | 55 |
| 16 | Brynden | 55 |
| 83 | Kevan | 50 |
| 57 | Varys | 49 |
| 54 | Meryn | 47 |
| 56 | Shae | 45 |
| 90 | Rattleshirt | 44 |
| 69 | Rhaegar | 42 |
| 36 | Theon | 38 |
| 81 | Janos | 37 |
| 3 | Aerys | 37 |
| 61 | Drogo | 35 |
| 40 | Lothar | 34 |
| 62 | Irri | 33 |
| 53 | Ilyn | 32 |
| 49 | Roslin | 32 |
| 92 | Val | 31 |
| 80 | Tommen | 31 |
| 60 | Daario | 30 |
| 67 | Missandei | 30 |
| 52 | Elia | 29 |
| 8 | Alliser | 29 |
| 26 | Balon | 29 |
| 45 | Jeyne | 28 |
| 55 | Pycelle | 24 |
| 76 | Eddison | 24 |
| 44 | Hoster | 24 |
| 91 | Styr | 23 |
| 97 | Marillion | 23 |
| 86 | Dalla | 21 |
| 100 | Mace | 20 |
| 70 | Viserys | 19 |
| 98 | Robert Arryn | 19 |
| 35 | Nan | 18 |
| 85 | Myrcella | 18 |
| 23 | Roose | 17 |
| 74 | Salladhor | 16 |
| 13 | Anguy | 15 |
| 71 | Worm | 14 |
| 96 | Olenna | 12 |
| 78 | Qyburn | 11 |
| 82 | Bowen | 11 |
| 101 | Rickard | 11 |
| 94 | Jon Arryn | 11 |
| 99 | Ellaria | 10 |
| 106 | Walton | 10 |
| 30 | Illyrio | 10 |
| 66 | Kraznys | 10 |
| 103 | Chataya | 9 |
| 64 | Aegon | 8 |
| 33 | Luwin | 8 |
| 95 | Lancel | 7 |
| 68 | Rakharo | 7 |
| 59 | Karl | 6 |
| 88 | Orell | 6 |
| 10 | Amory | 5 |
| 104 | Shireen | 5 |
| 105 | Doran | 5 |
| 73 | Cressen | 4 |
| 102 | Ramsay | 4 |
Plot the nodes with the highest weighted degree values
num_nodes_to_inspect = 10
weighted_degree_df[:num_nodes_to_inspect].plot(x='node', y='weighted_degree', color='orange', kind='barh').invert_yaxis()
Calculate Betweenness Centrality Scores#
Who connects the most other nodes in the network?
networkx.betweenness_centrality(G)
{'Aemon': 0.004622508177397137,
'Grenn': 5.989817310572027e-05,
'Samwell': 0.03227262859511145,
'Aerys': 0.0,
'Jaime': 0.09994344156136246,
'Robert': 0.2094523840293194,
'Tyrion': 0.19791284320277353,
'Tywin': 0.06553840423231058,
'Alliser': 0.0,
'Mance': 0.007275961371756524,
'Amory': 0.0,
'Oberyn': 0.01958014232946847,
'Arya': 0.07960711308183888,
'Anguy': 0.0,
'Beric': 0.0006091214266627511,
'Bran': 0.06301659941786954,
'Brynden': 0.004727134574764742,
'Cersei': 0.02674643287824232,
'Gendry': 0.0,
'Gregor': 0.005879915417737236,
'Joffrey': 0.025434099443917696,
'Jon': 0.22996466368473173,
'Rickon': 0.0007626320968639029,
'Roose': 0.0002629599012559427,
'Sandor': 0.014162278987154626,
'Thoros': 0.0019261823273239152,
'Balon': 0.0006281164805527878,
'Loras': 0.003780752291533962,
'Belwas': 0.018867924528301886,
'Barristan': 0.04011407489067884,
'Illyrio': 0.0,
'Hodor': 0.0021937273446681065,
'Jojen': 0.0004064518889316733,
'Luwin': 0.0,
'Meera': 0.0019922569692430686,
'Nan': 0.0,
'Theon': 0.00047177590304274953,
'Brienne': 0.0015376001520469229,
'Bronn': 0.00010482180293501046,
'Podrick': 0.0008358985235471674,
'Lothar': 0.0006600525898733143,
'Walder': 0.0032731813973401044,
'Catelyn': 0.04890588265764755,
'Edmure': 0.0063172332740347534,
'Hoster': 0.0002426336765959408,
'Jeyne': 0.0,
'Lysa': 0.015215156305177053,
'Petyr': 0.0011502139845250673,
'Robb': 0.1269644713830151,
'Roslin': 6.751960581039384e-05,
'Sansa': 0.12672031668498004,
'Stannis': 0.1026998617273264,
'Elia': 0.002996853410630337,
'Ilyn': 0.0,
'Meryn': 0.00025900705642512993,
'Pycelle': 0.0,
'Shae': 0.0012523948930099663,
'Varys': 0.0009094137867722772,
'Craster': 0.018867924528301886,
'Karl': 0.0,
'Daario': 5.989817310572027e-05,
'Drogo': 5.989817310572027e-05,
'Irri': 0.00017969451931716083,
'Daenerys': 0.15720345212054956,
'Aegon': 0.0,
'Jorah': 0.002329891127259132,
'Kraznys': 0.0,
'Missandei': 0.0,
'Rakharo': 0.0,
'Rhaegar': 0.007312671807481101,
'Viserys': 0.015644391307527945,
'Worm': 0.0,
'Davos': 0.056064690026954175,
'Cressen': 0.0,
'Salladhor': 0.0,
'Eddard': 0.019341416465723616,
'Eddison': 0.0,
'Gilly': 0.0,
'Qyburn': 0.0,
'Renly': 0.004227926858198188,
'Tommen': 0.0006984420191967362,
'Janos': 0.02355861153253357,
'Bowen': 0.0,
'Kevan': 0.019219915043818533,
'Margaery': 0.0010973522354777933,
'Myrcella': 0.0006235971795124951,
'Dalla': 0.0,
'Melisandre': 0.00860866854841803,
'Orell': 0.0,
'Qhorin': 0.0002635519616651692,
'Rattleshirt': 0.0,
'Styr': 0.0,
'Val': 0.005898334987101542,
'Ygritte': 0.0,
'Jon Arryn': 0.0005764583325230229,
'Lancel': 0.0,
'Olenna': 0.0,
'Marillion': 0.0,
'Robert Arryn': 0.0,
'Ellaria': 0.0,
'Mace': 0.0,
'Rickard': 0.0,
'Ramsay': 0.0,
'Chataya': 0.0,
'Shireen': 0.0,
'Doran': 0.0,
'Walton': 0.0}
betweenness_centrality = networkx.betweenness_centrality(G)
Add betweenness_centrality (which is already a dictionary) as a network “attribute” with networkx.set_node_attributes()
networkx.set_node_attributes(G, name='betweenness', values=betweenness_centrality)
Make a Pandas dataframe from the betweenness data G.nodes(data='betweenness'), then sort from highest to lowest
betweenness_df = pd.DataFrame(G.nodes(data='betweenness'), columns=['node', 'betweenness'])
betweenness_df = betweenness_df.sort_values(by='betweenness', ascending=False)
betweenness_df
| node | betweenness | |
|---|---|---|
| 21 | Jon | 0.229965 |
| 5 | Robert | 0.209452 |
| 6 | Tyrion | 0.197913 |
| 63 | Daenerys | 0.157203 |
| 48 | Robb | 0.126964 |
| 50 | Sansa | 0.126720 |
| 51 | Stannis | 0.102700 |
| 4 | Jaime | 0.099943 |
| 12 | Arya | 0.079607 |
| 7 | Tywin | 0.065538 |
| 15 | Bran | 0.063017 |
| 72 | Davos | 0.056065 |
| 42 | Catelyn | 0.048906 |
| 29 | Barristan | 0.040114 |
| 2 | Samwell | 0.032273 |
| 17 | Cersei | 0.026746 |
| 20 | Joffrey | 0.025434 |
| 81 | Janos | 0.023559 |
| 11 | Oberyn | 0.019580 |
| 75 | Eddard | 0.019341 |
| 83 | Kevan | 0.019220 |
| 28 | Belwas | 0.018868 |
| 58 | Craster | 0.018868 |
| 70 | Viserys | 0.015644 |
| 46 | Lysa | 0.015215 |
| 24 | Sandor | 0.014162 |
| 87 | Melisandre | 0.008609 |
| 69 | Rhaegar | 0.007313 |
| 9 | Mance | 0.007276 |
| 43 | Edmure | 0.006317 |
| 92 | Val | 0.005898 |
| 19 | Gregor | 0.005880 |
| 16 | Brynden | 0.004727 |
| 0 | Aemon | 0.004623 |
| 79 | Renly | 0.004228 |
| 27 | Loras | 0.003781 |
| 41 | Walder | 0.003273 |
| 52 | Elia | 0.002997 |
| 65 | Jorah | 0.002330 |
| 31 | Hodor | 0.002194 |
| 34 | Meera | 0.001992 |
| 25 | Thoros | 0.001926 |
| 37 | Brienne | 0.001538 |
| 56 | Shae | 0.001252 |
| 47 | Petyr | 0.001150 |
| 84 | Margaery | 0.001097 |
| 57 | Varys | 0.000909 |
| 39 | Podrick | 0.000836 |
| 22 | Rickon | 0.000763 |
| 80 | Tommen | 0.000698 |
| 40 | Lothar | 0.000660 |
| 26 | Balon | 0.000628 |
| 85 | Myrcella | 0.000624 |
| 14 | Beric | 0.000609 |
| 94 | Jon Arryn | 0.000576 |
| 36 | Theon | 0.000472 |
| 32 | Jojen | 0.000406 |
| 89 | Qhorin | 0.000264 |
| 23 | Roose | 0.000263 |
| 54 | Meryn | 0.000259 |
| 44 | Hoster | 0.000243 |
| 62 | Irri | 0.000180 |
| 38 | Bronn | 0.000105 |
| 49 | Roslin | 0.000068 |
| 60 | Daario | 0.000060 |
| 61 | Drogo | 0.000060 |
| 1 | Grenn | 0.000060 |
| 97 | Marillion | 0.000000 |
| 102 | Ramsay | 0.000000 |
| 105 | Doran | 0.000000 |
| 100 | Mace | 0.000000 |
| 104 | Shireen | 0.000000 |
| 98 | Robert Arryn | 0.000000 |
| 86 | Dalla | 0.000000 |
| 103 | Chataya | 0.000000 |
| 88 | Orell | 0.000000 |
| 93 | Ygritte | 0.000000 |
| 96 | Olenna | 0.000000 |
| 90 | Rattleshirt | 0.000000 |
| 101 | Rickard | 0.000000 |
| 95 | Lancel | 0.000000 |
| 91 | Styr | 0.000000 |
| 99 | Ellaria | 0.000000 |
| 53 | Ilyn | 0.000000 |
| 82 | Bowen | 0.000000 |
| 55 | Pycelle | 0.000000 |
| 3 | Aerys | 0.000000 |
| 8 | Alliser | 0.000000 |
| 10 | Amory | 0.000000 |
| 13 | Anguy | 0.000000 |
| 18 | Gendry | 0.000000 |
| 30 | Illyrio | 0.000000 |
| 33 | Luwin | 0.000000 |
| 35 | Nan | 0.000000 |
| 45 | Jeyne | 0.000000 |
| 59 | Karl | 0.000000 |
| 78 | Qyburn | 0.000000 |
| 64 | Aegon | 0.000000 |
| 66 | Kraznys | 0.000000 |
| 67 | Missandei | 0.000000 |
| 68 | Rakharo | 0.000000 |
| 71 | Worm | 0.000000 |
| 73 | Cressen | 0.000000 |
| 74 | Salladhor | 0.000000 |
| 76 | Eddison | 0.000000 |
| 77 | Gilly | 0.000000 |
| 106 | Walton | 0.000000 |
Plot the nodes with the highest betweenness centrality scores
num_nodes_to_inspect = 10
betweenness_df[:num_nodes_to_inspect].plot(x='node', y='betweenness', color='green', kind='barh').invert_yaxis()
Communities#
Who forms distinct communities within this network?
from networkx.algorithms import community
Calculate communities with community.greedy_modularity_communities()
communities = community.greedy_modularity_communities(G)
communities
Show code cell output
[frozenset({'Aerys',
'Amory',
'Balon',
'Bronn',
'Chataya',
'Doran',
'Elia',
'Ellaria',
'Gregor',
'Ilyn',
'Jaime',
'Joffrey',
'Kevan',
'Lancel',
'Loras',
'Mace',
'Margaery',
'Meryn',
'Myrcella',
'Oberyn',
'Olenna',
'Podrick',
'Pycelle',
'Qyburn',
'Renly',
'Sandor',
'Shae',
'Tommen',
'Tyrion',
'Tywin',
'Varys',
'Walton'}),
frozenset({'Aemon',
'Alliser',
'Bowen',
'Craster',
'Cressen',
'Dalla',
'Davos',
'Eddison',
'Gilly',
'Grenn',
'Hodor',
'Janos',
'Jojen',
'Jon',
'Karl',
'Mance',
'Meera',
'Melisandre',
'Orell',
'Qhorin',
'Rattleshirt',
'Salladhor',
'Samwell',
'Shireen',
'Stannis',
'Styr',
'Val',
'Ygritte'}),
frozenset({'Arya',
'Bran',
'Brienne',
'Brynden',
'Catelyn',
'Cersei',
'Eddard',
'Edmure',
'Hoster',
'Jeyne',
'Lothar',
'Luwin',
'Lysa',
'Marillion',
'Nan',
'Petyr',
'Ramsay',
'Rickard',
'Rickon',
'Robb',
'Robert Arryn',
'Roose',
'Roslin',
'Sansa',
'Theon',
'Walder'}),
frozenset({'Aegon',
'Barristan',
'Belwas',
'Daario',
'Daenerys',
'Drogo',
'Illyrio',
'Irri',
'Jon Arryn',
'Jorah',
'Kraznys',
'Missandei',
'Rakharo',
'Rhaegar',
'Robert',
'Viserys',
'Worm'}),
frozenset({'Anguy', 'Beric', 'Gendry', 'Thoros'})]
Make a dictionary by looping through the communities and, for each member of the community, adding their community number
# Create empty dictionary
modularity_class = {}
#Loop through each community in the network
for community_number, community in enumerate(communities):
#For each member of the community, add their community number
for name in community:
modularity_class[name] = community_number
Add modularity class to the network as an attribute
networkx.set_node_attributes(G, modularity_class, 'modularity_class')
Make a Pandas dataframe from modularity class network data G.nodes(data='modularity_class')
communities_df = pd.DataFrame(G.nodes(data='modularity_class'), columns=['node', 'modularity_class'])
communities_df = communities_df.sort_values(by='modularity_class', ascending=False)
communities_df
| node | modularity_class | |
|---|---|---|
| 25 | Thoros | 4 |
| 18 | Gendry | 4 |
| 14 | Beric | 4 |
| 13 | Anguy | 4 |
| 28 | Belwas | 3 |
| 94 | Jon Arryn | 3 |
| 65 | Jorah | 3 |
| 67 | Missandei | 3 |
| 71 | Worm | 3 |
| 70 | Viserys | 3 |
| 29 | Barristan | 3 |
| 30 | Illyrio | 3 |
| 69 | Rhaegar | 3 |
| 68 | Rakharo | 3 |
| 64 | Aegon | 3 |
| 63 | Daenerys | 3 |
| 5 | Robert | 3 |
| 62 | Irri | 3 |
| 61 | Drogo | 3 |
| 60 | Daario | 3 |
| 66 | Kraznys | 3 |
| 36 | Theon | 2 |
| 37 | Brienne | 2 |
| 43 | Edmure | 2 |
| 40 | Lothar | 2 |
| 42 | Catelyn | 2 |
| 44 | Hoster | 2 |
| 45 | Jeyne | 2 |
| 46 | Lysa | 2 |
| 47 | Petyr | 2 |
| 48 | Robb | 2 |
| 49 | Roslin | 2 |
| 50 | Sansa | 2 |
| 35 | Nan | 2 |
| 41 | Walder | 2 |
| 33 | Luwin | 2 |
| 17 | Cersei | 2 |
| 102 | Ramsay | 2 |
| 75 | Eddard | 2 |
| 101 | Rickard | 2 |
| 15 | Bran | 2 |
| 16 | Brynden | 2 |
| 12 | Arya | 2 |
| 98 | Robert Arryn | 2 |
| 22 | Rickon | 2 |
| 23 | Roose | 2 |
| 97 | Marillion | 2 |
| 73 | Cressen | 1 |
| 72 | Davos | 1 |
| 58 | Craster | 1 |
| 74 | Salladhor | 1 |
| 76 | Eddison | 1 |
| 77 | Gilly | 1 |
| 87 | Melisandre | 1 |
| 86 | Dalla | 1 |
| 81 | Janos | 1 |
| 59 | Karl | 1 |
| 0 | Aemon | 1 |
| 88 | Orell | 1 |
| 32 | Jojen | 1 |
| 2 | Samwell | 1 |
| 104 | Shireen | 1 |
| 8 | Alliser | 1 |
| 9 | Mance | 1 |
| 21 | Jon | 1 |
| 89 | Qhorin | 1 |
| 31 | Hodor | 1 |
| 82 | Bowen | 1 |
| 34 | Meera | 1 |
| 93 | Ygritte | 1 |
| 51 | Stannis | 1 |
| 92 | Val | 1 |
| 1 | Grenn | 1 |
| 91 | Styr | 1 |
| 90 | Rattleshirt | 1 |
| 84 | Margaery | 0 |
| 96 | Olenna | 0 |
| 99 | Ellaria | 0 |
| 100 | Mace | 0 |
| 103 | Chataya | 0 |
| 105 | Doran | 0 |
| 85 | Myrcella | 0 |
| 95 | Lancel | 0 |
| 53 | Ilyn | 0 |
| 83 | Kevan | 0 |
| 26 | Balon | 0 |
| 3 | Aerys | 0 |
| 4 | Jaime | 0 |
| 6 | Tyrion | 0 |
| 7 | Tywin | 0 |
| 10 | Amory | 0 |
| 11 | Oberyn | 0 |
| 19 | Gregor | 0 |
| 20 | Joffrey | 0 |
| 24 | Sandor | 0 |
| 27 | Loras | 0 |
| 80 | Tommen | 0 |
| 38 | Bronn | 0 |
| 39 | Podrick | 0 |
| 52 | Elia | 0 |
| 54 | Meryn | 0 |
| 55 | Pycelle | 0 |
| 56 | Shae | 0 |
| 57 | Varys | 0 |
| 78 | Qyburn | 0 |
| 79 | Renly | 0 |
| 106 | Walton | 0 |
Inspect each community in the network
communities_df[communities_df['modularity_class'] == 4]
| node | modularity_class | |
|---|---|---|
| 25 | Thoros | 4 |
| 18 | Gendry | 4 |
| 14 | Beric | 4 |
| 13 | Anguy | 4 |
communities_df[communities_df['modularity_class'] == 3]
| node | modularity_class | |
|---|---|---|
| 28 | Belwas | 3 |
| 94 | Jon Arryn | 3 |
| 65 | Jorah | 3 |
| 67 | Missandei | 3 |
| 71 | Worm | 3 |
| 70 | Viserys | 3 |
| 29 | Barristan | 3 |
| 30 | Illyrio | 3 |
| 69 | Rhaegar | 3 |
| 68 | Rakharo | 3 |
| 64 | Aegon | 3 |
| 63 | Daenerys | 3 |
| 5 | Robert | 3 |
| 62 | Irri | 3 |
| 61 | Drogo | 3 |
| 60 | Daario | 3 |
| 66 | Kraznys | 3 |
communities_df[communities_df['modularity_class'] == 2]
| node | modularity_class | |
|---|---|---|
| 36 | Theon | 2 |
| 37 | Brienne | 2 |
| 43 | Edmure | 2 |
| 40 | Lothar | 2 |
| 42 | Catelyn | 2 |
| 44 | Hoster | 2 |
| 45 | Jeyne | 2 |
| 46 | Lysa | 2 |
| 47 | Petyr | 2 |
| 48 | Robb | 2 |
| 49 | Roslin | 2 |
| 50 | Sansa | 2 |
| 35 | Nan | 2 |
| 41 | Walder | 2 |
| 33 | Luwin | 2 |
| 17 | Cersei | 2 |
| 102 | Ramsay | 2 |
| 75 | Eddard | 2 |
| 101 | Rickard | 2 |
| 15 | Bran | 2 |
| 16 | Brynden | 2 |
| 12 | Arya | 2 |
| 98 | Robert Arryn | 2 |
| 22 | Rickon | 2 |
| 23 | Roose | 2 |
| 97 | Marillion | 2 |
communities_df[communities_df['modularity_class'] == 1]
| node | modularity_class | |
|---|---|---|
| 73 | Cressen | 1 |
| 72 | Davos | 1 |
| 58 | Craster | 1 |
| 74 | Salladhor | 1 |
| 76 | Eddison | 1 |
| 77 | Gilly | 1 |
| 87 | Melisandre | 1 |
| 86 | Dalla | 1 |
| 81 | Janos | 1 |
| 59 | Karl | 1 |
| 0 | Aemon | 1 |
| 88 | Orell | 1 |
| 32 | Jojen | 1 |
| 2 | Samwell | 1 |
| 104 | Shireen | 1 |
| 8 | Alliser | 1 |
| 9 | Mance | 1 |
| 21 | Jon | 1 |
| 89 | Qhorin | 1 |
| 31 | Hodor | 1 |
| 82 | Bowen | 1 |
| 34 | Meera | 1 |
| 93 | Ygritte | 1 |
| 51 | Stannis | 1 |
| 92 | Val | 1 |
| 1 | Grenn | 1 |
| 91 | Styr | 1 |
| 90 | Rattleshirt | 1 |
communities_df[communities_df['modularity_class'] == 0]
| node | modularity_class | |
|---|---|---|
| 84 | Margaery | 0 |
| 96 | Olenna | 0 |
| 99 | Ellaria | 0 |
| 100 | Mace | 0 |
| 103 | Chataya | 0 |
| 105 | Doran | 0 |
| 85 | Myrcella | 0 |
| 95 | Lancel | 0 |
| 53 | Ilyn | 0 |
| 83 | Kevan | 0 |
| 26 | Balon | 0 |
| 3 | Aerys | 0 |
| 4 | Jaime | 0 |
| 6 | Tyrion | 0 |
| 7 | Tywin | 0 |
| 10 | Amory | 0 |
| 11 | Oberyn | 0 |
| 19 | Gregor | 0 |
| 20 | Joffrey | 0 |
| 24 | Sandor | 0 |
| 27 | Loras | 0 |
| 80 | Tommen | 0 |
| 38 | Bronn | 0 |
| 39 | Podrick | 0 |
| 52 | Elia | 0 |
| 54 | Meryn | 0 |
| 55 | Pycelle | 0 |
| 56 | Shae | 0 |
| 57 | Varys | 0 |
| 78 | Qyburn | 0 |
| 79 | Renly | 0 |
| 106 | Walton | 0 |
Plot a sample of 40 characters with their modularity class indicated by a star
import seaborn as sns
#Set figure size
plt.figure(figsize=(4,12))
#Plot a categorical scatter plot from the dataframe communities_df.sample(40)
ax =sns.stripplot(x='modularity_class', y='node', data=communities_df.sample(40),
hue='modularity_class', marker='*',size=15)
#Set legend outside the plot with bbox_to_anchor
ax.legend(loc='upper right',bbox_to_anchor=(1.5, 1), title='Modularity Class')
ax.set_title("GOT Characters By Modularity Class\n(Random Sample)")
plt.show()
Plot all GOT characters with their modularity class indicated by a star (tak
plt.figure(figsize=(4,25))
ax =sns.stripplot(x='modularity_class', y='node', data=communities_df,
hue='modularity_class', marker='*',size=15)
ax.legend(loc='upper right',bbox_to_anchor=(1.5, 1), title='Modularity Class')
ax.set_title("GOT Characters By Modularity Class")
plt.show()
All Network Metrics#
Create a Pandas dataframe of all network attributes by creating a dictionary of G.nodes(data=True)…
dict(G.nodes(data=True))
{'Aemon': {'degree': 5,
'weighted_degree': 74,
'betweenness': 0.004622508177397137,
'modularity_class': 1},
'Grenn': {'degree': 4,
'weighted_degree': 81,
'betweenness': 5.989817310572027e-05,
'modularity_class': 1},
'Samwell': {'degree': 15,
'weighted_degree': 282,
'betweenness': 0.03227262859511145,
'modularity_class': 1},
'Aerys': {'degree': 4,
'weighted_degree': 37,
'betweenness': 0.0,
'modularity_class': 0},
'Jaime': {'degree': 24,
'weighted_degree': 372,
'betweenness': 0.09994344156136246,
'modularity_class': 0},
'Robert': {'degree': 18,
'weighted_degree': 128,
'betweenness': 0.2094523840293194,
'modularity_class': 3},
'Tyrion': {'degree': 36,
'weighted_degree': 551,
'betweenness': 0.19791284320277353,
'modularity_class': 0},
'Tywin': {'degree': 22,
'weighted_degree': 204,
'betweenness': 0.06553840423231058,
'modularity_class': 0},
'Alliser': {'degree': 3,
'weighted_degree': 29,
'betweenness': 0.0,
'modularity_class': 1},
'Mance': {'degree': 12,
'weighted_degree': 160,
'betweenness': 0.007275961371756524,
'modularity_class': 1},
'Amory': {'degree': 1,
'weighted_degree': 5,
'betweenness': 0.0,
'modularity_class': 0},
'Oberyn': {'degree': 7,
'weighted_degree': 76,
'betweenness': 0.01958014232946847,
'modularity_class': 0},
'Arya': {'degree': 19,
'weighted_degree': 269,
'betweenness': 0.07960711308183888,
'modularity_class': 2},
'Anguy': {'degree': 2,
'weighted_degree': 15,
'betweenness': 0.0,
'modularity_class': 4},
'Beric': {'degree': 6,
'weighted_degree': 75,
'betweenness': 0.0006091214266627511,
'modularity_class': 4},
'Bran': {'degree': 14,
'weighted_degree': 344,
'betweenness': 0.06301659941786954,
'modularity_class': 2},
'Brynden': {'degree': 8,
'weighted_degree': 55,
'betweenness': 0.004727134574764742,
'modularity_class': 2},
'Cersei': {'degree': 20,
'weighted_degree': 226,
'betweenness': 0.02674643287824232,
'modularity_class': 2},
'Gendry': {'degree': 4,
'weighted_degree': 59,
'betweenness': 0.0,
'modularity_class': 4},
'Gregor': {'degree': 12,
'weighted_degree': 117,
'betweenness': 0.005879915417737236,
'modularity_class': 0},
'Joffrey': {'degree': 18,
'weighted_degree': 255,
'betweenness': 0.025434099443917696,
'modularity_class': 0},
'Jon': {'degree': 26,
'weighted_degree': 442,
'betweenness': 0.22996466368473173,
'modularity_class': 1},
'Rickon': {'degree': 6,
'weighted_degree': 81,
'betweenness': 0.0007626320968639029,
'modularity_class': 2},
'Roose': {'degree': 4,
'weighted_degree': 17,
'betweenness': 0.0002629599012559427,
'modularity_class': 2},
'Sandor': {'degree': 13,
'weighted_degree': 137,
'betweenness': 0.014162278987154626,
'modularity_class': 0},
'Thoros': {'degree': 5,
'weighted_degree': 60,
'betweenness': 0.0019261823273239152,
'modularity_class': 4},
'Balon': {'degree': 6,
'weighted_degree': 29,
'betweenness': 0.0006281164805527878,
'modularity_class': 0},
'Loras': {'degree': 9,
'weighted_degree': 76,
'betweenness': 0.003780752291533962,
'modularity_class': 0},
'Belwas': {'degree': 4,
'weighted_degree': 67,
'betweenness': 0.018867924528301886,
'modularity_class': 3},
'Barristan': {'degree': 6,
'weighted_degree': 63,
'betweenness': 0.04011407489067884,
'modularity_class': 3},
'Illyrio': {'degree': 1,
'weighted_degree': 10,
'betweenness': 0.0,
'modularity_class': 3},
'Hodor': {'degree': 4,
'weighted_degree': 177,
'betweenness': 0.0021937273446681065,
'modularity_class': 1},
'Jojen': {'degree': 4,
'weighted_degree': 125,
'betweenness': 0.0004064518889316733,
'modularity_class': 1},
'Luwin': {'degree': 2,
'weighted_degree': 8,
'betweenness': 0.0,
'modularity_class': 2},
'Meera': {'degree': 5,
'weighted_degree': 139,
'betweenness': 0.0019922569692430686,
'modularity_class': 1},
'Nan': {'degree': 2,
'weighted_degree': 18,
'betweenness': 0.0,
'modularity_class': 2},
'Theon': {'degree': 4,
'weighted_degree': 38,
'betweenness': 0.00047177590304274953,
'modularity_class': 2},
'Brienne': {'degree': 7,
'weighted_degree': 122,
'betweenness': 0.0015376001520469229,
'modularity_class': 2},
'Bronn': {'degree': 4,
'weighted_degree': 59,
'betweenness': 0.00010482180293501046,
'modularity_class': 0},
'Podrick': {'degree': 5,
'weighted_degree': 64,
'betweenness': 0.0008358985235471674,
'modularity_class': 0},
'Lothar': {'degree': 5,
'weighted_degree': 34,
'betweenness': 0.0006600525898733143,
'modularity_class': 2},
'Walder': {'degree': 8,
'weighted_degree': 87,
'betweenness': 0.0032731813973401044,
'modularity_class': 2},
'Catelyn': {'degree': 18,
'weighted_degree': 184,
'betweenness': 0.04890588265764755,
'modularity_class': 2},
'Edmure': {'degree': 8,
'weighted_degree': 98,
'betweenness': 0.0063172332740347534,
'modularity_class': 2},
'Hoster': {'degree': 3,
'weighted_degree': 24,
'betweenness': 0.0002426336765959408,
'modularity_class': 2},
'Jeyne': {'degree': 2,
'weighted_degree': 28,
'betweenness': 0.0,
'modularity_class': 2},
'Lysa': {'degree': 10,
'weighted_degree': 108,
'betweenness': 0.015215156305177053,
'modularity_class': 2},
'Petyr': {'degree': 7,
'weighted_degree': 89,
'betweenness': 0.0011502139845250673,
'modularity_class': 2},
'Robb': {'degree': 25,
'weighted_degree': 342,
'betweenness': 0.1269644713830151,
'modularity_class': 2},
'Roslin': {'degree': 4,
'weighted_degree': 32,
'betweenness': 6.751960581039384e-05,
'modularity_class': 2},
'Sansa': {'degree': 26,
'weighted_degree': 383,
'betweenness': 0.12672031668498004,
'modularity_class': 2},
'Stannis': {'degree': 14,
'weighted_degree': 146,
'betweenness': 0.1026998617273264,
'modularity_class': 1},
'Elia': {'degree': 5,
'weighted_degree': 29,
'betweenness': 0.002996853410630337,
'modularity_class': 0},
'Ilyn': {'degree': 6,
'weighted_degree': 32,
'betweenness': 0.0,
'modularity_class': 0},
'Meryn': {'degree': 7,
'weighted_degree': 47,
'betweenness': 0.00025900705642512993,
'modularity_class': 0},
'Pycelle': {'degree': 4,
'weighted_degree': 24,
'betweenness': 0.0,
'modularity_class': 0},
'Shae': {'degree': 5,
'weighted_degree': 45,
'betweenness': 0.0012523948930099663,
'modularity_class': 0},
'Varys': {'degree': 7,
'weighted_degree': 49,
'betweenness': 0.0009094137867722772,
'modularity_class': 0},
'Craster': {'degree': 5,
'weighted_degree': 75,
'betweenness': 0.018867924528301886,
'modularity_class': 1},
'Karl': {'degree': 1,
'weighted_degree': 6,
'betweenness': 0.0,
'modularity_class': 1},
'Daario': {'degree': 4,
'weighted_degree': 30,
'betweenness': 5.989817310572027e-05,
'modularity_class': 3},
'Drogo': {'degree': 4,
'weighted_degree': 35,
'betweenness': 5.989817310572027e-05,
'modularity_class': 3},
'Irri': {'degree': 4,
'weighted_degree': 33,
'betweenness': 0.00017969451931716083,
'modularity_class': 3},
'Daenerys': {'degree': 14,
'weighted_degree': 232,
'betweenness': 0.15720345212054956,
'modularity_class': 3},
'Aegon': {'degree': 1,
'weighted_degree': 8,
'betweenness': 0.0,
'modularity_class': 3},
'Jorah': {'degree': 6,
'weighted_degree': 89,
'betweenness': 0.002329891127259132,
'modularity_class': 3},
'Kraznys': {'degree': 1,
'weighted_degree': 10,
'betweenness': 0.0,
'modularity_class': 3},
'Missandei': {'degree': 2,
'weighted_degree': 30,
'betweenness': 0.0,
'modularity_class': 3},
'Rakharo': {'degree': 1,
'weighted_degree': 7,
'betweenness': 0.0,
'modularity_class': 3},
'Rhaegar': {'degree': 6,
'weighted_degree': 42,
'betweenness': 0.007312671807481101,
'modularity_class': 3},
'Viserys': {'degree': 3,
'weighted_degree': 19,
'betweenness': 0.015644391307527945,
'modularity_class': 3},
'Worm': {'degree': 1,
'weighted_degree': 14,
'betweenness': 0.0,
'modularity_class': 3},
'Davos': {'degree': 5,
'weighted_degree': 87,
'betweenness': 0.056064690026954175,
'modularity_class': 1},
'Cressen': {'degree': 1,
'weighted_degree': 4,
'betweenness': 0.0,
'modularity_class': 1},
'Salladhor': {'degree': 1,
'weighted_degree': 16,
'betweenness': 0.0,
'modularity_class': 1},
'Eddard': {'degree': 12,
'weighted_degree': 108,
'betweenness': 0.019341416465723616,
'modularity_class': 2},
'Eddison': {'degree': 3,
'weighted_degree': 24,
'betweenness': 0.0,
'modularity_class': 1},
'Gilly': {'degree': 4,
'weighted_degree': 69,
'betweenness': 0.0,
'modularity_class': 1},
'Qyburn': {'degree': 1,
'weighted_degree': 11,
'betweenness': 0.0,
'modularity_class': 0},
'Renly': {'degree': 8,
'weighted_degree': 55,
'betweenness': 0.004227926858198188,
'modularity_class': 0},
'Tommen': {'degree': 5,
'weighted_degree': 31,
'betweenness': 0.0006984420191967362,
'modularity_class': 0},
'Janos': {'degree': 6,
'weighted_degree': 37,
'betweenness': 0.02355861153253357,
'modularity_class': 1},
'Bowen': {'degree': 2,
'weighted_degree': 11,
'betweenness': 0.0,
'modularity_class': 1},
'Kevan': {'degree': 6,
'weighted_degree': 50,
'betweenness': 0.019219915043818533,
'modularity_class': 0},
'Margaery': {'degree': 7,
'weighted_degree': 96,
'betweenness': 0.0010973522354777933,
'modularity_class': 0},
'Myrcella': {'degree': 4,
'weighted_degree': 18,
'betweenness': 0.0006235971795124951,
'modularity_class': 0},
'Dalla': {'degree': 3,
'weighted_degree': 21,
'betweenness': 0.0,
'modularity_class': 1},
'Melisandre': {'degree': 4,
'weighted_degree': 62,
'betweenness': 0.00860866854841803,
'modularity_class': 1},
'Orell': {'degree': 1,
'weighted_degree': 6,
'betweenness': 0.0,
'modularity_class': 1},
'Qhorin': {'degree': 5,
'weighted_degree': 59,
'betweenness': 0.0002635519616651692,
'modularity_class': 1},
'Rattleshirt': {'degree': 4,
'weighted_degree': 44,
'betweenness': 0.0,
'modularity_class': 1},
'Styr': {'degree': 2,
'weighted_degree': 23,
'betweenness': 0.0,
'modularity_class': 1},
'Val': {'degree': 4,
'weighted_degree': 31,
'betweenness': 0.005898334987101542,
'modularity_class': 1},
'Ygritte': {'degree': 4,
'weighted_degree': 82,
'betweenness': 0.0,
'modularity_class': 1},
'Jon Arryn': {'degree': 2,
'weighted_degree': 11,
'betweenness': 0.0005764583325230229,
'modularity_class': 3},
'Lancel': {'degree': 1,
'weighted_degree': 7,
'betweenness': 0.0,
'modularity_class': 0},
'Olenna': {'degree': 2,
'weighted_degree': 12,
'betweenness': 0.0,
'modularity_class': 0},
'Marillion': {'degree': 3,
'weighted_degree': 23,
'betweenness': 0.0,
'modularity_class': 2},
'Robert Arryn': {'degree': 3,
'weighted_degree': 19,
'betweenness': 0.0,
'modularity_class': 2},
'Ellaria': {'degree': 2,
'weighted_degree': 10,
'betweenness': 0.0,
'modularity_class': 0},
'Mace': {'degree': 3,
'weighted_degree': 20,
'betweenness': 0.0,
'modularity_class': 0},
'Rickard': {'degree': 2,
'weighted_degree': 11,
'betweenness': 0.0,
'modularity_class': 2},
'Ramsay': {'degree': 1,
'weighted_degree': 4,
'betweenness': 0.0,
'modularity_class': 2},
'Chataya': {'degree': 2,
'weighted_degree': 9,
'betweenness': 0.0,
'modularity_class': 0},
'Shireen': {'degree': 1,
'weighted_degree': 5,
'betweenness': 0.0,
'modularity_class': 1},
'Doran': {'degree': 1,
'weighted_degree': 5,
'betweenness': 0.0,
'modularity_class': 0},
'Walton': {'degree': 1,
'weighted_degree': 10,
'betweenness': 0.0,
'modularity_class': 0}}
…and then transposing it (flipping the columns and rows) with .T
nodes_df = pd.DataFrame(dict(G.nodes(data=True))).T
nodes_df
| degree | weighted_degree | betweenness | modularity_class | |
|---|---|---|---|---|
| Aemon | 5.0 | 74.0 | 0.004623 | 1.0 |
| Grenn | 4.0 | 81.0 | 0.000060 | 1.0 |
| Samwell | 15.0 | 282.0 | 0.032273 | 1.0 |
| Aerys | 4.0 | 37.0 | 0.000000 | 0.0 |
| Jaime | 24.0 | 372.0 | 0.099943 | 0.0 |
| Robert | 18.0 | 128.0 | 0.209452 | 3.0 |
| Tyrion | 36.0 | 551.0 | 0.197913 | 0.0 |
| Tywin | 22.0 | 204.0 | 0.065538 | 0.0 |
| Alliser | 3.0 | 29.0 | 0.000000 | 1.0 |
| Mance | 12.0 | 160.0 | 0.007276 | 1.0 |
| Amory | 1.0 | 5.0 | 0.000000 | 0.0 |
| Oberyn | 7.0 | 76.0 | 0.019580 | 0.0 |
| Arya | 19.0 | 269.0 | 0.079607 | 2.0 |
| Anguy | 2.0 | 15.0 | 0.000000 | 4.0 |
| Beric | 6.0 | 75.0 | 0.000609 | 4.0 |
| Bran | 14.0 | 344.0 | 0.063017 | 2.0 |
| Brynden | 8.0 | 55.0 | 0.004727 | 2.0 |
| Cersei | 20.0 | 226.0 | 0.026746 | 2.0 |
| Gendry | 4.0 | 59.0 | 0.000000 | 4.0 |
| Gregor | 12.0 | 117.0 | 0.005880 | 0.0 |
| Joffrey | 18.0 | 255.0 | 0.025434 | 0.0 |
| Jon | 26.0 | 442.0 | 0.229965 | 1.0 |
| Rickon | 6.0 | 81.0 | 0.000763 | 2.0 |
| Roose | 4.0 | 17.0 | 0.000263 | 2.0 |
| Sandor | 13.0 | 137.0 | 0.014162 | 0.0 |
| Thoros | 5.0 | 60.0 | 0.001926 | 4.0 |
| Balon | 6.0 | 29.0 | 0.000628 | 0.0 |
| Loras | 9.0 | 76.0 | 0.003781 | 0.0 |
| Belwas | 4.0 | 67.0 | 0.018868 | 3.0 |
| Barristan | 6.0 | 63.0 | 0.040114 | 3.0 |
| Illyrio | 1.0 | 10.0 | 0.000000 | 3.0 |
| Hodor | 4.0 | 177.0 | 0.002194 | 1.0 |
| Jojen | 4.0 | 125.0 | 0.000406 | 1.0 |
| Luwin | 2.0 | 8.0 | 0.000000 | 2.0 |
| Meera | 5.0 | 139.0 | 0.001992 | 1.0 |
| Nan | 2.0 | 18.0 | 0.000000 | 2.0 |
| Theon | 4.0 | 38.0 | 0.000472 | 2.0 |
| Brienne | 7.0 | 122.0 | 0.001538 | 2.0 |
| Bronn | 4.0 | 59.0 | 0.000105 | 0.0 |
| Podrick | 5.0 | 64.0 | 0.000836 | 0.0 |
| Lothar | 5.0 | 34.0 | 0.000660 | 2.0 |
| Walder | 8.0 | 87.0 | 0.003273 | 2.0 |
| Catelyn | 18.0 | 184.0 | 0.048906 | 2.0 |
| Edmure | 8.0 | 98.0 | 0.006317 | 2.0 |
| Hoster | 3.0 | 24.0 | 0.000243 | 2.0 |
| Jeyne | 2.0 | 28.0 | 0.000000 | 2.0 |
| Lysa | 10.0 | 108.0 | 0.015215 | 2.0 |
| Petyr | 7.0 | 89.0 | 0.001150 | 2.0 |
| Robb | 25.0 | 342.0 | 0.126964 | 2.0 |
| Roslin | 4.0 | 32.0 | 0.000068 | 2.0 |
| Sansa | 26.0 | 383.0 | 0.126720 | 2.0 |
| Stannis | 14.0 | 146.0 | 0.102700 | 1.0 |
| Elia | 5.0 | 29.0 | 0.002997 | 0.0 |
| Ilyn | 6.0 | 32.0 | 0.000000 | 0.0 |
| Meryn | 7.0 | 47.0 | 0.000259 | 0.0 |
| Pycelle | 4.0 | 24.0 | 0.000000 | 0.0 |
| Shae | 5.0 | 45.0 | 0.001252 | 0.0 |
| Varys | 7.0 | 49.0 | 0.000909 | 0.0 |
| Craster | 5.0 | 75.0 | 0.018868 | 1.0 |
| Karl | 1.0 | 6.0 | 0.000000 | 1.0 |
| Daario | 4.0 | 30.0 | 0.000060 | 3.0 |
| Drogo | 4.0 | 35.0 | 0.000060 | 3.0 |
| Irri | 4.0 | 33.0 | 0.000180 | 3.0 |
| Daenerys | 14.0 | 232.0 | 0.157203 | 3.0 |
| Aegon | 1.0 | 8.0 | 0.000000 | 3.0 |
| Jorah | 6.0 | 89.0 | 0.002330 | 3.0 |
| Kraznys | 1.0 | 10.0 | 0.000000 | 3.0 |
| Missandei | 2.0 | 30.0 | 0.000000 | 3.0 |
| Rakharo | 1.0 | 7.0 | 0.000000 | 3.0 |
| Rhaegar | 6.0 | 42.0 | 0.007313 | 3.0 |
| Viserys | 3.0 | 19.0 | 0.015644 | 3.0 |
| Worm | 1.0 | 14.0 | 0.000000 | 3.0 |
| Davos | 5.0 | 87.0 | 0.056065 | 1.0 |
| Cressen | 1.0 | 4.0 | 0.000000 | 1.0 |
| Salladhor | 1.0 | 16.0 | 0.000000 | 1.0 |
| Eddard | 12.0 | 108.0 | 0.019341 | 2.0 |
| Eddison | 3.0 | 24.0 | 0.000000 | 1.0 |
| Gilly | 4.0 | 69.0 | 0.000000 | 1.0 |
| Qyburn | 1.0 | 11.0 | 0.000000 | 0.0 |
| Renly | 8.0 | 55.0 | 0.004228 | 0.0 |
| Tommen | 5.0 | 31.0 | 0.000698 | 0.0 |
| Janos | 6.0 | 37.0 | 0.023559 | 1.0 |
| Bowen | 2.0 | 11.0 | 0.000000 | 1.0 |
| Kevan | 6.0 | 50.0 | 0.019220 | 0.0 |
| Margaery | 7.0 | 96.0 | 0.001097 | 0.0 |
| Myrcella | 4.0 | 18.0 | 0.000624 | 0.0 |
| Dalla | 3.0 | 21.0 | 0.000000 | 1.0 |
| Melisandre | 4.0 | 62.0 | 0.008609 | 1.0 |
| Orell | 1.0 | 6.0 | 0.000000 | 1.0 |
| Qhorin | 5.0 | 59.0 | 0.000264 | 1.0 |
| Rattleshirt | 4.0 | 44.0 | 0.000000 | 1.0 |
| Styr | 2.0 | 23.0 | 0.000000 | 1.0 |
| Val | 4.0 | 31.0 | 0.005898 | 1.0 |
| Ygritte | 4.0 | 82.0 | 0.000000 | 1.0 |
| Jon Arryn | 2.0 | 11.0 | 0.000576 | 3.0 |
| Lancel | 1.0 | 7.0 | 0.000000 | 0.0 |
| Olenna | 2.0 | 12.0 | 0.000000 | 0.0 |
| Marillion | 3.0 | 23.0 | 0.000000 | 2.0 |
| Robert Arryn | 3.0 | 19.0 | 0.000000 | 2.0 |
| Ellaria | 2.0 | 10.0 | 0.000000 | 0.0 |
| Mace | 3.0 | 20.0 | 0.000000 | 0.0 |
| Rickard | 2.0 | 11.0 | 0.000000 | 2.0 |
| Ramsay | 1.0 | 4.0 | 0.000000 | 2.0 |
| Chataya | 2.0 | 9.0 | 0.000000 | 0.0 |
| Shireen | 1.0 | 5.0 | 0.000000 | 1.0 |
| Doran | 1.0 | 5.0 | 0.000000 | 0.0 |
| Walton | 1.0 | 10.0 | 0.000000 | 0.0 |
nodes_df.sort_values(by='betweenness', ascending=False)
| degree | weighted_degree | betweenness | modularity_class | |
|---|---|---|---|---|
| Jon | 26.0 | 442.0 | 0.229965 | 1.0 |
| Robert | 18.0 | 128.0 | 0.209452 | 3.0 |
| Tyrion | 36.0 | 551.0 | 0.197913 | 0.0 |
| Daenerys | 14.0 | 232.0 | 0.157203 | 3.0 |
| Robb | 25.0 | 342.0 | 0.126964 | 2.0 |
| Sansa | 26.0 | 383.0 | 0.126720 | 2.0 |
| Stannis | 14.0 | 146.0 | 0.102700 | 1.0 |
| Jaime | 24.0 | 372.0 | 0.099943 | 0.0 |
| Arya | 19.0 | 269.0 | 0.079607 | 2.0 |
| Tywin | 22.0 | 204.0 | 0.065538 | 0.0 |
| Bran | 14.0 | 344.0 | 0.063017 | 2.0 |
| Davos | 5.0 | 87.0 | 0.056065 | 1.0 |
| Catelyn | 18.0 | 184.0 | 0.048906 | 2.0 |
| Barristan | 6.0 | 63.0 | 0.040114 | 3.0 |
| Samwell | 15.0 | 282.0 | 0.032273 | 1.0 |
| Cersei | 20.0 | 226.0 | 0.026746 | 2.0 |
| Joffrey | 18.0 | 255.0 | 0.025434 | 0.0 |
| Janos | 6.0 | 37.0 | 0.023559 | 1.0 |
| Oberyn | 7.0 | 76.0 | 0.019580 | 0.0 |
| Eddard | 12.0 | 108.0 | 0.019341 | 2.0 |
| Kevan | 6.0 | 50.0 | 0.019220 | 0.0 |
| Belwas | 4.0 | 67.0 | 0.018868 | 3.0 |
| Craster | 5.0 | 75.0 | 0.018868 | 1.0 |
| Viserys | 3.0 | 19.0 | 0.015644 | 3.0 |
| Lysa | 10.0 | 108.0 | 0.015215 | 2.0 |
| Sandor | 13.0 | 137.0 | 0.014162 | 0.0 |
| Melisandre | 4.0 | 62.0 | 0.008609 | 1.0 |
| Rhaegar | 6.0 | 42.0 | 0.007313 | 3.0 |
| Mance | 12.0 | 160.0 | 0.007276 | 1.0 |
| Edmure | 8.0 | 98.0 | 0.006317 | 2.0 |
| Val | 4.0 | 31.0 | 0.005898 | 1.0 |
| Gregor | 12.0 | 117.0 | 0.005880 | 0.0 |
| Brynden | 8.0 | 55.0 | 0.004727 | 2.0 |
| Aemon | 5.0 | 74.0 | 0.004623 | 1.0 |
| Renly | 8.0 | 55.0 | 0.004228 | 0.0 |
| Loras | 9.0 | 76.0 | 0.003781 | 0.0 |
| Walder | 8.0 | 87.0 | 0.003273 | 2.0 |
| Elia | 5.0 | 29.0 | 0.002997 | 0.0 |
| Jorah | 6.0 | 89.0 | 0.002330 | 3.0 |
| Hodor | 4.0 | 177.0 | 0.002194 | 1.0 |
| Meera | 5.0 | 139.0 | 0.001992 | 1.0 |
| Thoros | 5.0 | 60.0 | 0.001926 | 4.0 |
| Brienne | 7.0 | 122.0 | 0.001538 | 2.0 |
| Shae | 5.0 | 45.0 | 0.001252 | 0.0 |
| Petyr | 7.0 | 89.0 | 0.001150 | 2.0 |
| Margaery | 7.0 | 96.0 | 0.001097 | 0.0 |
| Varys | 7.0 | 49.0 | 0.000909 | 0.0 |
| Podrick | 5.0 | 64.0 | 0.000836 | 0.0 |
| Rickon | 6.0 | 81.0 | 0.000763 | 2.0 |
| Tommen | 5.0 | 31.0 | 0.000698 | 0.0 |
| Lothar | 5.0 | 34.0 | 0.000660 | 2.0 |
| Balon | 6.0 | 29.0 | 0.000628 | 0.0 |
| Myrcella | 4.0 | 18.0 | 0.000624 | 0.0 |
| Beric | 6.0 | 75.0 | 0.000609 | 4.0 |
| Jon Arryn | 2.0 | 11.0 | 0.000576 | 3.0 |
| Theon | 4.0 | 38.0 | 0.000472 | 2.0 |
| Jojen | 4.0 | 125.0 | 0.000406 | 1.0 |
| Qhorin | 5.0 | 59.0 | 0.000264 | 1.0 |
| Roose | 4.0 | 17.0 | 0.000263 | 2.0 |
| Meryn | 7.0 | 47.0 | 0.000259 | 0.0 |
| Hoster | 3.0 | 24.0 | 0.000243 | 2.0 |
| Irri | 4.0 | 33.0 | 0.000180 | 3.0 |
| Bronn | 4.0 | 59.0 | 0.000105 | 0.0 |
| Roslin | 4.0 | 32.0 | 0.000068 | 2.0 |
| Daario | 4.0 | 30.0 | 0.000060 | 3.0 |
| Drogo | 4.0 | 35.0 | 0.000060 | 3.0 |
| Grenn | 4.0 | 81.0 | 0.000060 | 1.0 |
| Marillion | 3.0 | 23.0 | 0.000000 | 2.0 |
| Ramsay | 1.0 | 4.0 | 0.000000 | 2.0 |
| Doran | 1.0 | 5.0 | 0.000000 | 0.0 |
| Mace | 3.0 | 20.0 | 0.000000 | 0.0 |
| Shireen | 1.0 | 5.0 | 0.000000 | 1.0 |
| Robert Arryn | 3.0 | 19.0 | 0.000000 | 2.0 |
| Dalla | 3.0 | 21.0 | 0.000000 | 1.0 |
| Chataya | 2.0 | 9.0 | 0.000000 | 0.0 |
| Orell | 1.0 | 6.0 | 0.000000 | 1.0 |
| Ygritte | 4.0 | 82.0 | 0.000000 | 1.0 |
| Olenna | 2.0 | 12.0 | 0.000000 | 0.0 |
| Rattleshirt | 4.0 | 44.0 | 0.000000 | 1.0 |
| Rickard | 2.0 | 11.0 | 0.000000 | 2.0 |
| Lancel | 1.0 | 7.0 | 0.000000 | 0.0 |
| Styr | 2.0 | 23.0 | 0.000000 | 1.0 |
| Ellaria | 2.0 | 10.0 | 0.000000 | 0.0 |
| Ilyn | 6.0 | 32.0 | 0.000000 | 0.0 |
| Bowen | 2.0 | 11.0 | 0.000000 | 1.0 |
| Pycelle | 4.0 | 24.0 | 0.000000 | 0.0 |
| Aerys | 4.0 | 37.0 | 0.000000 | 0.0 |
| Alliser | 3.0 | 29.0 | 0.000000 | 1.0 |
| Amory | 1.0 | 5.0 | 0.000000 | 0.0 |
| Anguy | 2.0 | 15.0 | 0.000000 | 4.0 |
| Gendry | 4.0 | 59.0 | 0.000000 | 4.0 |
| Illyrio | 1.0 | 10.0 | 0.000000 | 3.0 |
| Luwin | 2.0 | 8.0 | 0.000000 | 2.0 |
| Nan | 2.0 | 18.0 | 0.000000 | 2.0 |
| Jeyne | 2.0 | 28.0 | 0.000000 | 2.0 |
| Karl | 1.0 | 6.0 | 0.000000 | 1.0 |
| Qyburn | 1.0 | 11.0 | 0.000000 | 0.0 |
| Aegon | 1.0 | 8.0 | 0.000000 | 3.0 |
| Kraznys | 1.0 | 10.0 | 0.000000 | 3.0 |
| Missandei | 2.0 | 30.0 | 0.000000 | 3.0 |
| Rakharo | 1.0 | 7.0 | 0.000000 | 3.0 |
| Worm | 1.0 | 14.0 | 0.000000 | 3.0 |
| Cressen | 1.0 | 4.0 | 0.000000 | 1.0 |
| Salladhor | 1.0 | 16.0 | 0.000000 | 1.0 |
| Eddison | 3.0 | 24.0 | 0.000000 | 1.0 |
| Gilly | 4.0 | 69.0 | 0.000000 | 1.0 |
| Walton | 1.0 | 10.0 | 0.000000 | 0.0 |