Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

Интерпретация кластерного анализа модели предоставления разрешений в Tessa

Интерпретация кластерного анализа модели предоставления разрешений в Tessa
Системы

Здесь представлена интерпретация результатов кластеризации моделей предоставления разрешений в Tessa. Интерпретация предназначена для разъяснения результатов кластеризации руководству организации, бизнес-аналитикам, аналитикам данных, системным администраторам Tessa и ответственным за информационную и кибер безопасность.

Файлы с отчетами о результатах интерпретации¶

Файл report_leadership.md¶


📊 ОТЧЕТ ДЛЯ РУКОВОДСТВА¶

Анализ модели доступа Tessa¶

Ключевые метрики¶

  • Лучший метод анализа: HDBSCAN
  • Всего кластеров: 539
  • Критические риски: 0
  • Оптимизированные паттерны: 52

Основные выводы¶

  1. Безопасность: 0 критических/высоких рисков требуют внимания
  2. Эффективность: 8 крупных кластеров для стандартизации
  3. Управляемость: 539 паттернов вместо тысяч индивидуальных назначений

Рекомендуемые действия¶

  1. Немедленно: Аудит 0 рисковых кластеров
  2. Краткосрочно: Стандартизация крупных паттернов
  3. Долгосрочно: Внедрение RBAC для 80% пользователей

Бизнес-ценность¶

  • Снижение рисков: На 0.00% (оценка)
  • Экономия времени администрирования: До 30%
  • Соответствие требованиям: Улучшение контроля доступа

Файл report_business_analysts.md¶


📈 ОТЧЕТ ДЛЯ БИЗНЕС-АНАЛИТИКОВ¶

Оптимизация ролевой модели Tessa¶

Обнаруженные паттерны¶

Всего 8 стабильных паттернов для стандартизации:

Кластер 16: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 6: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 3: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 38: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 61: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 39: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 25: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 85: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 41: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Кластер 20: 23 пользователей (0.711%)

  • Тип: Нормативный
  • Качество: 1.000

Рекомендации по стандартизации¶

8 ролей для создания:

  • Role_Cluster_50: Стабильный паттерн (65 пользователей)
  • Role_Cluster_72: Стабильный паттерн (65 пользователей)
  • Role_Cluster_70: Стабильный паттерн (65 пользователей)
  • Role_Cluster_33: Стабильный паттерн (65 пользователей)
  • Role_Cluster_52: Стабильный паттерн (65 пользователей)

Файл report_data_analysts.md¶


📊 ОТЧЕТ ДЛЯ АНАЛИТИКОВ ДАННЫХ¶

Методологический анализ кластеризации¶

Качество методов кластеризации¶

Лучший метод: HDBSCAN

  • Средняя силуэтная оценка: 0.705
  • Качество интерпретации: Отличное
  • Процент шума: 10.974%
  • Количество кластеров: 539

Сравнение методов¶

HDBSCAN:

  • Силуэт: 0.705
  • Качество: Отличное
  • Кластеров: 539

OPTICS:

  • Силуэт: 0.707
  • Качество: Отличное
  • Кластеров: 20

DBSCAN:

  • Силуэт: 0.938
  • Качество: Отличное
  • Кластеров: 16

Рекомендации по улучшению данных¶

288 предложений:

  • Кластер 94. Улучшить качество данных: Низкая силуэтная оценка (0.181)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 97. Улучшить качество данных: Низкая силуэтная оценка (0.265)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 98. Улучшить качество данных: Низкая силуэтная оценка (0.265)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 78. Улучшить качество данных: Низкая силуэтная оценка (0.288)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 79. Улучшить качество данных: Низкая силуэтная оценка (0.214)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 127. Улучшить качество данных: Низкая силуэтная оценка (0.068)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 110. Улучшить качество данных: Низкая силуэтная оценка (0.088)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 107. Улучшить качество данных: Низкая силуэтная оценка (0.234)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 113. Улучшить качество данных: Низкая силуэтная оценка (0.199)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 105. Улучшить качество данных: Низкая силуэтная оценка (0.125)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 114. Улучшить качество данных: Низкая силуэтная оценка (0.186)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 101. Улучшить качество данных: Низкая силуэтная оценка (0.202)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 129. Улучшить качество данных: Низкая силуэтная оценка (0.009)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 102. Улучшить качество данных: Низкая силуэтная оценка (0.156)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 120. Улучшить качество данных: Низкая силуэтная оценка (0.255)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 115. Улучшить качество данных: Низкая силуэтная оценка (0.243)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 106. Улучшить качество данных: Низкая силуэтная оценка (0.255)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 119. Улучшить качество данных: Низкая силуэтная оценка (0.176)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 108. Улучшить качество данных: Низкая силуэтная оценка (0.201)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 104. Улучшить качество данных: Низкая силуэтная оценка (0.147)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 109. Улучшить качество данных: Низкая силуэтная оценка (-0.012)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 116. Улучшить качество данных: Низкая силуэтная оценка (0.182)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 121. Улучшить качество данных: Низкая силуэтная оценка (0.192)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 348. Улучшить качество данных: Низкая силуэтная оценка (0.085)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 287. Улучшить качество данных: Низкая силуэтная оценка (0.059)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 193. Улучшить качество данных: Низкая силуэтная оценка (0.181)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 278. Улучшить качество данных: Низкая силуэтная оценка (0.036)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 242. Улучшить качество данных: Низкая силуэтная оценка (0.159)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 332. Улучшить качество данных: Низкая силуэтная оценка (0.159)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 456. Улучшить качество данных: Низкая силуэтная оценка (0.119)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 420. Улучшить качество данных: Низкая силуэтная оценка (-0.020)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 507. Улучшить качество данных: Низкая силуэтная оценка (0.165)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 238. Улучшить качество данных: Низкая силуэтная оценка (0.020)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 243. Улучшить качество данных: Низкая силуэтная оценка (0.074)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 295. Улучшить качество данных: Низкая силуэтная оценка (-0.102)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 455. Улучшить качество данных: Низкая силуэтная оценка (0.107)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 186. Улучшить качество данных: Низкая силуэтная оценка (0.174)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 184. Улучшить качество данных: Низкая силуэтная оценка (0.271)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 465. Улучшить качество данных: Низкая силуэтная оценка (0.143)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 422. Улучшить качество данных: Низкая силуэтная оценка (0.273)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 290. Улучшить качество данных: Низкая силуэтная оценка (0.127)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 351. Улучшить качество данных: Низкая силуэтная оценка (0.160)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 368. Улучшить качество данных: Низкая силуэтная оценка (0.175)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 339. Улучшить качество данных: Низкая силуэтная оценка (0.096)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 187. Улучшить качество данных: Низкая силуэтная оценка (0.147)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 212. Улучшить качество данных: Низкая силуэтная оценка (0.177)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 226. Улучшить качество данных: Низкая силуэтная оценка (-0.091)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 202. Улучшить качество данных: Низкая силуэтная оценка (0.190)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 376. Улучшить качество данных: Низкая силуэтная оценка (0.111)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 323. Улучшить качество данных: Низкая силуэтная оценка (0.232)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 155. Улучшить качество данных: Низкая силуэтная оценка (0.193)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 366. Улучшить качество данных: Низкая силуэтная оценка (0.119)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 463. Улучшить качество данных: Низкая силуэтная оценка (0.110)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 427. Улучшить качество данных: Низкая силуэтная оценка (0.149)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 307. Улучшить качество данных: Низкая силуэтная оценка (0.257)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 525. Улучшить качество данных: Низкая силуэтная оценка (0.147)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 459. Улучшить качество данных: Низкая силуэтная оценка (0.275)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 276. Улучшить качество данных: Низкая силуэтная оценка (0.167)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 321. Улучшить качество данных: Низкая силуэтная оценка (-0.074)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 275. Улучшить качество данных: Низкая силуэтная оценка (0.129)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 232. Улучшить качество данных: Низкая силуэтная оценка (0.167)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 533. Улучшить качество данных: Низкая силуэтная оценка (0.195)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 138. Улучшить качество данных: Низкая силуэтная оценка (0.137)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 337. Улучшить качество данных: Низкая силуэтная оценка (0.287)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 294. Улучшить качество данных: Низкая силуэтная оценка (0.200)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 325. Улучшить качество данных: Низкая силуэтная оценка (-0.012)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 501. Улучшить качество данных: Низкая силуэтная оценка (0.249)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 163. Улучшить качество данных: Низкая силуэтная оценка (0.176)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 151. Улучшить качество данных: Низкая силуэтная оценка (0.190)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 283. Улучшить качество данных: Низкая силуэтная оценка (0.219)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 428. Улучшить качество данных: Низкая силуэтная оценка (0.146)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 156. Улучшить качество данных: Низкая силуэтная оценка (0.103)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 518. Улучшить качество данных: Низкая силуэтная оценка (0.220)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 372. Улучшить качество данных: Низкая силуэтная оценка (0.254)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 474. Улучшить качество данных: Низкая силуэтная оценка (0.254)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 356. Улучшить качество данных: Низкая силуэтная оценка (0.121)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 495. Улучшить качество данных: Низкая силуэтная оценка (0.029)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 352. Улучшить качество данных: Низкая силуэтная оценка (0.267)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 425. Улучшить качество данных: Низкая силуэтная оценка (0.160)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 241. Улучшить качество данных: Низкая силуэтная оценка (0.073)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 134. Улучшить качество данных: Низкая силуэтная оценка (-0.083)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 169. Улучшить качество данных: Низкая силуэтная оценка (0.113)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 143. Улучшить качество данных: Низкая силуэтная оценка (0.066)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 369. Улучшить качество данных: Низкая силуэтная оценка (0.072)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 289. Улучшить качество данных: Низкая силуэтная оценка (0.189)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 279. Улучшить качество данных: Низкая силуэтная оценка (0.278)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 439. Улучшить качество данных: Низкая силуэтная оценка (0.213)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 437. Улучшить качество данных: Низкая силуэтная оценка (0.091)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 491. Улучшить качество данных: Низкая силуэтная оценка (0.030)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 298. Улучшить качество данных: Низкая силуэтная оценка (0.238)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 441. Улучшить качество данных: Низкая силуэтная оценка (0.164)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 223. Улучшить качество данных: Низкая силуэтная оценка (0.072)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 353. Улучшить качество данных: Низкая силуэтная оценка (0.147)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 535. Улучшить качество данных: Низкая силуэтная оценка (0.161)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 479. Улучшить качество данных: Низкая силуэтная оценка (0.101)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 256. Улучшить качество данных: Низкая силуэтная оценка (0.187)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 135. Улучшить качество данных: Низкая силуэтная оценка (0.156)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 258. Улучшить качество данных: Низкая силуэтная оценка (0.139)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 227. Улучшить качество данных: Низкая силуэтная оценка (0.223)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 327. Улучшить качество данных: Низкая силуэтная оценка (0.090)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 281. Улучшить качество данных: Низкая силуэтная оценка (0.252)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 265. Улучшить качество данных: Низкая силуэтная оценка (0.138)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 136. Улучшить качество данных: Низкая силуэтная оценка (0.088)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 154. Улучшить качество данных: Низкая силуэтная оценка (0.135)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 288. Улучшить качество данных: Низкая силуэтная оценка (0.167)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 527. Улучшить качество данных: Низкая силуэтная оценка (0.157)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 217. Улучшить качество данных: Низкая силуэтная оценка (0.056)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 467. Улучшить качество данных: Низкая силуэтная оценка (0.118)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 383. Улучшить качество данных: Низкая силуэтная оценка (0.032)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 486. Улучшить качество данных: Низкая силуэтная оценка (0.143)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 222. Улучшить качество данных: Низкая силуэтная оценка (0.207)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 388. Улучшить качество данных: Низкая силуэтная оценка (0.248)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 487. Улучшить качество данных: Низкая силуэтная оценка (0.068)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 302. Улучшить качество данных: Низкая силуэтная оценка (0.205)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 266. Улучшить качество данных: Низкая силуэтная оценка (0.083)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 385. Улучшить качество данных: Низкая силуэтная оценка (0.136)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 444. Улучшить качество данных: Низкая силуэтная оценка (0.153)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 274. Улучшить качество данных: Низкая силуэтная оценка (0.246)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 230. Улучшить качество данных: Низкая силуэтная оценка (0.258)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 500. Улучшить качество данных: Низкая силуэтная оценка (0.026)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 280. Улучшить качество данных: Низкая силуэтная оценка (-0.056)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 377. Улучшить качество данных: Низкая силуэтная оценка (0.049)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 235. Улучшить качество данных: Низкая силуэтная оценка (0.132)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 268. Улучшить качество данных: Низкая силуэтная оценка (0.213)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 199. Улучшить качество данных: Низкая силуэтная оценка (0.198)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 267. Улучшить качество данных: Низкая силуэтная оценка (0.174)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 117. Улучшить качество данных: Низкая силуэтная оценка (0.128)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 198. Улучшить качество данных: Низкая силуэтная оценка (0.121)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 343. Улучшить качество данных: Низкая силуэтная оценка (-0.013)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 537. Улучшить качество данных: Низкая силуэтная оценка (0.229)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 364. Улучшить качество данных: Низкая силуэтная оценка (-0.023)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 494. Улучшить качество данных: Низкая силуэтная оценка (0.127)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 433. Улучшить качество данных: Низкая силуэтная оценка (0.285)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 482. Улучшить качество данных: Низкая силуэтная оценка (0.059)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 436. Улучшить качество данных: Низкая силуэтная оценка (0.192)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 514. Улучшить качество данных: Низкая силуэтная оценка (0.052)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 423. Улучшить качество данных: Низкая силуэтная оценка (0.198)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 195. Улучшить качество данных: Низкая силуэтная оценка (0.189)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 481. Улучшить качество данных: Низкая силуэтная оценка (0.238)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 357. Улучшить качество данных: Низкая силуэтная оценка (0.253)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 174. Улучшить качество данных: Низкая силуэтная оценка (0.268)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 341. Улучшить качество данных: Низкая силуэтная оценка (0.094)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 175. Улучшить качество данных: Низкая силуэтная оценка (0.115)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 502. Улучшить качество данных: Низкая силуэтная оценка (0.161)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 462. Улучшить качество данных: Низкая силуэтная оценка (0.276)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 228. Улучшить качество данных: Низкая силуэтная оценка (0.129)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 259. Улучшить качество данных: Низкая силуэтная оценка (0.222)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 318. Улучшить качество данных: Низкая силуэтная оценка (0.006)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 211. Улучшить качество данных: Низкая силуэтная оценка (0.200)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 508. Улучшить качество данных: Низкая силуэтная оценка (0.121)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 489. Улучшить качество данных: Низкая силуэтная оценка (0.068)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 144. Улучшить качество данных: Низкая силуэтная оценка (0.191)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 210. Улучшить качество данных: Низкая силуэтная оценка (0.238)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 328. Улучшить качество данных: Низкая силуэтная оценка (0.257)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 205. Улучшить качество данных: Низкая силуэтная оценка (0.276)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 413. Улучшить качество данных: Низкая силуэтная оценка (0.258)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 316. Улучшить качество данных: Низкая силуэтная оценка (0.291)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 359. Улучшить качество данных: Низкая силуэтная оценка (0.300)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 426. Улучшить качество данных: Низкая силуэтная оценка (0.187)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 247. Улучшить качество данных: Низкая силуэтная оценка (0.080)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 523. Улучшить качество данных: Низкая силуэтная оценка (0.229)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 208. Улучшить качество данных: Низкая силуэтная оценка (0.207)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 457. Улучшить качество данных: Низкая силуэтная оценка (0.019)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 524. Улучшить качество данных: Низкая силуэтная оценка (0.254)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 245. Улучшить качество данных: Низкая силуэтная оценка (0.231)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 261. Улучшить качество данных: Низкая силуэтная оценка (0.296)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 334. Улучшить качество данных: Низкая силуэтная оценка (0.178)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 419. Улучшить качество данных: Низкая силуэтная оценка (-0.035)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 150. Улучшить качество данных: Низкая силуэтная оценка (0.200)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 397. Улучшить качество данных: Низкая силуэтная оценка (0.179)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 315. Улучшить качество данных: Низкая силуэтная оценка (0.145)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 189. Улучшить качество данных: Низкая силуэтная оценка (0.249)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 168. Улучшить качество данных: Низкая силуэтная оценка (0.231)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 319. Улучшить качество данных: Низкая силуэтная оценка (0.057)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 345. Улучшить качество данных: Низкая силуэтная оценка (0.080)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 442. Улучшить качество данных: Низкая силуэтная оценка (0.292)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 233. Улучшить качество данных: Низкая силуэтная оценка (0.124)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 197. Улучшить качество данных: Низкая силуэтная оценка (0.286)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 206. Улучшить качество данных: Низкая силуэтная оценка (0.223)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 220. Улучшить качество данных: Низкая силуэтная оценка (0.254)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 221. Улучшить качество данных: Низкая силуэтная оценка (0.287)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 313. Улучшить качество данных: Низкая силуэтная оценка (0.232)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 536. Улучшить качество данных: Низкая силуэтная оценка (0.234)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 167. Улучшить качество данных: Низкая силуэтная оценка (0.061)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 471. Улучшить качество данных: Низкая силуэтная оценка (0.233)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 342. Улучшить качество данных: Низкая силуэтная оценка (0.208)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 131. Улучшить качество данных: Низкая силуэтная оценка (0.281)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 270. Улучшить качество данных: Низкая силуэтная оценка (0.179)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 510. Улучшить качество данных: Низкая силуэтная оценка (0.252)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 305. Улучшить качество данных: Низкая силуэтная оценка (0.087)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 466. Улучшить качество данных: Низкая силуэтная оценка (0.156)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 443. Улучшить качество данных: Низкая силуэтная оценка (0.273)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 183. Улучшить качество данных: Низкая силуэтная оценка (0.167)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 204. Улучшить качество данных: Низкая силуэтная оценка (0.177)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 521. Улучшить качество данных: Низкая силуэтная оценка (0.197)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 166. Улучшить качество данных: Низкая силуэтная оценка (0.255)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 180. Улучшить качество данных: Низкая силуэтная оценка (0.249)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 262. Улучшить качество данных: Низкая силуэтная оценка (0.105)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 286. Улучшить качество данных: Низкая силуэтная оценка (0.157)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 237. Улучшить качество данных: Низкая силуэтная оценка (0.110)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 140. Улучшить качество данных: Низкая силуэтная оценка (0.107)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 395. Улучшить качество данных: Низкая силуэтная оценка (0.188)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 157. Улучшить качество данных: Низкая силуэтная оценка (0.169)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 139. Улучшить качество данных: Низкая силуэтная оценка (0.159)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 516. Улучшить качество данных: Низкая силуэтная оценка (0.213)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 478. Улучшить качество данных: Низкая силуэтная оценка (0.266)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 170. Улучшить качество данных: Низкая силуэтная оценка (0.200)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 504. Улучшить качество данных: Низкая силуэтная оценка (0.014)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 293. Улучшить качество данных: Низкая силуэтная оценка (0.212)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 145. Улучшить качество данных: Низкая силуэтная оценка (0.183)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 429. Улучшить качество данных: Низкая силуэтная оценка (0.296)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 371. Улучшить качество данных: Низкая силуэтная оценка (0.162)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 470. Улучшить качество данных: Низкая силуэтная оценка (0.228)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 310. Улучшить качество данных: Низкая силуэтная оценка (0.078)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 453. Улучшить качество данных: Низкая силуэтная оценка (0.248)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 493. Улучшить качество данных: Низкая силуэтная оценка (0.188)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 530. Улучшить качество данных: Низкая силуэтная оценка (0.200)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 340. Улучшить качество данных: Низкая силуэтная оценка (0.139)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 407. Улучшить качество данных: Низкая силуэтная оценка (0.252)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 370. Улучшить качество данных: Низкая силуэтная оценка (0.186)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 367. Улучшить качество данных: Низкая силуэтная оценка (0.295)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 350. Улучшить качество данных: Низкая силуэтная оценка (0.162)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 263. Улучшить качество данных: Низкая силуэтная оценка (0.153)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 291. Улучшить качество данных: Низкая силуэтная оценка (0.247)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 528. Улучшить качество данных: Низкая силуэтная оценка (0.223)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 531. Улучшить качество данных: Низкая силуэтная оценка (0.231)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 476. Улучшить качество данных: Низкая силуэтная оценка (0.148)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 363. Улучшить качество данных: Низкая силуэтная оценка (0.280)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 236. Улучшить качество данных: Низкая силуэтная оценка (0.249)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 190. Улучшить качество данных: Низкая силуэтная оценка (0.207)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 468. Улучшить качество данных: Низкая силуэтная оценка (0.227)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 231. Улучшить качество данных: Низкая силуэтная оценка (0.213)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 176. Улучшить качество данных: Низкая силуэтная оценка (0.142)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 277. Улучшить качество данных: Низкая силуэтная оценка (0.198)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 499. Улучшить качество данных: Низкая силуэтная оценка (0.230)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 477. Улучшить качество данных: Низкая силуэтная оценка (0.252)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 178. Улучшить качество данных: Низкая силуэтная оценка (0.119)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 461. Улучшить качество данных: Низкая силуэтная оценка (0.289)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 515. Улучшить качество данных: Низкая силуэтная оценка (0.088)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 322. Улучшить качество данных: Низкая силуэтная оценка (0.194)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 374. Улучшить качество данных: Низкая силуэтная оценка (0.255)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 324. Улучшить качество данных: Низкая силуэтная оценка (0.286)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 497. Улучшить качество данных: Низкая силуэтная оценка (0.266)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 396. Улучшить качество данных: Низкая силуэтная оценка (0.013)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 475. Улучшить качество данных: Низкая силуэтная оценка (0.241)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 311. Улучшить качество данных: Низкая силуэтная оценка (0.219)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 248. Улучшить качество данных: Низкая силуэтная оценка (0.154)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 320. Улучшить качество данных: Низкая силуэтная оценка (0.190)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 194. Улучшить качество данных: Низкая силуэтная оценка (0.205)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 171. Улучшить качество данных: Низкая силуэтная оценка (0.092)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 519. Улучшить качество данных: Низкая силуэтная оценка (0.175)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 308. Улучшить качество данных: Низкая силуэтная оценка (0.220)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 484. Улучшить качество данных: Низкая силуэтная оценка (0.289)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 99. Улучшить качество данных: Низкая силуэтная оценка (0.269)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 160. Улучшить качество данных: Низкая силуэтная оценка (0.262)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 214. Улучшить качество данных: Низкая силуэтная оценка (0.128)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 95. Улучшить качество данных: Низкая силуэтная оценка (0.128)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 488. Улучшить качество данных: Низкая силуэтная оценка (0.187)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 192. Улучшить качество данных: Низкая силуэтная оценка (0.292)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 326. Улучшить качество данных: Низкая силуэтная оценка (0.260)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 317. Улучшить качество данных: Низкая силуэтная оценка (0.229)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 146. Улучшить качество данных: Низкая силуэтная оценка (0.266)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 269. Улучшить качество данных: Низкая силуэтная оценка (0.208)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 472. Улучшить качество данных: Низкая силуэтная оценка (0.184)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 446. Улучшить качество данных: Низкая силуэтная оценка (0.166)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 361. Улучшить качество данных: Низкая силуэтная оценка (0.088)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 430. Улучшить качество данных: Низкая силуэтная оценка (0.281)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 240. Улучшить качество данных: Низкая силуэтная оценка (0.238)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 452. Улучшить качество данных: Низкая силуэтная оценка (0.213)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 344. Улучшить качество данных: Низкая силуэтная оценка (0.237)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 522. Улучшить качество данных: Низкая силуэтная оценка (0.229)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 360. Улучшить качество данных: Низкая силуэтная оценка (0.228)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 300. Улучшить качество данных: Низкая силуэтная оценка (0.144)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 196. Улучшить качество данных: Низкая силуэтная оценка (0.195)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 218. Улучшить качество данных: Низкая силуэтная оценка (0.169)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 431. Улучшить качество данных: Низкая силуэтная оценка (0.180)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 296. Улучшить качество данных: Низкая силуэтная оценка (0.129)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 292. Улучшить качество данных: Низкая силуэтная оценка (0.294)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 181. Улучшить качество данных: Низкая силуэтная оценка (0.197)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 301. Улучшить качество данных: Низкая силуэтная оценка (0.201)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 445. Улучшить качество данных: Низкая силуэтная оценка (0.287)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 483. Улучшить качество данных: Низкая силуэтная оценка (0.156)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 216. Улучшить качество данных: Низкая силуэтная оценка (0.166)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 191. Улучшить качество данных: Низкая силуэтная оценка (0.164)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 100. Улучшить качество данных: Низкая силуэтная оценка (0.227)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 91. Улучшить качество данных: Низкая силуэтная оценка (0.024)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 90. Улучшить качество данных: Низкая силуэтная оценка (0.172)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки
  • Кластер 0. Улучшить качество данных: Низкая силуэтная оценка (0.146)
    • Проверить полноту данных
    • Уточнить категоризацию признаков
    • Рассмотреть дополнительные признаки

Файл report_system_admins.md¶


🔧 ОТЧЕТ ДЛЯ СИСТЕМНЫХ АДМИНИСТРАТОРОВ¶

Практические действия по оптимизации доступа¶

Критические кластеры для аудита¶

Всего 0 кластеров требуют внимания:

Конкретные действия¶

0 задач для выполнения:


Файл report_security.md¶


🔒 ОТЧЕТ ДЛЯ СПЕЦИАЛИСТОВ БЕЗОПАСНОСТИ¶

Анализ рисков модели доступа Tessa¶

Уровни угроз¶

  • Критических рисков: 0
  • Высоких рисков: 0
  • Всего рисковых кластеров: 0

Детализация рисков¶

Меры по смягчению¶

0 неотложных действий:


Файл optimization_roadmap.md¶


🗺️ ДОРОЖНАЯ КАРТА ОПТИМИЗАЦИИ МОДЕЛИ ДОСТУПА TESSA¶

Немедленные действия (1-3 дня)¶

0 задач:

Краткосрочные задачи (1 неделя)¶

0 задач:

Среднесрочные задачи (1 месяц)¶

0 задач:

Долгосрочные улучшения (3-6 месяцев)¶

296 задач:

  • Стандартизировать в роль
  • Стандартизировать в роль
  • Стандартизировать в роль
  • Стандартизировать в роль
  • Стандартизировать в роль

Итоговые метрики¶

  • Всего задач: 296
  • Затронуто кластеров: 296
  • Аудитории: 2

Файлы визуализации интерпретации¶

Файл report_leadership.md¶


cluster_size_distribution.png


Файл cluster_type_distribution.md¶


cluster_type_distribution.png


Файл silhouette_heatmap.md¶


silhouette_heatmap.png


Файл risk_map.md¶


risk_map.png


Комментарии¶

Научные и методологические комментарии:¶

  1. Силуэтный анализ (Rousseeuw, 1987):

    • Используется для оценки качества кластеризации
    • Диапазон: от -1 (плохо) до +1 (хорошо)
    • Интерпретация:
      • > 0.7: Отличное разделение
      • 0.5-0.7: Хорошее
      • 0.25-0.5: Удовлетворительное
      • < 0.25: Слабое
  2. Принцит наименьших привелений (PoLP):

    • Основа для оценки рисковых кластеров
    • Кластеры с избыточными правами помечаются как «рисковые»
    • Рекомендуется редукция прав до минимально необходимых
  3. RBAC (ролевой контроль доступа):

    • Нормативные кластеры → стандартные роли
    • Уникальные кластеры → индивидуальные назначения
    • Оптимизация: переход от индивидуальных назначений к ролям
  4. UBA (анализ поведения пользователей):

    • Аномальные кластеры → необычные паттерны доступа
    • Требуют дополнительной верификации
    • Могут указывать на новые бизнес-процессы или риски

Технические комментарии:¶

  1. Производительность:

    • Код оптимизирован для работы с большими объемами данных
    • Использует векторизацию NumPy где возможно
    • Ограничивает анализ первыми N значениями для категориальных признаков
  2. Масштабируемость:

    • Конфигурация вынесена в отдельный класс
    • Возможность кастомизации порогов и правил
    • Поддержка различных организационных структур
  3. Обработка данных:

    • Валидация входных данных
    • Try-except блоки для критических операций
    • Логирование ошибок без прерывания выполнения
  4. Визцализация:

    • Автоматическое сохранение графиков
    • Адаптивные размеры и цвета
    • Профессиональное оформление для презентаций

Бизнес-комментарии:¶

  1. Ценность для руководства:

    • Стратегические инсайты о состоянии системы доступа
    • Оценка рисков безопасности
    • План оптимизации с измеримыми результатами
  2. Ценность для администраторов:

    • Конкретные действия по оптимизации
    • Приоритизация задач
    • Экономия времени на управление доступом
  3. Ценность для безопасности:

    • Выявление аномалий и угроз
    • Рекомендации по усилению контроля
    • Документация для аудита
  4. Ценность для аналитиков:

    • Методологические рекомендации
    • Качество данных и пути улучшения
    • Статистические инсайты

Код интерпретатора¶

Загрузка библиотек¶

In [14]:
# Загрузка библиотек
import pandas as pd
import numpy as np

from typing import Dict, List, Tuple, Any
import json
from dataclasses import dataclass
from enum import Enum
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import pairwise_distances
from scipy import stats

Код класса интерпретатора кластеров¶

In [16]:
# Модуль интерпретации кластеров пермиссий Tessa

# КОНСТАНТЫ И КОНФИГУРАЦИЯ

class ClusterType(Enum):
    """Типы кластеров на основе бизнес-логики"""
    NORMAL = "Нормативный"           # Типичный, предсказуемый паттерн
    ANOMALOUS = "Аномальный"         # Редкий, но легитимный
    RISKY = "Рисковый"               # Нарушение принципа наименьших привилегий
    ERRONEOUS = "Ошибочный"          # Вероятная ошибка конфигурации
    UNIQUE = "Уникальный"            # Единичные/специфичные случаи
    PRIVILEGED = "Привилегированный" # Высокий уровень доступа

class RiskLevel(Enum):
    """Уровни риска безопасности"""
    CRITICAL = "Критический"    # P0 - немедленное действие
    HIGH = "Высокий"           # P1 - срочная оптимизация
    MEDIUM = "Средний"         # P2 - плановая оптимизация
    LOW = "Низкий"             # P3 - мониторинг
    INFO = "Информационный"    # P4 - документирование

@dataclass
class ClusterInterpretationConfig:
    """Конфигурация модуля интерпретации"""
    # Пороговые значения для классификации
    silhouette_threshold: float = 0.5      # Минимальная силуэтная оценка для нормальных кластеров
    size_threshold: float = 0.01           # Минимальная доля объектов в кластере (1%)
    privilege_ratio_threshold: float = 0.7 # Порог для выявления привилегированных кластеров
    consistency_threshold: float = 0.6     # Порог согласованности методов
    
    # Бизнес-параметры
    sensitive_operations: List[str] = None # Чувствительные операции
    
    def __post_init__(self):
        if self.sensitive_operations is None:
            self.sensitive_operations = ['Чтение карточки', 
                                         'Редактирование карточки', 
                                         'Удаление карточки', 
                                         'Редактирование всех файлов', 
                                         'Удаление всех файлов', 
                                         'Редактирование собственных файлов', 
                                         'Удаление собственных файлов']

# ОСНОВНОЙ КЛАСС ИНТЕРПРЕТАТОРА

class PermissionClusterInterpreter:
    """
    Класс для интерпретации математических кластеров в бизнес-контексте.
    
    Преобразует результаты кластеризации HDBSCAN/OPTICS/DBSCAN в:
    1. Бизнес-описания паттернов доступа
    2. Оценки рисков безопасности
    3. Практические рекомендации для разных стейкхолдеров
    
    Методология основана на принципах:
    - Role-Based Access Control (RBAC)
    - Principle of Least Privilege (PoLP)
    - User Behavior Analytics (UBA)
    """
    
    def __init__(self, config: ClusterInterpretationConfig = None):
        """
        Инициализация интерпретатора.
        
        Args:
            config: Конфигурация интерпретатора
        """
        self.config = config or ClusterInterpretationConfig()
        self.cluster_descriptions = {}
        self.risk_assessments = {}
        self.recommendations = {}
        
        # Статистика для аудита
        self.interpretation_stats = {
            'total_clusters': 0,
            'risky_clusters': 0,
            'optimization_opportunities': 0
        }
    
    def interpret_clusters(self, 
                          data_with_clusters: pd.DataFrame,
                          original_data: pd.DataFrame) -> Dict[str, Any]:
        """
        Основной метод интерпретации кластеров.
        
        Args:
            data_with_clusters: DataFrame с результатами кластеризации
            original_data: Исходные данные для контекстного анализа
            
        Returns:
            Словарь с результатами интерпретации для разных аудиторий
        """
        print("🚀 Запуск интерпретации кластеров пермиссий Tessa...")
        print("=" * 70)
        
        # Шаг 1: Анализ качества кластеризации
        quality_report = self._assess_clustering_quality(data_with_clusters)
        
        # Шаг 2: Определение лучшего метода кластеризации
        best_method = self._determine_best_method(data_with_clusters)
        
        # Шаг 3: Классификация кластеров по типам
        cluster_types = self._classify_cluster_types(
            data_with_clusters, 
            best_method, 
            original_data
        )
        
        # Шаг 4: Сопоставление с организационной структурой
        org_mapping = self._map_to_organization(
            data_with_clusters, 
            best_method, 
            original_data
        )
        
        # Шаг 5: Оценка рисков безопасности
        risk_assessment = self._assess_security_risks(
            data_with_clusters,
            best_method,
            cluster_types,
            original_data
        )
        
        # Шаг 6: Генерация рекомендаций
        recommendations = self._generate_recommendations(
            data_with_clusters,
            best_method,
            cluster_types,
            risk_assessment,
            original_data
        )
        
        # Шаг 7: Формирование отчетов для разных аудиторий
        reports = self._generate_stakeholder_reports(
            quality_report,
            best_method,
            cluster_types,
            org_mapping,
            risk_assessment,
            recommendations
        )
        
        # Шаг 8: Визуализация результатов
        self._create_visualizations(
            data_with_clusters,
            best_method,
            cluster_types,
            risk_assessment
        )
        
        # Шаг 9: Сохранение результатов
        self._save_interpretation_results(reports)
        
        # Шаг 10: Формирование дорожной карты
        roadmap = self._create_optimization_roadmap(recommendations)
        
        print("=" * 70)
        print("✅ Интерпретация кластеров успешно завершена!")
        print(f"📊 Проанализировано кластеров: {self.interpretation_stats['total_clusters']}")
        print(f"⚠️  Выявлено рисковых кластеров: {self.interpretation_stats['risky_clusters']}")
        print(f"🔧 Рекомендаций по оптимизации: {self.interpretation_stats['optimization_opportunities']}")
        
        return {
            'quality_report': quality_report,
            'best_method': best_method,
            'cluster_types': cluster_types,
            'organization_mapping': org_mapping,
            'risk_assessment': risk_assessment,
            'recommendations': recommendations,
            'stakeholder_reports': reports,
            'optimization_roadmap': roadmap
        }
    
    # ВНУТРЕННИЕ МЕТОДЫ ИНТЕРПРЕТАЦИИ
    
    def _assess_clustering_quality(self, data: pd.DataFrame) -> Dict[str, Any]:
        """
        Оценка качества кластеризации по силуэтной оценке.
        
        Методология: Rousseeuw, P.J. (1987) Silhouettes
        """
        print("\n📈 ШАГ 1: Оценка качества кластеризации...")
        
        quality_metrics = {}
        methods = ['hdbscan', 'optics', 'dbscan']
        
        for method in methods:
            silhouette_col = f'{method}_silhouette_vals'
            if silhouette_col in data.columns:
                scores = data[silhouette_col]
                # Исключаем шум (-1) для расчета
                cluster_scores = scores[data[f'{method}_cluster'] >= 0]
                
                quality_metrics[method] = {
                    'mean_silhouette': cluster_scores.mean(),
                    'median_silhouette': cluster_scores.median(),
                    'std_silhouette': cluster_scores.std(),
                    'min_silhouette': cluster_scores.min(),
                    'max_silhouette': cluster_scores.max(),
                    'noise_percentage': (data[f'{method}_cluster'] == -1).mean() * 100,
                    'num_clusters': data[f'{method}_cluster'].nunique() - 1  # исключаем шум
                }
                
                # Интерпретация силуэтной оценки
                mean_score = quality_metrics[method]['mean_silhouette']
                if mean_score > 0.7:
                    quality = "Отличное"
                elif mean_score > 0.5:
                    quality = "Хорошее"
                elif mean_score > 0.25:
                    quality = "Удовлетворительное"
                else:
                    quality = "Слабое"
                
                quality_metrics[method]['interpretation'] = quality
                
                print(f"   - {method.upper()}: {quality} качество (средняя оценка: {mean_score:.3f})")
        
        return quality_metrics
    
    def _determine_best_method(self, data: pd.DataFrame) -> str:
        """
        Определение лучшего метода кластеризации на основе:
        1. Средней силуэтной оценки
        2. Процента шума
        3. Количества кластеров
        """
        print("\n🏆 ШАГ 2: Определение лучшего метода кластеризации...")
        
        methods = ['hdbscan', 'optics', 'dbscan']
        method_scores = {}

        # Определение количества кластеров
        # для использования в нормализации количества кластеров
        # при расчетах взвешенной оценки кластеров
        nums_clusters = {}
        for method in methods:
            nums_clusters[method] = data[f'{method}_cluster'].nunique() - 1
        
        for method in methods:
            silhouette_col = f'{method}_silhouette_vals'
            if silhouette_col in data.columns:
                # Взвешенная оценка метода
                # Rosseeuw P.J. (1987) - автор силуэтного анализа
                # рекомендует использовать медиану
                # для оценки "типичного" качества кластеризации
                median_silhouette = data[silhouette_col].median()
                noise_percent = (data[f'{method}_cluster'] == -1).mean()
                #num_clusters = data[f'{method}_cluster'].nunique() - 1
                
                # Эвристическая формула оценки
                # Больший вес силуэтной оценке, меньший - проценту шума
                score = (0.6 * median_silhouette + 
                        0.3 * (1 - noise_percent) + 
                        0.1 * (nums_clusters[method] / nums_clusters[max(nums_clusters)]))  # нормализуем количество кластеров
                        #0.1 * min(num_clusters / 20, 1))  # нормализуем количество кластеров
                
                method_scores[method] = score
        
        if method_scores:
            best_method = max(method_scores, key=method_scores.get)
            print(f"   ✅ Лучший метод: {best_method.upper()} (взвешенная оценка: {method_scores[best_method]:.3f})")
            return best_method
        
        return 'hdbscan'  # fallback
    
    def _classify_cluster_types(self, 
                               data: pd.DataFrame, 
                               method: str,
                               original_data: pd.DataFrame) -> Dict[int, Dict[str, Any]]:
        """
        Классификация кластеров на типы:
        1. Нормативные
        2. Аномальные
        3. Рисковые
        4. Ошибочные
        5. Уникальные
        6. Привилегированные
        """
        print(f"\n🏷️  ШАГ 3: Классификация кластеров ({method.upper()})...")
        
        cluster_col = f'{method}_cluster'
        silhouette_col = f'{method}_silhouette_vals'
        
        # Исключаем шум (-1)
        valid_clusters = [c for c in data[cluster_col].unique() if c >= 0]
        self.interpretation_stats['total_clusters'] = len(valid_clusters)
        
        cluster_types = {}
        
        for cluster_id in valid_clusters:
            cluster_data = data[data[cluster_col] == cluster_id]
            cluster_size = len(cluster_data)
            total_size = len(data[data[cluster_col] >= 0])
            
            # Базовые метрики
            silhouette_mean = cluster_data[silhouette_col].mean()
            size_ratio = cluster_size / total_size
            
            # Анализ признаков кластера
            feature_analysis = self._analyze_cluster_features(
                cluster_data, 
                original_data
            )
            
            # Определение типа кластера
            cluster_type = self._determine_cluster_type(
                silhouette_mean,
                size_ratio,
                feature_analysis
            )
            
            # Оценка привилегированности
            is_privileged = self._assess_privilege_level(feature_analysis)
            
            cluster_types[cluster_id] = {
                'type': cluster_type,
                'subtype': 'Привилегированный' if is_privileged else cluster_type.value,
                'size': cluster_size,
                'size_percentage': size_ratio * 100,
                'silhouette_score': silhouette_mean,
                'feature_profile': feature_analysis,
                'is_privileged': is_privileged,
                'risk_level': RiskLevel.INFO  # будет уточнено позже
            }
            
            print(f"   - Кластер {cluster_id}: {cluster_type.value} "
                  f"({cluster_size} объектов, {size_ratio:.3%}, силуэт: {silhouette_mean:.3f})")
        
        return cluster_types
    
    def _analyze_cluster_features(self, 
                                 cluster_data: pd.DataFrame,
                                 original_data: pd.DataFrame) -> Dict[str, Any]:
        """
        Анализ признаков кластера для создания профиля.
        """
        profile = {
            'dominant_features': {},
            'unique_combinations': 0,
            'privilege_indicators': [],
            'anomaly_indicators': []
        }
        
        # Анализ категориальных признаков
        categorical_cols = original_data.select_dtypes(include=['object']).columns
        
        for col in categorical_cols[:10]:  # Ограничиваем для производительности
            if col in cluster_data.columns:
                value_counts = cluster_data[col].value_counts()
                if len(value_counts) > 0:
                    dominant_value = value_counts.index[0]
                    dominance_ratio = value_counts.iloc[0] / len(cluster_data)
                    
                    if dominance_ratio > 0.7:  # Явно доминирующее значение
                        profile['dominant_features'][col] = {
                            'value': dominant_value,
                            'ratio': dominance_ratio
                        }
        
        # Анализ привилегий
        privilege_keywords = ['admin', 'root', 'супер', 'полный', 'все']
        for col in categorical_cols:
            if any(keyword in str(col).lower() for keyword in privilege_keywords):
                unique_values = cluster_data[col].nunique()
                if unique_values == 1:  # Все объекты имеют одинаковое значение
                    profile['privilege_indicators'].append(col)
        
        return profile
    
    def _determine_cluster_type(self, 
                               silhouette_score: float,
                               size_ratio: float,
                               feature_analysis: Dict[str, Any]) -> ClusterType:
        """
        Определение типа кластера на основе метрик.
        """
        # Уникальные/маленькие кластеры
        if size_ratio < 0.005:  # Менее 0.5%
            return ClusterType.UNIQUE
        
        # Ошибочные кластеры (низкое качество)
        if silhouette_score < 0.1:
            return ClusterType.ERRONEOUS
        
        # Нормативные кластеры
        if (silhouette_score > self.config.silhouette_threshold and 
            size_ratio > self.config.size_threshold):
            return ClusterType.NORMAL
        
        # Рисковые кластеры (показатели привилегий)
        if len(feature_analysis.get('privilege_indicators', [])) > 0:
            return ClusterType.RISKY
        
        # Аномальные кластеры
        if 0.1 <= silhouette_score <= 0.3:
            return ClusterType.ANOMALOUS
        
        return ClusterType.NORMAL  # По умолчанию
    
    def _assess_privilege_level(self, feature_analysis: Dict[str, Any]) -> bool:
        """
        Оценка уровня привилегий кластера.
        """
        privilege_indicators = feature_analysis.get('privilege_indicators', [])
        return len(privilege_indicators) >= 2  # Два и более индикатора
    
    def _map_to_organization(self,
                            data: pd.DataFrame,
                            method: str,
                            original_data: pd.DataFrame) -> Dict[int, Dict[str, Any]]:
        """
        Сопоставление кластеров с организационной структурой.
        """
        print(f"\n🏢 ШАГ 4: Сопоставление с организационной структурой...")
        
        mapping = {}
        cluster_col = f'{method}_cluster'
        
        # Поиск столбцов, связанных с организацией
        org_columns = self._identify_org_columns(original_data)
        
        for cluster_id in data[cluster_col].unique():
            if cluster_id >= 0:  # Исключаем шум
                cluster_data = data[data[cluster_col] == cluster_id]
                
                org_profile = {}
                for col in org_columns:
                    if col in cluster_data.columns:
                        # Самые частые значения в кластере
                        top_values = cluster_data[col].value_counts().head(3)
                        org_profile[col] = {
                            'values': top_values.index.tolist(),
                            'counts': top_values.values.tolist(),
                            'total': len(cluster_data)
                        }
                
                # Определение предполагаемого отдела/роли
                department, role = self._infer_department_role(org_profile)
                
                mapping[cluster_id] = {
                    'department': department,
                    'role': role,
                    'org_profile': org_profile,
                    'user_count': len(cluster_data)
                }
                
                if department:
                    print(f"   - Кластер {cluster_id}: {department} → {role or 'Не определено'}")
        
        return mapping
    
    def _identify_org_columns(self, data: pd.DataFrame) -> List[str]:
        """
        Идентификация столбцов, связанных с организационной структурой.
        """
        org_keywords = ['отдел', 'департамент', 'роль', 'должность', 'department', 'role', 'team']
        org_columns = []
        
        for col in data.columns:
            col_lower = str(col).lower()
            if any(keyword in col_lower for keyword in org_keywords):
                org_columns.append(col)
        
        return org_columns[:5]  # Ограничиваем до 5 столбцов
    
    def _infer_department_role(self, org_profile: Dict[str, Any]) -> Tuple[str, str]:
        """
        Вывод предполагаемого отдела и роли на основе профиля.
        """
        department = None
        role = None
        
        # Эвристические правила
        for col, profile in org_profile.items():
            col_lower = str(col).lower()
            
            if 'отдел' in col_lower or 'департамент' in col_lower:
                if profile['values']:
                    department = profile['values'][0]
            
            if 'роль' in col_lower or 'должность' in col_lower:
                if profile['values']:
                    role = profile['values'][0]
        
        return department, role
    
    def _assess_security_risks(self,
                              data: pd.DataFrame,
                              method: str,
                              cluster_types: Dict[int, Dict[str, Any]],
                              original_data: pd.DataFrame) -> Dict[int, Dict[str, Any]]:
        """
        Оценка рисков безопасности для каждого кластера.
        """
        print(f"\n⚠️  ШАГ 5: Оценка рисков безопасности...")
        
        risk_assessment = {}
        self.interpretation_stats['risky_clusters'] = 0
        
        cluster_col = f'{method}_cluster'
        
        for cluster_id, cluster_info in cluster_types.items():
            if cluster_id >= 0:
                cluster_data = data[data[cluster_col] == cluster_id]
                
                # Оценка рисков на основе типа и характеристик
                risk_level, risk_factors = self._calculate_risk_level(
                    cluster_info,
                    cluster_data,
                    original_data
                )
                
                risk_assessment[cluster_id] = {
                    'risk_level': risk_level,
                    'risk_factors': risk_factors,
                    'urgency': self._determine_urgency(risk_level, cluster_info),
                    'mitigation_priority': self._calculate_priority(
                        risk_level, 
                        cluster_info['size']
                    )
                }
                
                if risk_level in [RiskLevel.CRITICAL, RiskLevel.HIGH]:
                    self.interpretation_stats['risky_clusters'] += 1
                    print(f"   ⚠️  Кластер {cluster_id}: {risk_level.value} риск "
                          f"({', '.join(risk_factors[:2])})")
        
        return risk_assessment
    
    def _calculate_risk_level(self,
                             cluster_info: Dict[str, Any],
                             cluster_data: pd.DataFrame,
                             original_data: pd.DataFrame) -> Tuple[RiskLevel, List[str]]:
        """
        Расчет уровня риска безопасности.
        """
        risk_factors = []
        risk_score = 0
        
        # Фактор 1: Тип кластера
        if cluster_info['type'] == ClusterType.RISKY:
            risk_score += 3
            risk_factors.append("Рисковый тип доступа")
        
        # Фактор 2: Привилегированность
        if cluster_info.get('is_privileged', False):
            risk_score += 2
            risk_factors.append("Высокий уровень привилегий")
        
        # Фактор 3: Размер кластера (больше пользователей = выше риск)
        if cluster_info['size_percentage'] > 5:  # Больше 5%
            risk_score += 1
            risk_factors.append("Большое количество пользователей")
        
        # Фактор 4: Качество кластеризации (низкое качество = выше риск)
        if cluster_info['silhouette_score'] < 0.2:
            risk_score += 2
            risk_factors.append("Низкая определенность паттерна")
        
        # Фактор 5: Чувствительные операции
        sensitive_ops = self._detect_sensitive_operations(cluster_data, original_data)
        if sensitive_ops:
            risk_score += len(sensitive_ops)
            risk_factors.append(f"Чувствительные операции: {', '.join(sensitive_ops[:3])}")
        
        # Определение уровня риска
        if risk_score >= 5:
            return RiskLevel.CRITICAL, risk_factors
        elif risk_score >= 3:
            return RiskLevel.HIGH, risk_factors
        elif risk_score >= 2:
            return RiskLevel.MEDIUM, risk_factors
        elif risk_score >= 1:
            return RiskLevel.LOW, risk_factors
        else:
            return RiskLevel.INFO, ["Низкий риск"]
    
    def _detect_sensitive_operations(self, 
                                    cluster_data: pd.DataFrame,
                                    original_data: pd.DataFrame) -> List[str]:
        """
        Обнаружение чувствительных операций в кластере.
        """
        sensitive_ops = []
        
        # Поиск столбцов с операциями
        operation_cols = [col for col in original_data.columns 
                         if 'операц' in str(col).lower() or 'действ' in str(col).lower()]
        
        for col in operation_cols[:3]:  # Ограничиваем для производительности
            if col in cluster_data.columns:
                unique_ops = cluster_data[col].unique()
                for op in unique_ops:
                    op_str = str(op).lower()
                    # Проверка на чувствительные операции
                    if any(sensitive in op_str 
                          for sensitive in self.config.sensitive_operations):
                        sensitive_ops.append(str(op))
        
        return list(set(sensitive_ops))[:5]  # Уникальные, до 5 операций
    
    def _determine_urgency(self, 
                          risk_level: RiskLevel, 
                          cluster_info: Dict[str, Any]) -> str:
        """
        Определение срочности действий.
        """
        urgency_map = {
            RiskLevel.CRITICAL: "Немедленно (1-3 дня)",
            RiskLevel.HIGH: "Срочно (1 неделя)",
            RiskLevel.MEDIUM: "В течение месяца",
            RiskLevel.LOW: "Плановая оптимизация",
            RiskLevel.INFO: "Мониторинг"
        }
        return urgency_map.get(risk_level, "Мониторинг")
    
    def _calculate_priority(self, risk_level: RiskLevel, size: int) -> int:
        """
        Расчет приоритета для дорожной карты.
        """
        priority_map = {
            RiskLevel.CRITICAL: 0,
            RiskLevel.HIGH: 1,
            RiskLevel.MEDIUM: 2,
            RiskLevel.LOW: 3,
            RiskLevel.INFO: 4
        }
        return priority_map.get(risk_level, 4)
    
    def _generate_recommendations(self,
                                 data: pd.DataFrame,
                                 method: str,
                                 cluster_types: Dict[int, Dict[str, Any]],
                                 risk_assessment: Dict[int, Dict[str, Any]],
                                 original_data: pd.DataFrame) -> Dict[str, List[Dict[str, Any]]]:
        """
        Генерация рекомендаций для разных стейкхолдеров.
        """
        print(f"\n🔧 ШАГ 6: Генерация рекомендаций...")
        
        recommendations = {
            'leadership': [],      # Руководство
            'business_analysts': [], # Бизнес-аналитики
            'system_admins': [],   # Администраторы
            'security': [],        # Специалисты безопасности
            'data_analysts': []    # Аналитики данных
        }
        
        cluster_col = f'{method}_cluster'
        
        for cluster_id, cluster_info in cluster_types.items():
            if cluster_id >= 0:
                cluster_data = data[data[cluster_col] == cluster_id]
                risk_info = risk_assessment.get(cluster_id, {})
                
                # Генерация рекомендаций для каждой аудитории
                self._add_leadership_recommendations(
                    recommendations, cluster_id, cluster_info, risk_info
                )
                
                self._add_business_analyst_recommendations(
                    recommendations, cluster_id, cluster_info, risk_info, original_data
                )
                
                self._add_system_admin_recommendations(
                    recommendations, cluster_id, cluster_info, risk_info, cluster_data
                )
                
                self._add_security_recommendations(
                    recommendations, cluster_id, cluster_info, risk_info, cluster_data
                )
                
                self._add_data_analyst_recommendations(
                    recommendations, cluster_id, cluster_info, risk_info
                )
        
        # Подсчет рекомендаций
        total_recs = sum(len(recs) for recs in recommendations.values())
        self.interpretation_stats['optimization_opportunities'] = total_recs
        
        print(f"   📋 Сгенерировано рекомендаций: {total_recs}")
        for audience, recs in recommendations.items():
            if recs:
                print(f"     - {audience}: {len(recs)} рекомендаций")
        
        return recommendations
    
    def _add_leadership_recommendations(self,
                                       recommendations: Dict[str, List],
                                       cluster_id: int,
                                       cluster_info: Dict[str, Any],
                                       risk_info: Dict[str, Any]):
        """Рекомендации для руководства."""
        if risk_info.get('risk_level') in [RiskLevel.CRITICAL, RiskLevel.HIGH]:
            recommendations['leadership'].append({
                'cluster': cluster_id,
                'priority': 'Высокий',
                'action': f"Требуется внимание к кластеру {cluster_id}",
                'reason': f"{risk_info['risk_level'].value} риск: {', '.join(risk_info['risk_factors'][:2])}",
                'impact': f"{cluster_info['size']} пользователей ({cluster_info['size_percentage']:.3f}%)",
                'timeline': risk_info.get('urgency', 'Не определено')
            })
    
    def _add_business_analyst_recommendations(self,
                                             recommendations: Dict[str, List],
                                             cluster_id: int,
                                             cluster_info: Dict[str, Any],
                                             risk_info: Dict[str, Any],
                                             original_data: pd.DataFrame):
        """Рекомендации для бизнес-аналитиков."""
        if cluster_info['type'] == ClusterType.NORMAL and cluster_info['size_percentage'] > 2:
            recommendations['business_analysts'].append({
                'cluster': cluster_id,
                'action': "Стандартизировать в роль",
                'reason': f"Стабильный паттерн ({cluster_info['size']} пользователей)",
                'suggested_role_name': f"Role_Cluster_{cluster_id}",
                'benefit': "Упрощение управления доступом"
            })
    
    def _add_system_admin_recommendations(self,
                                         recommendations: Dict[str, List],
                                         cluster_id: int,
                                         cluster_info: Dict[str, Any],
                                         risk_info: Dict[str, Any],
                                         cluster_data: pd.DataFrame):
        """Рекомендации для системных администраторов."""
        if cluster_info['type'] == ClusterType.RISKY or cluster_info.get('is_privileged', False):
            recommendations['system_admins'].append({
                'cluster': cluster_id,
                'action': "Проверить и оптимизировать права",
                'reason': f"{cluster_info['subtype']} доступ",
                'users_count': cluster_info['size'],
                'suggested_actions': [
                    "Аудит назначенных прав",
                    "Применить принцип наименьших привилегий",
                    "Документировать исключения"
                ]
            })
    
    def _add_security_recommendations(self,
                                     recommendations: Dict[str, List],
                                     cluster_id: int,
                                     cluster_info: Dict[str, Any],
                                     risk_info: Dict[str, Any],
                                     cluster_data: pd.DataFrame):
        """Рекомендации для специалистов по безопасности."""
        if risk_info.get('risk_level') in [RiskLevel.CRITICAL, RiskLevel.HIGH]:
            recommendations['security'].append({
                'cluster': cluster_id,
                'threat_level': risk_info['risk_level'].value,
                'action': "Немедленный аудит безопасности",
                'risk_factors': risk_info['risk_factors'],
                'users_affected': cluster_info['size'],
                'mitigation': [
                    "Временное ограничение прав",
                    "Аудит действий пользователей",
                    "Уведомление ответственных лиц"
                ]
            })
    
    def _add_data_analyst_recommendations(self,
                                         recommendations: Dict[str, List],
                                         cluster_id: int,
                                         cluster_info: Dict[str, Any],
                                         risk_info: Dict[str, Any]):
        """Рекомендации для аналитиков данных."""
        if cluster_info['silhouette_score'] < 0.3:
            recommendations['data_analysts'].append({
                'cluster': cluster_id,
                'action': "Улучшить качество данных",
                'reason': f"Низкая силуэтная оценка ({cluster_info['silhouette_score']:.3f})",
                'suggestions': [
                    "Проверить полноту данных",
                    "Уточнить категоризацию признаков",
                    "Рассмотреть дополнительные признаки"
                ]
            })
    
    def _generate_stakeholder_reports(self,
                                     quality_report: Dict[str, Any],
                                     best_method: str,
                                     cluster_types: Dict[int, Dict[str, Any]],
                                     org_mapping: Dict[int, Dict[str, Any]],
                                     risk_assessment: Dict[int, Dict[str, Any]],
                                     recommendations: Dict[str, List]) -> Dict[str, str]:
        """
        Формирование отчетов для разных аудиторий.
        """
        print(f"\n📄 ШАГ 7: Формирование отчетов для стейкхолдеров...")
        
        reports = {}
        
        # Отчет для руководства (краткий, стратегический)
        reports['leadership'] = self._create_leadership_report(
            quality_report, best_method, cluster_types, risk_assessment
        )
        
        # Отчет для бизнес-аналитиков
        reports['business_analysts'] = self._create_business_analyst_report(
            cluster_types, org_mapping, recommendations
        )
        
        # Отчет для системных администраторов
        reports['system_admins'] = self._create_system_admin_report(
            cluster_types, risk_assessment, recommendations
        )
        
        # Отчет для специалистов безопасности
        reports['security'] = self._create_security_report(
            risk_assessment, recommendations
        )
        
        # Отчет для аналитиков данных
        reports['data_analysts'] = self._create_data_analyst_report(
            quality_report, best_method, recommendations
        )
        
        print("   ✅ Отчеты сформированы для 5 аудиторий")
        return reports
    
    def _create_leadership_report(self, quality_report, best_method, cluster_types, risk_assessment):
        """Создание отчета для руководства."""
        critical_risks = sum(1 for risk in risk_assessment.values() 
                            if risk['risk_level'] in [RiskLevel.CRITICAL, RiskLevel.HIGH])
        
        report = f"""
# 📊 ОТЧЕТ ДЛЯ РУКОВОДСТВА
## Анализ модели доступа Tessa

### Ключевые метрики
- **Лучший метод анализа**: {best_method.upper()}
- **Всего кластеров**: {len(cluster_types)}
- **Критические риски**: {critical_risks}
- **Оптимизированные паттерны**: {sum(1 for c in cluster_types.values() if c['type'] == ClusterType.NORMAL)}

### Основные выводы
1. **Безопасность**: {critical_risks} критических/высоких рисков требуют внимания
2. **Эффективность**: {len([c for c in cluster_types.values() if c['size_percentage'] > 2])} крупных кластеров для стандартизации
3. **Управляемость**: {len(cluster_types)} паттернов вместо тысяч индивидуальных назначений

### Рекомендуемые действия
1. **Немедленно**: Аудит {critical_risks} рисковых кластеров
2. **Краткосрочно**: Стандартизация крупных паттернов
3. **Долгосрочно**: Внедрение RBAC для 80% пользователей

### Бизнес-ценность
- **Снижение рисков**: На {(critical_risks * 20):.2f}% (оценка)
- **Экономия времени администрирования**: До 30%
- **Соответствие требованиям**: Улучшение контроля доступа
"""
        return report
    
    def _create_business_analyst_report(self, cluster_types, org_mapping, recommendations):
        """Создание отчета для бизнес-аналитиков."""
        normal_clusters = [c for c in cluster_types.values() 
                          if c['type'] == ClusterType.NORMAL and c['size_percentage'] > 2]
        
        report = f"""
# 📈 ОТЧЕТ ДЛЯ БИЗНЕС-АНАЛИТИКОВ
## Оптимизация ролевой модели Tessa

### Обнаруженные паттерны
Всего {len(normal_clusters)} стабильных паттернов для стандартизации:

"""
        for cluster_id, info in list(cluster_types.items())[:10]:  # Первые 10
            org_info = org_mapping.get(cluster_id, {})
            report += f"**Кластер {cluster_id}**: {info['size']} пользователей ({info['size_percentage']:.3f}%)\n"
            if org_info.get('department'):
                report += f"  - Предполагаемый отдел: {org_info['department']}\n"
            report += f"  - Тип: {info['subtype']}\n"
            report += f"  - Качество: {info['silhouette_score']:.3f}\n\n"
        
        report += f"""
### Рекомендации по стандартизации
{len(recommendations.get('business_analysts', []))} ролей для создания:

"""
        for rec in recommendations.get('business_analysts', [])[:5]:
            report += f"- **{rec['suggested_role_name']}**: {rec['reason']}\n"
        
        return report
    
    def _create_system_admin_report(self, cluster_types, risk_assessment, recommendations):
        """Создание отчета для системных администраторов."""
        risky_clusters = [c for c in cluster_types.values() 
                         if c['type'] == ClusterType.RISKY or c.get('is_privileged', False)]
        
        report = f"""
# 🔧 ОТЧЕТ ДЛЯ СИСТЕМНЫХ АДМИНИСТРАТОРОВ
## Практические действия по оптимизации доступа

### Критические кластеры для аудита
Всего {len(risky_clusters)} кластеров требуют внимания:

"""
        for cluster_id, info in list(cluster_types.items()):
            if info['type'] == ClusterType.RISKY or info.get('is_privileged', False):
                risk_info = risk_assessment.get(cluster_id, {})
                report += f"**Кластер {cluster_id}** ({info['size']} пользователей):\n"
                report += f"  - Риск: {risk_info.get('risk_level', RiskLevel.INFO).value}\n"
                report += f"  - Срочность: {risk_info.get('urgency', 'Не определено')}\n"
                report += f"  - Действия: Проверить права, применить PoLP\n\n"
        
        report += f"""
### Конкретные действия
{len(recommendations.get('system_admins', []))} задач для выполнения:

"""
        for rec in recommendations.get('system_admins', [])[:5]:
            report += f"**Задача**: {rec['action']}\n"
            report += f"  - Причина: {rec['reason']}\n"
            report += f"  - Пользователей: {rec['users_count']}\n"
            report += f"  - Шаги:\n"
            for action in rec['suggested_actions']:
                report += f"    - {action}\n"
            report += "\n"
        
        return report
    
    def _create_security_report(self, risk_assessment, recommendations):
        """Создание отчета для специалистов по безопасности."""
        critical_risks = [r for r in risk_assessment.values() 
                         if r['risk_level'] in [RiskLevel.CRITICAL, RiskLevel.HIGH]]
        
        report = f"""
# 🔒 ОТЧЕТ ДЛЯ СПЕЦИАЛИСТОВ БЕЗОПАСНОСТИ
## Анализ рисков модели доступа Tessa

### Уровни угроз
- **Критических рисков**: {len([r for r in critical_risks if r['risk_level'] == RiskLevel.CRITICAL])}
- **Высоких рисков**: {len([r for r in critical_risks if r['risk_level'] == RiskLevel.HIGH])}
- **Всего рисковых кластеров**: {len(critical_risks)}

### Детализация рисков
"""
        for cluster_id, risk_info in list(risk_assessment.items()):
            if risk_info['risk_level'] in [RiskLevel.CRITICAL, RiskLevel.HIGH]:
                report += f"**Кластер {cluster_id}**: {risk_info['risk_level'].value}\n"
                report += f"  - Факторы: {', '.join(risk_info['risk_factors'][:3])}\n"
                report += f"  - Приоритет: P{risk_info['mitigation_priority']}\n"
                report += f"  - Меры: {risk_info.get('urgency', 'Не определено')}\n\n"
        
        report += f"""
### Меры по смягчению
{len(recommendations.get('security', []))} неотложных действий:

"""
        for rec in recommendations.get('security', [])[:5]:
            report += f"**Кластер {rec['cluster']}. {rec['action']}** (Уровень: {rec['threat_level']})\n"
            report += f"  - Факторы риска: {', '.join(rec['risk_factors'][:3])}\n"
            report += f"  - Меры:\n"
            for mitigation in rec['mitigation']:
                report += f"    - {mitigation}\n"
            report += "\n"
        
        return report
    
    def _create_data_analyst_report(self, quality_report, best_method, recommendations):
        """Создание отчета для аналитиков данных."""
        method_quality = quality_report.get(best_method, {})
        
        report = f"""
# 📊 ОТЧЕТ ДЛЯ АНАЛИТИКОВ ДАННЫХ
## Методологический анализ кластеризации

### Качество методов кластеризации
**Лучший метод**: {best_method.upper()}
- Средняя силуэтная оценка: {method_quality.get('mean_silhouette', 0):.3f}
- Качество интерпретации: {method_quality.get('interpretation', 'Не определено')}
- Процент шума: {method_quality.get('noise_percentage', 0):.3f}%
- Количество кластеров: {method_quality.get('num_clusters', 0)}

### Сравнение методов
"""
        for method, metrics in quality_report.items():
            report += f"**{method.upper()}**:\n"
            report += f"  - Силуэт: {metrics.get('mean_silhouette', 0):.3f}\n"
            report += f"  - Качество: {metrics.get('interpretation', 'Не определено')}\n"
            report += f"  - Кластеров: {metrics.get('num_clusters', 0)}\n\n"
        
        report += f"""
### Рекомендации по улучшению данных
{len(recommendations.get('data_analysts', []))} предложений:

"""
        for rec in recommendations.get('data_analysts', []):
            report += f"- **Кластер {rec['cluster']}**. {rec['action']}: {rec['reason']}\n"
            for suggestion in rec['suggestions']:
                report += f"  - {suggestion}\n"
        
        return report
    
    def _create_visualizations(self,
                              data: pd.DataFrame,
                              method: str,
                              cluster_types: Dict[int, Dict[str, Any]],
                              risk_assessment: Dict[int, Dict[str, Any]]):
        """
        Создание визуализаций для разных аудиторий.
        """
        print(f"\n📊 ШАГ 8: Создание визуализаций...")
        
        try:
            # 1. Heatmap силуэтных оценок
            self._plot_silhouette_heatmap(data, method)
            
            # 2. Распределение кластеров по типам
            self._plot_cluster_type_distribution(cluster_types)
            
            # 3. Карта рисков
            self._plot_risk_map(risk_assessment, cluster_types)
            
            # 4. Распределение размеров кластеров
            self._plot_cluster_size_distribution(cluster_types)
            
            print("   ✅ Создано 4 типа визуализаций")
            
        except Exception as e:
            print(f"   ⚠️  Ошибка при создании визуализаций: {e}")
    
    def _plot_silhouette_heatmap(self, data: pd.DataFrame, method: str):
        """Heatmap силуэтных оценок."""
        plt.figure(figsize=(12, 8))
        
        # Подготовка данных
        silhouette_col = f'{method}_silhouette_vals'
        cluster_col = f'{method}_cluster'
        
        # Исключаем шум
        plot_data = data[data[cluster_col] >= 0].copy()
        
        # Создание heatmap
        pivot_table = pd.pivot_table(
            plot_data,
            values=silhouette_col,
            index=cluster_col,
            aggfunc='mean'
        ).sort_values(by=silhouette_col, ascending=False)
        
        sns.heatmap(pivot_table, annot=True, cmap='RdYlGn', center=0.5)
        plt.title(f'Силуэтные оценки кластеров ({method.upper()})', fontsize=14)
        plt.xlabel('Силуэтная оценка')
        plt.ylabel('Номер кластера')
        
        # Сохранение
        plt.savefig('silhouette_heatmap.png', dpi=150, bbox_inches='tight')
        plt.close()
    
    def _plot_cluster_type_distribution(self, cluster_types: Dict[int, Dict[str, Any]]):
        """Распределение кластеров по типам."""
        plt.figure(figsize=(10, 6))
        
        # Подсчет по типам
        type_counts = {}
        for info in cluster_types.values():
            type_name = info['subtype']
            type_counts[type_name] = type_counts.get(type_name, 0) + 1
        
        # Создание графика
        colors = ['green', 'yellow', 'orange', 'red', 'blue', 'purple']
        plt.pie(type_counts.values(), labels=type_counts.keys(), 
                autopct='%1.1f%%', colors=colors[:len(type_counts)])
        plt.title('Распределение кластеров по типам', fontsize=14)
        
        # Сохранение
        plt.savefig('cluster_type_distribution.png', dpi=150, bbox_inches='tight')
        plt.close()
    
    def _plot_risk_map(self, risk_assessment, cluster_types):
        """Карта рисков кластеров."""
        plt.figure(figsize=(14, 8))
        
        # Подготовка данных
        clusters = []
        sizes = []
        risks = []
        
        for cluster_id, info in cluster_types.items():
            risk_info = risk_assessment.get(cluster_id, {})
            if risk_info:
                clusters.append(cluster_id)
                sizes.append(info['size'])
                
                # Преобразование уровня риска в числовой
                risk_map = {
                    RiskLevel.CRITICAL: 4,
                    RiskLevel.HIGH: 3,
                    RiskLevel.MEDIUM: 2,
                    RiskLevel.LOW: 1,
                    RiskLevel.INFO: 0
                }
                risks.append(risk_map.get(risk_info['risk_level'], 0))
        
        # Создание scatter plot
        scatter = plt.scatter(clusters, sizes, c=risks, cmap='RdYlGn_r', 
                             s=100, alpha=0.7, edgecolors='black')
        
        plt.colorbar(scatter, label='Уровень риска (0-4)')
        plt.xlabel('Номер кластера')
        plt.ylabel('Размер кластера (количество объектов)')
        plt.title('Карта рисков кластеров', fontsize=14)
        plt.grid(True, alpha=0.3)
        
        # Сохранение
        plt.savefig('risk_map.png', dpi=150, bbox_inches='tight')
        plt.close()
    
    def _plot_cluster_size_distribution(self, cluster_types):
        """Распределение размеров кластеров."""
        plt.figure(figsize=(12, 6))
        
        sizes = [info['size'] for info in cluster_types.values()]
        
        plt.hist(sizes, bins=20, edgecolor='black', alpha=0.7)
        plt.xlabel('Размер кластера (количество объектов)')
        plt.ylabel('Количество кластеров')
        plt.title('Распределение размеров кластеров', fontsize=14)
        plt.grid(True, alpha=0.3)
        
        # Добавление вертикальной линии для медианы
        median_size = np.median(sizes)
        plt.axvline(median_size, color='red', linestyle='--', 
                   label=f'Медиана: {median_size:.0f}')
        plt.legend()
        
        # Сохранение
        plt.savefig('cluster_size_distribution.png', dpi=150, bbox_inches='tight')
        plt.close()
    
    def _save_interpretation_results(self, reports: Dict[str, str]):
        """
        Сохранение результатов интерпретации.
        """
        print(f"\n💾 ШАГ 9: Сохранение результатов...")
        
        # Сохранение отчетов в файлы
        for audience, report in reports.items():
            filename = f"report_{audience}.md"
            with open(filename, 'w', encoding='utf-8') as f:
                f.write(report)
            print(f"   📄 Отчет для {audience}: {filename}")
        
        # Сохранение структурированных данных
        results = {
            'statistics': self.interpretation_stats,
            'config': self.config.__dict__,
            'timestamp': pd.Timestamp.now().isoformat()
        }
        
        with open('interpretation_summary.json', 'w', encoding='utf-8') as f:
            json.dump(results, f, ensure_ascii=False, indent=2)
        
        print("   💾 Итоговый файл: interpretation_summary.json")
    
    def _create_optimization_roadmap(self, 
                                    recommendations: Dict[str, List]) -> Dict[str, Any]:
        """
        Создание дорожной карты оптимизации.
        """
        print(f"\n🗺️  ШАГ 10: Формирование дорожной карты оптимизации...")
        
        roadmap = {
            'immediate': [],   # 1-3 дня
            'short_term': [],  # 1 неделя
            'medium_term': [], # 1 месяц
            'long_term': []    # 3-6 месяцев
        }
        
        # Распределение рекомендаций по срокам
        for audience, recs in recommendations.items():
            for rec in recs:
                # Определение срока на основе приоритета
                if 'срочн' in str(rec.get('action', '')).lower() or 'немед' in str(rec.get('action', '')).lower():
                    roadmap['immediate'].append({
                        'audience': audience,
                        'action': rec.get('action', ''),
                        'cluster': rec.get('cluster', 'N/A'),
                        'reason': rec.get('reason', '')
                    })
                elif 'недел' in str(rec.get('timeline', '')).lower() if 'timeline' in rec else False:
                    roadmap['short_term'].append({
                        'audience': audience,
                        'action': rec.get('action', ''),
                        'cluster': rec.get('cluster', 'N/A'),
                        'reason': rec.get('reason', '')
                    })
                elif 'месяц' in str(rec.get('timeline', '')).lower() if 'timeline' in rec else False:
                    roadmap['medium_term'].append({
                        'audience': audience,
                        'action': rec.get('action', ''),
                        'cluster': rec.get('cluster', 'N/A'),
                        'reason': rec.get('reason', '')
                    })
                else:
                    roadmap['long_term'].append({
                        'audience': audience,
                        'action': rec.get('action', ''),
                        'cluster': rec.get('cluster', 'N/A'),
                        'reason': rec.get('reason', '')
                    })
        
        # Создание текстовой дорожной карты
        roadmap_text = f"""
# 🗺️ ДОРОЖНАЯ КАРТА ОПТИМИЗАЦИИ МОДЕЛИ ДОСТУПА TESSA

## Немедленные действия (1-3 дня)
{len(roadmap['immediate'])} задач:
"""
        for task in roadmap['immediate'][:5]:
            roadmap_text += f"- **{task['action']}** (Кластер {task['cluster']})\n"
        
        roadmap_text += f"""
## Краткосрочные задачи (1 неделя)
{len(roadmap['short_term'])} задач:
"""
        for task in roadmap['short_term'][:5]:
            roadmap_text += f"- {task['action']}\n"
        
        roadmap_text += f"""
## Среднесрочные задачи (1 месяц)
{len(roadmap['medium_term'])} задач:
"""
        for task in roadmap['medium_term'][:5]:
            roadmap_text += f"- {task['action']}\n"
        
        roadmap_text += f"""
## Долгосрочные улучшения (3-6 месяцев)
{len(roadmap['long_term'])} задач:
"""
        for task in roadmap['long_term'][:5]:
            roadmap_text += f"- {task['action']}\n"
        
        roadmap_text += f"""
### Итоговые метрики
- Всего задач: {sum(len(tasks) for tasks in roadmap.values())}
- Затронуто кластеров: {len(set(task['cluster'] for tasks in roadmap.values() for task in tasks if task['cluster'] != 'N/A'))}
- Аудитории: {len(set(task['audience'] for tasks in roadmap.values() for task in tasks))}
"""
        
        # Сохранение дорожной карты
        with open('optimization_roadmap.md', 'w', encoding='utf-8') as f:
            f.write(roadmap_text)
        
        print(f"   ✅ Дорожная карта сохранена: optimization_roadmap.md")
        print(f"   📋 Задач по срокам:")
        print(f"     - Немедленно: {len(roadmap['immediate'])}")
        print(f"     - Краткосрочно: {len(roadmap['short_term'])}")
        print(f"     - Среднесрочно: {len(roadmap['medium_term'])}")
        print(f"     - Долгосрочно: {len(roadmap['long_term'])}")
        
        return roadmap

# УТИЛИТЫ И ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ

def create_executive_summary(interpretation_results: Dict[str, Any]) -> str:
    """
    Создание краткого резюме для руководства.
    
    Args:
        interpretation_results: Результаты интерпретации
        
    Returns:
        Краткое резюме в формате Markdown
    """
    quality = interpretation_results.get('quality_report', {})
    best_method = interpretation_results.get('best_method', 'N/A')
    cluster_types = interpretation_results.get('cluster_types', {})
    risk_assessment = interpretation_results.get('risk_assessment', {})
    
    # Подсчет критических рисков
    critical_risks = sum(1 for r in risk_assessment.values() 
                        if r.get('risk_level') in [RiskLevel.CRITICAL, RiskLevel.HIGH])
    
    # Подсчет нормальных кластеров
    normal_clusters = sum(1 for c in cluster_types.values() 
                         if c.get('type') == ClusterType.NORMAL)
    
    summary = f"""
# 🎯 КРАТКОЕ РЕЗЮМЕ ДЛЯ РУКОВОДСТВА

## Основные выводы анализа модели доступа Tessa

### 📊 **Статистика анализа**
- **Метод анализа**: {best_method.upper()} (наиболее точный)
- **Всего кластеров**: {len(cluster_types)}
- **Нормальных паттернов**: {normal_clusters} ({normal_clusters/len(cluster_types)*100:.0f}%)
- **Критических рисков**: {critical_risks}

### ⚠️ **Ключевые риски безопасности**
"""
    
    # Добавление топ-3 рисков
    high_risks = []
    for cluster_id, risk_info in risk_assessment.items():
        if risk_info.get('risk_level') in [RiskLevel.CRITICAL, RiskLevel.HIGH]:
            high_risks.append((cluster_id, risk_info))
    
    high_risks.sort(key=lambda x: 4 if x[1]['risk_level'] == RiskLevel.CRITICAL else 3, reverse=True)
    
    for i, (cluster_id, risk_info) in enumerate(high_risks[:3], 1):
        cluster_info = cluster_types.get(cluster_id, {})
        summary += f"{i}. **Кластер {cluster_id}** ({risk_info['risk_level'].value}): "
        summary += f"{cluster_info.get('size', 0)} пользователей, "
        summary += f"факторы: {', '.join(risk_info.get('risk_factors', ['Не определены'])[:2])}\n"
    
    summary += f"""
### 🔧 **Возможности оптимизации**
- **Стандартизация ролей**: {normal_clusters} паттернов для формализации
- **Снижение рисков**: {critical_risks} кластеров для аудита
- **Экономия времени администрирования**: До 30% за счет стандартизации

### 🎯 **Рекомендуемые действия**
1. **Немедленно**: Аудит {critical_risks} критических кластеров
2. **В течение недели**: Стандартизация {min(5, normal_clusters)} основных ролей
3. **В течение месяца**: Внедрение RBAC для 80% пользователей

### 📈 **Ожидаемая бизнес-ценность**
- **Повышение безопасности**: Снижение рисков на {critical_risks * 15:.3f}%
- **Эффективность администрирования**: Сокращение времени на управление доступом
- **Соответствие требованиям**: Улучшение аудита и контроля
"""
    
    return summary

def validate_interpretation_input(data_with_clusters: pd.DataFrame) -> bool:
    """
    Валидация входных данных для интерпретации.
    
    Args:
        data_with_clusters: DataFrame с результатами кластеризации
        
    Returns:
        True если данные валидны, иначе False
    """
    required_columns = [
        'hdbscan_cluster', 'hdbscan_silhouette_vals',
        'optics_cluster', 'optics_silhouette_vals', 
        'dbscan_cluster', 'dbscan_silhouette_vals'
    ]
    
    missing_columns = [col for col in required_columns 
                      if col not in data_with_clusters.columns]
    
    if missing_columns:
        print(f"⚠️  Внимание: отсутствуют необходимые столбцы: {missing_columns}")
        return False
    
    # Проверка наличия данных
    if len(data_with_clusters) == 0:
        print("⚠️  Внимание: DataFrame пуст")
        return False
    
    # Проверка диапазона силуэтных оценок
    for method in ['hdbscan', 'optics', 'dbscan']:
        silhouette_col = f'{method}_silhouette_vals'
        if silhouette_col in data_with_clusters.columns:
            min_val = data_with_clusters[silhouette_col].min()
            max_val = data_with_clusters[silhouette_col].max()
            if min_val < -1 or max_val > 1:
                print(f"⚠️  Внимание: {silhouette_col} вне диапазона [-1, 1]")
                return False
    
    return True

Загрузка данных¶

In [18]:
# Загрузка данных о кластерах
data_with_clusters = pd.read_excel('data_with_clusters.xlsx')

print(data_with_clusters.info())
display(data_with_clusters.describe())

data_with_clusters.head(5)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3636 entries, 0 to 3635
Data columns (total 35 columns):
 #   Column                                      Non-Null Count  Dtype  
---  ------                                      --------------  -----  
 0   Unnamed: 0                                  3636 non-null   int64  
 1   Название роли                               3636 non-null   object 
 2   Тип роли                                    3636 non-null   object 
 3   Скрытая роль                                3636 non-null   int64  
 4   Тип карточки                                3636 non-null   object 
 5   Состояние карточки                          3636 non-null   object 
 6   Создание карточки                           3636 non-null   int64  
 7   Чтение карточки                             3636 non-null   int64  
 8   Редактирование карточки                     3636 non-null   int64  
 9   Удаление карточки                           3636 non-null   int64  
 10  Добавление файлов                           3636 non-null   int64  
 11  Редактирование всех файлов                  3636 non-null   int64  
 12  Удаление всех файлов                        3636 non-null   int64  
 13  Редактирование собственных файлов           3636 non-null   int64  
 14  Удаление собственных файлов                 3636 non-null   int64  
 15  Инициация типового процесса отправки задач  3636 non-null   int64  
 16  Ручное редактирование номера                3636 non-null   int64  
 17  Редактирование маршрута                     3636 non-null   int64  
 18  Полный пересчет маршрута                    3636 non-null   int64  
 19  Права супермодератора                       3636 non-null   int64  
 20  Подписка на уведомления                     3636 non-null   int64  
 21  Расширенные настройки прав доступа          3636 non-null   int64  
 22  Создание шаблона и копирование              3636 non-null   int64  
 23  Пропуск этапов                              3636 non-null   int64  
 24  Редактирование своих сообщений              3636 non-null   int64  
 25  Редактирование всех сообщений               3636 non-null   int64  
 26  Добавление обсуждений                       3636 non-null   int64  
 27  Чтение обсуждений                           3636 non-null   int64  
 28  Чтение и отправка сообщений                 3636 non-null   int64  
 29  hdbscan_cluster                             3636 non-null   int64  
 30  hdbscan_silhouette_vals                     3636 non-null   float64
 31  optics_cluster                              3636 non-null   int64  
 32  optics_silhouette_vals                      3636 non-null   float64
 33  dbscan_cluster                              3636 non-null   int64  
 34  dbscan_silhouette_vals                      3636 non-null   float64
dtypes: float64(3), int64(28), object(4)
memory usage: 994.3+ KB
None
Unnamed: 0 Скрытая роль Создание карточки Чтение карточки Редактирование карточки Удаление карточки Добавление файлов Редактирование всех файлов Удаление всех файлов Редактирование собственных файлов … Редактирование всех сообщений Добавление обсуждений Чтение обсуждений Чтение и отправка сообщений hdbscan_cluster hdbscan_silhouette_vals optics_cluster optics_silhouette_vals dbscan_cluster dbscan_silhouette_vals
count 3636.000000 3636.0 3636.000000 3636.0 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 … 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000 3636.000000
mean 1832.787129 0.0 0.639439 1.0 0.632013 0.271727 0.752750 0.390539 0.181518 0.756601 … 0.181518 0.756326 0.780253 0.770352 173.411441 0.574855 3.999450 0.307332 2.258526 0.224321
std 1059.108992 0.0 0.480229 0.0 0.482324 0.444911 0.431472 0.487938 0.385500 0.429193 … 0.385500 0.429358 0.414132 0.420664 163.876659 0.520804 6.694636 0.517693 5.158105 0.539778
min 0.000000 0.0 0.000000 1.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 … 0.000000 0.000000 0.000000 0.000000 -1.000000 -0.910676 -1.000000 -0.962357 -1.000000 -0.680342
25% 908.750000 0.0 0.000000 1.0 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 … 0.000000 1.000000 1.000000 1.000000 33.000000 0.186701 -1.000000 -0.096811 -1.000000 -0.177229
50% 1841.500000 0.0 1.000000 1.0 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 … 0.000000 1.000000 1.000000 1.000000 87.000000 0.999999 0.000000 0.118840 -1.000000 -0.082168
75% 2750.250000 0.0 1.000000 1.0 1.000000 1.000000 1.000000 1.000000 0.000000 1.000000 … 0.000000 1.000000 1.000000 1.000000 325.000000 1.000000 9.000000 0.933008 5.000000 0.933008
max 3659.000000 0.0 1.000000 1.0 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 … 1.000000 1.000000 1.000000 1.000000 538.000000 1.000000 19.000000 1.000000 15.000000 0.970052

8 rows × 31 columns

Out[18]:
Unnamed: 0 Название роли Тип роли Скрытая роль Тип карточки Состояние карточки Создание карточки Чтение карточки Редактирование карточки Удаление карточки … Редактирование всех сообщений Добавление обсуждений Чтение обсуждений Чтение и отправка сообщений hdbscan_cluster hdbscan_silhouette_vals optics_cluster optics_silhouette_vals dbscan_cluster dbscan_silhouette_vals
0 0 Королёв Леонид Сотрудник 0 Входящий документ Проект 1 1 1 1 … 1 1 1 1 16 0.999999 0 0.183154 -1 -0.101404
1 1 Королёв Леонид Сотрудник 0 Входящий документ На согласовании 1 1 1 1 … 1 1 1 1 6 1.000000 0 0.233769 -1 -0.052445
2 2 Королёв Леонид Сотрудник 0 Входящий документ Утвержден 1 1 1 1 … 1 1 1 1 3 1.000000 2 0.444444 -1 -0.055650
3 3 Королёв Леонид Сотрудник 0 Входящий документ Архив 1 1 1 1 … 1 1 1 1 38 1.000000 0 0.242934 -1 -0.055441
4 4 Королёв Леонид Сотрудник 0 Договор Проект 1 1 1 1 … 1 1 1 1 61 0.999999 0 0.087865 -1 -0.150827

5 rows × 35 columns

In [19]:
# Загрузка исходных тестовых данных 
# о модели предоставления разрешений 
# (в CSV требуется конвертировать в "UTF-8-BOM")
data = pd.read_csv('df_permission.csv', encoding='utf-8-sig', sep=',')#, sep=';')

# Замена пустынх значений и приведение типа поля к строковому
data = data.fillna('Unknown')

# Удаление пустых дубликатов строк
data = data.drop_duplicates()

print(data.info())
display(data.describe())

data.head(5)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3660 entries, 0 to 3659
Data columns (total 30 columns):
 #   Column                                      Non-Null Count  Dtype 
---  ------                                      --------------  ----- 
 0   Unnamed: 0                                  3660 non-null   int64 
 1   Название роли                               3660 non-null   object
 2   Тип роли                                    3660 non-null   object
 3   Скрытая роль                                3660 non-null   int64 
 4   Тип карточки                                3660 non-null   object
 5   Состояние карточки                          3660 non-null   object
 6   Создание карточки                           3660 non-null   int64 
 7   Чтение карточки                             3660 non-null   int64 
 8   Редактирование карточки                     3660 non-null   int64 
 9   Удаление карточки                           3660 non-null   int64 
 10  Добавление файлов                           3660 non-null   int64 
 11  Редактирование всех файлов                  3660 non-null   int64 
 12  Удаление всех файлов                        3660 non-null   int64 
 13  Редактирование собственных файлов           3660 non-null   int64 
 14  Удаление собственных файлов                 3660 non-null   int64 
 15  Инициация типового процесса отправки задач  3660 non-null   int64 
 16  Ручное редактирование номера                3660 non-null   int64 
 17  Редактирование маршрута                     3660 non-null   int64 
 18  Полный пересчет маршрута                    3660 non-null   int64 
 19  Права супермодератора                       3660 non-null   int64 
 20  Подписка на уведомления                     3660 non-null   int64 
 21  Расширенные настройки прав доступа          3660 non-null   int64 
 22  Создание шаблона и копирование              3660 non-null   int64 
 23  Пропуск этапов                              3660 non-null   int64 
 24  Редактирование своих сообщений              3660 non-null   int64 
 25  Редактирование всех сообщений               3660 non-null   int64 
 26  Добавление обсуждений                       3660 non-null   int64 
 27  Чтение обсуждений                           3660 non-null   int64 
 28  Чтение и отправка сообщений                 3660 non-null   int64 
 29  Название правила доступа                    3660 non-null   object
dtypes: int64(25), object(5)
memory usage: 857.9+ KB
None
Unnamed: 0 Скрытая роль Создание карточки Чтение карточки Редактирование карточки Удаление карточки Добавление файлов Редактирование всех файлов Удаление всех файлов Редактирование собственных файлов … Права супермодератора Подписка на уведомления Расширенные настройки прав доступа Создание шаблона и копирование Пропуск этапов Редактирование своих сообщений Редактирование всех сообщений Добавление обсуждений Чтение обсуждений Чтение и отправка сообщений
count 3660.00000 3660.0 3660.000000 3660.0 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 … 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000 3660.000000
mean 1829.50000 0.0 0.638525 1.0 0.631694 0.271585 0.754372 0.390164 0.180328 0.758197 … 0.180328 0.790437 0.180328 0.390164 0.180328 0.757104 0.180328 0.757923 0.781694 0.771858
std 1056.69532 0.0 0.480494 0.0 0.482411 0.444838 0.430518 0.487854 0.384513 0.428234 … 0.384513 0.407052 0.384513 0.487854 0.384513 0.428891 0.384513 0.428399 0.413153 0.419692
min 0.00000 0.0 0.000000 1.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 … 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 914.75000 0.0 0.000000 1.0 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 … 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000
50% 1829.50000 0.0 1.000000 1.0 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 … 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000
75% 2744.25000 0.0 1.000000 1.0 1.000000 1.000000 1.000000 1.000000 0.000000 1.000000 … 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 1.000000 1.000000
max 3659.00000 0.0 1.000000 1.0 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 … 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000

8 rows × 25 columns

Out[19]:
Unnamed: 0 Название роли Тип роли Скрытая роль Тип карточки Состояние карточки Создание карточки Чтение карточки Редактирование карточки Удаление карточки … Подписка на уведомления Расширенные настройки прав доступа Создание шаблона и копирование Пропуск этапов Редактирование своих сообщений Редактирование всех сообщений Добавление обсуждений Чтение обсуждений Чтение и отправка сообщений Название правила доступа
0 0 Королёв Леонид Сотрудник 0 Входящий документ Проект 1 1 1 1 … 1 1 1 1 1 1 1 1 1 Правило доступа 1
1 1 Королёв Леонид Сотрудник 0 Входящий документ На согласовании 1 1 1 1 … 1 1 1 1 1 1 1 1 1 Правило доступа 1
2 2 Королёв Леонид Сотрудник 0 Входящий документ Утвержден 1 1 1 1 … 1 1 1 1 1 1 1 1 1 Правило доступа 1
3 3 Королёв Леонид Сотрудник 0 Входящий документ Архив 1 1 1 1 … 1 1 1 1 1 1 1 1 1 Правило доступа 1
4 4 Королёв Леонид Сотрудник 0 Договор Проект 1 1 1 1 … 1 1 1 1 1 1 1 1 1 Правило доступа 1

5 rows × 30 columns

Запуск интерптетатора кластеров¶

In [21]:
# ЗАПУСК ИНТЕРПРЕТАЦИИ КЛАСТЕРОВ

# Проверяем наличие необходимых данных
if 'data_with_clusters' in locals() and 'data' in locals():
    print("🔍 Запуск модуля интерпретации кластеров...")
    
    # Валидация входных данных
    if validate_interpretation_input(data_with_clusters):
        # Конфигурация интерпретатора
        config = ClusterInterpretationConfig(
            silhouette_threshold=0.5,
            size_threshold=0.01,
            sensitive_operations=['Чтение карточки', 
                                  'Редактирование карточки', 
                                  'Удаление карточки', 
                                  'Редактирование всех файлов', 
                                  'Удаление всех файлов', 
                                  'Редактирование собственных файлов', 
                                  'Удаление собственных файлов']
        )
        
        # Создание интерпретатора
        interpreter = PermissionClusterInterpreter(config)
        
        # Запуск интерпретации
        interpretation_results = interpreter.interpret_clusters(
            data_with_clusters, 
            data
        )
        
        # Создание краткого резюме для руководства
        summary = create_executive_summary(interpretation_results)
        print("\n" + "="*70)
        print("🎯 КРАТКОЕ РЕЗЮМЕ ДЛЯ РУКОВОДСТВА")
        print("="*70)
        print(summary)
        
        print("\n✅ Интерпретация завершена! Результаты сохранены в файлы:")
        print("   - report_*.md - Отчеты для разных аудиторий")
        print("   - *.png - Визуализации")
        print("   - interpretation_summary.json - Структурированные данные")
        print("   - optimization_roadmap.md - Дорожная карта")
    else:
        print("❌ Ошибка: невалидные данные для интерпретации")
else:
    print("⚠️  Предупреждение: данные для интерпретации не найдены")
🔍 Запуск модуля интерпретации кластеров...
🚀 Запуск интерпретации кластеров пермиссий Tessa...
======================================================================

📈 ШАГ 1: Оценка качества кластеризации...
   - HDBSCAN: Отличное качество (средняя оценка: 0.705)
   - OPTICS: Отличное качество (средняя оценка: 0.707)
   - DBSCAN: Отличное качество (средняя оценка: 0.938)

🏆 ШАГ 2: Определение лучшего метода кластеризации...
   ✅ Лучший метод: HDBSCAN (взвешенная оценка: 3.562)

🏷️  ШАГ 3: Классификация кластеров (HDBSCAN)...
   - Кластер 16: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 6: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 3: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 38: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 61: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 39: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 25: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 85: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 41: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 20: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 11: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 69: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 10: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 2: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 1: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 9: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 81: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 40: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 26: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 59: Нормативный (23 объектов, 0.711%, силуэт: 1.000)
   - Кластер 36: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 18: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 12: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 17: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 86: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 62: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 45: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 60: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 67: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 44: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 28: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 42: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 23: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 7: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 4: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 22: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 58: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 64: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 47: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 82: Уникальный (2 объектов, 0.062%, силуэт: 0.583)
   - Кластер 35: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 19: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 13: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 37: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 87: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 63: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 46: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 84: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 66: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 43: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 27: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 68: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 24: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 8: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 5: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 21: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 80: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 65: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 48: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 83: Уникальный (8 объектов, 0.247%, силуэт: 1.000)
   - Кластер 92: Уникальный (2 объектов, 0.062%, силуэт: 0.372)
   - Кластер 94: Уникальный (2 объектов, 0.062%, силуэт: 0.181)
   - Кластер 97: Уникальный (2 объектов, 0.062%, силуэт: 0.265)
   - Кластер 98: Уникальный (2 объектов, 0.062%, силуэт: 0.265)
   - Кластер 125: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 249: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 391: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 394: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 124: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 252: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 380: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 381: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 126: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 250: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 392: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 393: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 123: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 251: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 379: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 382: Нормативный (48 объектов, 1.483%, силуэт: 1.000)
   - Кластер 78: Уникальный (2 объектов, 0.062%, силуэт: 0.288)
   - Кластер 79: Уникальный (4 объектов, 0.124%, силуэт: 0.214)
   - Кластер 57: Уникальный (2 объектов, 0.062%, силуэт: 0.323)
   - Кластер 50: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 72: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 70: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 33: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 52: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 76: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 74: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 31: Нормативный (65 объектов, 2.008%, силуэт: 1.000)
   - Кластер 29: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 54: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 53: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 15: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 30: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 56: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 55: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 14: Уникальный (10 объектов, 0.309%, силуэт: 0.893)
   - Кластер 49: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 73: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 71: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 34: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 51: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 77: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 75: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 32: Нормативный (19 объектов, 0.587%, силуэт: 1.000)
   - Кластер 402: Уникальный (5 объектов, 0.154%, силуэт: 0.838)
   - Кластер 398: Уникальный (5 объектов, 0.154%, силуэт: 0.846)
   - Кластер 390: Уникальный (5 объектов, 0.154%, силуэт: 0.860)
   - Кластер 403: Уникальный (5 объектов, 0.154%, силуэт: 0.839)
   - Кластер 416: Уникальный (5 объектов, 0.154%, силуэт: 0.838)
   - Кластер 409: Уникальный (5 объектов, 0.154%, силуэт: 0.843)
   - Кластер 405: Уникальный (5 объектов, 0.154%, силуэт: 0.852)
   - Кластер 417: Уникальный (5 объектов, 0.154%, силуэт: 0.839)
   - Кластер 412: Уникальный (5 объектов, 0.154%, силуэт: 0.838)
   - Кластер 404: Уникальный (5 объектов, 0.154%, силуэт: 0.846)
   - Кластер 401: Уникальный (5 объектов, 0.154%, силуэт: 0.857)
   - Кластер 411: Уникальный (5 объектов, 0.154%, силуэт: 0.839)
   - Кластер 400: Уникальный (5 объектов, 0.154%, силуэт: 0.838)
   - Кластер 389: Уникальный (5 объектов, 0.154%, силуэт: 0.846)
   - Кластер 378: Уникальный (5 объектов, 0.154%, силуэт: 0.862)
   - Кластер 399: Уникальный (5 объектов, 0.154%, силуэт: 0.839)
   - Кластер 415: Уникальный (5 объектов, 0.154%, силуэт: 0.838)
   - Кластер 410: Уникальный (5 объектов, 0.154%, силуэт: 0.844)
   - Кластер 406: Уникальный (6 объектов, 0.185%, силуэт: 0.611)
   - Кластер 414: Уникальный (5 объектов, 0.154%, силуэт: 0.839)
   - Кластер 127: Уникальный (5 объектов, 0.154%, силуэт: 0.068)
   - Кластер 128: Уникальный (3 объектов, 0.093%, силуэт: 0.340)
   - Кластер 110: Уникальный (2 объектов, 0.062%, силуэт: 0.088)
   - Кластер 107: Уникальный (5 объектов, 0.154%, силуэт: 0.234)
   - Кластер 113: Уникальный (2 объектов, 0.062%, силуэт: 0.199)
   - Кластер 105: Уникальный (2 объектов, 0.062%, силуэт: 0.125)
   - Кластер 114: Уникальный (3 объектов, 0.093%, силуэт: 0.186)
   - Кластер 101: Уникальный (2 объектов, 0.062%, силуэт: 0.202)
   - Кластер 129: Уникальный (5 объектов, 0.154%, силуэт: 0.009)
   - Кластер 102: Уникальный (4 объектов, 0.124%, силуэт: 0.156)
   - Кластер 88: Уникальный (2 объектов, 0.062%, силуэт: 0.343)
   - Кластер 120: Уникальный (2 объектов, 0.062%, силуэт: 0.255)
   - Кластер 115: Уникальный (3 объектов, 0.093%, силуэт: 0.243)
   - Кластер 106: Уникальный (2 объектов, 0.062%, силуэт: 0.255)
   - Кластер 119: Уникальный (2 объектов, 0.062%, силуэт: 0.176)
   - Кластер 108: Уникальный (2 объектов, 0.062%, силуэт: 0.201)
   - Кластер 112: Уникальный (2 объектов, 0.062%, силуэт: 0.580)
   - Кластер 130: Уникальный (4 объектов, 0.124%, силуэт: 0.329)
   - Кластер 104: Уникальный (3 объектов, 0.093%, силуэт: 0.147)
   - Кластер 109: Уникальный (4 объектов, 0.124%, силуэт: -0.012)
   - Кластер 116: Уникальный (2 объектов, 0.062%, силуэт: 0.182)
   - Кластер 121: Уникальный (3 объектов, 0.093%, силуэт: 0.192)
   - Кластер 111: Уникальный (2 объектов, 0.062%, силуэт: 0.499)
   - Кластер 348: Уникальный (4 объектов, 0.124%, силуэт: 0.085)
   - Кластер 287: Уникальный (4 объектов, 0.124%, силуэт: 0.059)
   - Кластер 384: Уникальный (3 объектов, 0.093%, силуэт: 0.309)
   - Кластер 193: Уникальный (4 объектов, 0.124%, силуэт: 0.181)
   - Кластер 278: Уникальный (3 объектов, 0.093%, силуэт: 0.036)
   - Кластер 242: Уникальный (2 объектов, 0.062%, силуэт: 0.159)
   - Кластер 332: Уникальный (3 объектов, 0.093%, силуэт: 0.159)
   - Кластер 456: Уникальный (8 объектов, 0.247%, силуэт: 0.119)
   - Кластер 257: Уникальный (2 объектов, 0.062%, силуэт: 0.406)
   - Кластер 420: Уникальный (8 объектов, 0.247%, силуэт: -0.020)
   - Кластер 507: Уникальный (4 объектов, 0.124%, силуэт: 0.165)
   - Кластер 238: Уникальный (5 объектов, 0.154%, силуэт: 0.020)
   - Кластер 243: Уникальный (7 объектов, 0.216%, силуэт: 0.074)
   - Кластер 295: Уникальный (8 объектов, 0.247%, силуэт: -0.102)
   - Кластер 455: Уникальный (3 объектов, 0.093%, силуэт: 0.107)
   - Кластер 186: Уникальный (3 объектов, 0.093%, силуэт: 0.174)
   - Кластер 492: Уникальный (2 объектов, 0.062%, силуэт: 0.636)
   - Кластер 184: Уникальный (2 объектов, 0.062%, силуэт: 0.271)
   - Кластер 465: Уникальный (3 объектов, 0.093%, силуэт: 0.143)
   - Кластер 422: Уникальный (4 объектов, 0.124%, силуэт: 0.273)
   - Кластер 358: Уникальный (4 объектов, 0.124%, силуэт: 0.367)
   - Кластер 331: Уникальный (2 объектов, 0.062%, силуэт: 0.307)
   - Кластер 534: Уникальный (2 объектов, 0.062%, силуэт: 0.383)
   - Кластер 290: Уникальный (4 объектов, 0.124%, силуэт: 0.127)
   - Кластер 351: Уникальный (2 объектов, 0.062%, силуэт: 0.160)
   - Кластер 347: Уникальный (2 объектов, 0.062%, силуэт: 0.477)
   - Кластер 368: Уникальный (5 объектов, 0.154%, силуэт: 0.175)
   - Кластер 225: Уникальный (2 объектов, 0.062%, силуэт: 0.378)
   - Кластер 339: Уникальный (6 объектов, 0.185%, силуэт: 0.096)
   - Кластер 187: Уникальный (2 объектов, 0.062%, силуэт: 0.147)
   - Кластер 212: Уникальный (4 объектов, 0.124%, силуэт: 0.177)
   - Кластер 226: Уникальный (5 объектов, 0.154%, силуэт: -0.091)
   - Кластер 202: Уникальный (4 объектов, 0.124%, силуэт: 0.190)
   - Кластер 376: Уникальный (4 объектов, 0.124%, силуэт: 0.111)
   - Кластер 323: Уникальный (3 объектов, 0.093%, силуэт: 0.232)
   - Кластер 155: Уникальный (2 объектов, 0.062%, силуэт: 0.193)
   - Кластер 490: Уникальный (2 объектов, 0.062%, силуэт: 0.440)
   - Кластер 469: Уникальный (2 объектов, 0.062%, силуэт: 0.308)
   - Кластер 366: Уникальный (5 объектов, 0.154%, силуэт: 0.119)
   - Кластер 463: Уникальный (3 объектов, 0.093%, силуэт: 0.110)
   - Кластер 427: Уникальный (2 объектов, 0.062%, силуэт: 0.149)
   - Кластер 307: Уникальный (2 объектов, 0.062%, силуэт: 0.257)
   - Кластер 525: Уникальный (3 объектов, 0.093%, силуэт: 0.147)
   - Кластер 526: Уникальный (2 объектов, 0.062%, силуэт: 0.333)
   - Кластер 435: Уникальный (5 объектов, 0.154%, силуэт: 0.338)
   - Кластер 459: Уникальный (4 объектов, 0.124%, силуэт: 0.275)
   - Кластер 276: Уникальный (3 объектов, 0.093%, силуэт: 0.167)
   - Кластер 321: Уникальный (8 объектов, 0.247%, силуэт: -0.074)
   - Кластер 275: Уникальный (3 объектов, 0.093%, силуэт: 0.129)
   - Кластер 330: Уникальный (3 объектов, 0.093%, силуэт: 0.338)
   - Кластер 253: Уникальный (2 объектов, 0.062%, силуэт: 0.386)
   - Кластер 232: Уникальный (4 объектов, 0.124%, силуэт: 0.167)
   - Кластер 297: Уникальный (3 объектов, 0.093%, силуэт: 0.669)
   - Кластер 533: Уникальный (4 объектов, 0.124%, силуэт: 0.195)
   - Кластер 138: Уникальный (4 объектов, 0.124%, силуэт: 0.137)
   - Кластер 337: Уникальный (3 объектов, 0.093%, силуэт: 0.287)
   - Кластер 294: Уникальный (4 объектов, 0.124%, силуэт: 0.200)
   - Кластер 325: Уникальный (5 объектов, 0.154%, силуэт: -0.012)
   - Кластер 501: Уникальный (4 объектов, 0.124%, силуэт: 0.249)
   - Кластер 511: Уникальный (2 объектов, 0.062%, силуэт: 0.400)
   - Кластер 163: Уникальный (3 объектов, 0.093%, силуэт: 0.176)
   - Кластер 151: Уникальный (2 объектов, 0.062%, силуэт: 0.190)
   - Кластер 273: Уникальный (2 объектов, 0.062%, силуэт: 0.582)
   - Кластер 283: Уникальный (3 объектов, 0.093%, силуэт: 0.219)
   - Кластер 272: Уникальный (4 объектов, 0.124%, силуэт: 0.537)
   - Кластер 346: Уникальный (2 объектов, 0.062%, силуэт: 0.961)
   - Кластер 299: Уникальный (2 объектов, 0.062%, силуэт: 0.438)
   - Кластер 428: Уникальный (4 объектов, 0.124%, силуэт: 0.146)
   - Кластер 156: Уникальный (3 объектов, 0.093%, силуэт: 0.103)
   - Кластер 147: Уникальный (3 объектов, 0.093%, силуэт: 0.471)
   - Кластер 518: Уникальный (5 объектов, 0.154%, силуэт: 0.220)
   - Кластер 203: Уникальный (2 объектов, 0.062%, силуэт: 0.960)
   - Кластер 372: Уникальный (3 объектов, 0.093%, силуэт: 0.254)
   - Кластер 474: Уникальный (4 объектов, 0.124%, силуэт: 0.254)
   - Кластер 356: Уникальный (4 объектов, 0.124%, силуэт: 0.121)
   - Кластер 132: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 485: Уникальный (3 объектов, 0.093%, силуэт: 0.418)
   - Кластер 495: Уникальный (3 объектов, 0.093%, силуэт: 0.029)
   - Кластер 244: Уникальный (3 объектов, 0.093%, силуэт: 0.317)
   - Кластер 352: Уникальный (2 объектов, 0.062%, силуэт: 0.267)
   - Кластер 425: Уникальный (2 объектов, 0.062%, силуэт: 0.160)
   - Кластер 158: Уникальный (2 объектов, 0.062%, силуэт: 0.952)
   - Кластер 329: Уникальный (2 объектов, 0.062%, силуэт: 0.413)
   - Кластер 254: Уникальный (2 объектов, 0.062%, силуэт: 0.311)
   - Кластер 241: Уникальный (6 объектов, 0.185%, силуэт: 0.073)
   - Кластер 134: Уникальный (4 объектов, 0.124%, силуэт: -0.083)
   - Кластер 169: Уникальный (3 объектов, 0.093%, силуэт: 0.113)
   - Кластер 143: Уникальный (7 объектов, 0.216%, силуэт: 0.066)
   - Кластер 369: Уникальный (3 объектов, 0.093%, силуэт: 0.072)
   - Кластер 289: Уникальный (2 объектов, 0.062%, силуэт: 0.189)
   - Кластер 279: Уникальный (3 объектов, 0.093%, силуэт: 0.278)
   - Кластер 439: Уникальный (4 объектов, 0.124%, силуэт: 0.213)
   - Кластер 118: Уникальный (2 объектов, 0.062%, силуэт: 0.429)
   - Кластер 437: Уникальный (5 объектов, 0.154%, силуэт: 0.091)
   - Кластер 491: Уникальный (4 объектов, 0.124%, силуэт: 0.030)
   - Кластер 298: Уникальный (3 объектов, 0.093%, силуэт: 0.238)
   - Кластер 441: Уникальный (3 объектов, 0.093%, силуэт: 0.164)
   - Кластер 223: Уникальный (4 объектов, 0.124%, силуэт: 0.072)
   - Кластер 353: Уникальный (2 объектов, 0.062%, силуэт: 0.147)
   - Кластер 535: Уникальный (2 объектов, 0.062%, силуэт: 0.161)
   - Кластер 479: Уникальный (3 объектов, 0.093%, силуэт: 0.101)
   - Кластер 256: Уникальный (3 объектов, 0.093%, силуэт: 0.187)
   - Кластер 135: Уникальный (2 объектов, 0.062%, силуэт: 0.156)
   - Кластер 451: Уникальный (2 объектов, 0.062%, силуэт: 0.524)
   - Кластер 258: Уникальный (3 объектов, 0.093%, силуэт: 0.139)
   - Кластер 227: Уникальный (2 объектов, 0.062%, силуэт: 0.223)
   - Кластер 338: Уникальный (2 объектов, 0.062%, силуэт: 0.355)
   - Кластер 386: Уникальный (2 объектов, 0.062%, силуэт: 0.491)
   - Кластер 496: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 327: Уникальный (4 объектов, 0.124%, силуэт: 0.090)
   - Кластер 281: Уникальный (4 объектов, 0.124%, силуэт: 0.252)
   - Кластер 265: Уникальный (3 объектов, 0.093%, силуэт: 0.138)
   - Кластер 136: Уникальный (3 объектов, 0.093%, силуэт: 0.088)
   - Кластер 172: Уникальный (2 объектов, 0.062%, силуэт: 0.604)
   - Кластер 154: Уникальный (4 объектов, 0.124%, силуэт: 0.135)
   - Кластер 288: Уникальный (3 объектов, 0.093%, силуэт: 0.167)
   - Кластер 387: Уникальный (2 объектов, 0.062%, силуэт: 0.421)
   - Кластер 527: Уникальный (3 объектов, 0.093%, силуэт: 0.157)
   - Кластер 217: Уникальный (6 объектов, 0.185%, силуэт: 0.056)
   - Кластер 467: Уникальный (5 объектов, 0.154%, силуэт: 0.118)
   - Кластер 421: Уникальный (2 объектов, 0.062%, силуэт: 0.962)
   - Кластер 383: Уникальный (6 объектов, 0.185%, силуэт: 0.032)
   - Кластер 486: Уникальный (3 объектов, 0.093%, силуэт: 0.143)
   - Кластер 222: Уникальный (2 объектов, 0.062%, силуэт: 0.207)
   - Кластер 388: Уникальный (2 объектов, 0.062%, силуэт: 0.248)
   - Кластер 487: Уникальный (4 объектов, 0.124%, силуэт: 0.068)
   - Кластер 188: Уникальный (2 объектов, 0.062%, силуэт: 0.480)
   - Кластер 302: Уникальный (3 объектов, 0.093%, силуэт: 0.205)
   - Кластер 266: Уникальный (4 объектов, 0.124%, силуэт: 0.083)
   - Кластер 438: Уникальный (2 объектов, 0.062%, силуэт: 0.306)
   - Кластер 385: Уникальный (5 объектов, 0.154%, силуэт: 0.136)
   - Кластер 444: Уникальный (4 объектов, 0.124%, силуэт: 0.153)
   - Кластер 274: Уникальный (2 объектов, 0.062%, силуэт: 0.246)
   - Кластер 230: Уникальный (3 объектов, 0.093%, силуэт: 0.258)
   - Кластер 500: Уникальный (4 объектов, 0.124%, силуэт: 0.026)
   - Кластер 280: Уникальный (3 объектов, 0.093%, силуэт: -0.056)
   - Кластер 164: Уникальный (3 объектов, 0.093%, силуэт: 0.330)
   - Кластер 207: Уникальный (2 объектов, 0.062%, силуэт: 0.409)
   - Кластер 377: Уникальный (6 объектов, 0.185%, силуэт: 0.049)
   - Кластер 285: Уникальный (3 объектов, 0.093%, силуэт: 0.435)
   - Кластер 271: Уникальный (2 объектов, 0.062%, силуэт: 0.928)
   - Кластер 235: Уникальный (3 объектов, 0.093%, силуэт: 0.132)
   - Кластер 185: Уникальный (2 объектов, 0.062%, силуэт: 0.532)
   - Кластер 268: Уникальный (3 объектов, 0.093%, силуэт: 0.213)
   - Кластер 199: Уникальный (2 объектов, 0.062%, силуэт: 0.198)
   - Кластер 454: Уникальный (2 объектов, 0.062%, силуэт: 0.387)
   - Кластер 365: Уникальный (2 объектов, 0.062%, силуэт: 0.328)
   - Кластер 267: Уникальный (3 объектов, 0.093%, силуэт: 0.174)
   - Кластер 117: Уникальный (2 объектов, 0.062%, силуэт: 0.128)
   - Кластер 148: Уникальный (2 объектов, 0.062%, силуэт: 0.306)
   - Кластер 198: Уникальный (3 объектов, 0.093%, силуэт: 0.121)
   - Кластер 460: Уникальный (2 объектов, 0.062%, силуэт: 0.447)
   - Кластер 343: Уникальный (7 объектов, 0.216%, силуэт: -0.013)
   - Кластер 537: Уникальный (3 объектов, 0.093%, силуэт: 0.229)
   - Кластер 364: Уникальный (5 объектов, 0.154%, силуэт: -0.023)
   - Кластер 447: Уникальный (2 объектов, 0.062%, силуэт: 0.554)
   - Кластер 494: Уникальный (3 объектов, 0.093%, силуэт: 0.127)
   - Кластер 433: Уникальный (3 объектов, 0.093%, силуэт: 0.285)
   - Кластер 141: Уникальный (2 объектов, 0.062%, силуэт: 0.480)
   - Кластер 482: Уникальный (4 объектов, 0.124%, силуэт: 0.059)
   - Кластер 436: Уникальный (3 объектов, 0.093%, силуэт: 0.192)
   - Кластер 514: Уникальный (4 объектов, 0.124%, силуэт: 0.052)
   - Кластер 239: Уникальный (3 объектов, 0.093%, силуэт: 0.461)
   - Кластер 423: Уникальный (3 объектов, 0.093%, силуэт: 0.198)
   - Кластер 195: Уникальный (2 объектов, 0.062%, силуэт: 0.189)
   - Кластер 481: Уникальный (3 объектов, 0.093%, силуэт: 0.238)
   - Кластер 357: Уникальный (2 объектов, 0.062%, силуэт: 0.253)
   - Кластер 161: Уникальный (2 объектов, 0.062%, силуэт: 0.346)
   - Кластер 174: Уникальный (2 объектов, 0.062%, силуэт: 0.268)
   - Кластер 448: Уникальный (2 объектов, 0.062%, силуэт: 0.395)
   - Кластер 341: Уникальный (3 объектов, 0.093%, силуэт: 0.094)
   - Кластер 246: Уникальный (2 объектов, 0.062%, силуэт: 0.565)
   - Кластер 175: Уникальный (3 объектов, 0.093%, силуэт: 0.115)
   - Кластер 234: Уникальный (2 объектов, 0.062%, силуэт: 0.305)
   - Кластер 502: Уникальный (3 объектов, 0.093%, силуэт: 0.161)
   - Кластер 149: Уникальный (2 объектов, 0.062%, силуэт: 0.416)
   - Кластер 462: Уникальный (4 объектов, 0.124%, силуэт: 0.276)
   - Кластер 228: Уникальный (2 объектов, 0.062%, силуэт: 0.129)
   - Кластер 259: Уникальный (4 объектов, 0.124%, силуэт: 0.222)
   - Кластер 318: Уникальный (8 объектов, 0.247%, силуэт: 0.006)
   - Кластер 229: Уникальный (2 объектов, 0.062%, силуэт: 0.924)
   - Кластер 211: Уникальный (3 объектов, 0.093%, силуэт: 0.200)
   - Кластер 213: Уникальный (2 объектов, 0.062%, силуэт: 0.539)
   - Кластер 508: Уникальный (2 объектов, 0.062%, силуэт: 0.121)
   - Кластер 489: Уникальный (3 объектов, 0.093%, силуэт: 0.068)
   - Кластер 144: Уникальный (2 объектов, 0.062%, силуэт: 0.191)
   - Кластер 210: Уникальный (2 объектов, 0.062%, силуэт: 0.238)
   - Кластер 312: Уникальный (2 объектов, 0.062%, силуэт: 0.612)
   - Кластер 328: Уникальный (2 объектов, 0.062%, силуэт: 0.257)
   - Кластер 205: Уникальный (3 объектов, 0.093%, силуэт: 0.276)
   - Кластер 413: Уникальный (2 объектов, 0.062%, силуэт: 0.258)
   - Кластер 316: Уникальный (2 объектов, 0.062%, силуэт: 0.291)
   - Кластер 359: Уникальный (2 объектов, 0.062%, силуэт: 0.300)
   - Кластер 426: Уникальный (4 объектов, 0.124%, силуэт: 0.187)
   - Кластер 480: Уникальный (3 объектов, 0.093%, силуэт: 0.300)
   - Кластер 247: Уникальный (3 объектов, 0.093%, силуэт: 0.080)
   - Кластер 523: Уникальный (2 объектов, 0.062%, силуэт: 0.229)
   - Кластер 208: Уникальный (2 объектов, 0.062%, силуэт: 0.207)
   - Кластер 457: Уникальный (4 объектов, 0.124%, силуэт: 0.019)
   - Кластер 524: Уникальный (4 объектов, 0.124%, силуэт: 0.254)
   - Кластер 245: Уникальный (2 объектов, 0.062%, силуэт: 0.231)
   - Кластер 261: Уникальный (2 объектов, 0.062%, силуэт: 0.296)
   - Кластер 354: Уникальный (2 объектов, 0.062%, силуэт: 0.337)
   - Кластер 334: Уникальный (3 объектов, 0.093%, силуэт: 0.178)
   - Кластер 419: Уникальный (4 объектов, 0.124%, силуэт: -0.035)
   - Кластер 150: Уникальный (3 объектов, 0.093%, силуэт: 0.200)
   - Кластер 264: Уникальный (2 объектов, 0.062%, силуэт: 0.375)
   - Кластер 397: Уникальный (4 объектов, 0.124%, силуэт: 0.179)
   - Кластер 219: Уникальный (2 объектов, 0.062%, силуэт: 0.421)
   - Кластер 315: Уникальный (4 объектов, 0.124%, силуэт: 0.145)
   - Кластер 458: Уникальный (2 объектов, 0.062%, силуэт: 0.462)
   - Кластер 189: Уникальный (3 объектов, 0.093%, силуэт: 0.249)
   - Кластер 168: Уникальный (3 объектов, 0.093%, силуэт: 0.231)
   - Кластер 319: Уникальный (4 объектов, 0.124%, силуэт: 0.057)
   - Кластер 200: Уникальный (2 объектов, 0.062%, силуэт: 0.580)
   - Кластер 345: Уникальный (5 объектов, 0.154%, силуэт: 0.080)
   - Кластер 509: Уникальный (2 объектов, 0.062%, силуэт: 0.356)
   - Кластер 442: Уникальный (2 объектов, 0.062%, силуэт: 0.292)
   - Кластер 233: Уникальный (4 объектов, 0.124%, силуэт: 0.124)
   - Кластер 197: Уникальный (2 объектов, 0.062%, силуэт: 0.286)
   - Кластер 373: Уникальный (3 объектов, 0.093%, силуэт: 0.578)
   - Кластер 503: Уникальный (2 объектов, 0.062%, силуэт: 0.474)
   - Кластер 206: Уникальный (2 объектов, 0.062%, силуэт: 0.223)
   - Кластер 220: Уникальный (2 объектов, 0.062%, силуэт: 0.254)
   - Кластер 221: Уникальный (2 объектов, 0.062%, силуэт: 0.287)
   - Кластер 215: Уникальный (2 объектов, 0.062%, силуэт: 0.961)
   - Кластер 313: Уникальный (3 объектов, 0.093%, силуэт: 0.232)
   - Кластер 536: Уникальный (3 объектов, 0.093%, силуэт: 0.234)
   - Кластер 167: Уникальный (4 объектов, 0.124%, силуэт: 0.061)
   - Кластер 471: Уникальный (2 объектов, 0.062%, силуэт: 0.233)
   - Кластер 342: Уникальный (2 объектов, 0.062%, силуэт: 0.208)
   - Кластер 131: Уникальный (2 объектов, 0.062%, силуэт: 0.281)
   - Кластер 270: Уникальный (4 объектов, 0.124%, силуэт: 0.179)
   - Кластер 182: Уникальный (3 объектов, 0.093%, силуэт: 0.333)
   - Кластер 510: Уникальный (2 объектов, 0.062%, силуэт: 0.252)
   - Кластер 305: Уникальный (6 объектов, 0.185%, силуэт: 0.087)
   - Кластер 466: Уникальный (2 объектов, 0.062%, силуэт: 0.156)
   - Кластер 443: Уникальный (4 объектов, 0.124%, силуэт: 0.273)
   - Кластер 498: Уникальный (2 объектов, 0.062%, силуэт: 0.347)
   - Кластер 304: Уникальный (2 объектов, 0.062%, силуэт: 0.315)
   - Кластер 450: Уникальный (3 объектов, 0.093%, силуэт: 0.308)
   - Кластер 122: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 512: Уникальный (2 объектов, 0.062%, силуэт: 0.306)
   - Кластер 424: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 183: Уникальный (2 объектов, 0.062%, силуэт: 0.167)
   - Кластер 418: Уникальный (2 объектов, 0.062%, силуэт: 0.378)
   - Кластер 529: Уникальный (2 объектов, 0.062%, силуэт: 0.352)
   - Кластер 204: Уникальный (2 объектов, 0.062%, силуэт: 0.177)
   - Кластер 521: Уникальный (2 объектов, 0.062%, силуэт: 0.197)
   - Кластер 375: Уникальный (2 объектов, 0.062%, силуэт: 0.344)
   - Кластер 166: Уникальный (3 объектов, 0.093%, силуэт: 0.255)
   - Кластер 180: Уникальный (2 объектов, 0.062%, силуэт: 0.249)
   - Кластер 262: Уникальный (3 объектов, 0.093%, силуэт: 0.105)
   - Кластер 286: Уникальный (2 объектов, 0.062%, силуэт: 0.157)
   - Кластер 237: Уникальный (4 объектов, 0.124%, силуэт: 0.110)
   - Кластер 140: Уникальный (5 объектов, 0.154%, силуэт: 0.107)
   - Кластер 395: Уникальный (2 объектов, 0.062%, силуэт: 0.188)
   - Кластер 157: Уникальный (3 объектов, 0.093%, силуэт: 0.169)
   - Кластер 139: Уникальный (2 объектов, 0.062%, силуэт: 0.159)
   - Кластер 473: Уникальный (2 объектов, 0.062%, силуэт: 0.303)
   - Кластер 209: Уникальный (3 объектов, 0.093%, силуэт: 0.330)
   - Кластер 516: Уникальный (2 объектов, 0.062%, силуэт: 0.213)
   - Кластер 478: Уникальный (3 объектов, 0.093%, силуэт: 0.266)
   - Кластер 170: Уникальный (2 объектов, 0.062%, силуэт: 0.200)
   - Кластер 152: Уникальный (3 объектов, 0.093%, силуэт: 0.580)
   - Кластер 504: Уникальный (4 объектов, 0.124%, силуэт: 0.014)
   - Кластер 293: Уникальный (2 объектов, 0.062%, силуэт: 0.212)
   - Кластер 145: Уникальный (3 объектов, 0.093%, силуэт: 0.183)
   - Кластер 429: Уникальный (2 объектов, 0.062%, силуэт: 0.296)
   - Кластер 371: Уникальный (2 объектов, 0.062%, силуэт: 0.162)
   - Кластер 470: Уникальный (5 объектов, 0.154%, силуэт: 0.228)
   - Кластер 310: Уникальный (5 объектов, 0.154%, силуэт: 0.078)
   - Кластер 453: Уникальный (2 объектов, 0.062%, силуэт: 0.248)
   - Кластер 493: Уникальный (2 объектов, 0.062%, силуэт: 0.188)
   - Кластер 530: Уникальный (3 объектов, 0.093%, силуэт: 0.200)
   - Кластер 340: Уникальный (2 объектов, 0.062%, силуэт: 0.139)
   - Кластер 407: Уникальный (3 объектов, 0.093%, силуэт: 0.252)
   - Кластер 362: Уникальный (2 объектов, 0.062%, силуэт: 0.332)
   - Кластер 370: Уникальный (4 объектов, 0.124%, силуэт: 0.186)
   - Кластер 367: Уникальный (4 объектов, 0.124%, силуэт: 0.295)
   - Кластер 350: Уникальный (4 объектов, 0.124%, силуэт: 0.162)
   - Кластер 263: Уникальный (2 объектов, 0.062%, силуэт: 0.153)
   - Кластер 291: Уникальный (3 объектов, 0.093%, силуэт: 0.247)
   - Кластер 440: Уникальный (3 объектов, 0.093%, силуэт: 0.482)
   - Кластер 335: Уникальный (2 объектов, 0.062%, силуэт: 0.538)
   - Кластер 528: Уникальный (5 объектов, 0.154%, силуэт: 0.223)
   - Кластер 355: Уникальный (2 объектов, 0.062%, силуэт: 0.366)
   - Кластер 531: Уникальный (2 объектов, 0.062%, силуэт: 0.231)
   - Кластер 201: Уникальный (2 объектов, 0.062%, силуэт: 0.429)
   - Кластер 153: Уникальный (2 объектов, 0.062%, силуэт: 0.345)
   - Кластер 434: Уникальный (2 объектов, 0.062%, силуэт: 0.306)
   - Кластер 476: Уникальный (2 объектов, 0.062%, силуэт: 0.148)
   - Кластер 363: Уникальный (2 объектов, 0.062%, силуэт: 0.280)
   - Кластер 236: Уникальный (2 объектов, 0.062%, силуэт: 0.249)
   - Кластер 133: Уникальный (2 объектов, 0.062%, силуэт: 0.338)
   - Кластер 190: Уникальный (2 объектов, 0.062%, силуэт: 0.207)
   - Кластер 468: Уникальный (3 объектов, 0.093%, силуэт: 0.227)
   - Кластер 336: Уникальный (2 объектов, 0.062%, силуэт: 0.396)
   - Кластер 231: Уникальный (2 объектов, 0.062%, силуэт: 0.213)
   - Кластер 176: Уникальный (2 объектов, 0.062%, силуэт: 0.142)
   - Кластер 277: Уникальный (2 объектов, 0.062%, силуэт: 0.198)
   - Кластер 499: Уникальный (2 объектов, 0.062%, силуэт: 0.230)
   - Кластер 349: Уникальный (2 объектов, 0.062%, силуэт: 0.366)
   - Кластер 408: Уникальный (2 объектов, 0.062%, силуэт: 0.342)
   - Кластер 477: Уникальный (2 объектов, 0.062%, силуэт: 0.252)
   - Кластер 178: Уникальный (3 объектов, 0.093%, силуэт: 0.119)
   - Кластер 461: Уникальный (2 объектов, 0.062%, силуэт: 0.289)
   - Кластер 515: Уникальный (3 объектов, 0.093%, силуэт: 0.088)
   - Кластер 322: Уникальный (2 объектов, 0.062%, силуэт: 0.194)
   - Кластер 374: Уникальный (3 объектов, 0.093%, силуэт: 0.255)
   - Кластер 324: Уникальный (2 объектов, 0.062%, силуэт: 0.286)
   - Кластер 505: Уникальный (2 объектов, 0.062%, силуэт: 0.379)
   - Кластер 284: Уникальный (2 объектов, 0.062%, силуэт: 0.321)
   - Кластер 497: Уникальный (3 объектов, 0.093%, силуэт: 0.266)
   - Кластер 520: Уникальный (2 объектов, 0.062%, силуэт: 0.325)
   - Кластер 432: Уникальный (3 объектов, 0.093%, силуэт: 0.345)
   - Кластер 162: Уникальный (2 объектов, 0.062%, силуэт: 0.494)
   - Кластер 396: Уникальный (4 объектов, 0.124%, силуэт: 0.013)
   - Кластер 260: Уникальный (2 объектов, 0.062%, силуэт: 0.957)
   - Кластер 137: Уникальный (2 объектов, 0.062%, силуэт: 0.300)
   - Кластер 475: Уникальный (2 объектов, 0.062%, силуэт: 0.241)
   - Кластер 311: Уникальный (3 объектов, 0.093%, силуэт: 0.219)
   - Кластер 142: Уникальный (2 объектов, 0.062%, силуэт: 0.369)
   - Кластер 159: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 248: Уникальный (2 объектов, 0.062%, силуэт: 0.154)
   - Кластер 173: Уникальный (2 объектов, 0.062%, силуэт: 0.471)
   - Кластер 309: Уникальный (2 объектов, 0.062%, силуэт: 0.388)
   - Кластер 320: Уникальный (3 объектов, 0.093%, силуэт: 0.190)
   - Кластер 194: Уникальный (2 объектов, 0.062%, силуэт: 0.205)
   - Кластер 171: Уникальный (2 объектов, 0.062%, силуэт: 0.092)
   - Кластер 255: Уникальный (2 объектов, 0.062%, силуэт: 0.965)
   - Кластер 519: Уникальный (2 объектов, 0.062%, силуэт: 0.175)
   - Кластер 308: Уникальный (4 объектов, 0.124%, силуэт: 0.220)
   - Кластер 464: Уникальный (2 объектов, 0.062%, силуэт: 1.000)
   - Кластер 177: Уникальный (2 объектов, 0.062%, силуэт: 0.634)
   - Кластер 303: Уникальный (2 объектов, 0.062%, силуэт: 0.487)
   - Кластер 484: Уникальный (2 объектов, 0.062%, силуэт: 0.289)
   - Кластер 333: Уникальный (2 объектов, 0.062%, силуэт: 0.305)
   - Кластер 538: Уникальный (2 объектов, 0.062%, силуэт: 0.336)
   - Кластер 99: Уникальный (2 объектов, 0.062%, силуэт: 0.269)
   - Кластер 160: Уникальный (2 объектов, 0.062%, силуэт: 0.262)
   - Кластер 214: Уникальный (2 объектов, 0.062%, силуэт: 0.128)
   - Кластер 95: Уникальный (2 объектов, 0.062%, силуэт: 0.128)
   - Кластер 488: Уникальный (2 объектов, 0.062%, силуэт: 0.187)
   - Кластер 192: Уникальный (2 объектов, 0.062%, силуэт: 0.292)
   - Кластер 326: Уникальный (3 объектов, 0.093%, силуэт: 0.260)
   - Кластер 317: Уникальный (5 объектов, 0.154%, силуэт: 0.229)
   - Кластер 282: Уникальный (2 объектов, 0.062%, силуэт: 0.920)
   - Кластер 146: Уникальный (2 объектов, 0.062%, силуэт: 0.266)
   - Кластер 269: Уникальный (4 объектов, 0.124%, силуэт: 0.208)
   - Кластер 472: Уникальный (2 объектов, 0.062%, силуэт: 0.184)
   - Кластер 446: Уникальный (2 объектов, 0.062%, силуэт: 0.166)
   - Кластер 361: Уникальный (2 объектов, 0.062%, силуэт: 0.088)
   - Кластер 430: Уникальный (2 объектов, 0.062%, силуэт: 0.281)
   - Кластер 240: Уникальный (2 объектов, 0.062%, силуэт: 0.238)
   - Кластер 452: Уникальный (2 объектов, 0.062%, силуэт: 0.213)
   - Кластер 517: Уникальный (2 объектов, 0.062%, силуэт: 0.916)
   - Кластер 344: Уникальный (2 объектов, 0.062%, силуэт: 0.237)
   - Кластер 179: Уникальный (3 объектов, 0.093%, силуэт: 0.483)
   - Кластер 522: Уникальный (3 объектов, 0.093%, силуэт: 0.229)
   - Кластер 360: Уникальный (3 объектов, 0.093%, силуэт: 0.228)
   - Кластер 300: Уникальный (3 объектов, 0.093%, силуэт: 0.144)
   - Кластер 314: Уникальный (2 объектов, 0.062%, силуэт: 0.558)
   - Кластер 196: Уникальный (2 объектов, 0.062%, силуэт: 0.195)
   - Кластер 449: Уникальный (2 объектов, 0.062%, силуэт: 0.515)
   - Кластер 506: Уникальный (2 объектов, 0.062%, силуэт: 0.361)
   - Кластер 306: Уникальный (2 объектов, 0.062%, силуэт: 0.921)
   - Кластер 165: Уникальный (2 объектов, 0.062%, силуэт: 0.343)
   - Кластер 218: Уникальный (2 объектов, 0.062%, силуэт: 0.169)
   - Кластер 431: Уникальный (2 объектов, 0.062%, силуэт: 0.180)
   - Кластер 513: Уникальный (2 объектов, 0.062%, силуэт: 0.340)
   - Кластер 532: Уникальный (2 объектов, 0.062%, силуэт: 0.317)
   - Кластер 296: Уникальный (2 объектов, 0.062%, силуэт: 0.129)
   - Кластер 292: Уникальный (3 объектов, 0.093%, силуэт: 0.294)
   - Кластер 181: Уникальный (2 объектов, 0.062%, силуэт: 0.197)
   - Кластер 301: Уникальный (2 объектов, 0.062%, силуэт: 0.201)
   - Кластер 445: Уникальный (3 объектов, 0.093%, силуэт: 0.287)
   - Кластер 224: Уникальный (2 объектов, 0.062%, силуэт: 0.454)
   - Кластер 483: Уникальный (3 объектов, 0.093%, силуэт: 0.156)
   - Кластер 216: Уникальный (3 объектов, 0.093%, силуэт: 0.166)
   - Кластер 191: Уникальный (3 объектов, 0.093%, силуэт: 0.164)
   - Кластер 100: Уникальный (3 объектов, 0.093%, силуэт: 0.227)
   - Кластер 96: Уникальный (2 объектов, 0.062%, силуэт: 0.350)
   - Кластер 103: Уникальный (2 объектов, 0.062%, силуэт: 0.344)
   - Кластер 91: Уникальный (4 объектов, 0.124%, силуэт: 0.024)
   - Кластер 93: Уникальный (2 объектов, 0.062%, силуэт: 0.412)
   - Кластер 89: Уникальный (2 объектов, 0.062%, силуэт: 0.349)
   - Кластер 90: Уникальный (2 объектов, 0.062%, силуэт: 0.172)
   - Кластер 0: Уникальный (2 объектов, 0.062%, силуэт: 0.146)

🏢 ШАГ 4: Сопоставление с организационной структурой...

⚠️  ШАГ 5: Оценка рисков безопасности...

🔧 ШАГ 6: Генерация рекомендаций...
   📋 Сгенерировано рекомендаций: 296
     - business_analysts: 8 рекомендаций
     - data_analysts: 288 рекомендаций

📄 ШАГ 7: Формирование отчетов для стейкхолдеров...
   ✅ Отчеты сформированы для 5 аудиторий

📊 ШАГ 8: Создание визуализаций...
   ✅ Создано 4 типа визуализаций

💾 ШАГ 9: Сохранение результатов...
   📄 Отчет для leadership: report_leadership.md
   📄 Отчет для business_analysts: report_business_analysts.md
   📄 Отчет для system_admins: report_system_admins.md
   📄 Отчет для security: report_security.md
   📄 Отчет для data_analysts: report_data_analysts.md
   💾 Итоговый файл: interpretation_summary.json

🗺️  ШАГ 10: Формирование дорожной карты оптимизации...
   ✅ Дорожная карта сохранена: optimization_roadmap.md
   📋 Задач по срокам:
     - Немедленно: 0
     - Краткосрочно: 0
     - Среднесрочно: 0
     - Долгосрочно: 296
======================================================================
✅ Интерпретация кластеров успешно завершена!
📊 Проанализировано кластеров: 539
⚠️  Выявлено рисковых кластеров: 0
🔧 Рекомендаций по оптимизации: 296

======================================================================
🎯 КРАТКОЕ РЕЗЮМЕ ДЛЯ РУКОВОДСТВА
======================================================================

# 🎯 КРАТКОЕ РЕЗЮМЕ ДЛЯ РУКОВОДСТВА

## Основные выводы анализа модели доступа Tessa

### 📊 **Статистика анализа**
- **Метод анализа**: HDBSCAN (наиболее точный)
- **Всего кластеров**: 539
- **Нормальных паттернов**: 52 (10%)
- **Критических рисков**: 0

### ⚠️ **Ключевые риски безопасности**

### 🔧 **Возможности оптимизации**
- **Стандартизация ролей**: 52 паттернов для формализации
- **Снижение рисков**: 0 кластеров для аудита
- **Экономия времени администрирования**: До 30% за счет стандартизации

### 🎯 **Рекомендуемые действия**
1. **Немедленно**: Аудит 0 критических кластеров
2. **В течение недели**: Стандартизация 5 основных ролей
3. **В течение месяца**: Внедрение RBAC для 80% пользователей

### 📈 **Ожидаемая бизнес-ценность**
- **Повышение безопасности**: Снижение рисков на 0.000%
- **Эффективность администрирования**: Сокращение времени на управление доступом
- **Соответствие требованиям**: Улучшение аудита и контроля


✅ Интерпретация завершена! Результаты сохранены в файлы:
   - report_*.md - Отчеты для разных аудиторий
   - *.png - Визуализации
   - interpretation_summary.json - Структурированные данные
   - optimization_roadmap.md - Дорожная карта

Python tessa анализ информационная система кластерный анализ корпоративная информационная система практика

Предыдущая статьяОт MVP к AI-ready платформе

Рубрики

Метки

abc abcd Apache Airflow CI/CD Data Warehouse Docker excel Git Grafana Great Expectations ms sql pandas PostgreSQL Python sql tessa VBA xyz Zabbix анализ виртуальный помощник данные знания информационная система информация искусственный интеллект кластерный анализ компетенции корпоративная информационная система маркетинг математика мудрость о проекте оптимизация ошибка практика программное обеспечение ролевая модель теория теория вероятностей тесса тест хранилище данных юмор языки программирования

Политика конфиденциальности

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




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)