Python, Анализ процессов, Программирование

Визуализация связей между объектами с помощью модуля NETWORKX

Время прочтения: 3 мин.

В мире BIG DATA зачастую требуется давать оценку не только самим данным, но также и их взаимосвязям. В решении этой задачи помогает гибкий и бесплатный инструмент Networkx, входящий в состав модулей Python. Здесь мы рассмотрим один из вариантов анализа связей между финансовыми объектами, в нашем примере – поиск взаимосвязей между ID клиентов организации посредством анализа переводов.

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

Импортируем требуемые модули и файл с данными клиентов – корреспондентов.

import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(r'U:\\Documents\data2.csv', sep=';')
df.head(5)

Для работы с модулем создаем пустой «граф» и импортируем в него список, состоящий из пар клиентов.

G = nx.Graph()
list_of_nodes = [(x,y) for x,y in df.values.tolist()]
list_of_nodes[0:2]
G.add_edges_from(list_of_nodes)

Прорисовка графа производится с указанием настроек параметров модуля и передачи ее в модуль matplotlib (для примера, представлены 2 вида графа).

nx.draw_random(G,  node_size= 1000 , with_labels=True)
plt.show()
nx.draw(G,  pos=nx.spring_layout(G) , node_size= 1000 , with_labels=True)
plt.show()

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

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

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

sub_G = list(nx.connected_component_subgraphs(G))
edges_ = []
for sub in sub_G:
    edges = sub.edges()
    if len(edges) > 1:
        print(edges, "всего связей в подгруппах: %s" %len(edges))
        for node in edges:
            edges_.append(node)

Сформированный список множественных связей клиентов можем использовать для построения отдельных графов связей между ними.

G_ = nx.Graph()
G_.add_edges_from(edges_)
nx.draw(G_, pos=nx.spring_layout(G_), node_size= 1000 , font_size=50, with_labels=True)
plt.show()

Граф более подробно показывает нам взаимосвязь между конкретными клиентами, отобранными по условию из первоначального массива данных.

Кроме того, модуль networkx можно аналогичным образом использовать для анализа направленных взаимосвязей с учетом векторов (т.е. учитывая направление активностей переводов), выделение тех или иных свойств взаимосвязей между объектами (в т.ч. агрегированных, например, общей суммы и частоты переводов) для работы с выборками и многое другое.

С подробным описанием методов и нюансов использования модуля можно ознакомится на портале проекта https://networkx.org

Советуем почитать