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

Читать основной материал:

«Кольца коррупции». Как кыргызские бизнесмены сымитировали конкуренцию на 83 млн сомов.

Ниже мы расскажем, как именно мы смогли это сделать.

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

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

В Кыргызстане, как и во многих других странах, государство не может покупать товары и услуги у частного бизнеса напрямую (кроме некоторых, определенных законом случаев). Оно обязано выбирать поставщиков (подрядчиков) через единую систему государственных закупок — электронный портал, созданный, чтобы:

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

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

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

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

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

Графовое представление вселенной госзакупок

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

Она хранит информацию об исследуемой нами области в виде графа, где вершины (node) — это субъекты или объекты госзакупок, а ребра — связи между ними.

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

Наша вселенная госзакупок выглядит так:

Рисунок 1 — Представление госзакупки в графовой базе Neo4j

Попробуйте сами

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

Вы можете самостоятельно перетаскивать объекты, приближать и отдалять их. 

Например, как в этом видео:

А теперь на интерактивном изображении:

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

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

У каждой ноды в базе кроме имени есть свойства. Например, для лота — это непосредственно номер лота, дата объявления торгов, начальная цена лота и т.д. Для участника госзакупок — индивидуальный налоговый номер (ИНН) и другие.

Данные о закупающих организациях, тендерах, лотах и участниках госзакупок мы загрузили в базу Neo4j из нашей базы госзакупок — обычной SQL-базы, где хранятся данные, выгруженные с официального сайта zakupki.gov.kg. Наши скрейперы обновляют эту базу раз в сутки, и раз в неделю мы будем переносить данные из SQL-таблиц в графовую базу Neo4j.

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

Рисунок 2 — Графовое представление базы данных юрлиц

Попробуйте сами: 

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

Данные о юридических лицах были загружены в базу Neo4j из нашей общей SQL-базы, куда скрейперы ежедневно заносят данные с официального сайта Министерства юстиции Кыргызстана. Данные графовой базы обновляются раз в неделю.

Чтобы связать участников госзакупок с юрлицами из базы Минюста мы использовали связь SAME_INN, поскольку ИНН — это уникальный идентификатор компании.

Добавим юрлица к примеру, представленному на рис. 1.

Рисунок 3 — Связь между юрлицами базы Минюста и участниками госзакупок. Интерфейс Neo4j

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

Мы видим, что два юрлица связаны между собой: у них один и тот же учредитель —Асанов Джапар Сарыбаевич. Кроме того, в одной из компаний он выступает директором, а в другой аналогичную должность занимает — Асанов Шарабидин Жапарович, возможно, сын Асанова-учредителя. Совпадения между возможными «тезками» показывает связь NAME_SAKE, возможными «родственниками» — PROBABLE_KID.

Кажется, мы нашли первый пример участия в госзакупках связанных компаний. Мы назвали эти случаи «кольцами коррупции» — в кавычках, поскольку каждую связь нужно отдельно доказывать обычными журналистскими методами, поскольку в Кыргызстане в реестре юридических лиц в графе «учредитель»или «директор» указывается только имя физического лица (иногда неполное), но не указывается индивидуальный налоговый номер. В вашей стране эта связь может быть более четкой, если в реестрах хранятся уникальные идентификаторы создавших компанию физлиц.

Рисунок 4 — «Кольцо коррупции». Названо так из-за специфической формы представления связей в графовой базе Neo4j


Как мы искали «кольца коррупции»

Загрузка данных в базу Neo4j

Прежде чем искать «кольца коррупции», загружаем данные в графовую базу Neo4j. Вначале мы сделали так:

  1. Выгрузили содержимое таблиц нашей SQL-базы, содержащих данные о юридических лицах Кыргызстана, в csv-файлы. Очистили данные от кавычек, поскольку графовая база глючит, если в данные попадает этот символ.
  2. Создали поочередно:
  1. ноды юрлиц Кыргызстана KgMinjust;
  2. ноды учредителей KgMinjustParticipants;
  3. связи между юрлицами и учредителями :CONTROLS;
  4. ноды директоров HeadNameSur;
  5. связи между юрлицами и директорами :DIRECTOR.

3. Выгрузили содержимое таблиц SQL-базы госзакупок в cvs-файлы.

4. Создали поочередно:

  1. ноды тендеров KgProcurement;
  2. ноды лотов KgProcuremenLots, связали их с тендерами связью :INCLUDES_LOTS;
  3. ноды участников госзакупок KgProcurementParticipants, связали их с лотами связью :PARTICIPATED_IN;
  4. ноды закупающих организаций KgProcurementEntities, связали их с тендерами связью :ANNOUNCED.

5. Между юрлицами из базы Минюста KgMinjust и участниками госзакупок KgProcurementParticipants установили связь SAME_INN.

Бизнесмены-тезки. Алгоритм поиска

После загрузки данных о госзакупках и юрлицах в графовую базу, мы просмотрели все лоты KgProcuremenLots и составили список всех возможных пар компаний-участников госзакупок KgProcurementParticipants, использовав обычную комбинаторику.

В полученном списке были удвоения, которые мы удалили, считая пары {a,b} и {b,a} дублирующими друг друга.

Затем мы попарно извлекали юрлица KgMinjust, ИНН которых совпадает с ИНН участника закупок KgProcurementParticipants (связь SAME_INN), и сравнивали их учредителей KgMinjustParticipants и директоров HeadNameSur между собой. Если имена совпадали, между нодами учредителей и директоров устанавливалась связь NAME_SAKE.

После того, как все ноды и связи в базе были готовы, мы приступили к поиску колец.

Ручной поиск

Изначально мы решили искать кольца по шаблону — написали запрос, который должен был вытащить из базы ноды и связи, образующие «кольцо коррупции» (см. рис. 4).

Для этого мы запустили последовательно несколько запросов на языке Cypher графовой базы Neo4j:

Рисунок 6 — Поиск колец коррупции. Условие поиска — начальная цена лота при объявлении госзакупки, здесь — от 1 до 2 млн сомов

Почему несколько запросов? Один большой запрос без указания начальной стоимости лота мог «подвесить» базу на несколько дней — так долго выполняется запрос в нашей довольно объемной базе.

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

Чтобы их смог увидеть кто-то еще, кроме наших программистов (нет уверенности, что хотя бы один человек на свете готов ждать несколько часов, пока выполнится запрос к базе), мы промаркировали их, добавив каждой ноде в кольце свойство (property) isChain и chainGroupId_1 … chainGroupId_15, равные true, если нода входит в кольцо и является участником конкретной группы колец.

Чтобы проставить эти свойства, мы вручную выгрузили каждую группу в файл json, распарсили полученные файлы, добавив нужные property, и загрузили обратно в базу.

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

Теперь если кто-то захочет посмотреть на кольца самостоятельно, ему не придется писать громоздкие запросы на Cypher. Достаточно лишь одной строки:

Рисунок 7 — «Кольца коррупции« с ценой лота от 700 до 800 тыс сомов в интерфейсе Neo4j

Поиск колец при помощи встроенных алгоритмов

«Кольца коррупции» можно искать с помощью встроенного в Neo4j алгоритма Shortest Path, который основан на алгоритме Дейкстры для поиска кратчайшего пути между узлами (нодами) графа.

Мы искали все пути между участниками закупок, кроме тех, что проходят через лот, поскольку мы знаем, что все они участвовали в одних и тех же лотах — и путь через лот и будет кратчайшим.

Важно отметить: алгоритм Дейкстры может использовать веса ребер графа для поиска кратчайших расстояний между узлами. В нашем случае граф мы считали невзвешенным: все ребра (связи) принимались равнозначными.

В результате у нас появились пути, длиной от 6 до 10 связей (ребер). Пути длиной больше 10 мы не рассматривали, поскольку они для нашей вселенной госзакупок бессмысленны.

В итоге у нас получилось 15 групп родственных «колец коррупции», каждому из которых, как и в случае с тезками, был присвоен свой chainRelGroupId_1 … chainRelGroupId_15.

Теперь на кольца может взглянуть любой желающий:

Что мы получили в итоге

В базе госзакупок Кыргызстана — более 1,5 млн лотов и более 16 тысяч участвующих в торгах юридических лиц. Из них 288 компаний связаны между собой через учредителей или директоров.

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

Подробнее о «кольцах коррупции» Кыргызстана можно прочитать здесь.

А здесь вы можете поиграться с кольцами:

 через наш веб-интерфейс:

https://kloopmedia.github.io/graph-montecristo/

 или непосредственно в Neo4j-браузере (для продвинутых пользователей):

https://neo4j.kloop.io/browser/

P.S. Запись на бесплатный онлайн-тренинг по «кольцам коррупции»: