Урок 14: Візуалізація OSINT-даних — мережевий аналіз та GEOINT
Навігація курсу: Хаб: Уроки
Попередній: Урок-13-Bias-та-упередження | Наступний: Урок-15-Майбутнє-OSINT
Інструменти уроку: Gephi · gephi-ai · QGIS · Kepler.gl · Neo4j · Sigma.js · Maltego
Слайди (Презентаційний текст)
ЧАСТИНА І — МЕРЕЖЕВИЙ АНАЛІЗ ТА ГРАФ-ВІЗУАЛІЗАЦІЯ
Слайд 1 — Заголовок
Візуалізація OSINT-даних
Мережевий аналіз та GEOINT
Урок 14 | AI для OSINT 2026
«Граф показує, хто з ким. Карта показує, де і коли. Разом — вони розповідають усю історію.»
Слайд 2 — Два виміри OSINT-візуалізації
Більшість аналітиків зупиняються на одному вимірі. Досвідчені — поєднують обидва.
Вимір 1 — Реляційний (граф):
- Хто з ким пов’язаний?
- Хто контролює потік інформації?
- Де координація, а де органічна активність?
- Інструменти: Gephi, Maltego, Neo4j
Вимір 2 — Просторовий (GEOINT):
- Де фізично відбуваються події?
- Як переміщуються люди, техніка, контент?
- Де сконцентрована інфраструктура?
- Інструменти: QGIS, Kepler.gl, Google Earth Pro
Коли їх поєднувати:
- Telegram-кластер (граф) → учасники геолоковані на карті → візначення реального регіону операції
- Мережа IP-адрес (граф) → ASN → фізична локація серверів (карта)
- Рух підозрюваного (карта) + зустрічі = соціальний граф (граф)
Слайд 3 — Словник: ключові терміни теорії графів
| Термін | Визначення | Приклад в OSINT |
|---|---|---|
| Вузол (Node / Vertex) | Окремий об’єкт у мережі | Акаунт, IP, домен, особа |
| Ребро (Edge / Link) | Зв’язок між двома вузлами | Підписка, репост, транзакція |
| Ступінь (Degree) | Кількість ребер вузла | Кількість підписників/підписок |
| Шлях (Path) | Послідовність ребер між вузлами | Ланцюжок координації між каналами |
| Діаметр (Diameter) | Найдовший з найкоротших шляхів | Міра «розтягнутості» мережі |
| Компонент (Component) | Підграф з’єднаних вузлів | Ізольована мережа без зовнішніх зв’язків |
| Атрибут (Attribute) | Властивість вузла або ребра | Кількість підписників, дата реєстрації |
| Вага (Weight) | Числова інтенсивність ребра | Частота взаємодій між двома акаунтами |
Слайд 4 — Типи графів: що вибирати для OSINT
Орієнтований граф (Directed graph / Digraph)
- Ребро має напрям: A → B ≠ B → A
- Приклад: підписки в Twitter (X), форварди в Telegram
- Коли використовувати: аналіз ієрархій, потоків інформації, ланцюжків командування
Зважений граф (Weighted graph)
- Кожне ребро має числову вагу
- Приклад: частота згадок між акаунтами за тиждень
- Алгоритми враховують вагу при обрахунку метрик
Двочастковий граф (Bipartite graph)
- Два типи вузлів; ребра лише між різними типами
- Приклад: акаунти ↔ канали, особи ↔ організації
- Особливо корисний для membership-аналізу
Мультиграф (Multigraph)
- Кілька типів ребер між одними і тими ж вузлами
- Приклад: ті самі актори пов’язані через Telegram і через реєстр компаній
Часовий граф (Temporal / Dynamic graph)
- Ребра і вузли мають мітки часу; структура змінюється
- Приклад: граф Telegram-каналів у розрізі тижнів до/після виборів
Слайд 5 — Центральність: навіщо вимірювати «важливість»
Центральність (Centrality) — клас метрик, що відповідає на питання:
«Який вузол у мережі найважливіший?»
Але «важливість» — неоднозначне поняття. Різні метрики вимірюють різний тип впливу:
| Питання | Метрика |
|---|---|
| Хто має найбільше прямих зв’язків? | Degree |
| Хто контролює потік інформації? | Betweenness |
| Хто швидше за всіх охопить всю мережу? | Closeness |
| Хто пов’язаний з найвпливовішими? | Eigenvector / PageRank |
Практичне правило: Завжди рахуйте мінімум три різних метрики центральності. Вузли, що потрапляють в топ-10% за кількома метриками одночасно, — найбільш критичні точки мережі.
Слайд 6 — Degree та Betweenness Centrality
Degree Centrality — найпростіша:
- In-degree: кількість вхідних ребер (хто посилається на вузол)
- Out-degree: кількість вихідних ребер (на кого посилається вузол)
- Приклад: канал
@propagandachannelмає in-degree = 87 (87 каналів переслали його контент) при середньому по мережі = 4.2 → відхилення в 20 разів → підозра на координований буст - Обмеження: не відрізняє якісні зв’язки від бот-трафіку
Betweenness Centrality — «брокери» мережі:
Вимірює, скільки найкоротших шляхів між усіма парами вузлів проходять через даний вузол.
BC(v) = Σ (σ(s,t|v) / σ(s,t)) s≠v≠t
- Вузол з високим betweenness = брокер: з’єднує частини мережі, що інакше б не спілкувалися
- Видалення такого вузла фрагментує мережу
Реальний приклад (Graphika, 2019): У Russian interference networks ретранслятори між англомовним і французьким сегментами мали betweenness у 50–100 разів вище середнього при скромному загальному degree — звичайний підрахунок підписників їх би не виявив.
Слайд 7 — Eigenvector Centrality та PageRank
Eigenvector Centrality:
Вузол важливий, якщо він з’єднаний з іншими важливими вузлами. Рекурсивне визначення.
EC(v) = (1/λ) × Σ EC(u) u∈N(v)
де λ — найбільше власне значення матриці суміжності.
Інтуїція: Один зв’язок з «суперхабом» піднімає EC вузла. Бот-ферма, яку ретвітить CNN, матиме вищий EC, ніж тисячна органічна аудиторія нішевого блогу.
PageRank (адаптований для OSINT):
PR(v) = (1-d)/N + d × Σ (PR(u) / Out-degree(u)) u→v
де d = 0.85 (damping factor), N — кількість вузлів.
Різниця EC vs PageRank:
- EC нестабільний на орієнтованих графах із «балотними» вузлами (без вихідних ребер)
- PageRank стабільніший завдяки damping factor — кращий вибір для Telegram/Twitter аналізу
Запуск у Gephi: Statistics → PageRank та Statistics → Eigenvector Centrality
Слайд 8 — Closeness Centrality та порівняльна таблиця
Closeness Centrality:
CC(v) = (n-1) / Σ d(v, u) u≠v
де d(v, u) — найкоротший шлях між v та u.
- Вузол з високим closeness розповсюдить інформацію по мережі найшвидше
- Виявлення «посівного» акаунта, з якого стартує дезінформаційний наратив
- Для роздрібнених мереж → Harmonic Centrality (враховує лише досяжні вузли)
Порівняльна таблиця:
| Метрика | Що вимірює | Складність | Застосування в OSINT |
|---|---|---|---|
| Degree | Прямі зв’язки | O(V+E) | Знайти хаби, перший скан |
| Betweenness | Контроль потоків | O(V×E) | Координатори, брокери |
| Closeness | Швидкість охоплення | O(V²) | «Сіяч» інформації |
| Eigenvector | Зв’язок з впливовими | O(V²) iter | «Ампліфікатори» |
| PageRank | Авторитетність посилань | O(V+E) iter | Реальний вплив джерела |
У Gephi:
Statistics → Run All→ атрибути в таблиці вузлів →Appearance → Size → Ranking
Слайд 9 — Community Detection та алгоритм Лувена
Спільнота (Community) — підграф, де вузли щільніше з’єднані між собою, ніж із рештою мережі.
Навіщо в OSINT: виявлення координованої неавтентичної поведінки (CIB), розбиття великих мереж на аналітичні блоки, картографування ідеологічних кластерів.
Модулярність Q:
Q = (1/2m) × Σ [A(i,j) - k(i)×k(j)/2m] × δ(c(i), c(j))
Q > 0.3 — помітна структура; Q > 0.6 — сильна кластеризація; Q ≈ 0 — випадкова мережа.
Алгоритм Лувена (Louvain, 2008):
- Фаза 1: кожен вузол = окрема спільнота → переміщаємо до сусідньої, якщо Q зростає → до стабілізації
- Фаза 2: кожна спільнота стискається в «супервузол» → повторити Фазу 1
- Складність: O(n log n) — масштабується до мільярдів вузлів
Запуск у Gephi: Statistics → Modularity → Use weights → Resolution 1.0 → Run
Результат: атрибут modularity_class → Appearance → Color → Partition → modularity_class
Слайд 10 — Leiden vs Louvain та топологія мереж
Leiden (Traag et al., 2019) — навіщо:
Louvain може генерувати внутрішньо роз’єднані спільноти (вузли в групі фізично не з’єднані між собою). Leiden гарантує, що кожна спільнота — зв’язний підграф.
import igraph as ig, leidenalg
g = ig.Graph.Read_GraphML("network.graphml")
part = leidenalg.find_partition(g, leidenalg.ModularityVertexPartition)
print(f"Q={part.quality():.4f}, кластерів: {len(part)}")На реальних Telegram-даних (5k–50k вузлів) різниця незначна. На мережах > 500k або ретвіт-графах — Leiden стабільніший.
Топологія мереж:
| Тип | Характеристика | Ознака в OSINT |
|---|---|---|
| Scale-free | P(k) ~ k⁻ᵞ; кілька суперхабів | Типові соціальні мережі; видалення 1–2% хабів = фрагментація 80% |
| Small-world | Короткі шляхи + висока кластеризація | Інформація поширюється надзвичайно швидко |
| Star | Один центр + усі підключені до нього | Ботнет або керований медіапул |
| Core-periphery | Щільне ядро + периферія через ядро | Медіаекосистема: великі медіа (ядро) + агрегатори |
Слайд 11 — Gephi: workflow та формати
Три панелі Gephi:
- Overview — побудова та стилізація графа
- Data Laboratory — таблиця вузлів і ребер
- Preview — фінальний рендер (SVG/PDF/PNG)
Стандартний OSINT workflow:
1. Імпорт (CSV edge list / GEXF / GraphML / Neo4j plugin)
2. Statistics → Degree, Modularity, PageRank, Betweenness
3. Appearance → Color (Partition: modularity_class)
4. Appearance → Size (Ranking: PageRank або Betweenness)
5. Layout → ForceAtlas 2 (500–2000 ітерацій)
6. Filters → Giant Component (видалити ізоляти)
7. Preview → мітки топ-N вузлів, товщина ребер
8. Export → PNG + GEXF
Cypher-запит Neo4j → Gephi CSV:
MATCH (u:User)-[:MEMBER_OF]->(g1:Group),
(u)-[:MEMBER_OF]->(g2:Group)
WHERE id(g1) < id(g2)
WITH g1, g2, count(u) AS sharedMembers
WHERE sharedMembers >= 5
RETURN g1.title AS Source, g2.title AS Target, sharedMembers AS WeightСлайд 12 — ForceAtlas 2, Sigma.js, Maltego
ForceAtlas 2 (Jacomy et al., 2014) — вузли відштовхуються як заряди, ребра притягують як пружини.
| Параметр | Рекомендація |
|---|---|
| LinLog mode | Вмикати для чіткіших кластерів |
| Gravity | 1.0 → більше = компактніший граф |
| Prevent Overlap | Вмикати після стабілізації |
| Edge Weight Influence | 1.0 = враховувати вагу |
Процес: Yifan Hu 300 ітерацій (грубий layout) → ForceAtlas 2 + LinLog 1000 ітерацій → Prevent Overlap.
Sigma.js — WebGL-рендеринг графів у браузері. Gephi плагін SigmaExporter → File → Export → Sigma.js template → готовий index.html з інтерактивним графом для командного шерингу.
Maltego — link analysis із автоматичним збором даних через трансформи:
email@target.com
→ HaveIBeenPwned → Person
→ Passive DNS → Domains → IPs → ASN
→ Social profiles → Twitter connections
Maltego збирає дані в процесі; Gephi лише візуалізує. Оптимально: Maltego для розвідки → Gephi для глибокого аналізу великих датасетів.
Слайд 13 — gephi-ai + Claude: AI-асистований аналіз
gephi-ai = Java-плагін для Gephi + Python MCP-сервер + 73 MCP-інструменти для Claude.
Приклад аналітичного сеансу:
Аналітик → Claude: граф Telegram (~4800 вузлів, ~28000 ребер). Знайди ключових акторів.
Claude:
→ gephi_get_graph_stats()
→ gephi_compute_modularity() → Q=0.71, 8 спільнот
→ gephi_compute_pagerank() → топ-10 вузлів
→ gephi_compute_betweenness() → брокери
→ gephi_color_by_partition(attr="modularity_class")
→ gephi_size_by_ranking(attr="pagerank")
→ gephi_run_layout(layout="ForceAtlas2", iterations=1500)
→ gephi_export_png(path="report.png")
Висновок: @relay_net — betweenness у 23× вище середнього при moderate degree.
Класичний broker між Спільнотою 2 і 5. Видалення його ізолює обидва кластери.
Claude пояснює аналітичне значення числових результатів — не просто виводить цифри.
Слайд 14 — Кейс: граф-аналіз Telegram-каналів (CIB)
Завдання: 47 україномовних Telegram-каналів про вибори → виявити ознаки координованої неавтентичної поведінки (CIB).
Граф 1 — Member Overlap: вузли = 47 каналів; ребро A↔B = кількість спільних учасників → 3 кластери (Louvain Q=0.68).
Граф 2 — Content Propagation: ребро A→B = форвард контенту → 11 каналів із cosine similarity > 0.87 публікують у вікні ±3 хвилини; один канал має betweenness у 14× вище середнього — ретранслює до всіх кластерів.
Результат:
- Кластер 1 (23 канали): органічна аудиторія, низька кореляція
- Кластер 2 (14 каналів): помірна синхронізація, «сірий» медіапул
- Кластер 3 (10 каналів): синхронізація ±5 хв, overlap учасників 78–91%, один «seed» канал → ознаки CIB
ЧАСТИНА ІІ — GEOINT ТА ГЕОПРОСТОРОВА ВІЗУАЛІЗАЦІЯ
Слайд 15 — GEOINT: що це і місце в OSINT
GEOINT (Geospatial Intelligence) — розвідка, що базується на аналізі та інтерпретації геопросторових даних: зображень, карт, координат і просторових зв’язків.
Чим GEOINT відрізняється від «просто карти»:
| «Просто карта» | GEOINT |
|---|---|
| Показати де | Відповісти на «що тут відбувається і чому» |
| Одна точка | Просторові паттерни + часова динаміка |
| Статичний знімок | Зіставлення шарів різних джерел |
| Декоративна | Доказова, відтворювана, атрибутована |
Типові GEOINT-задачі в OSINT:
- Геолокація фото/відео → прив’язка до місцевості через орієнтири
- Мобільність → аналіз руху особи/техніки за геотегами публікацій
- Верифікація → чи відбувалась подія там, де стверджується?
- Інфраструктурна розвідка → локація серверів, штабів, логістичних вузлів
- Паттерни активності → де і коли концентруються публікації певного контенту
Ключові інструменти: QGIS, Kepler.gl, Google Earth Pro, SunCalc, Shadow Calculator
Слайд 16 — Типи геопросторових даних
Перш ніж працювати в QGIS — розуміємо, з чим маємо справу.
Растровий шар (Raster layer):
- Прямокутна сітка пікселів, кожен із колірним значенням (DN-value)
- Роздільна здатність фіксована — масштабування погіршує якість
- Приклади: супутникові знімки, аерофотозйомка, DEM (цифрова модель рельєфу)
- Формати: GeoTIFF, ECW, JPG2000
Векторний шар (Vector layer):
- Геометрії визначені математично: точки, лінії, полігони
- Масштабується без втрати якості
- Приклади: дороги, кордони, точки POI, будівлі
- Формати: Shapefile (.shp), GeoJSON, KML/KMZ, GeoPackage
WMS-шар (Web Map Service):
- Растрові тайли, що надсилає сервер на запит
- Дозволяє підключити Google Maps, OpenStreetMap, Bing Satellite безпосередньо в QGIS
- Не зберігається локально — потрібен інтернет
- Використовується як фонова підложка для накладання аналітичних шарів
OSINT-правило: Завжди зберігайте локальні копії растрів, якщо вони є доказовою базою. WMS-сервіси можуть змінювати або видаляти архівні знімки.
Слайд 17 — QGIS: огляд, встановлення, інтерфейс
QGIS — безкоштовна крос-платформна геоінформаційна система (GIS) з відкритим кодом. Стандарт для OSINT-аналітиків, що не хочуть платити за ArcGIS.
Встановлення:
- Windows: рекомендується OSGeo4W Network Installer — дає доступ до розширених інструментів (GDAL, GRASS, SAGA), яких немає в standalone installer
- Завантажити: https://qgis.org/download/
- Обрати: OSGeo4W → Advanced install →
qgis-full
- Linux:
sudo apt install qgis(Ubuntu/Debian) абоsudo pacman -S qgis(Arch/Manjaro) - macOS: офіційний installer з qgis.org
Основні елементи інтерфейсу:
| Елемент | Призначення |
|---|---|
| Map Canvas | Основний вид карти |
| Layers Panel | Список всіх завантажених шарів (порядок = рендеринг) |
| Browser Panel | Файлова система + бази даних + WMS-з’єднання |
| Attribute Table | Таблиця атрибутів векторного шару (аналог БД) |
| Processing Toolbox | 500+ алгоритмів аналізу (GDAL, SAGA, GRASS, нативні) |
Система координат (CRS):
- EPSG:4326 — WGS84 (GPS координати, градуси) — найпоширеніша для OSINT даних
- EPSG:3857 — Web Mercator (Google Maps, OSM) — для WMS підложок
- QGIS автоматично перепроєктує шари «на льоту» — але краще явно призначати CRS імпортованим даним
Слайд 18 — QGIS: ключові плагіни для OSINT
Плагіни встановлюються через Plugins → Manage and Install Plugins.
Плагін 1 — Streetview
Миттєвий перехід з карти QGIS до Google Street View.
Як використовувати:
- Встановити плагін Streetview
- Натиснути кнопку Streetview на панелі інструментів
- Клікнути на точку на карті
- Браузер автоматично відкриє Street View за цими координатами
Навіщо в OSINT:
- Швидка геолокаційна верифікація: порівняти орієнтири на фото з реальним виглядом місцевості
- Перевірка стану будівлі/об’єкта на різних датах (якщо є архівні Street View)
- Підтвердження, що маршрут/локація є фізично досяжною
Плагін 2 — QuickMapServices (QMS)
Підключення фонових картографічних підложок в один клік.
Встановлення + активація розширеного каталогу:
- Встановити плагін QuickMapServices
Web → QuickMapServices → Settings → More services → Get contributed pack- Перезавантажити QGIS
Доступні підложки:
- Google Satellite Hybrid — супутниковий знімок + підписи — найкорисніша для OSINT
- Google Maps / Google Terrain
- Bing Aerial
- OpenStreetMap Standard / Topo
- ESRI World Imagery
- Stamen Toner (чорно-біла для контрасту при накладанні шарів)
Як використовувати: Web → QuickMapServices → Google → Google Satellite Hybrid — підложка з’являється знизу стека шарів.
Плагін 3 — QuickOSM
Запит до OpenStreetMap через Overpass API безпосередньо з QGIS.
Як використовувати:
Vector → QuickOSM → QuickOSM- Заповнити форму:
- Key — тег OSM (наприклад,
amenity,shop,military) - Value — значення тегу (наприклад,
hospital,tattoo,base) - Location — назва міста/регіону або bbox
- Key — тег OSM (наприклад,
Run query- Результат: векторний шар із точками/полігонами на карті + атрибутивна таблиця
Слайд 19 — QuickOSM: практика геопросторової розвідки
QuickOSM дозволяє витягнути будь-яку інфраструктуру з OpenStreetMap за тегами.
OSM Tag система:
OpenStreetMap використовує пари ключ=значення (key=value) для опису об’єктів.
Довідник тегів: https://wiki.openstreetmap.org/wiki/Map_features
Приклади OSINT-запитів:
| Key | Value | Що отримаємо |
|---|---|---|
amenity | fuel | Всі АЗС у регіоні (логістика, маршрути) |
military | barracks / base | Військова інфраструктура |
amenity | hospital | Лікарні (верифікація медевакуації) |
shop | tattoo | Тату-салони (верифікація локації за фото татуювань) |
landuse | industrial | Промислові зони |
building | warehouse | Склади (логістика) |
amenity | place_of_worship | Релігійні об’єкти |
Практичний кейс:
Є фото підозрюваного перед характерним магазином. На вивісці видно латинські букви, на задньому плані — висотка радянського стилю.
- QuickOSM:
shop=tattoo, location=Запоріжжя→ отримуємо точки всіх тату-салонів - Street View кожної точки → порівняти задній план
- Підтвердження або виключення кожного варіанту
Обмеження QuickOSM: OSM — не офіційна карта. Дані волонтерські, можуть бути неповними або застарілими для специфічних об’єктів (особливо в зонах конфліктів).
Слайд 20 — QGIS: просунуті техніки для OSINT
Техніка 1 — Temporal Controller (Часовий контролер)
Анімація геопросторових подій у часі.
- Додати до векторного шару атрибут
datetime(ISO 8601:2026-01-15T14:22:00) - Клікнути на шар →
Properties → Temporal→ увімкнутиDynamic Temporal Control View → Temporal Controller Panel- Встановити часовий діапазон і крок (годину, добу, тиждень)
- Натиснути Play → QGIS анімує точки у часі
Застосування: Маршрут переміщення особи з гео-тегованих публікацій; поширення контенту по регіонах; динаміка пошкоджень інфраструктури.
Техніка 2 — Heatmap (KDE — Ядерна оцінка щільності)
Візуалізація концентрації точкових об’єктів.
Processing Toolbox → Interpolation → Heatmap (Kernel Density Estimation)
- Input: векторний шар точок
- Radius: радіус ядра (у метрах CRS)
- Output: растровий шар де яскравіше = більша щільність
Застосування: Концентрація публікацій із певним хештегом за регіонами; зони підвищеної активності підозрюваного; кластеризація повідомлень з місць подій.
Техніка 3 — EXIF Extractor
Плагін EXIF Tool або Photo2Shape витягує GPS-координати з EXIF-метаданих фотографій і одразу наносить їх на карту як точковий шар.
# Командний рядок через ExifTool перед QGIS
exiftool -csv -GPSLatitude -GPSLongitude -DateTimeOriginal *.jpg > photo_locations.csvПотім імпортувати CSV у QGIS: Layer → Add Layer → Add Delimited Text Layer → задати поля lat/lon.
Техніка 4 — Spatial Join
Зіставлення двох шарів за просторовим критерієм.
Vector → Data Management → Join Attributes by Location
Приклад: шар IP-адрес з геолокацією (точки) + шар адміністративних кордонів (полігони) → автоматично визначити, до якої країни/регіону належить кожен IP.
Слайд 21 — Kepler.gl: як це працює зсередини
Kepler.gl (Foursquare / колишній Uber) — open source React-застосунок для інтерактивної геовізуалізації мільйонів точок у браузері в реальному часі.
Архітектура (три шари):
┌─────────────────────────────────────────────┐
│ Браузер / Jupyter │
├─────────────────────────────────────────────┤
│ React UI (Styled-Components) │
│ Redux store ←→ keplerGl reducer │
│ react-palm middleware (async side effects) │
├─────────────────────────────────────────────┤
│ deck.gl — GPU-рендеринг шарів даних │
│ MapLibre GL — рендеринг базової карти │
└─────────────────────────────────────────────┘
- deck.gl (від Uber/Vis.gl) — WebGL-бібліотека для рендерингу геопросторових шарів. Саме вона «малює» мільйони точок за 60 fps, виконуючи агрегацію (hexbin, heatmap) прямо на GPU.
- MapLibre GL — open source рушій базової карти (форк Mapbox GL після зміни ліцензії). Відображає тайли підложки.
- Redux — весь стан застосунку (шари, фільтри, viewport) зберігається в одному Redux-store під ключем
keplerGl. Це означає: стан серіалізується в JSON і відновлюється повністю.
Формат вхідних даних:
Kepler.gl приймає дані у вигляді об’єкта з двома полями:
{
info: { id: "my_dataset", label: "Telegram Events" },
data: {
fields: [
{ name: "lat", type: "real" },
{ name: "lng", type: "real" },
{ name: "timestamp", type: "timestamp", format: "YYYY-MM-DDTHH:mm:ssZ" },
{ name: "actor", type: "string" },
{ name: "count", type: "integer" }
],
rows: [
[50.4501, 30.5234, "2026-01-15T14:22:00Z", "@channel_kyiv", 143],
[48.9226, 24.7111, "2026-01-15T14:22:00Z", "@channel_lviv", 67]
]
}
}CSV, GeoJSON, і навіть Shapefile (через конвертацію) також приймаються через drag-and-drop у веб-інтерфейсі.
Типи шарів:
| Шар | Рендеринг | OSINT-застосування |
|---|---|---|
| Point | Кола/іконки | Окремі події, акаунти, пристрої |
| Arc | Криві між парами координат | Переміщення, потоки між містами |
| Heatmap | KDE на GPU | Щільність публікацій по регіонах |
| Hexbin | Агрегація по гексагонах | Зведена активність по зонах |
| GeoJSON | Полігони/лінії | Адміністративні кордони, зони |
| Trip | Анімовані маршрути | Рух об’єкта в часі (потребує timestamp) |
| Grid | Агрегація по прямокутних комірках | Альтернатива hexbin |
Trip layer — ключовий для аналізу переміщень:
trip_id,timestamp,lng,lat
vehicle_01,2026-01-15T08:00:00Z,30.5234,50.4501
vehicle_01,2026-01-15T09:30:00Z,31.2345,49.9876
vehicle_01,2026-01-15T11:00:00Z,32.0567,49.5432Kepler.gl анімує маршрут у часі — ідеально для демонстрації переміщення техніки або відстеження особи за геотегами.
Вбудовування у власний застосунок (React/npm):
npm install @kepler.gl/components @kepler.gl/reducers @kepler.gl/actionsimport KeplerGl from '@kepler.gl/components';
import { addDataToMap } from '@kepler.gl/actions';
// Програмне завантаження даних
dispatch(addDataToMap({
datasets: myDataset,
config: savedConfig, // відновити збережену конфігурацію
options: { centerMap: true, readOnly: false }
}));Збереження/відновлення конфігурації:
// Зберегти поточний стан (шари, фільтри, viewport) як JSON
const config = KeplerGlSchema.getConfigToSave(store.getState().keplerGl.map);
// → config.json можна завантажити назад і точно відтворити картуPython / Jupyter підтримка:
from keplergl import KeplerGl
map_1 = KeplerGl(height=600)
map_1.add_data(data=df, name="telegram_events")
map_1 # відображається прямо в notebook
map_1.save_to_html(file_name="report_map.html") # самодостатній HTML-файлKepler.gl vs QGIS — коли що:
| Задача | Kepler.gl | QGIS |
|---|---|---|
| Мільйони точок у браузері | ✅ | ⚠️ повільно |
| Анімація Trip у реальному часі | ✅ | ✅ (Temporal Controller) |
| Просторовий join, буфер, overlay | ❌ | ✅ |
| Запит до OSM Overpass | ❌ | ✅ (QuickOSM) |
| Публікація як HTML без сервера | ✅ | ⚠️ складніше |
| Jupyter-інтеграція | ✅ | ❌ |
| Векторний PDF/SVG-експорт | ❌ | ✅ |
Для публікацій, брифінгів і великих датасетів → Kepler.gl. Для аналізу, запитів, overlay → QGIS.
Слайд 22 — Геолокація та верифікація: практичний pipeline
Геолокація — процес визначення точної географічної позиції за ознаками на фото/відео без GPS-даних.
Pipeline верифікації:
1. ЗБІР ОЗНАК
├── Архітектурний стиль (радянська висотка, сучасний ЖК, промобудівля)
├── Вивіски, написи, мова (кирилиця, латиниця, мова)
├── Природні орієнтири (рельєф, річка, характерне дерево)
├── Дорожня розмітка і знаки (стандарти різних країн)
└── Тіні (напрямок → сонце → час доби та сезон через SunCalc)
2. ГІПОТЕЗА ЛОКАЦІЇ
├── Google Maps / Yandex Maps текстовий пошук
├── QuickOSM → об'єкти в підозрілому районі
└── Wikimapia для промислових/специфічних об'єктів
3. ВЕРИФІКАЦІЯ
├── Google Street View (плагін QGIS Streetview)
├── Google Earth Pro → Historical Imagery (порівняння за датами)
├── Bing Maps Bird's Eye View (похилі знімки 45°)
└── Mapillary / KartaView (Street View від спільноти)
4. ДОКУМЕНТАЦІЯ
├── Скріншот знімку з джерела + скріншот карти
├── Координати в десятковому форматі (50.4501, 30.5234)
└── Посилання на джерело карти + дата знімку
Важливо: Геолокація підтверджує, де зроблено знімок — не коли. Для верифікації дати потрібні: метадані файлу, тіні (SunCalc), сезонні ознаки, нумерні таблиці авто, актуальні вивіски.
Слайд 23 — Геопросторовий кейс: картографування логістики
Сценарій: Моніторинг руху важкої техніки за відеозаписами з соцмереж.
Крок 1 — Збір:
- 47 відео з Telegram, датовані тижнем X
- Кожне відео геолоковане вручну або з EXIF
- Результат: 47 точок із атрибутами:
дата,час,тип техніки,напрямок руху
Крок 2 — QGIS аналіз:
- Завантажити точки як CSV шар
- QuickMapServices → Google Satellite Hybrid підложка
- Temporal Controller → анімація за часом → виявлення маршруту
- Arc layer в Kepler.gl → потоки між точками → виявлення вузлових точок
Крок 3 — Просторовий аналіз:
Processing → Nearest Neighbor Analysis→ чи є кластеризація точок?- Buffer 5 km навколо кожної точки →
Dissolve→ коридор переміщення - Overlay з шаром доріг (QuickOSM:
highway=primary/secondary) → можливі маршрути
Крок 4 — Cross-reference з графом:
- Telegram-канали, що опублікували ці відео → граф у Gephi
- Чи є кореляція між географічним кластером і мережевим кластером?
- Якщо так — можлива регіональна координаційна структура
Слайд 24 — Temporal Analysis: мережа у часі
Статичний граф = накопичений стан. Часовий граф = як мережа народжувалась і змінювалась.
Ключові часові патерни:
Burst Detection: різке зростання degree/ваги за короткий час → координований буст або «активація» сплячого акаунта.
Temporal Community Shift: вузол переходить зі спільноти A до B → pivot у наративі.
Creation Pattern: 50 акаунтів зареєстровані за 48 годин і одночасно активувались → явна координація.
GEXF з часовими даними:
<node id="n1" label="@account_x">
<spells>
<spell start="2025-10-01" end="2026-03-15"/>
</spells>
</node>
<edge source="n1" target="n2">
<spells><spell start="2025-11-20"/></spells>
</edge>Window → Timeline у Gephi → автоматично зчитує start/end → анімація зміни графа.
Слайд 25 — Правила публікації: граф і карта для звіту
Публікований матеріал ≠ робочий матеріал.
Для графів:
- Видалити ізольовані вузли (
Filters → Giant Component) - Розмір вузла = метрика (завжди легенда)
- Колір = спільнота (не більше 8–10 кольорів, colorblind-friendly)
- Мітки лише для топ-N вузлів
- Завжди PNG для показу + GEXF для відтворюваності
Для карт:
- Масштабна лінійка та стрілка Північ — обов’язково
- Легенда для кожного шару з поясненням символів
- Джерело підложки та дата знімку (особливо для супутникових)
- Координатна сітка або bbox у підписі
- Вказати проєкцію CRS (важливо для вимірювань відстаней)
- Окремий шар = окрема легенда; не суміщати несумісні типи даних
Спільне правило:
Аналітична візуалізація — це доказовий матеріал. Кожен елемент має пояснення. Будь-який читач повинен відтворити вашу логіку з цієї картинки і метаданих.
Слайд 26 — Резюме та ключові виводи
Урок 14 охопив два виміри OSINT-візуалізації:
Мережевий аналіз:
- Метрики центральності (Degree, Betweenness, Closeness, Eigenvector, PageRank)
- Community Detection: Louvain Q-модулярність, Leiden для великих мереж
- Топологія: Scale-free, Small-world, Star, Core-periphery
- Gephi workflow: ForceAtlas 2, GEXF, Sigma.js, gephi-ai + Claude
GEOINT:
- Типи геоданих: Raster, Vector, WMS
- QGIS: OSGeo4W, Streetview, QuickMapServices, QuickOSM
- Просунуті техніки: Temporal Controller, KDE Heatmap, EXIF, Spatial Join
- Kepler.gl для веб-публікації та великих датасетів
- Pipeline геолокаційної верифікації
Золоте правило:
Мережева метрика — гіпотеза. Геолокація — підтвердження. Разом вони переводять цифровий слід у реальний простір і час. Аналітик вирішує, що це означає.
Домашнє завдання — ДЗ 14
Назва: «Від мережі до карти»
Рівень 1 — Базовий (обов’язковий)
Частина А — Мережевий аналіз у Gephi:
Знайдіть або зберіть публічно доступний граф (мінімум 100 вузлів, 300 ребер):
- Telegram-канал через Groupint
- Датасет з SNAP (
ego-Facebook,twitter_combined) - Датасет з Network Repository
Виконайте:
- Обрахуйте Degree, Modularity (Louvain), PageRank, Betweenness
- ForceAtlas 2 (мінімум 500 ітерацій), Giant Component filter
- Колір за
modularity_class, розмір за PageRank, мітки топ-10 за betweenness - Експортуйте PNG (1920×1080+) та GEXF
Частина Б — QGIS:
- Встановіть QGIS (OSGeo4W) та плагіни: QuickMapServices, QuickOSM, Streetview
- Підключіть підложку Google Satellite Hybrid
- Виконайте QuickOSM-запит для будь-якого міста на вашу тему (наприклад:
amenity=hospital,military=barracks,shop=supermarket) - Зробіть скріншот карти з підложкою, результатами запиту, легендою та масштабною лінійкою
Звіт (мінімум 400 слів):
- Що виявив Louvain? Значення Q? Кількість спільнот?
- Топ-3 вузли за betweenness — яка їх роль у мережі?
- Що показав QuickOSM-запит? Яке аналітичне питання ви намагались вирішити цим запитом?
- Яка топологія мережі? Обґрунтуйте через розподіл degree.
Рівень 2 — Розширений (додаткові бали)
Варіант А — Геолокаційна верифікація:
- Знайдіть будь-яке публічне фото з геопросторовою загадкою (місце не підписано явно)
- Пройдіть повний pipeline верифікації зі Слайду 22: збір ознак → гіпотеза → верифікація через Street View + Google Earth
- Задокументуйте кожен крок зі скріншотами
- Нанесіть результат на карту в QGIS: підложка + точка локації + анотація
Варіант Б — Temporal аналіз:
- Зберіть або підготуйте геодані з часовим атрибутом (мінімум 50 точок, 3+ різних дати)
- Завантажте в QGIS, налаштуйте Temporal Controller
- Зробіть 4–5 скріншотів у різних часових зрізах із поясненням змін
- Що анімація показує про паттерн активності?
Рівень 3 — Дослідницький (максимум балів)
Поєднання мережевого аналізу та GEOINT:
- Зберіть дані, що мають і мережевий, і просторовий вимір (наприклад: Telegram-канали з відомою географічною прив’язкою учасників або геолоковані публікації з визначеного регіону)
- Побудуйте граф у Gephi → виявіть кластери
- Нанесіть вузли/актори на карту в QGIS → чи збігаються мережеві кластери з географічними кластерами?
- Використайте KDE Heatmap для просторової щільності активності
- Зробіть Kepler.gl Arc layer, що показує потоки між локаціями
Питання для відповіді в звіті: Чи існує просторова кореляція між мережевими спільнотами та географічними регіонами? Що це може свідчити про характер мережі?
Формат здачі
- Граф:
ДЗ14_Прізвище.gephi+ДЗ14_Прізвище_graph.png - Карта:
ДЗ14_Прізвище_map.png(скріншот QGIS із легендою) - Звіт:
ДЗ14_Прізвище_report.md - Дедлайн: до наступного заняття
- Захист: 5 хвилин — показати і граф, і карту, пояснити знахідки
Критерії оцінювання
| Критерій | Рівень 1 | Рівень 2 | Рівень 3 |
|---|---|---|---|
| Технічна правильність (Gephi) | 30% | 25% | 20% |
| Технічна правильність (QGIS) | 20% | 20% | 15% |
| Якість візуалізацій | 15% | 15% | 15% |
| Аналітична інтерпретація | 25% | 25% | 35% |
| Оформлення звіту | 10% | 10% | 10% |
| Геолокаційний pipeline / Cross-аналіз | — | 5% бонус | 5% бонус |
Кінець Уроку 14. Матеріали до наступного заняття: Урок-15-Майбутнє-OSINT