Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Аналіз часових рядів повітряних тривог в Україні

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 не потрапляє).

Ключові рішення та знахідки під час очищення

  1. Структурний злам ~листопада 2025. Тривоги перейшли з обласного на районний рівень: обласних записів стало ~40/міс замість ~2000. Тому весь аналіз і прогноз роблено на однорідному вікні 2022-03-15 → 2025-07-31 на рівні області (єдине послідовне визначення «тривоги»). Період після — окрема історія (див. next steps).
  2. Масові дублі в джерелі. Кожен обласний рядок вписаний у файл двічі (сирі помісячні підрахунки були завищені вдвічі). Прибираються до будь-яких фільтрів; після дедуплікації залишається 62 139 реальних обласних тривог.
  3. Час → київський. Для аналізу «о котрій годині» час конвертується UTC→Europe/Kyiv (з урахуванням літнього/зимового переходу). Тривалість рахується на UTC (щоб перехід годинника не спотворював фактичний час події).
  4. Постійні сирени відсутні в даних (Луганська з квітня 2022, Крим з грудня 2022) — їх «вічний» стан тривоги не записаний, тож ці регіони занижені, а не «спокійні».
  5. Конвеєр самоперевіряється через _sanity_check (кількість, 0 дублів, лише oblast, дати в межах, невід'ємна тривалість).

Результати

EDA (figures/)

  • 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), але не моделюється кількісно. Принциповий апгрейд — згорнути районні тривоги вгору до області (область під тривогою, якщо хоч один район під тривогою) + злити інтервали, що перетинаються → неперервний ряд до «сьогодні». Дає тяглість/актуальність ціною шва й зсунутої семантики тривалості; точності прогнозу не додає, тому свідомо відкладено.
  • Пробити стелю точності можна лише зовнішніми ознаками (свята/річниці, погода, попередження про пуски) або іншою ціллю прогнозу (ймовірність «важкого дня», інтервали).
  • Прогноз робиться на національному рівні; за областями ряди надто розріджені.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages