![](https://habrastorage.org/getpro/habr/upload_files/b44/db6/af7/b44db6af7b06a30292c78f4b0ac64414.png)
В чёрную пятницу, пока у нас стартует флагманский курс Data Science, делимся интерактивными графами подписок веб-разработчиков и разработчиков моделей ML, а также знакомим читателей с инструментом визуализации больших графов — PyGraphistry.
Такие данные — косвенный индикатор конкуренции языков и технологий. К примеру, можно попробовать выяснить, сколько разработчиков C++ следят за разработчиками Rust и наоборот. За подробностями и кодом приглашаем под кат.
![](https://habrastorage.org/getpro/habr/upload_files/05f/039/d87/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)
![](https://habrastorage.org/getpro/habr/upload_files/a54/c39/7c9/a54c397c98213f7f1a7990d66092586d.png)
Рёбра (edges) — это наблюдения двух разработчиков друг за другом.
edges = pd.read_csv("github-social-network/github_edges_1.csv")
# Change datatypes
edges = edges.astype(str)
edges.head(10)
![](https://habrastorage.org/getpro/habr/upload_files/51b/735/7eb/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)
![](https://habrastorage.org/getpro/habr/upload_files/cad/6eb/388/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?
Чтобы ответить на этот вопрос, воспользуемся теоремой Байеса. Из этой теоремы известно, что:
![](https://habrastorage.org/getpro/habr/upload_files/b4f/757/c8e/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):
![](https://habrastorage.org/getpro/habr/upload_files/98e/0f7/edb/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()
В вашем блокноте должно появиться что-то вроде этого:
![](https://habrastorage.org/getpro/habr/upload_files/c22/2a1/505/c222a15055c5291995b0dac9a02c82a7.png)
Интерактивный граф вы найдёте здесь.
Чем больше узел, тем больше количество его связей с другими узлами. Наведя курсор на определённый узел, вы увидите узлы, с которыми он связан.
![](https://habrastorage.org/getpro/habr/upload_files/620/f0f/6a7/620f0f6a7d35cbecd72aed9036479b12.gif)
Интерактивный граф вы найдёте здесь.
Щёлкнув по узлу, вы получите информацию о нём.
![](https://habrastorage.org/getpro/habr/upload_files/b9c/84e/052/b9c84e05251eecf916974ccfc9e3dfe6.png)
Цветовое кодирование точек
Граф красивый, но не очень информативный. Хочется знать, как разработчики разных ролей связаны друг с другом, поэтому раскрасим узлы с разными ролями в разные цвета. Разработчики моделей машинного обучения окрашены в серебряный цвет, веб-разработчики — в бордовый.
g2 = g.encode_point_color("ml_target", categorical_mapping={1: "silver", 0: "maroon"})
g2.plot()
![](https://habrastorage.org/getpro/habr/upload_files/c24/cf5/df1/c24cf5df1210af20555b5192fc80d5be.png)
Интерактивный граф вы найдёте здесь.
Если цвет отображается не так, как вы этого ожидали, возможно, нужно обновить страницу.
Видно, что разработчики одинаковых ролей имеют тенденцию группироваться.
Разработчики с наибольшим количеством связей
Нажмём на значок "Data Table" в верхней части экрана. Отсортируем её по количеству взаимосвязей и щёлкнем по интересующей точке, которая будет выделена:
![](https://habrastorage.org/getpro/habr/upload_files/6c3/9f1/d74/6c39f1d7479236d8ac4f2260b8f6a45f.gif)
Интерактивный граф здесь.
Из таблицы видно, что большинство популярных разработчиков — это веб-разработчики. Что неудивительно, ведь веб-разработчиков гораздо больше.
Найдём сообщества
Сообщество — это подмножество узлов, которые в одном и том же графе плотно связаны друг с другом и слабо связаны с узлами других сообществ. Попробуем найти сообщества с помощью метода Лувена. Мы имеем дело с большим графом, поэтому для ускорения кода воспользуемся 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)
![](https://habrastorage.org/getpro/habr/upload_files/0aa/e97/02f/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)
![](https://habrastorage.org/getpro/habr/upload_files/938/1d4/c00/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()
Вы должны увидеть нечто подобное:
![](https://habrastorage.org/getpro/habr/upload_files/95f/178/05e/95f17805e6a049f1b036e7403b07a70c.gif)
Интерактивная версия здесь.
Видно, что узлы из одного сообщества имеют тенденцию объединяться в кластеры.
Сообщества разработчиков ML и веб-разработчиков
К каким сообществам принадлежит большинство веб-разработчиков? Мы можем выяснить это, выбрав только веб-разработчиков. Для этого нажмите кнопку Filter в верхней части экрана.
![](https://habrastorage.org/getpro/habr/upload_files/c31/203/cdd/c31203cddbe373bda95720cfb7c6b2b4.png)
После этого отображаться должны только узлы веб-разработчиков:
![](https://habrastorage.org/getpro/habr/upload_files/848/f39/655/848f39655c1f1b115fd74db5c3b580ec.png)
Кажется, что веб-разработчики принадлежат к самым разным сообществам. А теперь посмотрим, к каким сообществам принадлежат разработчики моделей ML:
![](https://habrastorage.org/getpro/habr/upload_files/a1f/0af/982/a1f0af98285a0bc5a5a5086f97689901.png)
Граф только из разработчиков ML:
![](https://habrastorage.org/getpro/habr/upload_files/7ca/9ac/dcd/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. Свободно форкайте исходный код из этой статьи.
Продолжить изучение визуализации, Python и всей науки о данных вы сможете на наших курсах:
![](https://habrastorage.org/getpro/habr/upload_files/57d/f9c/a25/57df9ca25c2b1f306301ec14d23cf304.png)
Подробности здесь.
Профессии и курсы
Data Science и Machine Learning
Python, веб-разработка
Мобильная разработка
Java и C#
От основ — в глубину
А также