Здесь представлена интерпретация результатов кластеризации моделей предоставления разрешений в Tessa. Интерпретация предназначена для разъяснения результатов кластеризации руководству организации, бизнес-аналитикам, аналитикам данных, системным администраторам Tessa и ответственным за информационную и кибер безопасность.
Файлы с отчетами о результатах интерпретации¶
Файл report_leadership.md¶
📊 ОТЧЕТ ДЛЯ РУКОВОДСТВА¶
Анализ модели доступа Tessa¶
Ключевые метрики¶
- Лучший метод анализа: HDBSCAN
- Всего кластеров: 539
- Критические риски: 0
- Оптимизированные паттерны: 52
Основные выводы¶
- Безопасность: 0 критических/высоких рисков требуют внимания
- Эффективность: 8 крупных кластеров для стандартизации
- Управляемость: 539 паттернов вместо тысяч индивидуальных назначений
Рекомендуемые действия¶
- Немедленно: Аудит 0 рисковых кластеров
- Краткосрочно: Стандартизация крупных паттернов
- Долгосрочно: Внедрение 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)
- Проверить полноту данных
- Уточнить категоризацию признаков
- Рассмотреть дополнительные признаки
Файл optimization_roadmap.md¶
🗺️ ДОРОЖНАЯ КАРТА ОПТИМИЗАЦИИ МОДЕЛИ ДОСТУПА TESSA¶
Немедленные действия (1-3 дня)¶
0 задач:
Краткосрочные задачи (1 неделя)¶
0 задач:
Среднесрочные задачи (1 месяц)¶
0 задач:
Долгосрочные улучшения (3-6 месяцев)¶
296 задач:
- Стандартизировать в роль
- Стандартизировать в роль
- Стандартизировать в роль
- Стандартизировать в роль
- Стандартизировать в роль
Итоговые метрики¶
- Всего задач: 296
- Затронуто кластеров: 296
- Аудитории: 2
Комментарии¶
Научные и методологические комментарии:¶
Силуэтный анализ (Rousseeuw, 1987):
- Используется для оценки качества кластеризации
- Диапазон: от -1 (плохо) до +1 (хорошо)
- Интерпретация:
> 0.7: Отличное разделение0.5-0.7: Хорошее0.25-0.5: Удовлетворительное< 0.25: Слабое
Принцит наименьших привелений (PoLP):
- Основа для оценки рисковых кластеров
- Кластеры с избыточными правами помечаются как «рисковые»
- Рекомендуется редукция прав до минимально необходимых
RBAC (ролевой контроль доступа):
- Нормативные кластеры → стандартные роли
- Уникальные кластеры → индивидуальные назначения
- Оптимизация: переход от индивидуальных назначений к ролям
UBA (анализ поведения пользователей):
- Аномальные кластеры → необычные паттерны доступа
- Требуют дополнительной верификации
- Могут указывать на новые бизнес-процессы или риски
Технические комментарии:¶
Производительность:
- Код оптимизирован для работы с большими объемами данных
- Использует векторизацию NumPy где возможно
- Ограничивает анализ первыми N значениями для категориальных признаков
Масштабируемость:
- Конфигурация вынесена в отдельный класс
- Возможность кастомизации порогов и правил
- Поддержка различных организационных структур
Обработка данных:
- Валидация входных данных
- Try-except блоки для критических операций
- Логирование ошибок без прерывания выполнения
Визцализация:
- Автоматическое сохранение графиков
- Адаптивные размеры и цвета
- Профессиональное оформление для презентаций
Бизнес-комментарии:¶
Ценность для руководства:
- Стратегические инсайты о состоянии системы доступа
- Оценка рисков безопасности
- План оптимизации с измеримыми результатами
Ценность для администраторов:
- Конкретные действия по оптимизации
- Приоритизация задач
- Экономия времени на управление доступом
Ценность для безопасности:
- Выявление аномалий и угроз
- Рекомендации по усилению контроля
- Документация для аудита
Ценность для аналитиков:
- Методологические рекомендации
- Качество данных и пути улучшения
- Статистические инсайты
Код интерпретатора¶
Загрузка библиотек¶
# Загрузка библиотек
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
Код класса интерпретатора кластеров¶
# Модуль интерпретации кластеров пермиссий 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
Загрузка данных¶
# Загрузка данных о кластерах
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
| 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
# Загрузка исходных тестовых данных
# о модели предоставления разрешений
# (в 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
| 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
Запуск интерптетатора кластеров¶
# ЗАПУСК ИНТЕРПРЕТАЦИИ КЛАСТЕРОВ
# Проверяем наличие необходимых данных
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 - Дорожная карта





