Часові ряди та що з ними робити. Гайд для початківців

Вітаю, я Дмитро Меланченко, провідний розробник в Salesforce. В цій статті я розповім про те що таке часові ряди, як їх створювати та як з їхньою допомогою можна передбачити майбутнє або знайти щось цікаве в минулому.

Часовий ряд — це структура даних, де кожен елемент складається з двох частин: число та часова відмітка, асоційована з цим числом. Прикладів використання часових рядів в повсякденному житті досить багато: прогноз температури на найближчі кілька днів, коливання курсів валют, відмітки зросту дітей на шибці дверей в батьківській хаті. Усе це приклади часових рядів. Як бачите, є ще одна надважлива характеристика будь-якого ряду — опис того, про що той чи інший ряд: чий це зріст або для якого міста це температура.

Наступне питання: нащо вони потрібні. Найчастіше, ця структура використовується для аналізу чогось в минулому або для прогнозування майбутнього.

Аналіз минулого за допомогою часових рядів

Аналізуючи дані з минулого, ми можемо:

  • обчислити пропущені значення. Є температура повітря о десятій ранку та опівдні, можна припустити, що температура повітря об одинадцятій є середнім значенням між тими значеннями, що в нас є, або можна скористатися більшим обсягом історичних даних та створити точнішу модель. Все залежить від мети, наявності часу, та доступних обчислювальних ресурсів;
  • перетворити кілька рядів в один. Припустимо в нас є дані про використання CPU на багатьох комп’ютерах за тиждень, натомість нам потрібна одна лінія, щоб зрозуміти коливання навантаження протягом доби. Для цього ми можемо, наприклад, обчислити середнє поміж всіх значень за кожен проміжок часу;
  • перетворення декількох інтервалів в один. Наприклад в нас є дані продажів за кожен день, ми можемо додати всі ці значення та порахувати обсяг продажів за місяць;
  • створення нових рядів за допомогою арифметичних операцій. Припустимо в нас є чеки з заправки за місяць, там вказані об’єм та вартість бензину, а нам цікаво як змінювалась ціна пального протягом цього часу. Тож ми розділимо вартість з кожного чеку на об’єм пального з того самого чекy та отримаємо часовий ряд ціни.

Уявіть, що є дані, записані в таблицю:

Час

Зріст Даринки

Зріст Христинки

Зріст Миколки

Січень

110

112

115

Лютий

111

114

Березень

111

114

117

За допомогою цих даних ми можемо зробити припущення відносно зросту Миколки у лютому, що буде обчисленням пропущеного значення. Можемо обчислити найбільший ріст серед дітей за кожен місяць, що буде перетворенням кількох рядів в один. Або знайти, на скільки в середньому діти зросли за 3 місяці — це буде перетворення декількох інтервалів в один.

Трохи про статистичну обробку даних

В системах що працюють з часовими рядами, як то Prometheus, InfluxDB, OpenTSDB та інші, є багато функцій для трансформації даних, і важливо розуміти, коли припустимо використовувати ті чи інші трансформації.

Середнє значення — сума всіх чисел, розділена на кількість. Доцільно використовувати, коли всі дані згруповані досить щільно та немає значень, які досить далеко від інших. Добре підходить для аналізу температури протягом доби, не підходить для аналізу ціни авто на ринку, бо старий «ланос» та новий «феррарі» коштують занадто по-різному.

Медіана — таке число, що більше за половину чисел з групи та менше за іншу половину. Наприклад, якщо група — це числа 1, 2, 3, 4, 5, то медіана — це 3. Використовується як заміна середньому коли якісь дані досить далеко від інших. Наприклад «медіанна зарплата в Києві становить 29,5 тис. гривень» означає, що половина людей в Києві отримує менше за 29,5К, а половина — більше.

Мінімум/максимум — доцільно використовувати, коли нам дійсно важливо знати найбільше або найменше значення. Наприклад, які статки найбагатшої людини в світі за кожен рік протягом останніх 100 років.

Високі/низькі перцентилі. Перцентиль — це число, що більше за якийсь відсоток чисел з групи та менше за всі інші числа з тієї ж групи. Розмір цього відсотка входить до назви перцентиля: 25-й процентиль більше за 25% значень та менше за решту 75%. Медіана — це 50-й процентиль. Високі перцентилі (з великим відсотком) використовуються замість максимуму, коли нас цікавлять максимальні значення, проте без екстремальних. Так, наприклад, ми можемо слідкувати за 99 перцентилем часу відповіді сервера на запити, та намагатись тримати його нижче за 300 мілісекунд. Один відсоток користувачів буде чекати довше, проте ціна зниження максимального значення нижче 300 мілісекунд може бути надто висока.

Відхилення — ця трансформація корисна, коли ми хочемо оцінити, наскільки показники, які ми аналізуємо, далекі від норми. Наприклад, лікарі оцінюють відхилення маси малюків від норми та можуть рекомендувати батькам, що зробити, щоб зменшити ці відхилення, якщо дітки занадто худі або надто важкі.

Вирівнювання часу та інтервали — часто вимірювання відбуваються не ідеально чітко в той момент, коли нам потрібно: температуру опівночі можуть виміряти о 23:59 або 00:03, як що ці розбіжності не важливі, то час вимірювання може бути вирівняний до цілої години, і всі ці вимірювання будуть записані нібито зроблені опівночі. Або якщо ми хочемо зберегти реальний час вимірювань, то ми можемо використовувати інтервал: опівночі +/- 15 хвилин.

Плаваючі вікна — досить часто дані, які ми аналізуємо мають багато маленьких коливань, зумовлених факторами, які ми не можемо контролювати. Наприклад, радіохвилі можуть призводити до коливань напруги на сенсорах, що буде призводити до незначних відхилень при вимірюваннях. Ми не можемо на це вплинути без додаткових витрат, проте ми можемо знизити ці ефекти шляхом, наприклад, підміни результату вимірювання середнім значенням цього вимірювання та декількох попередніх. Через те, що інтервал для усереднення постійно рухається, він називається «плаваючим», а сам інтервал зветься «вікном».

Крім наведених вище трансформацій, системи обробки часових рядів (TSDB — Time Series DataBase) дозволяють проводити арифметичні операції над даними, обчислювати похідні та логарифми, зсувати дані в часі, присвоїти їм нові імена та багато іншого. Найчастіше оригінальні дані проходять через серії трансформацій, перед тим як на їх основі можна робити якісь висновки.

Зазираючи в майбутнє

Крім аналізу даних в минулому, часові ряди можуть бути корисними для прогнозування майбутнього. Наприклад, уявімо ситуацію: з минулого ми знаємо, що медіанний денний обсяг продажів в травні вдвічі більший за січень та вдвічі менший за передноворічний. Тепер, маючи дані за травень, ми можемо прогнозувати, що буде з попитом взимку.

Подібний аналіз може бути виконаний як досить простими методами: вирахувати зміну продажів травень до травня, зсунути дані за минулу зиму на один рік вперед та помножити на коефіцієнт зміни в травні. Так і можуть застосовуватися складніші моделі, включно з тими, що використовують ML для побудови прогнозів.

Замість висновків

Через те, що часові ряди досить простий, розповсюджений формат та метод накопичення даних, доступний у всіх сферах нашого життя, навколо нього розроблений досить потужний математичний апарат для аналізу та прийняття рішень.

Також існує багато систем для роботи з даними y цьому форматі: від Excel до спеціалізованих продуктів, як-от InfluxDB, Amazon Timestream, Druid, Aerospike, DataDog та багато інших.

Працюючи з часовими рядами, найчастіше неможливо аналізувати кожне значення, тому критичним є розуміння того, які оригінальні дані використовуються, про що вони, які їх властивості, яка поведінка та особливості кожної трансформації, та чи відповідає результат очікуванням.

Сподобалась стаття? Натискай «Подобається» внизу. Це допоможе автору виграти подарунок у програмі #ПишуНаDOU

👍ПодобаєтьсяСподобалось18
До обраногоВ обраному5
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

це для кого взагалі стаття, чи аби написати.
«часові ряди», по суті це просто метрики, з цим знайомий кожен програміст.
що наступне, про арифметику для дошкільнят писати будемо?

Приклад для медіани (1,2,3,4,5) нерепрезентативний, бо не відрізняється від середнього значення.

Підписатись на коментарі