Красивые визуализации GitHub с помощью PyGraphistry

Kate

Administrator
Команда форума
05f039d878d6ba1e536ca8862de45de3.png

Интерактивный граф вы найдёте здесь.

Загрузка набора данных​

Мы проанализируем GitHub при помощи набора данных в Kaggle. Узлы — это разработчики, которые поставили звезду не менее чем 10 репозиториям. Если человек является разработчиком машинного обучения, то ml_target=1, иначе ml_target=0.

import pandas as pd

# Download the data at https://www.kaggle.com/femikj/github-social-network
nodes = pd.read_csv("github-social-network/github_target_1.csv")

# Change datatypes
nodes.id = nodes.id.astype(str)
nodes.ml_target = nodes.ml_target.astype(str)

nodes.head(10)
a54c397c98213f7f1a7990d66092586d.png

Рёбра (edges) — это наблюдения двух разработчиков друг за другом.

edges = pd.read_csv("github-social-network/github_edges_1.csv")

# Change datatypes
edges = edges.astype(str)

edges.head(10)
51b7357ebac162a72bfa1449419b10ba.png

Cвязи ML и веб-разработчиков​

Доля ML-разработчиков и веб-разработчиков​

Начнём с определения процентного соотношения веб-разработчиков — 𝑃(Web Developer) и разработчиков машинного обучения — 𝑃(ML Developer) в сети.

import plotly.express as px

percent_web, percent_ml = nodes.ml_target.value_counts(normalize=True)
px.histogram(data_frame=nodes, x="ml_target", histnorm="probability density")
74% разработчиков в этой сети — веб-разработчики.

Процент смешанных соединений​

Каков процент смешанных соединений (между веб-разработчиком и разработчиком машинного обучения)?

Объединим таблицы edges и nodes:

edges = edges.merge(nodes, how="left", left_on="id_1", right_on="id").merge(
nodes, how="left", left_on="id_2", right_on="id", suffixes=("1", "2")
)[["id_1", "id_2", "name1", "name2", "ml_target1", "ml_target2"]]

edges.head(10)

cad6eb3883dc6667d6c7364f28983f7b.png

Затем рассчитайте процент смешанных связей в сети — 𝑃(ML Developer connect to Web Developer).

cross_edge = edges.query("ml_target1 != ml_target2")
percentage_cross_edge = cross_edge.shape[0] / edges.shape[0]
percentage_cross_edge

0.1546558340224842
Одинаковых соединений почти в 5,5 раз больше, чем смешанных.

Связи веб-разработчиков​

Ещё один интересный вопрос: если человек — веб-разработчик, какой процент его связей — веб-разработчики, а какой — разработчики ML?

Чтобы ответить на этот вопрос, воспользуемся теоремой Байеса. Из этой теоремы известно, что:

b4f757c8e25b545a1440060736bda5c7.png

Мы уже знаем 𝑃(ML-Developer connect to web Developer) и 𝑃(Web Developer) из предыдущих расчётов. Воспользуемся этими цифрами, чтобы найти 𝑃(connect to ML Developer|Web Developer):

percentage_cross_edge / percent_web
0.20852347708049263
Теперь легко найти 𝑃(Web Developer|Web Developer):

98e0f7edbe837c9b079001bf157d2266.png

Это означает, что если человек является веб-разработчиком, то:

  • вероятность, что связанные с ним люди тоже веб-разработчики, составляет 71,95%;
  • вероятность, что он связан с разработчиком ML, составляет 28,05%.
Эти цифры очень похожи на процент разработчиков ML и веб-разработчиков в сети (0,258 и 0,741).

Связи разработчиков ML​

Мы можем найти 𝑃(Connect to a Web developer|ML Developer):

percentage_cross_edge / percent_ml
0.5986779897985065
И 𝑃(ML Developer|ML Developer):

1 - 0.5897
0.4103
Если человек — разработчик ML, то:

  • вероятность, что связанные с ним или с ней люди также являются веб-разработчиками, составляет 59,87%;
  • вероятность, что связанные с ним люди — разработчики ML, составляет 41,03%.
Поскольку процент разработчиков ML в сети составляет всего 25,8%, удивительно наблюдать, что 41,03% связей разработчика ML — это разработчики ML. То есть разработчики ML с большей вероятностью будут следить друг за другом, чем за веб-разработчиками.

Визуализация сети с помощью PyGraphistry​

Давайте попробуем подтвердить этот вывод. Визуализируем сеть GitHub с помощью PyGraphistry.

Что такое PyGraphistry?​

PyGraphistry — это библиотека Python для визуализации больших графов. Здесь мы будем работать с большим графом, поэтому PyGraphistry — идеальный инструмент.Чтобы установить его, выполните:

pip install pygraphistry

Начнём​

Чтобы использовать PyGraphistry, создайте бесплатный аккаунт graphistry.com:

import graphistry

PASSWORD ="GRAPHISTRY_PASSWORD" # Insert your password here
USERNAME = "GRAPHISTRY_USERNAME" # Insert your username here

graphistry.register(api=3, username=USERNAME, password=PASSWORD)

Затем укажите узлы и рёбра графа. Чтобы показать разные значки для разных ролей, воспользуемся encode_point_icon:

g = graphistry.edges(edges, "id_1", "id_2")

# Choose icons here: https://fontawesome.com/v4.7.0/icons/
g = (g.nodes(nodes, "id").encode_point_icon(
"ml_target", categorical_mapping={1: "area-chart", 0: "mouse-pointer"}
)
Теперь выводим граф Github:

g.plot()
В вашем блокноте должно появиться что-то вроде этого:

c222a15055c5291995b0dac9a02c82a7.png

Интерактивный граф вы найдёте здесь.

Чем больше узел, тем больше количество его связей с другими узлами. Наведя курсор на определённый узел, вы увидите узлы, с которыми он связан.

image-loader.svg

Интерактивный граф вы найдёте здесь.

Щёлкнув по узлу, вы получите информацию о нём.

b9c84e05251eecf916974ccfc9e3dfe6.png

Цветовое кодирование точек​

Граф красивый, но не очень информативный. Хочется знать, как разработчики разных ролей связаны друг с другом, поэтому раскрасим узлы с разными ролями в разные цвета. Разработчики моделей машинного обучения окрашены в серебряный цвет, веб-разработчики — в бордовый.

g2 = g.encode_point_color("ml_target", categorical_mapping={1: "silver", 0: "maroon"})
g2.plot()
c24cf5df1210af20555b5192fc80d5be.png

Интерактивный граф вы найдёте здесь.

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

Разработчики с наибольшим количеством связей​

Нажмём на значок "Data Table" в верхней части экрана. Отсортируем её по количеству взаимосвязей и щёлкнем по интересующей точке, которая будет выделена:

image-loader.svg

Интерактивный граф здесь.

Из таблицы видно, что большинство популярных разработчиков — это веб-разработчики. Что неудивительно, ведь веб-разработчиков гораздо больше.

Найдём сообщества​

Сообщество — это подмножество узлов, которые в одном и том же графе плотно связаны друг с другом и слабо связаны с узлами других сообществ. Попробуем найти сообщества с помощью метода Лувена. Мы имеем дело с большим графом, поэтому для ускорения кода воспользуемся cuGraph.

import cudf
import cugraph
from cugraph.community.louvain import louvain

# Turn a pandas DataFrame into a graph
G = cugraph.from_pandas_edgelist(edges, "id_1", "id_2")

# Get communities
parts, modularity_score = cugraph.louvain(G)

# View the first 10 rows
parts.head(10)
0aae9702f5b5a94b99ad53ab186c2970.png

В таблице ниже, partition — это сообщество, которому принадлежит узел (вершина). Сколько существует сообществ? Давайте узнаем:

parts.partition.unique().values
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], dtype=int32)
Их всего 22. Давайте представим, как выглядят эти сообщества. Объединим таблицы nodes с таблицами parts, чтобы получить имена узлов и их разделов.

# Join the parts and nodes table to get the name of the nodes
nodes_cudf = cudf.from_pandas(nodes)
nodes_part = nodes_cudf.merge(parts, how="left", left_on="id", right_on="vertex")
nodes_part.head(10)

9381d4c0051c8dd98ac74f311d3bbb80.png

Воспользуемся faker, чтобы раскрасить разделы в разные цвета.

from faker import Faker

Faker.seed(0)
fake = Faker()

g3 = (
g.nodes(nodes_part, "id")
.encode_point_icon(
"ml_target", categorical_mapping={1: "area-chart", 0: "mouse-pointer"}
)
.encode_point_color(
"partition", categorical_mapping={i: fake.color() for i in range(22)}
)
)

g3.plot()
Вы должны увидеть нечто подобное:

image-loader.svg

Интерактивная версия здесь.

Видно, что узлы из одного сообщества имеют тенденцию объединяться в кластеры.

Сообщества разработчиков ML и веб-разработчиков​

К каким сообществам принадлежит большинство веб-разработчиков? Мы можем выяснить это, выбрав только веб-разработчиков. Для этого нажмите кнопку Filter в верхней части экрана.

c31203cddbe373bda95720cfb7c6b2b4.png

После этого отображаться должны только узлы веб-разработчиков:

848f39655c1f1b115fd74db5c3b580ec.png

Кажется, что веб-разработчики принадлежат к самым разным сообществам. А теперь посмотрим, к каким сообществам принадлежат разработчики моделей ML:

a1f0af98285a0bc5a5a5086f97689901.png

Граф только из разработчиков ML:

7ca9acdcd6634e111f2b07d1b1d55964.png

Интересно! Большинство разработчиков ML принадлежат к сообществу, окрашенному в розовый цвет. Это означает, что, в отличие от веб-разработчиков, разработчики ML, как правило, находятся в одном сообществе. Другими словами, разработчики ML теснее связаны друг с другом.

Процент разработчиков ML в каждом сообществе​

Каков процент разработчиков ML в каждом сообществе? Чтобы выяснить это, воспользуемся сгруппированной гистограммой.

from faker import Faker

Faker.seed(0)
fake = Faker()

g3 = (
g.nodes(nodes_part, "id")
.encode_point_icon(
"ml_target", categorical_mapping={1: "area-chart", 0: "mouse-pointer"}
)
.encode_point_color(
"partition", categorical_mapping={i: fake.color() for i in range(22)}
)
)

g3.plot()
Кажется, небольшой процент разработчиков ML есть в большинстве сообществ. Это означает, что большинство сообществ весьма разнообразны.

Заключение​

Поздравляю! Вы только что узнали, как анализировать социальную сеть с помощью байесовской статистики и PyGraphistry. Свободно форкайте исходный код из этой статьи.

 
Сверху