Модель выявления признаков картельного сговора на zakupki.gov.ru
Модель выявления признаков картельного сговора в реестре заключенных контрактов на zakupki.gov.ru. Простая загрузка выгруженных с zakupki.gov.ru файлов и настройка белых списков услуг в конфигурационном файле.
Модель на доработке
Автор активно улучшает эту модель — возможны изменения в API, описании, весах или поведении.
Описание
# Детектор картельных рисков в госзакупках
## Быстрый старт
1. Положите CSV-выгрузки из ЕИС в папку data/
2. Запустите: python run.py
3. Откройте отчёт: results/report.html
Требования: Python 3.9+, установить зависимости:
pip install pandas scikit-learn networkx joblib
## Формат входных данных
Скрипт ожидает CSV с разделителем ; и кодировкой cp1251.
Обязательные столбцы:
- Заказчик: наименование
- Заказчик: ИНН
- Заказчик: КПП
- Способ размещения заказа
- Дата подведения результатов определения поставщика (подрядчика, исполнителя)
- Контракт: дата
- Контракт: номер
- Предмет контракта
- Цена контракта
- Идентификационный код закупки (ИКЗ)
- Объект закупки: код позиции
- Информация о поставщиках (исполнителях, подрядчиках) по контракту: наименование юридического лица (ф.и.о. физического лица)
- Информация о поставщиках (исполнителях, подрядчиках) по контракту: ИНН
- Информация о поставщиках (исполнителях, подрядчиках) по контракту: КПП
## Настройка exclusion_config.json
Файл exclusion_config.json позволяет исключать закупки по предмету контракта до расчёта рисков.
Поля:
- match_field — поле для проверки (обычно subject)
- excluded_subjects — список правил
- pattern — строка или регулярное выражение
- match:
- substring_ci — нечувствительный к регистру поиск подстроки
- regex_ci — нечувствительное к регистру регулярное выражение
- reason — пояснение причины исключения (для сопровождения)
Когда добавлять исключения:
- если категория закупок относится к естественным или регулируемым монополиям;
- если поведение поставщиков в этой категории заранее структурно ограничено и может давать ложные срабатывания.
Если файла exclusion_config.json нет, анализ продолжается без фильтрации.
## Как работает модель
Кратко:
1. Из закупок строится граф связей поставщиков через общих заказчиков.
2. В графе выделяются кластеры (сообщества поставщиков).
3. По каждому кластеру считаются признаки конкурентного поведения.
4. Модель Isolation Forest оценивает нетипичность кластера.
5. Формируются results/anomaly_report.json и results/report.html.
Модель обучена на выборке закупок.
Anomaly score < 0 — кластер требует проверки в приоритетном порядке.
## Для разработчиков: переобучение
Модель model.pkl) — scikit-learn Pipeline:
StandardScaler + IsolationForest.
Для переобучения на своих данных подготовьте датафрейм
с теми же признаками (см. СЕКЦИЯ 2 в run.py) и выполните:
```python
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', IsolationForest(contamination=0.1, random_state=42))
])
pipeline.fit(features_df)
joblib.dump(pipeline, 'model.pkl')
```
## Интерпретация отчёта
- Anomaly score — числовая оценка нетипичности кластера для модели. Чем ниже, тем менее типичен кластер.
- HHI — насколько контракты кластера сосредоточены у небольшого числа заказчиков.
- Индекс чередования — насколько часто победы «переключаются» между поставщиками внутри пары/кластера.
- Временное окно — период между первым и последним контрактом в примерах кластера. Узкое окно может указывать на концентрированную активность.
Важно: отчёт не доказывает сговор автоматически, а помогает определить, что нужно проверить вручную в первую очередь.
Предпросмотр файлов
В этой модели нет файлов для предпросмотра.