Pet-проєкт для відбору на KSE Agentic AI Summer School. Мета — аналіз часових рядів (+ базове прогнозування) повітряних тривог в Україні на Python.
Проєкт оцінюється за процесом, тож тут важливі не лише результати, а й рішення та їх обґрунтування. Ключові з них зібрані нижче.
Джерело: Vadimkin ukrainian-air-raid-sirens-dataset
(official_data_en.csv, оновлюється щодня).
Колонки: oblast, raion, hromada, level, started_at, finished_at, source; час у UTC.
Завантажується автоматично з фіксованого URL і кешується в data/ (у git не потрапляє).
- Структурний злам ~листопада 2025. Тривоги перейшли з обласного на районний рівень: обласних записів стало ~40/міс замість ~2000. Тому весь аналіз і прогноз роблено на однорідному вікні 2022-03-15 → 2025-07-31 на рівні області (єдине послідовне визначення «тривоги»). Період після — окрема історія (див. next steps).
- Масові дублі в джерелі. Кожен обласний рядок вписаний у файл двічі (сирі помісячні підрахунки були завищені вдвічі). Прибираються до будь-яких фільтрів; після дедуплікації залишається 62 139 реальних обласних тривог.
- Час → київський. Для аналізу «о котрій годині» час конвертується UTC→Europe/Kyiv (з урахуванням літнього/зимового переходу). Тривалість рахується на UTC (щоб перехід годинника не спотворював фактичний час події).
- Постійні сирени відсутні в даних (Луганська з квітня 2022, Крим з грудня 2022) — їх «вічний» стан тривоги не записаний, тож ці регіони занижені, а не «спокійні».
- Конвеєр самоперевіряється через
_sanity_check(кількість, 0 дублів, лишеoblast, дати в межах, невід'ємна тривалість).
daily_alerts.png— тривоги по днях: майже щодня (лише 1 тихий день за 1235), ~50/день, хвилями; провал узимку 2022/23, пік активності у 2024.hour_weekday_heatmap.png— початки тривог пікують вдень (11–14) і ввечері, найтихіше 05–07; різниця між днями тижня слабка.oblast_ranking.png— лідери: схід/південь (Донецька, Харківська, Запорізька…); Сумська/Чернігівська піднімаються за сумарним часом (довші тривоги).seasonality.png— зимового піку немає; визначає рівень рік (фаза війни), а не пора року.regime_transition.png— обласні vs районні помісячно по всьому таймлайну: наочно видно злам — обласні падають до ~0, районні злітають до ~7–9 тис/міс саме навколо нашого кордону 31.07.2025. Це чесний опис періоду «після вікна».
Ціль — денна кількість обласних тривог. Порівняння на walk-forward бектесті
(31 вікно × 28 днів), src/backtest.py:
| модель | MAE | RMSE |
|---|---|---|
| ETS | 15.9 | 20.0 |
| SARIMA | 16.0 | 20.0 |
| log-SARIMA | 16.0 | 20.3 |
| Prophet | 18.7 | 22.8 |
| GBM (boosting) | 19.9 | 24.8 |
| Naive (минулий тиждень) | 21.6 | 27.7 |
Висновки:
- Будь-яка адекватна модель б'є наївний бейзлайн на ~26% — моделювання реально допомагає.
- Але серед моделей ETS ≈ SARIMA ≈ log-SARIMA (різниці в межах шуму); складніші Prophet/бустинг/лог-трансформація не покращують результат.
- Стеля ~16 MAE (~30% від середнього) задана екзогенністю: піки спричинені зовнішніми воєнними рішеннями, яких немає в історії тривог. Пробити її можна лише зовнішніми регресорами, а не складнішою моделлю.
- Урок методології: на одному холдауті (липень 2025) наївна виглядала конкурентною — walk-forward це спростував. Один холдаут оманливий.
src/data.py # завантаження, дедуплікація, київський час, фільтр, sanity-check
src/eda.py # 4 розвідувальні графіки
src/forecast.py # моделі + один холдаут
src/backtest.py # walk-forward порівняння 6 моделей
figures/ # збережені PNG
python -m venv venv
venv/bin/pip install -r requirements.txt
venv/bin/python src/eda.py # EDA-графіки
venv/bin/python src/forecast.py # прогноз (один холдаут)
venv/bin/python src/backtest.py # walk-forward (надійне порівняння)- Період після 31.07.2025 показано описово (
regime_transition.png), але не моделюється кількісно. Принциповий апгрейд — згорнути районні тривоги вгору до області (область під тривогою, якщо хоч один район під тривогою) + злити інтервали, що перетинаються → неперервний ряд до «сьогодні». Дає тяглість/актуальність ціною шва й зсунутої семантики тривалості; точності прогнозу не додає, тому свідомо відкладено. - Пробити стелю точності можна лише зовнішніми ознаками (свята/річниці, погода, попередження про пуски) або іншою ціллю прогнозу (ймовірність «важкого дня», інтервали).
- Прогноз робиться на національному рівні; за областями ряди надто розріджені.