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

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

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

Решение задачи состоит из двух этапов:

  • поиск в глубину (находим связи между клиентами через все «рукопожатия»);
  • визуализация результатов (отрисовка связей между клиентами в виде графа).

Полный код статьи, а также вспомогательные материалы можно найти на github странице. Импортируем необходимые библиотеки:

Библиотеки pandas и numpy понадобятся для обработки данных, библиотека graphviz для отрисовки графа.

Для примера возьмем следующий сгенерированный набор данных:

Набор данных состоит из столбцов суммы перевода (Sum), отправителя перевода (Payer), получателя перевода (Recipient).

Далее необходимо реализовать функцию для определения связи между отправителем и получателем:

На вход функции get_values_for_graph подается датафрейм, состоящий из 3 столбцов (Sum, Payer, Recipient), порядок столбцов важен, на выходе получим словарь, который показывает, как связаны между собой клиенты:

Далее напишем функцию, которая найдет обобщенные группы клиентов, связанные через любые «рукопожатия»:

Запустим следующий код для выполнения функции coherence:

Результатом вышеуказанного кода является переменная fully_connected_groups, которая содержит полносвязные группы клиентов, в данном примере получились 4 обособленные группы.

В наборе данных отберем только тех клиентов, которые связаны с одной из групп, одиночные операции на графе будут малоинформативными:

Далее сформируем данные для отрисовки, а также посчитаем сумму переводов для каждой пары (отправитель — получатель):

Предобработка данных завершена, осталось с помощью библиотеки graphviz отобразить результаты в виде графа:

Важным параметром в вышеуказанном коде является engine, алгоритм, с помощью которого происходит отрисовка графа. Стоит провести эксперимент: какое из значений (sfdp, dot, neato, fdp, twopi, circo) лучше всего подходит для ваших данных. После запуска кода появится пдф-файл, на котором отображены группы, связанные между собой определенными клиентами.

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

Читайте также: Как при помощи графов провести анализ процесса и найти в нем изъяны? (ссылка)