И узнайте влиятельных лиц в игре престолов

Мотивация

После прочтения книг из серии Песнь льда и огня Дж. Р. Р. Мартина, как истинного фаната Игры престолов, вам может быть любопытно, кто является самым влиятельным человеком в Вестеросе. Или вы знаете, что Эддард Старк и Рэндил Тарли связаны, но не совсем уверены, как именно они связаны. Связаны ли они третьим или четвертым лицом? Было бы здорово, если бы вы могли визуализировать сеть?

Как энтузиаст данных, вы решаете провести поиск по релевантным данным для анализа. К счастью, вы найдете данные сетей взаимодействия персонажей для« Песни льда и пламени Джорджа Р. Мартина». Как это интересно! Но данные содержат список узлов и ребер. Что они вообще означают и с чего начать? Не волнуйся. Я верну тебя. Давайте разберемся, что такое граф и как он помогает нам понимать социальные сети.

Что такое график?

Граф - это структура, содержащая вершины (или узлы), а каждая из связанных пар вершин называется ребром. Края могут быть направленными или ненаправленными. Направленный означает одно направление. Человеку A может нравиться человек B, но человеку B может не нравиться человек A. Неориентированный означает 2 направления. Если человек A пожимает руку человеку B, это также означает, что человек B пожимает руку человеку A

Благодаря структуре графика его можно использовать для эффективной визуализации социальных сетей. Хотите знать влиятельных членов команды? Мы сразу видим, что человек (узел) с наибольшим количеством связей (ребер) является влиятельным лицом.

Большой! Мы знаем, почему граф полезен для визуализации сети. Давайте узнаем, как мы можем создать график и использовать его для визуализации сети персонажей в Игре престолов!

Изучите данные

Я объединил кратные данные из нескольких книг в 2 файла: данные узлов ‘ASOIAF_nodes.csv’, и данные ребер ‘ASOIAF_edges.csv’. Вы можете найти данные здесь

import pandas as pd
nodes = pd.read_csv('ASOIAF_nodes.csv')
nodes = nodes['Id']
num_nodes = nodes.shape[0]
nodes

Прохладный! Итак, у нас есть список символов в переменной node.. Всего 276 узлов (символов). Теперь давайте исследуем края. В файле ‘ASOIAF_edges.csv’ также есть информация о весе (количестве взаимодействий) и типе графика (неориентированный). Но поскольку мы просто заботимся о соединениях, мы используем первые 2 столбца

edges = pd.read_csv('ASOIAF_edges.csv',usecols=[0,1] )
edges

Всего 683 подключения! Вот это да. Многие связи установлены на протяжении всей серии. Но как превратить эти данные в график? Мы можем рассматривать:

  • Каждый символ как вершина
  • Две связанные вершины как ребро

Теперь мы готовы визуализировать сеть!

Визуализируйте график с помощью Graphviz

Graphviz - это Python-интерфейс для рисования графиков. Чтобы установить его, запустите

$ pip install graphviz

Создайте график, создав новый объект Digraph

from graphviz import Digraph
dot = Digraph(comment='VIP graph')

Давайте визуализируем первые десять узлов

nodes_G = []
for node in edges[:10]['Source']:
    if node not in nodes_G:
        nodes_G.append(node)
for node in edges[:10]['Target']:
    if node not in nodes_G:
        nodes_G.append(node)

Добавить узлы и ребра в граф

dot = Digraph(comment='VIP graph')
for i in range(len(nodes_G)):
    dot.node(nodes_G[i])
for i in range(len(edges[:10])):
    edge = edges.iloc[i]
    dot.edge(edge['Source'], edge['Target'])

Визуализируйте:

dot.render('VIP-graph_10.gv', view=True)

Отлично! Мы можем ясно видеть взаимодействия между персонажами на графике. Но как насчет визуализации всей сети. Конечно, мы можем это сделать. Но следует ожидать, что сеть персонажей в 5 главах этого сериала будет огромна.

dot = Digraph(comment='VIP graph')
for i in range(num_nodes):
    dot.node(nodes[i])
for i in range(len(edges)):
    edge = edges.iloc[i]
    dot.edge(edge['Source'], edge['Target'])
dot.render('VIP-graph.gv', view=True)

Пришло время шоу!

Прохладный! С помощью графика мы можем эффективно визуализировать сеть. Но можем ли мы создать наш собственный класс графа?

Создать график

Начнем с создания класса вершины (узла). Какие атрибуты и методы мы хотим, чтобы наш класс вершин имел? Хм. Добавьте соединения (addNeighbor), узнайте, с какими узлами соединяется текущий узел (getConnections), узнайте имя узла (getId) и насколько сильное соединение (getWeight)

Создайте класс графа с помощью некоторых основных методов графа:

Заключение

Поздравляю! В этой статье вы узнали, что такое граф и как использовать граф для визуализации социальной сети. Итак, что вы можете сделать с этими знаниями? Может быть, получить доступ к данным в этой статье и создать график персонажей, который вам интересно, чтобы проанализировать их отношения?

Или, если вы совсем не являетесь поклонником Игры престолов, вы можете анализировать данные о других социальных сетях, которые вам небезразличны, например Twitter, Facebook, чтобы проанализировать сеть между вами и вашими друзьями или подписчиками. Вы сможете попрактиковаться в использовании графика, а также понять свои отношения с друзьями. Вы знаете их напрямую или по связям с другими? Было бы так интересно узнать!

Вы можете найти код этой статьи в моем Github. В своей записной книжке я также рассказываю, как обходить отключенные узлы с помощью поиска в глубину и находить расстояние между двумя символами с помощью поиска в ширину .

Мне нравится писать об основных концепциях науки о данных и играть с различными алгоритмами и инструментами анализа данных. Вы могли связаться со мной в LinkedIn и Twitter.

Пометьте это репо, если хотите проверить коды всех моих статей. Следуйте за мной на Medium, чтобы быть в курсе моих последних статей по науке о данных, таких как: