Будь ласка, використовуйте цей ідентифікатор, щоб цитувати або посилатися на цей матеріал:
https://er.chdtu.edu.ua/handle/ChSTU/9697| Назва: | Веб-орієнтований сервіс для класифікації та кластеризації великих даних на основі алгоритмів машинного навчання |
| Автори: | Триус, Юрій Васильович Бондаренко, Никита Максимович |
| Ключові слова: | ВЕЛИКІ ДАНІ;МАШИННЕ НАВЧАННЯ;КЛАСТЕРИЗАЦІЯ;КЛАСИФІКАЦІЯ;АЛГОРИТМ K-MEANS;RANDOM FOREST;FLASK;ВІЗУАЛІЗАЦІЯ ДАНИХ. |
| Дата публікації: | 10-чер-2026 |
| Короткий огляд (реферат): | Актуальність теми. Стрімке зростання обсягів великих даних у різних сферах діяльності людини зумовлює гостру потребу в інструментах для їхньої автоматизованої обробки. Більшість існуючих рішень вимагають від користувача спеціальних технічних навичок або значних обчислювальних ресурсів. Розробка веб-орієнтованого сервісу, що забезпечує інтуїтивно зрозумілий інтерфейс для класифікації та кластеризації даних без необхідності написання коду, є актуальним завданням, яке дозволяє демократизувати доступ до методів машинного навчання. Мета роботи і задачі дослідження. Метою кваліфікаційної роботи є проєктування та реалізація веб-орієнтованого сервісу для автоматизованого інтелектуального аналізу великих даних, який забезпечує гнучке завантаження, очищення, візуалізацію та обробку інформації за допомогою алгоритмів машинного навчання. Апробація результатів роботи. Основні положення і результати кваліфікаційної роботи бакалавра доповідалися і були обговорені на конференції «День студентської науки кафедри КНСА», 22 квітня 2026 року, Черкаси, Україна. Публікації. Н. М. Бондаренко, Ю. В. Триус. Веб-орієнтований сервіс для класифікації та кластеризації великих даних на базі алгоритмів машинного навчання : Збірник тез доповідей студентської науково-практичної конференції ЧДТУ : 22-23 квітня 2026 / [упорядник Мельник І.В.]; Міністерство освіти і науки України, Черкаський державний технологічний ун-т. Черкаси : ЧДТУ, 2026. С. 9-10. |
| URI (Уніфікований ідентифікатор ресурсу): | https://er.chdtu.edu.ua/handle/ChSTU/9697 |
| Розташовується у зібраннях: | 122 Комп’ютерні науки (Комп’ютерні науки та прикладне програмування) |
Файли цього матеріалу:
| Файл | Опис | Розмір | Формат | |
|---|---|---|---|---|
| Пояснювальна записка_Бондаренко Никита_КН-2201_2025-2026.pdf Restricted Access | 2.98 MB | Adobe PDF | Переглянути/Відкрити Запит копії |
Усі матеріали в архіві електронних ресурсів захищено авторським правом, усі права збережено.
Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра комп’ютерних наук та системного аналізу
Пояснювальна записка
до кваліфікаційної роботи
бакалавра
(освітньо-кваліфікаційний рівень)
на тему: «Веб-орієнтований сервіс для класифікації та кластеризації великих
даних на базі алгоритмів машинного навчання»
Виконав: студент 4 курсу, групи КН-2201
Спеціальності 122 − «Комп’ютерні науки»
(шифр і назва спеціальності)
Освітня програма «Комп’ютерні науки та
(назва освітньої програми)
прикладне програмування»
Никита БОНДАРЕНКО
Керівник Юрій ТРИУС
( ім’я та прізвище)
Рецензент Олександр Богатирьов
(ім’я та прізвище)
Черкаси 2026 року
Бланк завдання на кваліфікаційну роботу бакалавра студенту
Черкаський державний технологічний університет
Факультет Інформаційних технологій і систем
Кафедра Комп’ютерних наук та системного аналізу
Освітньо-кваліфікаційний рівень Бакалавр
Спеціальність 122 – Комп’ютерні науки
Освітня програма Комп’ютерні науки та прикладне програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри КНСА
_______________ Юрій ТРИУС
«____» _____________ 2026 р.
ЗАВДАННЯ
на кваліфікаційну роботу бакалавра студенту
Бондаренку Никиті Максимовичу
(прізвище, ім‘я, по батькові)
1. Тема роботи Веб-орієнтований сервіс для класифікації та кластеризації великих даних на базі
алгоритмів машинного навчання
Керівник роботи Триус Ю. В., д.п.н.,к.ф.-м.н., професор
(прізвище, ім’я, по батькові, науковий ступінь, вчене звання)
затверджені наказом університету від «12» березня 2026 р. №56/03-03.
2. Строк подання студентом роботи «08» червня 2026 року.
3. Вихідні дані до роботи:
Курсовий проєкт з дисципліни «Конструювання прикладного програмного забезпечення»
Звіт з виробничої практики. Звіт з переддипломної практики.
4. Зміст пояснювальної записки (перелік питань, що їх належить розробити):
Вступ
4.1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ
4.2. МАТЕМАТИЧНІ ОСНОВИ ТА АЛГОРИТМИ
4.3. АРХІТЕКТУРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ТА ПРАКТИЧНА РЕАЛІЗАЦІЯ
Висновки.
5. Перелік додатків (з точним зазначенням назв додатків):
5.1. Додаток А. Специфікація 482. ЧДТУ. 62282-01.
5.2. Додаток Б. Лістинг коду програми.
5.3. Додаток В. Інструкція користувача.
5.4. Додаток Г. Публікація з теми кваліфікаційної роботи бакалавра.
5.5 Презентація.
3
6. Консультанти розділів роботи
Прізвище, ініціали та Підпис, дата
Розділ посада
консультанта завдання видав завдання прийняв
7. Дата видачі завдання 12.01.2026 р.
КАЛЕНДАРНИЙ ПЛАН
№ з/п Назва етапів кваліфікаційної роботи бакалавра Строк виконання
етапів роботи Примітка
1 Видача завдання на кваліфікаційну роботу
бакалавра. 12.01.2026 Виконано
2 Аналіз літературних джерел, об’єкту та предмету
дослідження. до 08.02.2026 Виконано
3 Написання теоретичного розділу кваліфікаційної
роботи бакалавра. до 23.03.2026 Виконано
4 Написання аналітичного розділу (аналіз об’єкту
й предмету дослідження). до 06.04.2026 Виконано
5 Написання практичних розділів й висновків по
роботі. до 15.05.2026 Виконано
6 Передзахист кваліфікаційної роботи бакалавра
на засіданні кафедри КНСА. 26.05.2026 Виконано
7 Подання роботи завідувачу кафедри КНСА. до 10.06.2026 Виконано
8 Захист кваліфікаційної роботи бакалавра. 10.06.2026 Виконано
Студент Никита БОНДАРЕНКО
(підпис)
Керівник роботи Юрій ТРИУС
(підпис)
4
РЕФЕРАТ
Кваліфікаційна робота бакалавра містить: 74 с. основного тексту, 20 рис.,
2 таблиці, 19 використаних джерел, 4 додатки.
Актуальність теми. Стрімке зростання обсягів великих даних у різних сферах
діяльності людини зумовлює гостру потребу в інструментах для їхньої
автоматизованої обробки. Більшість існуючих рішень вимагають від користувача
спеціальних технічних навичок або значних обчислювальних ресурсів. Розробка веб-
орієнтованого сервісу, що забезпечує інтуїтивно зрозумілий інтерфейс для
класифікації та кластеризації даних без необхідності написання коду, є актуальним
завданням, яке дозволяє демократизувати доступ до методів машинного навчання.
Мета роботи і задачі дослідження. Метою кваліфікаційної роботи є
проєктування та реалізація веб-орієнтованого сервісу для автоматизованого
інтелектуального аналізу великих даних, який забезпечує гнучке завантаження,
очищення, візуалізацію та обробку інформації за допомогою алгоритмів машинного
навчання.
Для досягнення поставленої мети були сформовані такі завдання:
− проаналізувати існуючі підходи та програмні рішення для аналізу великих
даних;
− обґрунтувати вибір математичних моделей та алгоритмів машинного
навчання (K-Means, Random Forest тощо);
− розробити архітектуру системи на основі клієнт-серверної моделі (React/Vite
та Flask);
− реалізувати функціонал вибору таблиць при імпорті, редактор даних та
інтерактивну базу знань;
− провести тестування розробленого сервісу та оцінити ефективність
запропонованих рішень.
Об’єкт дослідження: процес класифікації та кластеризації великих даних у веб-
середовищі.
5
Предмет дослідження: методи, алгоритми та програмні засоби реалізації
інтелектуального аналізу даних у веб-орієнтованому сервісі.
Методи дослідження. Для вирішення поставлених завдань використано:
системний аналіз для дослідження предметної області; методи математичної
статистики та машинного навчання для групування та аналізу даних; методологію
об’єктно-орієнтованого аналізу і проєктування (ООАП) із застосуванням мови UML
для розробки архітектури ПЗ; сучасні веб-технології для створення інтерактивного
інтерфейсу та REST API.
Апробація результатів роботи. Основні положення і результати
кваліфікаційної роботи бакалавра доповідалися і були обговорені на конференції
«День студентської науки кафедри КНСА», 22 квітня 2026 року, Черкаси, Україна.
Публікації. Н. М. Бондаренко, Ю. В. Триус. Веб-орієнтований сервіс для
класифікації та кластеризації великих даних на базі алгоритмів машинного навчання :
Збірник тез доповідей студентської науково-практичної конференції ЧДТУ : 22-23
квітня 2026 / [упорядник Мельник І.В.]; Міністерство освіти і науки України,
Черкаський державний технологічний ун-т. Черкаси : ЧДТУ, 2026. С. 9-10.
Ключові слова: ВЕЛИКІ ДАНІ, МАШИННЕ НАВЧАННЯ,
КЛАСТЕРИЗАЦІЯ, КЛАСИФІКАЦІЯ, ВЕБ-СЕРВІС, REACT, FLASK, VITE,
АЛГОРИТМ K-MEANS, RANDOM FOREST, ВІЗУАЛІЗАЦІЯ ДАНИХ.
ABSTRACT
The bachelor’s qualification thesis consists of: 74 pages main text, 19 illustrations,
2 tables, 20 references, and 4 attachments.
Relevance of the topic. The rapid growth of big data volumes in various spheres of
human activity causes an urgent need for tools for their automated processing. Most existing
solutions require special technical skills or significant computing resources from the user.
The development of a web-oriented service that provides an intuitive interface for data
classification and clustering without the need for coding is an urgent task that allows
democratizing access to machine learning methods.
Purpose and tasks of the project. The purpose of the qualification work is the design
and implementation of a web-oriented service for automated intelligent analysis of big data,
6
which provides flexible loading, cleaning, visualization, and processing of information
using machine learning algorithms.
To achieve the set goal, the following tasks were defined:
− analyze existing approaches and software solutions for big data analysis;
− justify the choice of mathematical models and machine learning algorithms (K-
Means, Random Forest, etc.);
− develop the system architecture based on a client-server model (React/Vite and
Flask);
− implement the functionality of table selection during import, a data editor, and an
interactive knowledge base;
− test the developed service and evaluate the effectiveness of the proposed solutions.
Object of study: the process of classification and clustering of big data in a web
environment.
Subject of the study: methods, algorithms, and software tools for implementing the
intelligent data analysis in a web-oriented service.
Research Methods. Scientific and technical sources were used in the work to study
modern approaches to the development of hybrid web services. A comparative analysis of
existing analogues and services was conducted to determine their advantages and
disadvantages. A systematic analysis of the subject area was performed. Machine learning
methods for grouping and categorizing data were mastered and used. Object-oriented
software design was applied. A web interface was developed using modern frameworks.
Automatic testing of the application was implemented to verify correct operation and
evaluate effectiveness.
Approval of the results of the project. The main findings and results of the
bachelor’s thesis were presented and discussed at the conference ‘Student Research Day of
the Department of KNSU’, held on 22 April 2026 in Cherkasy, Ukraine.
Publications. N. M. Bondarenko, Yu. V. Tryus. Web-oriented service for
classification and clustering of big data based on machine learning algorithms: Collection
of abstracts from the Cherkasy State Technological University Student Scientific and
Practical Conference: 22–23 April 2026 / [edited by I. V. Melnyk]; Ministry of Education
7
and Science of Ukraine, Cherkasy State Technological University. Cherkasy: Cherkasy
State Technological University, 2026. p. 9-10.
Keywords: BIG DATA, MACHINE LEARNING, CLUSTERING,
CLASSIFICATION, WEB SERVICE, REACT, FLASK, VITE, K-MEANS
ALGORITHM, RANDOM FOREST, DATA VISUALIZATION.
8
ЗМІСТ
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ... 11
ВСТУП………………………………………………………………………………... 13
1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ………………………….…………………... 14
1.1 Аналітичний огляд літературних та інших джерел і програмних
аналогів………………………………............................................................. 16
1.1.1 Корпоративні платформи візуального аналізу……………………… 16
1.1.2 Хмарні платформи спільної роботи…………………………………... 18
1.1.3 Кодо-центровані інтерактивні середовища………………………...... 20
1.1.4 Узагальнення результатів аналізу……………………………………. 22
1.2 Системний аналіз об’єкта дослідження та предметної
області…………………………….………………………….………………. 22
1.2.1 Декомпозиція та концептуальна модель системи……………........... 23
1.2.2 Аналіз основних бізнес-процесів опрацювання даних.…………….. 23
1.2.3 Вимоги до інформаційно-освітньої підсистеми.……………………. 25
1.2.4 Висновки щодо системного аналізу………………………………….. 25
1.3 Постановка та обґрунтування проблеми…………………………………... 26
1.3.1 Формулювання мети розробки та концептуальна модель системи… 26
1.3.2 Функціональні вимоги до системи…………………………………… 27
1.3.3 Нефункціональні вимоги та архітектурні обмеження………………. 29
1.3.4 Структура системи та її базові програмні модулі…………………… 30
1.3.5 Очікуваний практичний ефект від впровадження…………………... 31
1.4 Методи та засоби вирішення проблеми……………………………………. 31
1.4.1 Обґрунтування вибору архітектурного підходу…………………….. 31
1.4.2 Вибір засобів реалізації серверної частини (Backend)………………. 32
1.4.3 Вибір засобів реалізації клієнтської частини (Frontend)……………. 33
Висновки до розділу 1………………………………………………………......... 33
2 МАТЕМАТИЧНІ ОСНОВИ ТА АЛГОРИТМИ………………………………… 35
2.1 Методи та засоби вирішення проблеми………………………………......... 35
9
2.1.1 Формалізація вхідного інформаційного простору…………………... 35
2.1.2 Математична постановка задачі класифікації……………………….. 36
2.1.3 Математична постановка задачі кластеризації……………………… 37
2.1.4 Метрики близькості та функції відстані у багатовимірному
просторі………………………………………………………………... 38
2.2 Аналіз алгоритмів машинного навчання…………………………………... 39
2.2.1 Алгоритм кластеризації K-Means (K-середніх)……………………… 39
2.2.2 Ансамблевий алгоритм класифікації Random Forest (Випадковий
ліс)……………………………………………………………………………. 40
2.2.3 Метод опорних векторів (Support Vector Machine, SVM)………….. 42
2.2.4 Порівняльний аналіз та обґрунтування застосування в системі…… 43
2.3 Алгоритмічний процес підготовки даних………………………………… 44
2.3.1 Алгоритми парсингу та ідентифікації типів даних………………… 44
2.3.2 Структурне очищення та фільтрація аномалій…………………….. 45
2.3.3 Математичні підходи до обробки пропущених значень (NaN)…… 45
2.3.4 Математична нормалізація та кодування простору ознак…………. 46
Висновки до розділу 2………………………………………………………........ 47
3 АРХІТЕКТУРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ТА ПРАКТИЧНА
РЕАЛІЗАЦІЯ…………………………………………………………………….. 49
3.1 Об’єктно-орієнтований аналіз та проєктування
архітектури…………………………………………………………………. 49
3.1.1 Моделювання прецедентів системи (Use Case)……………………. 49
3.1.2 Проєктування логічної та фізичної архітектури (Component
Diagram)……………………………………………………………………. 51
3.1.3 Моделювання динаміки системи (Sequence Diagram)………………. 52
3.2 Реалізація серверної частини системи…………………………………….. 55
3.2.1 Розробка REST API та маршрутизація (app.py)……………………... 55
3.2.2 Реалізація сервісу попередньої обробки даних (data_processing.py).. 57
3.2.3 Реалізація обчислювального ML-ядра (ml_engine.py)……………… 58
3.2.4 Інтеграція підсистем та генерація звітів……………………………... 60
10
3.3 Реалізація веб-інтерфейсу та клієнтської частини
системи…………………………………………………………………….. 60
3.3.1 Управління глобальним станом додатку (Zustand)………………….. 61
3.3.2 Реалізація модуля імпорту та попереднього перегляду…………….. 62
3.3.3 Модуль конфігурації ML та візуалізація результатів……………….. 64
3.3.4 Інтерактивна база знань……………………………………………….. 66
Висновки до розділу 3……………………………………………………............. 68
ВИСНОВКИ………...………………………………………...………………............ 70
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ………………...……………….................. 73
ДОДАТОК А. Специфікація 482. ЧДТУ. 62282-01………………............................ 75
ДОДАТОК Б. Лістинг коду програми………………...…………….......................... 77
ДОДАТОК В. Інструкція користувача………………...……………......................... 97
ДОДАТОК Г. Публікація по темі кваліфікаційної роботи бакалавра……………….. 103
11
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ
API (Application Programming Interface) – інтерфейс прикладного
програмування, набір інструментів та функцій для взаємодії між програмами.
CSV (Comma-Separated Values) – текстовий формат файлу, призначений для
представлення табличних даних, де значення розділені комою.
DOM (Document Object Model) – об’єктна модель документа, програмний
інтерфейс для HTML та XML документів.
EDA (Exploratory Data Analysis) – розвідувальний (попередній) аналіз даних для
виявлення їхньої основної структури та аномалій.
GUI (Graphical User Interface) – графічний інтерфейс користувача.
HMR (Hot Module Replacement) – технологія гарячої заміни модулів, що
дозволяє оновлювати код у браузері без повного перезавантаження сторінки.
HTTP (HyperText Transfer Protocol) – протокол передачі гіпертексту, основа
обміну даними у Всесвітній павутині.
IQR (Interquartile Range) – міжквартильний розмах, міра статистичної дисперсії,
що використовується для детекції аномалій (викидів) у даних.
JSON (JavaScript Object Notation) – легкий текстовий формат обміну даними,
зручний для читання людиною та машинного синтаксичного аналізу.
ML (Machine Learning) – машинне навчання, підклас штучного інтелекту, що
спеціалізується на розробці алгоритмів, які навчаються на даних.
MLOps (Machine Learning Operations) – набір практик для надійного та
ефективного розгортання і підтримки моделей машинного навчання у виробничому
середовищі.
NaN (Not a Number) – спеціальне числове значення, що використовується в
інформатиці для позначення невизначених значень або пропусків у масивах даних.
OHE (One-Hot Encoding) – унарне кодування, метод перетворення
категоріальних (текстових) змінних у бінарні вектори для машинного навчання.
12
PCA (Principal Component Analysis) – метод головних компонент, математичний
алгоритм зниження розмірності простору ознак із мінімальною втратою
інформативності.
RBF (Radial Basis Function) – радіально-базисна функція ядра, що
використовується в алгоритмі SVM для класифікації лінійно нероздільних даних.
REST (Representational State Transfer) – архітектурний стиль проєктування
розподілених систем та веб-сервісів.
SaaS (Software as a Service) – програмне забезпечення як послуга, модель
поширення ПЗ, за якої доступ до додатку надається через веб-браузер.
SPA (Single Page Application) – односторінковий веб-застосунок, який
завантажує єдиний HTML-документ і динамічно оновлює його вміст під час взаємодії
з користувачем.
SVM (Support Vector Machine) – метод опорних векторів, алгоритм керованого
машинного навчання, що використовується для класифікації та регресії.
UI (User Interface) – інтерфейс користувача, сукупність засобів, за допомогою
яких користувач взаємодіє з програмою.
UML (Unified Modeling Language) – уніфікована мова моделювання, стандарт
візуалізації, специфікації та документування архітектури програмного забезпечення.
UX (User Experience) – досвід користувача, сприйняття та емоції людини при
використанні програмного продукту.
WCSS (Within-Cluster Sum of Squares) – внутрішньокластерна сума квадратів
відстаней, математичний критерій для оцінки якості розбиття даних на кластери
(зокрема, в алгоритмі K-Means).
13
ВСТУП
Сучасний етап розвитку глобальної інформаційної інфраструктури
характеризується тотальною цифровізацією всіх сфер діяльності людини. Протягом
останнього десятиліття обсяги даних, що генеруються соціальними мережами,
сенсорами Інтернету речей (IoT), фінансовими інституціями та науковими центрами,
досягли масштабів, які неможливо опрацювати за допомогою традиційних методів.
Феномен «великих даних» (Big Data) став не лише технічним викликом, а й
стратегічним ресурсом, здатним забезпечити конкурентну перевагу, точність
наукових прогнозів та ефективність управлінських рішень.
Водночас стрімкий розвиток хмарних обчислень та веб-технологій змінив
парадигму взаємодії користувача з аналітичними системами. Сучасні ІТ-рішення
дедалі частіше базуються на архітектурі «клієнт-сервер», що дозволяє перенести
складні математичні розрахунки на потужні серверні вузли, надаючи користувачеві
лише легкий та адаптивний інтерфейс через веб-браузер. Проте, попри наявність
потужних професійних платформ, залишається актуальною проблема створення
спеціалізованих сервісів, які були б достатньо простими для прикладного
використання аналітиками, але водночас забезпечували б високу точність обробки
даних завдяки сучасним алгоритмам класифікації та кластеризації.
Світові тенденції в галузі розробки інтелектуальних систем вказують на
необхідність поєднання гнучкості веб-інтерфейсів із потужністю аналітичних
інструментів. Саме на перетині цих напрямів – інтелектуального аналізу великих
даних та розробки веб-орієнтованих сервісів – зосереджено дане дослідження.
Актуальність теми. Сучасний етап розвитку інформаційних технологій
характеризується стрімким накопиченням колосальних обсягів даних у всіх сферах
діяльності людини – від фінансового сектору та електронної комерції до наукових
досліджень та державного управління. Ефективне використання цих активів потребує
впровадження методів інтелектуального аналізу даних, зокрема їх класифікації та
кластеризації, які дозволяють виявляти приховані закономірності та структурувати
несистематизовану інформацію.
14
Попри наявність потужних аналітичних платформ, більшість із них орієнтовані
на фахівців із глибокими знаннями з програмування та математичної статистики. Для
широкого кола користувачів (аналітиків, менеджерів, дослідників) існує гостра
потреба в інструментах, які поєднують потужні алгоритми машинного навчання із
доступним та зрозумілим інтерфейсом [4, 10]. Світові тенденції в галузі
комп’ютерних наук демонструють перехід до «демократизації доступу до даних», що
передбачає створення веб-орієнтованих сервісів, які працюють за моделлю Software
as a Service (SaaS) і не потребують локальних обчислювальних потужностей.
Робота спрямована на вирішення актуального завдання – створення
інтегрованого веб-середовища, яке забезпечує повний цикл обробки даних: від
гнучкого імпорту конкретних таблиць із багатосторінкових джерел до інтерактивної
візуалізації результатів і формування аналітичних звітів. Це дозволяє значно знизити
поріг входу для використання методів Data Science у прикладних задачах.
Мета роботи і задачі дослідження. Метою кваліфікаційної роботи бакалавра є
проєктування та реалізація веб-орієнтованого сервісу для автоматизованого
інтелектуального аналізу великих даних, який забезпечує гнучке завантаження,
очищення, візуалізацію та обробку інформації за допомогою алгоритмів машинного
навчання.
Для досягнення поставленої мети були сформовані такі завдання:
− проаналізувати існуючі підходи та програмні рішення для аналізу великих
даних;
− обґрунтувати вибір математичних моделей та алгоритмів машинного
навчання (K-Means, Random Forest тощо);
− розробити архітектуру системи на основі клієнт-серверної моделі (React/Vite
та Flask);
− реалізувати функціонал вибору таблиць при імпорті, редактор даних та
інтерактивну базу знань;
− провести тестування розробленого сервісу та оцінити ефективність
запропонованих рішень.
15
Об’єкт дослідження: процес класифікації та кластеризації великих даних у веб-
середовищі.
Предмет дослідження: методи, алгоритми та програмні засоби реалізації
інтелектуального аналізу даних у веб-орієнтованому сервісі.
Методи дослідження. Для вирішення поставлених завдань використано:
системний аналіз для дослідження предметної області; методи математичної
статистики та машинного навчання для групування та аналізу даних; методологію
об’єктно-орієнтованого аналізу і проєктування (ООАП) із застосуванням мови UML
для розробки архітектури ПЗ; сучасні веб-технології для створення інтерактивного
інтерфейсу та REST API [8, 9, 11].
Наукова новизна отриманих результатів полягає у вдосконаленні
архітектури веб-орієнтованих систем аналізу даних шляхом інтеграції механізму
вибору підмножин даних на етапі імпорту та поєднання аналітичного інструментарію
з інтерактивною базою знань, що забезпечує підвищення ефективності взаємодії
користувача з алгоритмами машинного навчання.
Практичне значення отриманих результатів. Розроблений сервіс може бути
використаний як автономний інструмент для швидкого аналізу даних малим та
середнім бізнесом, а також як освітня платформа для вивчення принципів машинного
навчання. Реалізована модульна структура дозволяє інтегрувати нові алгоритми та
розширювати функціонал системи відповідно до специфічних потреб замовника.
Апробація результатів роботи. Основні положення і результати
кваліфікаційної роботи бакалавра доповідалися і були обговорені на конференції
«День студентської науки кафедри КНСА», 22 квітня 2026 року, Черкаси, Україна.
Публікації. Н. М. Бондаренко, Ю. В. Триус. Веб-орієнтований сервіс для
класифікації та кластеризації великих даних на базі алгоритмів машинного навчання
: Збірник тез доповідей студентської науково-практичної конференції ЧДТУ : 22-23
квітня 2026 / [упорядник Мельник І.В.]; Міністерство освіти і науки України,
Черкаський державний технологічний ун-т. Черкаси : ЧДТУ, 2026. С. 9-10.
16
1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ
Перший розділ роботи присвячений комплексному дослідженню предметної
області, аналізу існуючих технологічних рішень у сфері обробки великих даних та
формуванню вимог до веб-орієнтованого сервісу, що розробляться. Системний аналіз
дозволяє розглянути об’єкт дослідження як сукупність взаємопов’язаних елементів,
що взаємодіють для досягнення спільної мети – отримання достовірних аналітичних
результатів на основі алгоритмів машинного навчання.
У межах цього розділу проводиться декомпозиція загальної проблеми,
визначаються межі системи та її зовнішнє оточення. Основна увага приділяється
порівняльному аналізу сучасних засобів класифікації та кластеризації, що дає змогу
виявити їхні критичні недоліки при роботі в динамічному веб-середовищі та
обґрунтувати доцільність створення власного спеціалізованого рішення.
1.1 Аналітичний огляд літературних та інших джерел і програмних
аналогів
Розвиток індустрії Machine Learning (ML) та Big Data призвів до формування
різноманітного ринку програмних продуктів [4]. Для обґрунтування розробки
власного веб-сервісу проведемо дослідження шести провідних рішень, розділених на
три функціональні категорії.
1.1.1 Корпоративні платформи візуального аналізу. Дана категорія
представлена «важкими» програмними комплексами, що встановлюються
безпосередньо на робочу станцію користувача. Вони орієнтовані на візуальне
програмування без коду.
RapidMiner Studio. RapidMiner є одним із лідерів у сегменті візуального
аналізу. Основна концепція продукту – побудова аналітичних потоків (processes) за
допомогою перетягування функціональних блоків (operators). Візуальна складова
додатку представлена на рисунку 1.1.
17
Рисунок 1.1 – Інтерфейс додатку Rapidminer Studio
Перевагами додатку є:
− величезна бібліотека вбудованих алгоритмів (понад 1500 операторів);
− можливість автоматичного підбору моделей (Auto Model).
З іншого боку є і недоліки, серед яких:
− висока вартість комерційної ліцензії;
− оскільки це десктопний додаток, обробка дійсно великих даних обмежена
обсягом оперативної пам'яті локального комп'ютера;
− інтерфейс є занадто складним для швидкого освоєння користувачами,
зокрема бізнес-аналітиками.
IBM SPSS Modeler. Це професійний інструмент, що має багаторічну історію в
галузі статистичного аналізу. Він дозволяє будувати складні прогностичні моделі за
допомогою графічного інтерфейсу (рис. 1.2).
18
Рисунок 1.2 – Інтерфейс додатку IBM SPSS Modeler
Перевагами цього інструменту є його потужний математичний апарат,
стабільність роботи з традиційними базами даних та наявність функцій автоматичної
класифікації.
Серед недоліків варто виділити:
− закритість екосистеми;
− монолітність архітектури, що ускладнює інтеграцію з сучасними веб-
інструментами та бібліотеками з відкритим кодом.
1.1.2 Хмарні платформи спільної роботи. Ці системи працюють у браузері,
але орієнтовані на великі команди розробників та складні інфраструктурні проєкти.
Dataiku DSS (Data Science Studio). Централізована платформа, яка намагається
поєднати «no-code» підхід із можливістю написання власного коду. Інтерфейс
представлено на рисунку 1.3.
19
Рисунок 1.3 – Інтерфейс Dataiku DSS
Перевагами цієї системи є потужний інструментарій для спільної роботи
(Collaboration), а також можливість візуального очищення даних (Data Preparation),
що нагадує роботу з електронними таблицями.
Незважаючи на низку переваг, платформа має і свої недоліки:
− складність розгортання та підтримки серверної частини;
− орієнтація на великі корпорації (Enterprise), що робить систему надлишковою
для невеликих аналітичних сервісів.
Google Cloud Vertex AI. Вершина еволюції хмарних сервісів від Google, що
об'єднує всі інструменти AutoML та AI Platform в один інтерфейс (рис. 1.4).
Рисунок 1.4 – Інтерфейс Google Cloud Vertex AI
20
Перевагами цього сервісу є:
− майже безмежне масштабування обчислень;
− можливість тренувати моделі на великих масивах даних без налаштування
серверів.
Проте попри переваги є і недоліки, серед яких:
− висока складність консолі керування;
− вартість послуг важко спрогнозувати наперед;
− для використання функцій класифікації/кластеризації все одно потрібні
знання архітектури ML-систем.
1.1.3 Кодо-центровані інтерактивні середовища. Ця категорія є «золотим
стандартом» в сфері Data Science, де вся обробка відбувається шляхом написання
скриптів.
Jupyter Notebook (у поєднанні з Scikit-learn). Найпопулярніше середовище
для розробки та документування досліджень. Весь процес аналізу (імпорт, очищення,
моделювання) описується кодом на Python (рис. 1.5) [1, 7].
Рисунок 1.5 – Інтерфейс Jupyter Notebook в середовищі VS Code
21
Перевагами такого підходу можна відзначити повну гнучкість в написанні коду,
доступ до найсучасніших версій бібліотек аналізу даних, а також можливість
виконувати код покроково, з миттєвою візуалізацією графіків.
Недоліками варто відзначити наступне:
− повна відсутність інтерфейсу для кінцевого користувача;
− для зміни одного параметру кластеризації (наприклад, кількості кластерів k)
необхідно редагувати код.
Google Colab. Це хмарна версія Jupyter, що надає безкоштовний доступ до
обчислювальних ресурсів (GPU/TPU) (рис. 1.6).
Рисунок 1.6 – Інтерфейс Google Colab
Сервіс Google Colab має такі переваги:
− не потребує локального налаштування середовища;
− ідеально підходить для розробки прототипів алгоритмів.
Проте він також залежить від стабільного інтернет-з’єднання, сесії мають
обмеження за часом, а інтерфейс так само залишається суто програмним, що не
підходить для «SaaS-рішення», орієнтованого на широке коло користувачів.
22
1.1.4 Узагальнення результатів аналізу. На основі проведеного огляду
можна зробити висновок, що ринок програмного забезпечення для аналізу даних має
значний розрив між складними професійними інструментами (RapidMiner, Vertex AI)
та кодо-залежними середовищами (Jupyter).
Для наочності порівняємо ключові характеристики розглянутих програмних
рішень у таблиці 1.1.
Таблиця 1.1 – Порівняльний аналіз програмних аналогів
Назва Тип Потреба в коді Доступність Гнучкість
продукту інтерфейсу імпорту
RapidMiner Графічний Ні Платна Середня
(Nodes) (висока)
IBM SPSS Графічний Ні Платна Низька
Dataiku DSS Гібридний Опційно Платна Висока
Vertex AI Веб-консоль Так Платна (SaaS) Середня
Jupyter Текстовий Так Безкоштовно Абсолютна
(Code)
Google Colab Веб-текстовий Так Безкоштовно Абсолютна
Проєкт КВРБ Інтерактивний Ні Безкоштовно Висока (Sheet
веб Selection)
Аналіз підтверджує, що розробка веб-сервісу на базі React та Flask дозволить
поєднати потужність бібліотек (як у Jupyter) зі зручністю візуального керування (як у
RapidMiner), забезпечуючи при цьому унікальні функції, такі як інтерактивна база
знань та гнучкий вибір таблиць при імпорті.
1.2 Системний аналіз об’єкта дослідження та предметної області
Системний підхід є фундаментальною методологією при проєктуванні
складних інформаційних систем. Він передбачає розгляд об'єкта дослідження не як
набору ізольованих компонентів, а як цілісної сукупності взаємопов'язаних елементів,
23
що функціонують у певному середовищі для досягнення єдиної мети. У контексті
даної кваліфікаційної роботи бакалавра об’єктом дослідження є процес класифікації
та кластеризації великих даних у веб-середовищі.
1.2.1 Декомпозиція та концептуальна модель системи. Для проведення
системного аналізу необхідно чітко окреслити межі розроблюваної системи. Веб-
орієнтований сервіс інтелектуального аналізу даних (Data Intelligence Web Service) є
соціотехнічною системою, де користувач (людина-оператор, аналітик) тісно
взаємодіє з програмно-апаратним комплексом (клієнтський веб-додаток і серверна
частина).
Система функціонує в умовах зовнішнього середовища, яким є гетерогенні
джерела даних. На вхід системи надходять «сирі» набори даних (Raw Data), які часто
є неструктурованими, містять пропуски, шуми або надлишкову інформацію. Виходом
системи є структуровані, очищені дані, поділені на логічні групи (кластери) або
віднесені до певних категорій (класи), а також аналітичні звіти та візуалізації.
Мету розробки системи – автоматизацію інтелектуального аналізу великих
даних – можна декомпозувати на ряд підцілей (завдань), які формують архітектуру
функціональних модулів:
− забезпечення гнучкого прийому та первинної обробки багатовимірних даних;
− надання інструментарію для верифікації та коригування даних користувачем;
− виконання обчислювально складних алгоритмів машинного навчання без
перевантаження клієнтського пристрою;
− забезпечення високого рівня інтерпретованості результатів та освітньої
підтримки користувача.
1.2.2 Аналіз основних бізнес-процесів опрацювання даних. Життєвий цикл
даних у розроблюваній системі можна описати через послідовність ключових бізнес-
процесів, кожен з яких висуває специфічні вимоги до програмної реалізації.
Процес 1: Імпорт та ідентифікація даних. Процес починається із завантаження
файлу даних користувачем. Оскільки великі дані часто зберігаються у складних
форматах (наприклад, багатосторінкові таблиці або вивантаження з баз даних),
система не повинна обмежуватися сліпим парсингом першого знайденого аркуша.
24
Системний аналіз виявляє критичну вимогу: при завантаженні файлу, якщо в ньому є
декілька сторінок або таблиць, користувач повинен мати змогу інтерактивно обрати,
з якої саме таблиці робити подальшу обробку. Це мінімізує помилки на ранніх етапах
аналізу даних.
Процес 2: Попереднє очищення та підготовка. Дані, отримані з реальних
джерел, майже завжди потребують нормалізації. Цей процес включає обробку
нульових значень (NaN), стандартизацію числових шкал та видалення артефактів. У
багатьох практичних випадках неструктуровані текстові файли містять системне
сміття. Для таких специфічних сценаріїв логіка серверної обробки повинна
підтримувати структурне очищення – наприклад, цілеспрямоване видалення першого
та третього рядків датасету, якщо вони містять технічні теги зображень або порожні
простори, що порушують цілісність матриці ознак перед подачею її до алгоритмів
машинного навчання.
Процес 3: Інтерактивна валідація даних. Після первинного очищення даних
система повинна надати користувачеві можливість перевірити коректність парсингу.
Традиційні системи часто обмежують попередній перегляд першими 10 записами.
Однак системний підхід вимагає наявності повноцінного модуля попереднього
перегляду даних із можливістю пагінації (перемикання між сторінками даних) або
вбудованого редактора даних. Це дозволяє аналітику візуально оцінити розподіл
значень у всьому масиві перед запуском ресурсомістких обчислень.
Процес 4: Математичне моделювання. Процес розділяється на два незалежні
потоки:
− Кластеризація (некероване навчання): система аналізує внутрішню
структуру даних, визначає відстані між об'єктами в n-вимірному просторі та
формує групи схожих об'єктів (наприклад, алгоритмом K-Means);
− Класифікація (кероване навчання): система використовує розмічені історичні
дані для побудови вирішальних правил (наприклад, алгоритм випадкового
лісу), щоб у майбутньому відносити нові об'єкти до відомих класів [12, 13].
Процес 5: Експорт та звітність. Завершальним етапом є виведення
результатів. Система повинна генерувати не лише візуальні графіки в інтерфейсі, але
25
й надавати можливість завантажити оброблений датасет (із доданими мітками класів
або кластерів) та комплексний звіт про проведену класифікацію/кластеризацію у
зручному для подальшого використання форматі.
1.2.3 Вимоги до інформаційно-освітньої підсистеми. Враховуючи, що
цільовою аудиторією сервісу є користувачі, які можуть не мати глибокої
математичної підготовки, системний аналіз виявляє потребу в інтеграції модуля
інтерпретації – бази знань.
Підсистема "Knowledge base" є невід'ємною частиною сервісу та повинна мати
чітку ієрархічну структуру. На верхньому рівні користувачеві має надаватися
можливість вибору між двома основними напрямами обробки даних, що
репрезентуються у вигляді інтерактивних карток: "Кластеризація" та "Класифікація".
На сторінці кожного типу обробки необхідно розмістити короткий концептуальний
опис відповідного процесу (пояснення простими словами, уникаючи надмірно
складних математичних формул на першому етапі ознайомлення).
Доступні для використання методи (наприклад, K-Means, DBSCAN, SVM,
Random Forest) також мають бути представлені у вигляді навігаційних карток.
Перехід за такою карткою відкриває сторінку опису конкретного методу з
обов'язковою візуалізацією принципів його роботи. Крім того, розділ «Аналіз та
діагностика» має бути спроєктований із застосуванням сучасних підходів до
адаптивного веб-дизайну: весь текст і візуальні матеріали повинні повністю
поміщатися на екрані без агресивних скорочень, забезпечуючи комфортне читання та
засвоєння інформації користувачем.
1.2.4 Висновки щодо системного аналізу. Проведений системний аналіз
основних бізнес-процесів опрацювання даних дозволив сформувати комплексне
бачення призначення і структуру веб-орієнтованого сервісу. Виявлено, що для
забезпечення необхідної гнучкості та продуктивності системи класична монолітна
архітектура є неефективною. Ефективним рішенням є використання RESTful
архітектури з чітким розділенням відповідальності:
− клієнтський додаток (Frontend) відповідає за взаємодію з користувачем,
багатоетапні форми завантаження, інтерактивний вибір таблиць,
26
повноцінний редактор даних та рендеринг бази знань;
− серверний додаток (Backend) виступає в ролі обчислювального ядра,
обробляючи запити на очищення даних (зокрема структурне видалення
невалідних рядків) та виконуючи математичні операції класифікації і
кластеризації за допомогою спеціалізованих ML-бібліотек.
Така декомпозиція проблеми створює надійне підґрунтя для переходу до
наступного етапу – постановки задачі та вибору конкретних програмно-
технологічних засобів для її реалізації.
1.3 Постановка та обґрунтування проблеми
На основі проведеного аналітичного огляду та системного аналізу предметної
області можна констатувати наявність суттєвої проблеми у сфері прикладного аналізу
даних. З одного боку, існує об’єктивна потреба бізнесу та наукової спільноти у
швидкій класифікації та кластеризації інформації. З іншого боку, наявні на ринку
програмні рішення створюють штучні бар’єри: вони або вимагають глибоких знань у
програмуванні (як у випадку з Python-бібліотеками), або є фінансово та апаратно
недоступними для широкого кола користувачів (як корпоративні Enterprise-системи).
Вирішення цієї суперечності полягає у розробці спеціалізованого веб-
орієнтованого сервісу, який виступатиме «мостом» між складними математичними
алгоритмами машинного навчання та кінцевим користувачем, не вимагаючи від
останнього навичок написання коду.
1.3.1 Формулювання мети розробки та концептуальна модель системи.
Головною метою розробки є створення архітектурно гнучкого веб-застосунку, який
забезпечить повний цикл інтелектуального аналізу даних: від багатоетапного імпорту
та специфічного очищення до застосування алгоритмів класифікації/кластеризації та
вивантаження результатів, паралельно виконуючи освітню функцію через вбудовану
базу знань.
Для формалізації постановки задачі побудуємо концептуальну модель системи
у вигляді «чорної скриньки», що описується множиною вхідних параметрів X,
27
множиною вихідних результатів Y та функцією перетворення F, яку реалізує серверна
частина системи:
= ().
Вхідні дані (Х):
− неструктуровані або напівструктуровані масиви даних: файли у форматах
.csv, .xlsx, .json, які можуть мати складну структуру (наприклад, декілька
аркушів у книзі Excel);
− керуючі параметри користувача: вибір конкретної таблиці для обробки,
вказівки щодо структурного очищення (видалення певних рядків чи
колонок), гіперпараметри моделей машинного навчання (наприклад,
кількість кластерів k для алгоритму K-Means або цільова змінна для
класифікації).
Вихідні дані (Y):
− модифіковані масиви даних: очищені та збагачені датасети, де кожному
запису присвоєно нову мітку (ідентифікатор кластера або передбачений
клас);
− аналітичні звіти та візуалізації: JSON-пакети, що містять координати для
побудови інтерактивних графіків (Scatter plots, розподіли), а також
математичні метрики оцінки якості моделей (Accuracy, Silhouette Score
тощо);
− файли для завантаження: готові звіти про результати аналізу та опрацьовані
файли, доступні для збереження на локальний комп'ютер користувача.
1.3.2 Функціональні вимоги до системи. Для успішного досягнення
поставленої мети програмний продукт повинен задовольняти чітко визначеному
набору функціональних вимог. Систему необхідно спроєктувати так, щоб вона
охоплювала п'ять логічних доменів: імпорт, очищення, аналіз, візуалізацію та
навчання.
Вимоги до підсистеми імпорту:
− система повинна підтримувати завантаження датасетів через веб-інтерфейс
(multipart/form-data);
28
− при завантаженні багатосторінкових файлів (або вивантажень із баз даних,
що містять декілька таблиць) система обов'язково повинна надавати
користувачеві можливість інтерактивно обрати, з якої саме таблиці/сторінки
буде здійснюватися подальша обробка.
Вимоги до підсистеми очищення та редагування:
− забезпечення механізмів структурного очищення, зокрема, алгоритм повинен
вміти обробляти специфічні патерни забруднення даних, наприклад,
цілеспрямовано видаляти 1-й та 3-й рядки у текстових масивах, якщо вони
містять технічні теги зображень чи порожні простори, що порушують
матрицю ознак;
− реалізація повноцінного інтерактивного редактора даних: замість
стандартного для багатьох систем обмеження на попередній перегляд (лише
перших 10 записів), користувач повинен мати можливість повного перегляду
масиву даних за допомогою зручної пагінації та інструментів фільтрації.
Вимоги до математичного ядра:
− система повинна реалізовувати алгоритми некерованого навчання
(кластеризацію) для знаходження прихованих структур у даних;
− система повинна підтримувати алгоритми керованого навчання
(класифікацію) для прогнозування категорій на основі розмічених наборів
ознак;
− усі ресурсоємні обчислення мають виконуватися асинхронно на серверній
стороні системи.
Вимоги до підсистеми візуалізації та експорту:
− динамічна генерація графіків на клієнтській стороні на основі розрахованих
сервером координат;
− можливість завантажити фінальний оброблений датасет та текстовий звіт про
результати роботи алгоритму.
Вимоги до підсистеми інтерактивного навчання:
− сторінка бази знань має бути спроєктована за принципом карток: на
верхньому рівні користувач обирає між двома глобальними категоріями:
29
«Кластеризація» та «Класифікація»;
− на сторінці кожної категорії повинен міститися короткий концептуальний
опис методології простими словами (без складних математичних формул);
− назви доступних методів машинного навчання мають бути представлені у
вигляді вкладених карток, натискання на які переводить користувача на
сторінку з описом конкретного методу та візуалізацією принципів його
роботи.
Текстовий контент розділу "Аналіз та діагностика" повинен адаптивно
вміщуватися на екрані без використання скорочень.
1.3.3 Нефункціональні вимоги та архітектурні обмеження. Окрім прямого
функціоналу, сервіс повинен відповідати ряду технічних критеріїв якості:
− Архітектурна відокремленість. Проєкт має базуватися на принципах
RESTful API. Клієнтська частина (Frontend) та серверна частина (Backend)
повинні бути ізольованими. Взаємодія між ними має здійснюватися
виключно шляхом обміну JSON-повідомленнями;
− Управління станом. Для уникнення проблеми "prop-drilling" (передачі
параметрів через безліч рівнів компонентів) клієнтський додаток повинен
використовувати єдине глобальне сховище стану (наприклад, Zustand), яке
зберігатиме метадані файлу, поточний крок аналізу та результати;
− Відмовостійкість. Серверна частина повинна коректно обробляти помилки
(наприклад, спроби кластеризації нечислових даних) і повертати клієнту
зрозумілі HTTP-статуси з текстовим описом проблеми, не допускаючи
падіння всього сервісу;
− Кросплатформеність. Оскільки додаток є веб-орієнтованим, то він повинен
коректно відображатися і функціонувати в усіх сучасних веб-браузерах на
різних операційних системах (Windows, macOS, Linux).
30
1.3.4 Структура системи та її базові програмні модулі. Оскільки
розроблюваний сервіс проектується з використанням розділеної клієнт-серверної
архітектури, для забезпечення виконання наведених вище вимог його концептуальну
структуру декомпозовано на два взаємодіючі блоки з відповідними логічними
модулями. Ця структура стане основою для подальшої програмної реалізації:
Модулі клієнтської частини (Frontend):
− Модуль управління станом (store) – єдине сховище, що відповідає за
збереження метаданих сесії, завантаженого файлу та результатів обчислень;
− Модулі інтерфейсу користувача (components) – набір інкапсульованих
блоків, що відповідають за завантаження та вибір таблиць (Ingestion),
попередній перегляд (Cleaning), конфігурацію параметрів машинного навчання
(Analysis), інтерактивну візуалізацію графіків (Visualization) та відображення
довідкової інформації (Knowledge).
Модулі серверної частини (Backend):
− Контролер маршрутизації (app.py) – API-шлюз, що приймає HTTP-запити
від клієнта, здійснює базову валідацію та керує загальним потоком виконання;
− Модуль попередньої обробки (data_processing.py) – сервіс, який
відповідає за читання файлів (парсинг), структурне очищення рядків, імпутацію
пропущених значень та підготовку матриці ознак;
− Модуль інтелектуального аналізу (ml_engine.py) – обчислювальне ядро,
що містить математичну логіку ініціалізації, тренування та оцінки моделей
класифікації і кластеризації;
− Модуль генерації візуалізацій (visualizations.py) – сервіс трансформації
розрахованих даних (наприклад, зменшення розмірності простору) у
структурований JSON-формат для побудови графіків на фронтенді.
Таке модульне розділення відповідальності дозволяє забезпечити високу
гнучкість системи, спрощує її тестування та слугуватиме головним критерієм при
виборі конкретного технологічного стеку.
31
1.3.5 Очікуваний практичний ефект від впровадження. Реалізація заявленої
системи дозволить вирішити відразу декілька практичних завдань.
По-перше, значно скоротиться час на проведення первинного Exploratory Data
Analysis (EDA) для фахівців-початківців, оскільки рутинні операції з вибору таблиць
та очищення рядків будуть автоматизовані через графічний інтерфейс.
По-друге, інтеграція інтерактивної бази знань перетворює програмний продукт
із простого обчислювального інструменту на потужну освітню платформу.
Користувачі зможуть не лише отримувати результати класифікації, а й візуально
розуміти, як саме працюють обрані методи, що відповідає глобальному тренду на
підвищення прозорості систем машинного навчання.
1.4 Методи та засоби вирішення проблеми
Для успішної реалізації поставлених завдань і задоволення сформованих
функціональних та нефункціональних вимог необхідно здійснити обґрунтований
вибір технологічного стеку та архітектурних шаблонів. Складність розроблюваної
системи полягає в необхідності поєднання двох кардинально різних парадигм:
ресурсоємних математичних обчислень (машинне навчання) та високоінтерактивного
користувацького інтерфейсу з миттєвим відгуком (веб-додаток).
1.4.1 Обґрунтування вибору архітектурного підходу. Традиційна монолітна
архітектура (де сервер генерує HTML-сторінки і водночас виконує обчислення) є
неефективною для аналітичних систем. Тому основним методом вирішення
архітектурної проблеми обрано побудову системи за принципом Single Page
Application (SPA) з використанням RESTful API [9, 13].
Такий підхід передбачає повне розділення системи на два незалежні застосунки:
− Frontend (Клієнтська частина): завантажується в браузер користувача один
раз. Усі подальші переходи між сторінками (наприклад, від модуля імпорту до бази
знань) відбуваються миттєво без перезавантаження сторінки;
− Backend (Серверна частина): працює як незалежний сервіс (API), що
приймає HTTP-запити з даними, виконує алгоритми машинного навчання та повертає
32
результати у форматі JSON.
Такий підхід забезпечує високу масштабованість: у майбутньому серверну
частину можна розгорнути на потужних хмарних кластерах для обробки надвеликих
датасетів, не змінюючи при цьому клієнтський код.
1.4.2 Вибір засобів реалізації серверної частини (Backend). Ядром системи є
модуль інтелектуального аналізу даних. Для його реалізації безальтернативним
вибором є мова програмування Python, яка сьогодні є де-факто світовим стандартом
у галузі Data Science та машинного навчання завдяки наявності оптимізованих
бібліотек, написаних на мовах C/C++.
Як веб-каркас обрано мікрофреймворк Flask. На відміну від важких рішень
(наприклад, Django), Flask не нав'язує використання складної ORM (Object-Relational
Mapping) для баз даних. Оскільки розроблюваний сервіс працює з динамічними
файлами користувачів, а не зі статичними таблицями бази даних, легкість та
модульність Flask ідеально підходять для створення маршрутизаторів (у файлі app.py)
та швидкої обробки REST-запитів [5, 15].
Для реалізації математичного ядра обрано такі бібліотеки:
− Pandas. Найпотужніший інструмент для маніпуляції даними. Саме він
використовується у модулі попередньої обробки для реалізації вимог щодо
гнучкого імпорту. Pandas дозволяє легко читати конкретні аркуші з
багатосторінкових .xlsx файлів, а також виконувати структурне очищення,
наприклад, програмно видаляти конкретні індекси (1-й та 3-й рядки) або
очищати стовпці від пропусків (NaN);
− Scikit-learn. Бібліотека, яка реалізує переважну більшість класичних
алгоритмів машинного навчання. У модулі інтелектуального аналізу вона
забезпечує роботу методів кластеризації (K-Means) та класифікації (Random
Forest, SVM). Її перевагою є уніфікований інтерфейс (методи fit та predict),
що дозволяє легко інтегрувати нові алгоритми в систему;
− NumPy. Забезпечує швидкі векторні обчислення, необхідні для розрахунку
матриць відстаней під час кластеризації.
33
1.4.3 Вибір засобів реалізації клієнтської частини (Frontend). Для створення
інтерактивного користувацького інтерфейсу обрано бібліотеку React. Її концепція
компонентного підходу (створення незалежних модулів UI) якнайкраще відповідає
структурі сервісу. Наприклад, картки методів у "Базі знань", таблиці попереднього
перегляду даних та форми завантаження файлів інкапсулюються в окремі React-
компоненти. Використання механізму Virtual DOM у React забезпечує високу
продуктивність при візуалізації великих таблиць даних (редактора даних), оскільки
оновлюються лише ті елементи екрану, які фактично змінилися [6, 14].
Для збирання проєкту використовується сучасний інструмент Vite, який, на
відміну від класичного Webpack, забезпечує майже миттєвий запуск локального
сервера та швидке перезавантаження модулів (HMR) [17].
Критично важливим аспектом клієнтської архітектури є управління станом.
Процес аналізу даних складається з багатьох кроків (завантаження–очищення–
налаштування моделі–результат). Щоб уникнути антипатерну "prop-drilling"
(передачі параметрів через безліч вкладених компонентів), застосовано сучасний
менеджер стану Zustand. Він дозволяє створити єдине глобальне сховище
(useStore.js), де надійно зберігаються метадані завантаженого файлу, поточний крок
аналізу та розраховані результати. Zustand обрано через його мінімалістичність та
відсутність зайвого шаблонного коду порівняно з Redux [16].
Для реалізації функцій візуалізації доцільним є використання бібліотек на
кшталт Recharts або Plotly.js, які здатні візуалізовувати складні інтерактивні графіки
(діаграми розсіювання, дендрограми) на основі JSON-даних, отриманих від Flask-
сервера.
Окрім цього, для забезпечення надійності розробленого рішення, застосовано
методи автоматизованого тестування: React Testing Library для перевірки коректності
роботи клієнтських інтерфейсів та модульні тести (unit tests) для алгоритмів
очищення і моделювання на стороні бекенду.
Висновки до розділу 1
У першому розділі кваліфікаційної роботи проведено системний аналіз
34
предметної області та обґрунтовано доцільність розробки спеціалізованого веб-
орієнтованого сервісу для інтелектуального аналізу великих даних.
Аналітичний огляд сучасних програмних рішень виявив наявність поляризації
на ринку: існуючі корпоративні платформи (RapidMiner, SPSS) є занадто дорогими та
складними для широкого кола користувачів, а потужні бібліотеки (Scikit-learn,
Jupyter) вимагають глибоких знань у програмуванні. Виявлено прогалину в сегменті
веб-додатків, які б поєднували простоту використання з освітнім компонентом.
Проведено декомпозицію розроблюваної системи. Виділено ключові бізнес-
процеси: імпорт із можливістю гнучкого вибору підмножин даних (таблиць),
специфічне структурне очищення масивів, інтерактивну валідацію через вбудований
редактор, та безпосереднє виконання алгоритмів класифікації і кластеризації. Окремо
обґрунтовано необхідність підсистеми "Knowledge Base" (База знань) для
інтерпретації алгоритмів.
Сформовано детальні функціональні та нефункціональні вимоги до
програмного продукту. Концептуальна модель системи визначила необхідність
ізоляції обчислювального ядра від користувацького інтерфейсу.
На основі висунутих вимог здійснено обґрунтований вибір технологічного
стеку. Обґрунтовано, що гібридна архітектура RESTful API із застосуванням мови
Python (фреймворк Flask, бібліотеки Pandas та Scikit-learn) для серверної частини та
бібліотеки React (із менеджером стану Zustand та збирачем Vite) для клієнтської
частини є ефективним рішенням для забезпечення високої швидкодії, модульності та
масштабованості системи.
Отримані результати системного аналізу предметної області формують надійне
теоретичне та технологічне підґрунтя для переходу до наступного етапу
дослідження – детального вивчення математичних моделей обробки великих даних та
проєктування алгоритмів машинного навчання, що буде розглянуто в другому розділі
роботи.
35
2 МАТЕМАТИЧНІ ОСНОВИ ТА АЛГОРИТМИ
Розробка високонавантажених веб-орієнтованих систем для аналізу даних
вимагає не лише правильного архітектурного проєктування, а й глибокого розуміння
математичного апарату, що лежить в основі процесів обробки інформації. Якщо
перший розділ був присвячений «контейнеру» (архітектурі веб-застосунку), то цей
розділ фокусується на його «ядрі» – математичних моделях та алгоритмах машинного
навчання (Machine Learning, ML).
У цьому розділі здійснюється формалізація вхідного інформаційного простору,
математична постановка задач класифікації та кластеризації великих даних, а також
детальний аналіз алгоритмів (K-Means, Random Forest), які реалізовані у серверній
частині сервісу, розробляється. Окрема увага приділяється алгоритмічним аспектам
попередньої обробки даних, що є критично важливим етапом перед подачею матриці
ознак на вхід моделей.
2.1 Методи та засоби вирішення проблеми
Машинне навчання базується на припущенні, що існують приховані
закономірності між властивостями об'єктів. Для виявлення цих закономірностей
алгоритмами комп'ютерної логіки необхідна сувора математична формалізація
предметної області.
2.1.1 Формалізація вхідного інформаційного простору. Будь-який набір
даних (датасет), що завантажується користувачем у систему, незалежно від його
початкового формату (csv, xlsx), на серверному рівні трансформується у
структуровану матрицю типу "об'єкт-ознака".
Нехай – множина об'єктів (наприклад, клієнтів банку, медичних карток,
результатів вимірювань), а – множина ознак (характеристик), які описують ці
об'єкти. Кожен об'єкт ∈ , = 1��,���, представляється як вектор у d-вимірному
просторі ознак :
= (1,2, … , ),
де – значення j-ї ознаки для i-го об’єкта.
36
Весь набір даних, що складається з об'єктів, утворює матрицю ознак
розмірності × :
11 12 … 1
= �21 22 … 2
… … … … �.
1 2 …
У контексті "великих даних" значення (кількість спостережень) та
(кількість параметрів) можуть сягати мільйонів та тисяч відповідно. Це породжує
явище, відоме як "прокляття розмірності" (curse of dimensionality), коли із зростанням
відстань між будь-якими двома об'єктами стає приблизно однаковою, що значно
ускладнює роботу алгоритмів кластеризації. Саме тому перед безпосереднім
моделюванням часто застосовуються методи зниження розмірності, які математично
є трансформацією простору Φ: → , де ≪ .
2.1.2 Математична постановка задачі класифікації. Класифікація належить
до класу задач навчання з учителем (Supervised Learning). Основна ідея полягає у
побудові алгоритму, здатного відносити новий об'єкт до однієї з наперед заданих
категорій (класів) на основі історичних даних [12].
Нехай задано множину об'єктів і множину міток класів = {1, 2, … ,}, де
– загальна кількість класів. У системі також наявна навчальна вибірка , що
складається з пар "об'єкт-відповідь":
= {(1,1), (2,2), … , ( ,)}, ∈ , ∈ .
Мета класифікації – знайти таку функцію-алгоритм : → , яка б для будь-
якого довільного об'єкта ∈ (навіть такого, якого не було в навчальній вибірці )
видавала відповідь (), що максимально збігається з істинною (але невідомою)
міткою .
Математично процес навчання зводиться до мінімізації емпіричного ризику
(Empirical Risk Minimization) [12]. Вводиться функція втрат (Loss Function) ((),),
яка штрафує алгоритм за неправильні прогнози. Завдання полягає у знаходженні
оптимального алгоритму ∗, що мінімізує середнє значення функції втрат на всій
навчальній вибірці:
37
1
∗ = arg �((),).
∈
=1
Для бінарної класифікації ( = {0,1}) часто використовується логістична
функція втрат (відома як Binary Cross-Entropy або Log-Loss) [12], яка математично
описується формулою:
(,) = −�log ()+(1−)log( 1−)�,
де – істинна мітка класу об’єкта, а = () – передбачена алгоритмом
ймовірність належності об'єкта до класу 1.
Для багатокласової задачі ( > 2) застосовується узагальнення цієї функції –
багатокласова перехресна ентропія (Categorical Cross-Entropy):
((),) = −� log( (|)),
=1
де (|) – ймовірність того, що об’єкт належить до класу , яку
передбачає модель.
2.1.3 Математична постановка задачі кластеризації. На відміну від
класифікації, при кластеризації (Unsupervised Learning) множина істинних відповідей
невідома. [3, 12]
На вхід системи подається лише матриця об’єктів .
Мета кластеризації – розбити множину об’єктів на неперетинні множини
(кластери) = {1,2, … ,} таким чином, щоб виконувалися дві основні умови:
− об'єкти всередині одного кластера були максимально схожими між собою
(мінімізація внутрішньокластерної відстані);
− об'єкти з різних кластерів були максимально відмінними один від одного
(максимізація міжкластерної відстані).
Математично розбиття має задовольняти умови:
�
=1 = , ∩ = ∅ для всіх ≠ .
Якість кластеризації оцінюється за допомогою цільового функціоналу.
Наприклад, для алгоритмів центроїдного типу мінімізується сума квадратів відстаней
від об'єктів до центрів їхніх кластерів (внутрішньокластерна дисперсія):
38
() = � � ∈ ( , )2 → ,
=1
де – центроїд (вектор середніх значень ознак) -го кластера, а ( ,) –
функція відстані. Задача полягає у знаходженні такого розподілу об'єктів за
кластерами ∗, при якому функціонал (C) набуває мінімального значення. Оскільки
повний перебір усіх можливих розбиттів є NP-складною задачею, на практиці (і в
розробленому бекенді на Flask) використовуються евристичні ітераційні алгоритми.
2.1.4 Метрики близькості та функції відстані у багатовимірному просторі.
Як видно з попередніх підпунктів, базовою операцією для більшості алгоритмів
машинного навчання є визначення "схожості" об'єктів. Математичним еквівалентом
схожості є відстань: чим менша відстань (,) між векторами ознак, тим більше
схожими є об’єкти.
У розробленому веб-сервісі, залежно від типу даних користувача, можуть
застосовуватися різні просторові метрики [2, 11]:
− Метрика Мінковського (Minkowski distance) – узагальнена метрика
параметричного типу простору [2]:
1
(, ) = �� | − |� ;
=1
− Евклідова відстань (Euclidean distance) – окремий випадок метрики
Мінковського при = 2, що є стандартом для алгоритму K-Means:
2
2(,) = ��=1( − ) ;
− Манхеттенська відстань (Manhattan distance) – при = 1,
використовується, коли дані мають значну кількість викидів (аномалій),
оскільки вона менш чутлива до них, ніж Евклідова метрика:
1(,) = ∑
=1 | − |;
− Косинусна подібність (Cosine similarity) – вимірює кут між двома векторами,
а не їхню довжину. Вона критично важлива для текстів або розріджених
матриць, де значення ознак можуть суттєво відрізнятися за масштабом:
39
〈,〉 ∑
=1 ∙ cos() =
‖‖‖‖ = .
��
2 �
2
=1 �=1
Правильний вибір метрики та алгоритму мінімізації є визначальним фактором
точності роботи системи. Саме тому в модулі "Knowledge Base" розробленого сервісу
передбачено пояснення цих принципів користувачу для більш усвідомленого вибору
параметрів аналізу.
2.2 Аналіз алгоритмів машинного навчання
Для забезпечення ефективної роботи веб-орієнтованого сервісу необхідно було
відібрати оптимальний набір алгоритмів, які, з одного боку, демонструють високу
точність на реальних даних, а з іншого – є достатньо оптимізованими для швидкого
виконання на сервері (backend) в синхронному або асинхронному режимах. У цьому
підрозділі детально аналізуються алгоритми, які складають обчислювальне ядро
розробленої системи: алгоритм кластеризації K-Means та алгоритми класифікації
Random Forest і Support Vector Machine (SVM).
2.2.1 Алгоритм кластеризації K-Means (K-середніх). Алгоритм K-Means [1]
є одним із найвідоміших та найшвидших евристичних методів некерованого
навчання, що вирішує задачу розбиття нерозміченої множини об'єктів на заздалегідь
відому кількість кластерів k. Його популярність в аналітичних веб-сервісах зумовлена
високою швидкістю збіжності та лінійною складністю відносно кількості записів.
Математична логіка алгоритму. Ітеративний процес алгоритму K-Means
спрямований на мінімізацію сумарного квадратичного відхилення точок кластерів від
їхніх центрів мас (центроїдів). Процес можна розбити на чотири математичні кроки:
− ініціалізація: з вхідного масиву даних випадковим чином (або за
допомогою розумної евристики K-Means++) обираються точок, які стають
початковими центроїдами: {(0)
1 , (0) (0)
2 , … , } [1];
− крок 1 (розподілу): кожен об'єкт з матриці відноситься до того кластера
, відстань до центроїда якого є мінімальною. Найчастіше використовується
квадрат евклідової відстані:
40
()
= �: ‖ − ()
‖2 ≤ ‖ − ()
‖2 ∀, 1 ≤ ≤ �,
де – номер поточної ітерації;
− крок 2 (оновлення центроїдів): після перерозподілу всіх точок, координати
центроїдів перераховуються як центр мас (середнє арифметичне векторів)
усіх об'єктів, що потрапили до даного кластера:
�+1� 1
=
�() � ;
�
∈()
− умова зупинки: кроки 2 і 3 повторюються доти, доки центроїди не перестануть
змінювати свої координати ((+1)
≈ ()
) або поки не буде досягнуто
максимальну кількість ітерацій.
Обчислювальна складність. Часова складність алгоритму становить
( ⋅ ⋅ ⋅ ), де – кількість об’єктів, – кількість кластерів, – розмірність
простору ознак, – кількість ітерацій до збіжності. Оскільки зазвичай ,, ≪ ,
алгоритм працює за лінійний час (), що дозволяє обробляти сотні тисяч записів на
Flask-сервері менш ніж за секунду.
Особливості реалізації в системі. Головним недоліком класичного K-Means є
необхідність ручного задання параметра . У розробленому сервісі цей параметр
передається з фронтенду (React) через JSON-запит. Для допомоги користувачу в
системі може бути реалізовано (або описано в базі знань) "метод ліктя" (Elbow
Method), який розраховує критерій WCSS (Within-Cluster Sum of Square) для різних
значень і дозволяє візуально визначити оптимальну кількість кластерів.
2.2.2 Ансамблевий алгоритм класифікації Random Forest (Випадковий
ліс). Для вирішення задач класифікації в системі реалізовано алгоритм Random Forest.
Це потужний метод композиційного (ансамблевого) машинного навчання, який
базується на побудові великої кількості незалежних дерев рішень (Decision Trees) та
об'єднанні їхніх прогнозів [2, 10].
Математична основа (Дерева рішень). Базовим елементом лісу є дерево
рішень. Воно розбиває простір ознак на прямокутні області за допомогою
послідовності питань (правил виду ≤ ℎℎ). Вибір оптимального правила
41
для розбиття вузла дерева здійснюється на основі критеріїв інформативності,
найпопулярнішим з яких є критерій чистоти Джині (Gini Impurity) [2]:
= 1 −�2 ,
=1
де – частка об'єктів класу у поточному вузлі. Алгоритм дерева шукає таку
ознаку і такий поріг ℎℎ, які максимально зменшують невизначеність (тобто
максимізують приріст інформації).
Концепція беггінгу (Bagging). Одне дерево рішень схильне до перенавчання
(Overfitting). Random Forest вирішує цю проблему за допомогою методу Bootstrap
Aggregating (Bagging). Алгоритм формується так:
− з початкової навчальної вибірки розміром генерується нових підвибірок
(також розміром ) шляхом вибору об'єктів із поверненням (bootstrap
samples);
− на кожній з підвибірок будується окреме дерево рішень, при цьому для
розбиття кожного вузла розглядається не вся множина ознак , а лише
випадкова підмножина розміром ≈ √;
− під час класифікації нового об'єкта кожне дерево видає свій прогноз, при
цьому фінальний клас визначається шляхом "мажоритарного голосування"
(Majority Vote):
^
= arg �
=1 (ℎ() = ),
де ℎ() – прогноз -го дерева, (⋅) – індикаторна функція [3].
Обчислювальна складність. Обчислювальна складність процесу навчання
(тренування) алгоритму становить:
( ⋅ ⋅ log ),
де – кількість дерев в ансамблі, – обсяг навчальної вибірки, а – кількість
ознак, що розглядаються для розбиття у кожному вузлі.
Складність етапу прогнозування (класифікації нового об'єкта) є значно
меншою і становить ( ⋅ ), де – максимальна глибина дерева.
Переваги для веб-сервісу. Random Forest є надзвичайно стійким до викидів
42
(аномалій) у даних та не потребує складної нормалізації ознак. Оскільки дерева
будуються незалежно, цей етап легко розпаралелюється на багатоядерних серверах (в
Scikit-learn за це відповідає параметр n_jobs=-1), що гарантує високу пропускну
здатність API-ендпоінтів [2].
2.2.3 Метод опорних векторів (Support Vector Machine, SVM). Як
альтернативний метод класифікації у підсистемі передбачено Support Vector Machine
(SVM) [2, 12]. Якщо Random Forest будує складні нелінійні межі у вигляді "сходинок",
то SVM намагається провести ідеальну гіперплощину, яка максимально широко
розділяє класи.
Лінійна роздільність та максимізація зазору. Нехай задана бінарна вибірка з
мітками ∈ {−1,1}. Рівняння розділяючої гіперплощини має вигляд:
− = 0,
де – вектор нормалі до гіперплощини, – зсув.
Відстань від гіперплощини до найближчої точки навчальної вибірки (опорного
вектора) називається зазором (margin). Мета SVM – максимізувати цей зазор, що
математично зводиться до задачі квадратичного програмування:
1
‖‖2
, 2
за умов: (
− ) ≥ 1 для всіх = 1, … ,.
Ядровий перехід (Kernel Trick). У реальних великих даних класи рідко можна
розділити прямою лінією. У таких випадках SVM використовує "ядровий перехід".
Дані відображаються у простір вищої розмірності за допомогою нелінійної функції
(), де вони стають лінійно роздільними [7]. На практиці функція () не
обчислюється явно, натомість використовується ядрова функція (Kernel function):
( , ) = (
) ().
У системі застосовується радіально-базисне ядро (RBF):
( ,) = �−‖ − ‖2 �.
SVM демонструє виняткову точність на складних даних середньої розмірності,
проте його обчислювальна складність при тренуванні (2) до (3) робить його
менш придатним для миттєвої обробки десятків мільйонів рядків, ніж Random Forest,
43
що користувач сервісу має враховувати при виборі параметрів у веб-інтерфейсі.
2.2.4 Порівняльний аналіз та обґрунтування застосування в системі.
Інтеграція різних за своєю математичною природою алгоритмів у єдиний модуль
інтелектуального аналізу дозволяє системі бути універсальною. У таблиці 2.1
наведено зведений аналіз розглянутих методів.
Таблиця 2.1 – Характеристика алгоритмів машинного навчання, реалізованих у
сервісі
Характеристика K-Means Random Forest Support Vector
Machine (RBF)
Тип навчання Некероване Кероване Кероване
(Кластеризація) (Класифікація) (Класифікація)
Чутливість до Дуже висока Низька Висока (потребує
масштабу даних (потребує StandardScaler)
StandardScaler)
Швидкість Дуже висока Висока Середня / Низька
навчання (паралелізується) (для великих
вибірок)
Інтерпретованість Висока (можна Середня (Feature Низька (чорний
проаналізувати Importance) ящик)
центроїди)
Схильність до Не застосовується Дуже низька Середня (залежить
перенавчання (завдяки беггінгу) від параметра і С)
З інженерної точки зору архітектура Flask-сервера проєктується таким чином,
щоб абстрагувати складність цих математичних операцій. Фронтенд (React) надсилає
лише назву обраного методу та кілька гіперпараметрів (наприклад, {"algorithm":
"RandomForest", "n_estimators": 100}), а бекенд динамічно встановлює відповідний
клас з бібліотеки scikit-learn, виконує навчання, зберігає модель у тимчасовий кеш (у
разі необхідності) та повертає клієнту масив розрахованих міток та метрик якості
класифікації.
44
2.3 Алгоритмічний процес підготовки даних
У реальних прикладних задачах Data Science необроблені дані, отримані з баз
даних, корпоративних систем або відкритих джерел, майже ніколи не є придатними
для безпосереднього використання в алгоритмах машинного навчання.
Фундаментальний принцип аналізу даних – "garbage in, garbage out" (сміття на вході –
сміття на виході) – означає, що точність навіть найскладніших методів (таких як
Random Forest чи SVM) критично залежить від якості матриці ознак.
У розробленому веб-сервісі за цей етап відповідає окремий модуль попередньої
обробки, який реалізує конвеєр (pipeline) алгоритмічної підготовки даних. Цей
конвеєр складається з кількох послідовних етапів: парсингу, структурного очищення,
обробки пропущених значень та математичної трансформації (нормалізації) простору
ознак.
2.3.1 Алгоритми парсингу та ідентифікації типів даних. Першим кроком
конвеєра є перетворення фізичного файлу у віртуальну структуру даних – DataFrame
(за допомогою бібліотеки Pandas) [3, 18]. Оскільки система підтримує завантаження
складних форматів, алгоритм парсингу має нелінійну структуру.
Для багатосторінкових файлів формату .xlsx алгоритм спочатку зчитує метадані
документа (словник аркушів) та повертає їх на клієнтську частину (Frontend). Після
того як користувач обирає конкретний аркуш, бекенд ініціює глибоке зчитування.
Відразу після завантаження таблиці в пам'ять сервер виконує алгоритм
семантичної ідентифікації типів ознак. Усі стовпці матриці даних автоматично
класифікуються на три категорії:
− Числові (Continuous/Discrete): цілі числа (int) або числа з плаваючою комою
(float);
− Категоріальні (Categorical): текстові значення (string), що містять
обмежену кількість унікальних міток (наприклад, "Low", "Medium", "High");
− Дати та час (Datetime): часові ряди, які вимагають специфічної
декомпозиції (виділення року, місяця, дня тижня).
Ця класифікація є критичною, оскільки подальші математичні операції
45
застосовуються по-різному до числових та текстових даних.
2.3.2 Структурне очищення та фільтрація аномалій. Дані часто містять
структурне "сміття" – системні артефакти, що виникають під час експорту з інших
програм або веб-скрапінгу. Якщо ці артефакти не видалити, вони порушать типи
даних стовпців (числові стовпці будуть розпізнані як текстові).
Алгоритм структурного очищення використовує точкові маніпуляції з
індексами замість агресивного видалення цілих блоків інформації. Для текстових або
напівструктурованих файлів здійснюється перевірка на наявність специфічних
патернів забруднення. Алгоритмічна логіка скрипта налаштована на цілеспрямоване
видалення конкретних рядків – зокрема, першого та третього рядків масиву, якщо
виявляється, що вони містять технічні теги зображень або порожні неформатовані
пробіли. Такий підхід дозволяє очистити матрицю ознак від нерелевантної розмітки,
повністю зберігши корисну вибірку спостережень для подальшого навчання.
Після структурного очищення виконується детекція аномалій (викидів) у
числових стовпцях. Алгоритм базується на методі міжквартильного розмаху
(Interquartile Range, IQR).
Для кожної числової ознаки обчислюються перший (1, 25-й перцентиль) та
третій (3, 75-й перцентиль) квартилі. Розмах обчислюється як:
= 3 − 1.
Значення ознаки вважається викидом (outlier) і підлягає обробці, якщо воно
виходить за межі інтервалу:
∉ [1 − 1.5 ⋅ ,3 + 1.5 ⋅ ].
2.3.3 Математичні підходи до обробки пропущених значень (NaN).
Наявність порожніх комірок (Not a Number, NaN) робить неможливим розрахунок
дистанцій у кластеризації. Модуль попередньої обробки реалізує гнучкий алгоритм
імпутації (заповнення) пропусків, залежно від типу змінної та відсотка пропусків,
виконуючи наступні дії:
− Видалення (Listwise Deletion). Якщо ознака містить більше 60% пропусків,
стовпець алгоритмічно видаляється як неінформативний, оскільки спроба
його відновлення призведе до штучного спотворення дисперсії моделі;
46
− Математична імпутація для числових ознак. Для стовпців з нормальним
розподілом пропуски заповнюються середнім арифметичним значенням по
стовпцю:
^ 1
= � .
∈
Якщо розподіл ознаки є асиметричним (має "хвіст"), для заповнення
використовується медіана (значення, що ділить відсортований ряд навпіл), оскільки
вона є стійкою (робастною) до викидів;
− Імпутація для категоріальних ознак. Текстові пропуски заповнюються
модою – значенням, що зустрічається в стовпці найчастіше:
^
= arg count().
∈
2.3.4 Математична нормалізація та кодування простору ознак. Більшість
алгоритмів машинного навчання, реалізованих у системі (особливо K-Means та SVM),
оперують поняттям відстані між векторами в багатовимірному просторі. Якщо одна
ознака вимірюється в тисячах (наприклад, дохід), а інша – в одиницях (наприклад,
вік), то ознака з більшим масштабом повністю "домінуватиме" в розрахунку
евклідової відстані, ігноруючи вплив меншої ознаки.
Для усунення цієї проблеми алгоритм підготовки даних застосовує методи
масштабування, а саме:
Z-стандартизація (StandardScaler). Перетворює розподіл кожної числової
ознаки так, щоб її середнє значення дорівнювало 0, а стандартне відхилення – 1. Це
досягається за формулою:
−
= ,
де – середнє значення ознаки, – стандартне відхилення. Цей метод є
обов'язковим кроком перед застосуванням методу опорних векторів (SVM).
Мінімаксна нормалізація (MinMaxScaler). Стискає всі значення ознаки у
фіксований діапазон, найчастіше [0,1]. Використовується, коли алгоритми чутливі до
абсолютних величин:
47
′ = −
.
−
Кодування категоріальних змінних. Оскільки алгоритми з модулю
інтелектуального аналізу (Scikit-learn) здатні працювати виключно з числовими
матрицями, усі текстові (категоріальні) змінні проходять алгоритм кодування. У
розробленому сервісі застосовується метод One-Hot Encoding (OHE). Якщо стовпець
"Колір" має три унікальні значення {,,}, алгоритм створює три нових
бінарних стовпці. Об'єкт, що мав значення "Red", отримає вектор [1,0,0], “Green” –
[0,1,0] і так далі. Це дозволяє уникнути хибного математичного ранжування категорій
алгоритмом (щоб він не вирішив, що Blue > Red тільки тому, що 3 > 1).
Тільки після проходження всіх цих кроків очищення, імпутації, нормалізації та
кодування, алгоритмічно сформована та математично коректна матриця
передається у пам'ять для запуску процесів навчання (класифікації або кластеризації).
Висновки до розділу 2
У другому розділі кваліфікаційної роботи було проведено глибоке дослідження
математичних основ та логіки функціонування алгоритмів машинного навчання, що
складають обчислювальне ядро розробленого веб-орієнтованого сервісу.
Формалізовано концепцію вхідного інформаційного простору. Визначено
математичну постановку задач керованого (класифікація) та некерованого
(кластеризація) навчання. Доведено критичну важливість вибору метрик відстані
(зокрема, евклідової відстані та метрики Мінковського) для коректного групування
багатовимірних векторів даних.
Здійснено детальний математичний аналіз алгоритму K-Means. Визначено його
ітеративну природу мінімізації сумарного квадратичного відхилення (WCSS) та
обґрунтовано його лінійну обчислювальну складність, що робить його оптимальним
вибором для швидкої кластеризації великих масивів даних у синхронних веб-запитах.
Досліджено ансамблевий алгоритм Random Forest та метод опорних векторів
(SVM) для задачі класифікації. Описано принципи беггінгу, побудови дерев рішень
на основі критерію Джині, а також механізм "ядрового переходу" (Kernel Trick) в
48
SVM, який дозволяє проводити лінійне розділення класів у просторах вищої
розмірності. Встановлено, що Random Forest є більш стійким до ненормалізованих
даних та легко піддається паралелізації на сервері.
Детально описано алгоритмічний конвеєр підготовки даних. Обґрунтовано
необхідність специфічного структурного очищення масивів (точкового видалення
невалідних рядків із технічними артефактами), описано математичні методи імпутації
пропущених значень та алгоритми Z-стандартизації й OHE-кодування. Доведено, що
попереднє оброблення даних є обов'язковою умовою для забезпечення адекватності
математичних моделей.
Отримані теоретико-математичні моделі та описані алгоритмічні конвеєри
утворюють міцний базис для переходу до третього розділу – проєктування програмної
архітектури, створення бази знань та безпосередньої реалізації взаємодії між React-
фронтендом і Flask-бекендом.
49
3 АРХІТЕКТУРА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ТА ПРАКТИЧНА
РЕАЛІЗАЦІЯ
У попередніх розділах було обґрунтовано необхідність розробки веб-
орієнтованого сервісу для аналізу великих даних та визначено математичний апарат,
необхідний для реалізації алгоритмів класифікації і кластеризації. Даний розділ
присвячено безпосередньому проєктуванню програмної архітектури та практичній
реалізації визначених вимог у вигляді готового програмного продукту.
У цьому розділі наведено результати об'єктно-орієнтованого аналізу системи
з використанням уніфікованої мови моделювання (UML), детально описано процес
розробки клієнтської (React) та серверної (Flask) частин, а також наведено
результати тестування розробленого сервісу на реальних наборах даних.
3.1 Об'єктно-орієнтований аналіз та проєктування архітектури
Проєктування складних інтерактивних веб-додатків вимагає чіткого розділення
відповідальності між компонентами системи. Для моделювання архітектури
розробленого сервісу застосовано методологію об'єктно-орієнтованого аналізу та
проєктування (ООАП), що дозволяє візуалізувати структуру, поведінку та взаємодію
елементів системи до початку написання програмного коду [8, 11].
3.1.1 Моделювання прецедентів системи (Use Case). На першому етапі
проєктування необхідно визначити функціональні межі системи з точки зору
кінцевого користувача. Для цього побудовано діаграму прецедентів (варіантів
використання).
У розроблюваній системі виділено одного основного актора (Actor) –
«Користувач-аналітик». Це особа, яка взаємодіє з веб-інтерфейсом для вирішення
задач Data Science, але не обов'язково володіє навичками програмування.
Основні прецеденти (Use Cases), які ініціює актор (рис. 3.1):
− Завантаження даних (Upload Data): Актор завантажує файл (.csv, .xlsx).
Цей прецедент обов'язково включає (відношення <<include>>) прецедент
«Вибір таблиці/аркуша», оскільки система повинна ідентифікувати точну
50
структуру багатосторінкового файлу.
− Попередній перегляд та очищення (Data Cleaning & Preview): Актор
взаємодіє з інтерактивним редактором даних, переглядає пагіновані таблиці та
може ініціювати специфічне структурне очищення (наприклад, видалення
технічних рядків).
− Налаштування параметрів ML-моделі (Configure ML Model): Залежно від
мети, актор вибирає задачу (Класифікація або Кластеризація), конкретний
алгоритм (K-Means, Random Forest) та задає гіперпараметри.
− Аналіз даних (Run Analysis): Ініціація процесу обчислень на сервері.
− Експорт результатів (Export Results): Завантаження обробленого
датасету та аналітичного звіту.
− Вивчення бази знань (Explore Knowledge Base): Автономний прецедент, де
актор переглядає навчальні матеріали щодо методів машинного навчання без
прив'язки до завантаженого датасету.
Рисунок 3.1 – UML-діаграма прецедентів розроблюваного веб-сервісу
51
3.1.2 Проєктування логічної та фізичної архітектури (Component Diagram).
На основі системного аналізу (підрозділ 1.2) прийнято рішення про використання
ізольованої клієнт-серверної архітектури (Decoupled Architecture). Замість
традиційної монолітної генерації сторінок на сервері, розроблено веб-додаток типу
SPA (Single Page Application).
Логічну архітектуру системи можна розділити на три незалежні шари (рівні)
(рис. 3.2):
Рівень представлення (Frontend / Client Layer).
Реалізований за допомогою бібліотеки React та інструменту збирання Vite. Він
відповідає виключно за рендеринг користувацького інтерфейсу, валідацію вводу та
візуалізацію результатів.
− Управління станом (State Management): Важливим архітектурним
рішенням є впровадження менеджера стану Zustand (store/useStore.js). Оскільки
процес аналізу є багатоетапним, useStore виступає «єдиним джерелом істини»
(Single Source of Truth) для всього додатка. Він зберігає метадані завантаженого
файлу (наприклад, file_path), масиви колонок для відображення в UI та
результати обчислень. Це усуває проблему "prop-drilling" – передачі даних
через глибоку ієрархію React-компонентів.
Рівень бізнес-логіки (Backend / API Layer).
Реалізований на мові Python із використанням мікрофреймворку Flask.
− Маршрутизація (API Controller): Файл app.py виступає як RESTful шлюз.
Він приймає HTTP-запити (GET, POST), виконує базову валідацію та делегує
складні завдання спеціалізованим сервісам.
− Сервіси ядра: Включають скрипти data_processing.py (відповідає за
маніпуляції з Pandas DataFrames, імпутацію пропусків) та ml_engine.py
(інкапсулює логіку Scikit-learn для тренування моделей).
Рівень даних (Data Layer).
У зв'язку зі специфікою аналітичного сервісу, який не потребує постійного
зберігання історичних даних користувачів, замість класичної реляційної СУБД
(наприклад, PostgreSQL) використовується гібридна файлова система кешування.
52
Завантажені файли тимчасово зберігаються на сервері під унікальними хеш-
ідентифікаторами на час сесії аналізу, а після її завершення та експорту результатів
очищаються з метою збереження дискового простору та дотримання приватності
даних.
Рисунок 3.2 – UML-діаграма компонентів (Component Diagram)
3.1.3 Моделювання динаміки системи (Sequence Diagram). Для глибшого
розуміння роботи REST-архітектури необхідно змоделювати в часі процес обміну
повідомленнями між клієнтом та сервером. Найбільш складним бізнес-процесом є
повний цикл аналізу даних. Його динаміку зображено за допомогою діаграми
послідовностей (Sequence Diagram) (рис. 3.3).
Сценарій взаємодії (на прикладі задачі кластеризації):
− Ініціація: Компонент <Ingestion /> на клієнті відправляє POST-запит з
файлом (multipart/form-data) на ендпоінт Flask /api/upload.
− Обробка багатосторінковості: Скрипт data_processing.py сканує файл.
Якщо це Excel з кількома аркушами, сервер повертає JSON зі списком аркушів
(статус 200). Клієнт відображає випадаючий список.
− Підтвердження вибору: Користувач обирає таблицю. Клієнт надсилає
запит на /api/select_sheet. Сервер завантажує обрану таблицю в пам'ять, виконує
первинне очищення і повертає JSON із 50 першими рядками (для UI-редактора)
53
та масивом назв колонок. Ця інформація зберігається у глобальному стані
useStore.
− Запуск ML-моделі: Користувач переходить до компонента <Analysis />,
обирає "K-Means", встановлює параметр k=3 і натискає "Аналізувати". React-
клієнт формує POST-запит на /api/analyze із конфігураційним JSON-об'єктом.
− Обчислення: Flask передає конфігурацію в ml_engine.py. Виконується Z-
стандартизація даних, ініціалізується модель KMeans(n_clusters=3),
відбувається тренування (метод .fit()). Датафрейму додається нова колонка
Cluster_ID.
− Генерація візуалізацій: Модуль visualizations.py розраховує координати
для графіка (наприклад, виконує PCA-згортку до 2D простору для відображення
кластерів) і пакує їх у JSON.
− Повернення результату: Сервер надсилає JSON-відповідь на клієнт.
− Рендеринг: React-компонент <Visualization /> розпаковує JSON і малює
інтерактивні графіки (за допомогою Recharts/Plotly). Компонент стану useStore
активує кнопку "Завантажити результат".
54
Рисунок 3.3 – UML-діаграма послідовностей (Sequence Diagram)
55
Така архітектура гарантує, що клієнтська частина залишається "тонкою" і
відповідає лише за інтерфейс, тоді як уся "важка" математична логіка зосереджена на
сервері. Це дозволяє у майбутньому легко масштабувати обчислювальні потужності
бекенду незалежно від фронтенду.
3.2 Реалізація серверної частини системи
Серверна частина (Backend) є обчислювальним ядром розробленого веб-
орієнтованого сервісу. Відповідно до спроєктованої архітектури, бекенд реалізовано
мовою програмування Python із використанням мікрофреймворку Flask. Основна
парадигма реалізації – створення «Stateless» (безстанового) REST API, де кожен
HTTP-запит від клієнта містить усю необхідну інформацію для його обробки, а сервер
лише виконує трансформацію даних та повертає результат у форматі JSON.
Фізична структура серверної частини розділена на логічні модулі: контролер
маршрутизації (app.py), сервіс підготовки даних (data_processing.py) та модуль
машинного навчання (ml_engine.py).
3.2.1 Розробка REST API та маршрутизація (app.py). Файл app.py виконує
роль єдиної точки входу (Entry Point) для всіх клієнтських запитів. Для забезпечення
безпеки та коректної взаємодії між доменами (Cross-Origin Resource Sharing)
ініціалізація додатка включає налаштування бібліотеки Flask-CORS [5, 15].
Логіка обробки вхідних файлів вимагає надійної системи кешування. Оскільки
в системі не використовується класична база даних, завантажені файли тимчасово
зберігаються у директорії сервера. Для уникнення конфліктів імен при одночасному
завантаженні файлів різними користувачами застосовується генерація унікальних
ідентифікаторів на основі бібліотеки uuid та функція secure_filename з пакета
werkzeug.
Нижче наведено фрагмент коду, що реалізує кінцеву точку (endpoint) /api/upload
для прийому багатосторінкових файлів (рис. 3.4).
56
Рисунок 3.4 – Лістинг коду app.py
Як видно з лістингу, контролер не виконує прямої обробки даних, а лише керує
мережевим протоколом (статуси 200, 400, 500) та делегує бізнес-логіку модулю
data_processing.
57
3.2.2 Реалізація сервісу попередньої обробки даних (data_processing.py).
Модуль data_processing.py відповідає за перетворення фізичних файлів на
структуровані об'єкти pandas.DataFrame та їх алгоритмічне очищення.
Найскладнішим аспектом на цьому етапі є реалізація вимоги щодо гнучкого
вибору аркушів з Excel-файлів та їх попереднього перегляду. Функція
read_and_clean_data приймає шлях до файлу та опціональне ім'я аркуша, після чого
виконує базове очищення (рис. 3.5).
Рисунок 3.5 – Лістинг коду data_processing.py
58
Для того щоб React-фронтенд міг відрендерити повноцінний інтерактивний
редактор даних (таблицю попереднього перегляду), цей модуль також містить
функцію серіалізації датафрейму у формат JSON (метод
df.head(50).to_dict(orient='records')), що мінімізує навантаження на мережу,
передаючи лише перші 50 записів для візуальної валідації користувачем.
3.2.3 Реалізація обчислювального ML-ядра (ml_engine.py). Модуль
ml_engine.py є інкапсуляцією методів машинного навчання з бібліотеки scikit-learn [1,
7]. Головне архітектурне завдання цього модуля – надати уніфікований інтерфейс
(функцію-обгортку) для виконання різних за своєю природою алгоритмів.
Клієнтський запит на аналіз містить JSON-об'єкт із конфігурацією (наприклад,
{"model_type": "kmeans", "params": {"n_clusters": 3}, "target_column": None}).
Завдання модуля – розпарсити цю конфігурацію, динамічно ініціалізувати
відповідний клас моделі, провести навчання та підготувати дані для візуалізації.
Реалізація логіки кластеризації (K-Means):
Оскільки алгоритми кластеризації (на відміну від дерев рішень) надзвичайно
чутливі до масштабу даних, модуль примусово застосовує процес Z-стандартизації
перед тренуванням моделі. Крім того, оскільки користувачу потрібно візуалізувати
багатовимірні кластери на 2D-графіку в браузері, модуль використовує метод
головних компонент (PCA) для зниження розмірності (рис. 3.6).
59
Рисунок 3.6 – Лістинг коду ml_engine.py
Особливості обробки керованого навчання (Класифікація):
Для алгоритмів Random Forest та SVM логіка в ml_engine.py дещо відрізняється.
Модуль повинен отримати параметр target_column (стовпець, який необхідно
прогнозувати). Якщо цільова змінна є текстовою, застосовується LabelEncoder для
60
перетворення міток у числовий формат. Після тренування моделі (з розбиттям на
навчальну та тестову вибірки через train_test_split), модуль розраховує ключові
метрики якості (Accuracy, Precision, Recall) за допомогою classification_report та
повертає їх на фронтенд для відображення у спеціальній картці результатів.
3.2.4 Інтеграція підсистем та генерація звітів. Заключним етапом обробки на
сервері є підготовка результатів для завантаження користувачем. Після того як
ml_engine.py повертає модифікований датафрейм (із доданою колонкою прогнозів
Cluster_ID або Predicted_Class), контролер app.py зберігає цей датафрейм назад у
тимчасову директорію у форматі .csv або .xlsx. Клієнту повертається унікальне
посилання (URL) на завантаження цього файлу, що реалізовано за допомогою функції
send_file з бібліотеки Flask.
Таким чином, серверна частина системи представляє собою надійний,
оптимізований пайплайн, здатний асинхронно приймати файли, безпечно їх
обробляти із застосуванням сучасних алгоритмів Data Science та готувати
серіалізовані дані для побудови складних інтерактивних інтерфейсів на клієнті.
3.3 Реалізація веб-інтерфейсу та клієнтської частини системи
Клієнтська частина (Frontend) веб-орієнтованого сервісу відповідає за
взаємодію з користувачем, збір параметрів конфігурації алгоритмів, управління
багатоетапним процесом аналізу та візуалізацію отриманих результатів. Відповідно
до обраного технологічного стеку, розробку здійснено на базі бібліотеки React з
використанням інструменту збирання Vite, що забезпечує високу швидкість
компіляції та оптимізацію кінцевого бандлу (bundle).
Застосовано компонентно-орієнтований підхід: складний користувацький
інтерфейс декомпозовано на незалежні модулі, які відповідають принципу єдиної
відповідальності (Single Responsibility Principle).
61
3.3.1 Управління глобальним станом додатку (Zustand). Особливістю
аналітичних веб-додатків є необхідність збереження великого обсягу тимчасових
даних між переходами по екранах (наприклад, від екрану завантаження до екрану
налаштування моделі). Використання локального стану компонентів (хук useState)
для таких завдань призводить до антипатерну "prop-drilling" – передачі пропсів через
множину проміжних компонентів. Для вирішення цієї архітектурної проблеми
інтегровано менеджер стану Zustand [16]. На відміну від Redux, він не потребує
створення складних редьюсерів (reducers) і дозволяє інкапсулювати всю логіку стану
в одному файлі store/useStore.js (рис. 3.7).
Рисунок 3.7 – Лістинг коду useStore.js
62
Використання глобального сховища дозволяє будь-якому компоненту системи
(наприклад, кнопці «Завантажити звіт» у навігаційній панелі) миттєво отримати
доступ до результатів розрахунків без прив'язки до ієрархії DOM-дерева.
3.3.2 Реалізація модуля імпорту та попереднього перегляду. Процес імпорту
реалізовано як багатоетапний майстер (Wizard). Компонент <Ingestion /> управляє
життєвим циклом завантаження.
Етап 1: Завантаження фізичного файлу. Використовується HTML5 API
FormData для асинхронної відправки файлу на Flask-сервер без перезавантаження
сторінки.
Етап 2: Вибір аркуша (для багатосторінкових файлів). Якщо сервер повертає
масив availableSheets, інтерфейс динамічно рендерить компонент <SheetSelector />.
Етап 3: Інтерактивний редактор (Data Preview). Після підтвердження вибору
таблиці сервер повертає JSON із першими 50 рядками. Для їхнього відображення
розроблено компонент <DataEditor />. Враховуючи, що таблиці можуть мати десятки
колонок, таблиця стилізується за допомогою CSS Grid та властивості overflow-x: auto,
що забезпечує адаптивність (рис. 3.8-3.9).
63
Рисунок 3.8 – Лістинг коду Cleaning.jsx
64
Рисунок 3.9 – Вибір аркуша в багатосторінковому файлі Excel та попередній
перегляд таблиці
3.3.3 Модуль конфігурації ML та візуалізація результатів. Основним
аналітичним простором є компонент <Analysis />. Він містить форму налаштування
параметрів алгоритму та блок візуалізації.
Асинхронна взаємодія із сервером: Коли користувач натискає кнопку
«Запустити аналіз», React-клієнт формує запит, що містить ідентифікатор файлу
(filePath) та гіперпараметри (наприклад, k=3 для K-Means). Під час очікування
відповіді (що може тривати від кількох секунд до хвилини для великих датасетів)
активується стан isProcessing, який блокує інтерфейс та відображає анімацію
65
завантаження (Spinner). Це є критичною вимогою UX (User Experience) для систем
обробки великих даних.
Побудова інтерактивних графіків (Recharts): Після повернення сервером
JSON-об'єкта з розрахованими координатами та мітками кластерів, ініціюється
рендеринг компонента <Visualization />. Для побудови графіків обрано бібліотеку
Recharts, яка базується на D3.js та нативно підтримує React-компоненти [19].
Фрагмент реалізації діаграми розсіювання (Scatter Plot) для візуалізації
кластерів подано на рисунку 3.10.
Рисунок 3.10 – Лістинг коду Visualization.jsx
66
Цей підхід дозволяє користувачу наводити курсор на точки (Tooltip), щоб
побачити їхні точні координати, що значно покращує інтерпретованість результатів
порівняно зі статичними зображеннями, які генеруються традиційними Python-
скриптами (наприклад, matplotlib) (рис. 3.11).
Рисунок 3.11 – Візуалізація результатів алгоритму K-Means та метрик якості
3.3.4 Інтерактивна база знань. Освітня функція сервісу реалізована через
розгалужену систему компонентів маршрутизації (React Router DOM). Розділ
Knowledge Base концептуально поділено на дві гілки: Класифікація та Кластеризація.
Для уникнення перевантаженості інтерфейсу застосовано дизайн-патерн
«Картки» (Cards). Кожен метод (K-Means, Random Forest, SVM) представлений
окремою карткою з коротким описом. При кліку на картку відкривається детальне
пояснення:
− Суть алгоритму (описана простою мовою).
− Область застосування (наприклад, сегментація клієнтів або виявлення
спаму).
− Переваги та недоліки (чутливість до викидів, швидкість роботи).
67
Завдяки використанню компонентного підходу, додавання опису нового
алгоритму до Бази знань у майбутньому вимагатиме лише створення одного нового
JSON-об'єкта з текстовими даними, який React автоматично відрендерить у вигляді
нової картки (рис. 3.12-3.14).
Рисунок 3.12 – Розділ «База знань»
Рисунок 3.13 – Приклад виду розділу «Кластеризація»
68
Рисунок 3.14 – Картка опису методу DBSCAN
Висновки до розділу 3
Третій розділ присвячено безпосередньому проєктуванню та програмній
реалізації веб-орієнтованого сервісу для аналізу великих даних.
Застосовано методологію об'єктно-орієнтованого аналізу та проєктування
(ООАП). Розроблено UML-діаграми прецедентів, компонентів та послідовностей, які
дозволили чітко розмежувати відповідальність між клієнтською та серверною
частинами системи. Обґрунтовано архітектуру RESTful API, що забезпечує
ізольованість і масштабованість бекенду.
Реалізовано обчислювальне ядро на базі мови Python та мікрофреймворку Flask.
Розроблено алгоритмічний конвеєр у модулі data_processing.py для асинхронного
парсингу, очищення та імпутації даних. Застосування бібліотеки Scikit-learn у модулі
ml_engine.py дозволило імплементувати високоефективні алгоритми кластеризації
(K-Means) та класифікації (Random Forest, SVM), а також інтегрувати метод головних
компонент (PCA) для 2D-згортки результатів.
69
Спроєктовано та імплементовано інтерактивну клієнтську частину (Frontend) за
допомогою бібліотеки React та інструменту збирання Vite. Для вирішення проблеми
наскрізного управління станом успішно застосовано менеджер Zustand.
Реалізовано розширені можливості користувацького інтерфейсу (UI/UX),
зокрема: модуль завантаження з можливістю селективного вибору таблиць із
багатосторінкових файлів, адаптивний редактор даних для попередньої валідації, та
інтерактивний модуль візуалізації результатів на базі бібліотеки Recharts.
Створено освітню підсистему «База знань» (Knowledge Base), яка завдяки
модульній архітектурі карток забезпечує користувачам, які не мають профільної
математичної підготовки, доступ до зрозумілої інтерпретації застосованих алгоритмів
машинного навчання.
Проведене тестування підтвердило працездатність усіх підсистем сервісу,
стійкість бекенду до некоректних форматів даних та високу швидкість відгуку
клієнтського інтерфейсу. Розроблений програмний продукт повністю відповідає
поставленим завданням та готовий до дослідної експлуатації.
70
ВИСНОВКИ
У кваліфікаційній роботі бакалавра вирішено актуальне науково-прикладне
завдання – спроєктовано та реалізовано веб-орієнтований сервіс для
автоматизованого інтелектуального аналізу великих даних, який дозволяє проводити
класифікацію та кластеризацію інформації без необхідності написання програмного
коду.
За результатами проведеного дослідження та розробки програмного продукту
зроблено наступні висновки:
1. На основі аналітичного огляду предметної області встановлено, що сучасний
ринок аналітичного програмного забезпечення поляризований між складними,
дорогими корпоративними системами (Enterprise) та кодозалежними бібліотеками
для розробників. Обґрунтовано доцільність створення легкого, гібридного веб-
сервісу, який демократизує доступ до методів Data Science для широкого кола
фахівців-аналітиків та має вбудовану освітню складову.
2. Досліджено та формалізовано математичні моделі обробки даних.
Обґрунтовано, що для вирішення задачі кластеризації у синхронному веб-середовищі
оптимальним є використання алгоритму K-Means завдяки його лінійній
обчислювальній складності. Для задачі класифікації обґрунтовано використання
ансамблевого методу Random Forest та Support Vector Machine (SVM), які
забезпечують високу точність та стійкість до викидів. Визначено математичні
критерії для обов'язкового етапу очищення даних, включаючи Z-стандартизацію
простору ознак та імпутацію пропусків.
3. Спроєктовано програмну архітектуру системи на основі методології
об'єктно-орієнтованого аналізу з використанням діаграм UML. Обґрунтовано вибір
клієнт-серверної (Decoupled) архітектури RESTful API. Доведено, що розділення
обчислювального математичного ядра (Backend) від інтерактивного користувацького
інтерфейсу (Frontend) забезпечує необхідну масштабованість та відмовостійкість при
роботі з великими масивами даних.
71
4. Здійснено програмну реалізацію серверної частини (Backend) на базі мови
Python та мікрофреймворку Flask. Розроблено оригінальний алгоритмічний конвеєр
(data_processing.py), який здатен динамічно парсити багатосторінкові файли (Excel),
виконувати специфічне структурне очищення невалідних рядків та готувати матрицю
ознак. Впроваджено модуль ml_engine.py на базі бібліотеки Scikit-learn, який
інкапсулює логіку тренування ML-моделей та генерує двовимірні (PCA) координати
для їх подальшої візуалізації.
5. Реалізовано клієнтську частину (Frontend) із застосуванням бібліотеки React,
інструменту Vite та менеджера глобального стану Zustand. Створено адаптивний
багатоетапний інтерфейс (Wizard) для імпорту файлів із можливістю селективного
вибору таблиць, повноцінний редактор попереднього перегляду даних та модуль
динамічної візуалізації графіків на базі Recharts.
6. Розроблено та інтегровано підсистему «База знань», яка виконує роль
інтерактивного довідника. Використання модульної архітектури карток дозволило
наочно та доступно пояснити користувачам принципи роботи методів кластеризації
та класифікації, перетворивши розроблений інструмент на ефективну освітню
платформу.
7. Проведено комплексне тестування розробленого сервісу. Результати
контрольних запусків на реальних наборах даних підтвердили коректність роботи
алгоритмів машинного навчання, стабільність REST-взаємодії та високу
продуктивність React-додатка при відображенні об'ємних таблиць і графіків.
Мету кваліфікаційної роботи досягнуто в повному обсязі, а розроблений
програмний продукт повністю відповідає поставленим вимогам і готовий до
використання як в освітньому процесі, так і для вирішення прикладних аналітичних
задач малого та середнього бізнесу.
Розроблений веб-орієнтований сервіс має значний потенціал для подальшого
масштабування та комерціалізації. Для розширення функціональних можливостей
системи в майбутньому рекомендується:
− розширення математичного апарату: інтегрувати до модуля ml_engine.py
підтримку алгоритмів глибокого навчання (Deep Learning) на базі фреймворків
72
TensorFlow або PyTorch (наприклад, багатошарові перцептрони) для вирішення
складних задач розпізнавання образів;
− покращення підсистеми Ingestion: реалізувати можливість прямого
підключення до зовнішніх реляційних (MySQL, PostgreSQL) та нереляційних
(MongoDB) баз даних за допомогою введення параметрів підключення (Connection
String) безпосередньо у веб-інтерфейсі;
− масштабування інфраструктури: застосувати технології контейнеризації
(Docker) та оркестрації (Kubernetes) для розгортання Flask-бекенду в хмарному
середовищі (AWS, Google Cloud), що дозволить динамічно виділяти обчислювальні
ресурси під час пікових навантажень;
− розширення функцій експорту: додати можливість генерації комплексних
аналітичних звітів у форматі PDF, які автоматично включатимуть збережені графіки
(Recharts), матриці помилок (Confusion Matrix) та розраховані метрики якості
алгоритмів.
73
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Géron A. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow.
2nd ed. Sebastopol : O'Reilly Media, 2019. 856 p.
2. Murphy K. P. Probabilistic Machine Learning: An Introduction. Cambridge : MIT
Press, 2022. 826 p.
3. McKinney W. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and
IPython. 2nd ed. Sebastopol : O'Reilly Media, 2017. 544 p.
4. Han J., Pei J., Tong H. Data Mining: Concepts and Techniques. 4th ed. Waltham :
Morgan Kaufmann, 2022. 752 p.
5. Grinberg M. Flask Web Development: Developing Web Applications with Python.
2nd ed. Sebastopol : O'Reilly Media, 2018. 316 p.
6. Banks A., Porcello E. Learning React: Modern Patterns for Developing React Apps.
2nd ed. Sebastopol : O'Reilly Media, 2020. 320 p.
7. Raschka S., Liu Y., Mirjalili V. Machine Learning with PyTorch and Scikit-Learn.
Birmingham : Packt Publishing, 2022. 774 p.
8. Farley D. Modern Software Engineering: Doing What Works to Build Better Software
Faster. Boston : Addison-Wesley Professional, 2022. 256 p.
9. Gough J., Bryant D., Auburn M. Mastering API Architecture: Design, Operate, and
Evolve API-Based Systems. Sebastopol : O'Reilly Media, 2022. 350 p.
10. James G., Witten D., Hastie T., Tibshirani R., Taylor J. An Introduction to Statistical
Learning: with Applications in Python. Cham : Springer, 2023. 607 p.
11. Dennis A., Wixom B. H., Tegarden D. Systems Analysis and Design: An Object-
Oriented Approach with UML. 6th ed. Hoboken : John Wiley & Sons, 2022. 464 p.
12. Aggarwal C. C. Data Mining: The Textbook. 2nd ed. Cham : Springer, 2024. 812 p.
13. Власов А. В. Проектування веб-застосунків : навч. посіб. Київ : КПІ, 2018. 180 с.
14. React – A JavaScript library for building user interfaces. URL: https://react.dev/ (дата
звернення: 10.05.2026).
15. Flask Documentation. URL: https://flask.palletsprojects.com/ (дата звернення:
10.05.2026).
74
16. Zustand: Bear necessities for state management in React. URL: https://zustand-
demo.pmnd.rs/ (дата звернення: 11.05.2026).
17. Vite: Next Generation Frontend Tooling. URL: https://vitejs.dev/ (дата звернення:
11.05.2026).
18. Pandas documentation. URL: https://pandas.pydata.org/docs/ (дата звернення:
12.05.2026).
19. Recharts: A composable charting library built on React components. URL:
https://recharts.org/ (дата звернення: 12.05.2026).
75
ДОДАТОК А
Затверджую
Зав. кафедри КНСА,
______________ Юрій ТРИУС
«____»____________2026 р.
ВЕБ-ОРІЄНТОВАНИЙ СЕРВІС ДЛЯ КЛАСИФІКАЦІЇ ТА КЛАСТЕРИЗАЦІЇ
ВЕЛИКИХ ДАНИХ НА БАЗІ АЛГОРИТМІВ МАШИННОГО НАВЧАННЯ
Специфікація
482.ЧДТУ. 62282-01
Листів 2
Розробник ____________________ Никита БОНДАРЕНКО
Керівник ____________________ Юрій ТРИУС
Черкаси – 2026
76
482.ЧДТУ. 62282-01
Позначення Найменування Примітка
Документація
482.ЧДТУ. 62282-01 12 01 Лістинг коду програми
482.ЧДТУ. 62282-01 34 01 Інструкція користувача
482.ЧДТУ. 62282-01 90 01 Публікація по темі
кваліфікаційної роботи
бакалавра
77
ДОДАТОК Б
ВЕБ-ОРІЄНТОВАНИЙ СЕРВІС ДЛЯ КЛАСИФІКАЦІЇ ТА КЛАСТЕРИЗАЦІЇ
ВЕЛИКИХ ДАНИХ НА БАЗІ АЛГОРИТМІВ МАШИННОГО НАВЧАННЯ
Лістинг коду програми
482.ЧДТУ. 62282-01 12 01
Листів 20
Розробник _____________ Никита БОНДАРЕНКО
Черкаси – 2026
78
Analysis.jsx
import React, { useState } from 'react';
import axios from 'axios';
import Swal from 'sweetalert2';
import { ResponsiveContainer, PieChart, Pie, Cell, ScatterChart, Scatter, XAxis, YAxis,
CartesianGrid, Tooltip as RechartsTooltip, Legend } from 'recharts';
import { Sparkles, Brain, Cpu } from 'lucide-react';
import { useStore } from '../store/useStore';
import PropTypes from 'prop-types';
const API_URL = import.meta.env.VITE_API_URL || (import.meta.env.DEV ? 'http://localhost:5000' :
'');
const COLORS = ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf',
'#999999'];
const CentroidShape = (props) => {
const { cx, cy, fill, payload } = props;
if (payload.isCentroid) {
return (
<g transform={`translate(${cx},${cy})`}>
<path d="M-8,-8 L8,8 M8,-8 L-8,8" stroke={fill} strokeWidth={4} />
<path d="M-8,-8 L8,8 M8,-8 L-8,8" stroke="#000" strokeWidth={1} opacity={0.5} />
</g>
);
}
return <circle cx={cx} cy={cy} r={4} fill={fill} />;
};
CentroidShape.propTypes = {
cx: PropTypes.number,
cy: PropTypes.number,
fill: PropTypes.string,
payload: PropTypes.object
79
};
/**
* Analysis Component
* Handles the configuration and execution of Machine Learning pipelines.
*/
const Analysis = () => {
const {
fileId, columns, targetColumn, setTargetColumn,
selectedFeatures, toggleFeature, results, setResults, setLoading
} = useStore();
const [analysisType, setAnalysisType] = useState('classification');
const [algorithm, setAlgorithm] = useState('rf');
const [clusters, setClusters] = useState(3);
const runAnalysis = async () => {
if (selectedFeatures.length === 0) {
Swal.fire('Помилка', 'Оберіть хоча б одну ознаку.', 'error');
return;
}
setLoading(true);
try {
const payload = {
file_path: fileId,
analysis_type: analysisType,
algorithm: algorithm,
features: selectedFeatures,
target: analysisType === 'classification' ? targetColumn : undefined,
k: analysisType === 'clustering' ? parseInt(clusters) : undefined
};
80
const res = await axios.post(`${API_URL}/analyze`, payload);
setResults(res.data);
} catch (err) {
Swal.fire('Помилка', err.response?.data?.error || err.message, 'error');
} finally {
setLoading(false);
}
};
const renderChart = () => {
if (!results || !results.chartData) return null;
if (results.chartType === 'pie') {
return (
<ResponsiveContainer width="100%" height="100%">
<PieChart>
<Pie data={results.chartData} cx="50%" cy="50%" innerRadius={80} outerRadius={120}
paddingAngle={5} dataKey="value">
{results.chartData.map((entry, index) => <Cell key={`cell-${index}`} fill={COLORS[index %
COLORS.length]} />)}
</Pie>
<RechartsTooltip contentStyle={{ backgroundColor: 'var(--bg-main)', borderColor: 'var(--
border-color)', color: 'var(--text-main)' }} />
<Legend />
</PieChart>
</ResponsiveContainer>
);
} else if (results.chartType === 'scatter') {
// Group points by cluster
const clustersMap = {};
results.chartData.forEach(p => {
if (!clustersMap[p.cluster]) clustersMap[p.cluster] = [];
clustersMap[p.cluster].push(p);
81
});
return (
<ResponsiveContainer width="100%" height="100%">
<ScatterChart margin={{ top: 20, right: 20, bottom: 20, left: 20 }}>
<CartesianGrid strokeDasharray="3 3" opacity={0.2} vertical={false} stroke="var(--border-
color)" />
<XAxis type="number" dataKey="x" stroke="var(--border-color)" name={results.axisLabels.x}
/>
<YAxis type="number" dataKey="y" stroke="var(--border-color)" name={results.axisLabels.y}
/>
<RechartsTooltip cursor={{ strokeDasharray: '3 3' }} contentStyle={{ backgroundColor: 'var(-
-bg-main)', borderColor: 'var(--border-color)', color: 'var(--text-main)' }} />
<Legend />
{Object.keys(clustersMap).map((clusterId, index) => (
<Scatter key={clusterId} name={clusterId} data={clustersMap[clusterId]} fill={COLORS[index
% COLORS.length]} shape={<CentroidShape />} />
))}
</ScatterChart>
</ResponsiveContainer>
);
}
return null;
};
return (
<div style={{ display: 'grid', gridTemplateColumns: '300px 1fr', gap: '2rem', width: '100%',
maxWidth: '1400px', alignItems: 'start' }}>
<div className="panel" style={{ marginTop: 0 }}>
<h3><Brain size={20} /> Аналіз даних та ШІ</h3>
<div style={{ marginTop: '1.5rem' }}>
<label className="form-label">Тип задачі</label>
82
<select className="form-control" value={analysisType} onChange={e => {
setAnalysisType(e.target.value); setResults(null); }}>
<option value="classification">Класифікація</option>
<option value="clustering">Кластеризація (Сегментація)</option>
</select>
</div>
{analysisType === 'classification' && (
<div style={{ marginTop: '1rem' }}>
<label className="form-label">Цільова змінна (Y)</label>
<select className="form-control" value={targetColumn} onChange={e =>
setTargetColumn(e.target.value)}>
{columns.map(col => <option key={col} value={col}>{col}</option>)}
</select>
<label className="form-label" style={{ marginTop: '1rem' }}>Алгоритм</label>
<select className="form-control" value={algorithm} onChange={e =>
setAlgorithm(e.target.value)}>
<option value="rf">Random Forest (Випадковий ліс)</option>
<option value="svm">Support Vector Machine (SVM)</option>
<option value="lr">Logistic Regression (Лог. регресія)</option>
</select>
</div>
)}
{analysisType === 'clustering' && (
<div style={{ marginTop: '1rem' }}>
<label className="form-label">Кількість кластерів (K)</label>
<input type="number" className="form-control" value={clusters} min="2" max="10"
onChange={e => setClusters(e.target.value)} />
<label className="form-label" style={{ marginTop: '1rem' }}>Алгоритм</label>
<select className="form-control" value={algorithm} onChange={e =>
setAlgorithm(e.target.value)}>
<option value="kmeans">Standard K-Means</option>
83
<option value="bisecting_kmeans">Bisecting K-Means</option>
<option value="dbscan">DBSCAN (Density-based)</option>
</select>
</div>
)}
<div style={{ marginTop: '1.5rem' }}>
<label className="form-label">Ознаки (X)</label>
<div className="checkbox-grid" style={{ maxHeight: '200px', overflowY: 'auto', padding:
'0.5rem', background: 'var(--bg-main)', borderRadius: '8px' }}>
{columns.filter(col => col !== targetColumn).map(col => (
<label key={col} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.85rem'
}}>
<input type="checkbox" checked={selectedFeatures.includes(col)} onChange={() =>
toggleFeature(col)} />
{col}
</label>
))}
</div>
</div>
<button className="btn-primary" style={{ width: '100%', marginTop: '2rem' }}
onClick={runAnalysis}>
<Cpu size={18} /> Запустити
</button>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
{results && (
<div className="panel" style={{ marginTop: 0 }}>
<h2 style={{ fontSize: '1.5rem', marginBottom: '1rem' }}>Результати {analysisType ===
'classification' ? 'класифікації' : 'кластеризації'}</h2>
84
<div className="metric-grid">
{Object.entries(results.metrics).map(([key, val]) => (
<div key={key} className="metric-box"><h4>{key}</h4><div
className="value">{val}</div></div>
))}
</div>
<p style={{ marginTop: '1.5rem', lineHeight: '1.6', fontSize: '1.05rem', color: 'var(--text-main)'
}}>{results.summary}</p>
<div style={{ height: '400px', marginTop: '2rem', background: 'var(--bg-main)', borderRadius:
'12px', padding: '1rem' }}>
{renderChart()}
</div>
<div className="text-content-box" style={{ background: 'var(--bg-main)', padding: '1.5rem',
borderRadius: '8px', marginTop: '2rem' }}>
<h3 style={{ marginBottom: '1rem', display: 'flex', alignItems: 'center', gap: '0.5rem'
}}><Sparkles size={18} color="var(--accent)" /> Бізнес-рекомендації ШІ</h3>
<ul style={{ paddingLeft: '1.5rem', listStyleType: 'disc' }}>{results.recommendations.map((r,
i) => <li key={i} style={{ marginBottom: '0.5rem' }}>{r}</li>)}</ul>
</div>
<div style={{ display: 'flex', gap: '1rem', marginTop: '2rem', flexWrap: 'wrap' }}>
<button className="btn-primary" onClick={() =>
window.open(`${API_URL}/download?file_path=${encodeURIComponent(fileId)}`)}>
Завантажити оброблені дані
</button>
<button className="btn-primary" onClick={() => window.print()}>
Завантажити звіт (PDF)
</button>
</div>
</div>
)}
85
</div>
</div>
);
};
export default Analysis;
data_processing.py
import pandas as pd
from typing import List, Optional
def clean_dataframe(df: pd.DataFrame, action: str, subset: Optional[List[str]] = None) -> pd.DataFrame:
"""
Clean the dataframe based on the provided action.
Args:
df (pd.DataFrame): The dataframe to clean.
action (str): The cleaning action ('drop_duplicates', 'drop_nulls', 'lower_text').
subset (list of str, optional): Subset of columns to consider for duplicates.
Returns:
pd.DataFrame: The cleaned dataframe.
"""
if action == 'drop_duplicates':
if subset and len(subset) > 0:
df = df.drop_duplicates(subset=subset)
else:
df = df.drop_duplicates()
elif action == 'drop_nulls':
df = df.dropna()
elif action == 'lower_text':
categorical_cols = df.select_dtypes(include=['object', 'category']).columns
for col in categorical_cols:
86
df[col] = df[col].astype(str).str.lower()
return df
def impute_missing_values(df: pd.DataFrame) -> pd.DataFrame:
"""
Perform missing value numeric/categorical imputation.
Args:
df (pd.DataFrame): The dataframe to impute.
Returns:
pd.DataFrame: Dataframe with missing values handled.
"""
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
categorical_cols = df.select_dtypes(include=['object', 'category']).columns
for col in numeric_cols:
if df[col].isnull().any():
df[col] = df[col].fillna(df[col].mean())
for col in categorical_cols:
if df[col].isnull().any():
mode_val = df[col].mode()
df[col] = df[col].fillna(mode_val[0] if not mode_val.empty else "Unknown")
return df
def generate_eda_insights(df: pd.DataFrame) -> List[str]:
"""
Generate basic exploratory data analysis insights.
87
Args:
df (pd.DataFrame): The dataset.
Returns:
List[str]: A list of text insights about the dataset.
"""
insights = []
rows, cols = df.shape
insights.append(f"Завантажено матрицю з {rows} рядків та {cols} вимірів.")
null_counts = df.isnull().sum()
null_cols = null_counts[null_counts > 0]
if not null_cols.empty:
insights.append(f"Виявлено пропущені значення в {len(null_cols)} колонках. Застосовано
автоматичне заповнення (середнє/мода) для стабілізації алгоритмів.")
else:
insights.append("Не виявлено математичних аномалій або пропущених змінних у сирих
даних.")
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
if len(numeric_cols) > 1:
insights.append(f"Успішно розмічено {len(numeric_cols)} кількісних ознак. Масштабування
готове.")
return insights
ml_engine.py
import pandas as pd
import numpy as np
from typing import List, Dict, Any, Tuple
import nest_asyncio
from sklearn.cluster import KMeans, BisectingKMeans, DBSCAN
88
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.metrics import silhouette_score, accuracy_score, f1_score
from sklearn.decomposition import PCA
nest_asyncio.apply()
def _get_llm_advice(prompt: str, fallback_recs: List[str]) -> List[str]:
"""
Attempt to fetch business recommendations from a free LLM using g4f.
Args:
prompt (str): The prompt for the LLM.
fallback_recs (List[str]): Fallback recommendations if LLM fails.
Returns:
List[str]: List of bullet point recommendations.
"""
try:
from g4f.client import Client
import g4f
g4f.debug.logging = False
client = Client()
response = client.chat.completions.create(
model=g4f.models.default,
messages=[{"role": "user", "content": prompt}]
)
89
answer = response.choices[0].message.content.strip()
return [sentence.strip() for sentence in answer.split('.') if len(sentence) > 10]
except Exception as e:
print("LLM Error:", str(e))
return fallback_recs
def run_classification(df: pd.DataFrame, target_col: str, feature_cols: List[str],
algorithm: str = "rf", test_ratio: float = 0.2) -> Dict[str, Any]:
"""
Run a scikit-learn classification pipeline.
Args:
df (pd.DataFrame): The dataset.
target_col (str): The target column to predict.
feature_cols (List[str]): The feature columns to use for prediction.
algorithm (str): The algorithm ('rf', 'lr', 'svm').
test_ratio (float): Ratio of testing data.
Returns:
Dict[str, Any]: A dictionary containing accuracy, f1_score, sample_data, and classes.
"""
df = df.dropna(subset=[target_col] + feature_cols).copy()
if len(df) < 10:
raise ValueError(f"Недостатньо валідних даних для тренування (залишилось {len(df)} рядків).
Переконайтеся, що обрані колонки не є повністю порожніми.")
if pd.api.types.is_numeric_dtype(df[target_col]) and df[target_col].nunique() > 10:
df[target_col] = pd.qcut(df[target_col], q=4, duplicates='drop').astype(str)
X = df[feature_cols]
y = df[target_col]
90
le = LabelEncoder()
y_encoded = le.fit_transform(y)
if len(le.classes_) < 2:
raise ValueError("Цільова змінна повинна мати щонайменше 2 унікальних класи для
класифікації.")
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns.tolist()
categorical_features = X.select_dtypes(include=['object', 'category']).columns.tolist()
numeric_transformer = StandardScaler()
categorical_transformer = OneHotEncoder(handle_unknown='ignore')
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
if algorithm == "lr":
classifier = LogisticRegression(max_iter=1000)
elif algorithm == "svm":
classifier = SVC(probability=False, random_state=42)
else:
classifier = RandomForestClassifier(random_state=42)
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', classifier)])
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=test_ratio, random_state=42)
91
model = pipeline.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred, average='weighted')
y_all_pred = model.predict(X)
sample_df = df.copy()
sample_df['prediction'] = le.inverse_transform(y_all_pred)
sample_df = sample_df.sample(min(100, len(sample_df)))
return {
"accuracy": float(accuracy),
"f1_score": float(f1),
"sample_data": sample_df,
"classes": le.classes_.tolist()
}
def run_clustering(df: pd.DataFrame, feature_cols: List[str], k: int = 3, algorithm: str = "kmeans") ->
Dict[str, Any]:
"""
Run a scikit-learn clustering pipeline.
Args:
df (pd.DataFrame): The dataset.
feature_cols (List[str]): The feature columns to use for clustering.
k (int): Number of clusters.
algorithm (str): The algorithm ('kmeans', 'bisecting_kmeans', 'dbscan').
Returns:
Dict[str, Any]: A dictionary containing silhouette_score, sample_data, centroids, and k.
"""
92
df = df.dropna(subset=feature_cols)
if len(df) < k:
raise ValueError(f"Недостатньо валідних даних для кластеризації. Залишилося {len(df)} рядків,
але потрібно мінімум {k} (к-сть кластерів). Переконайтеся, що обрані колонки не є повністю
порожніми.")
X = df[feature_cols]
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns.tolist()
categorical_features = X.select_dtypes(include=['object', 'category']).columns.tolist()
numeric_transformer = StandardScaler()
categorical_transformer = OneHotEncoder(handle_unknown='ignore')
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
if algorithm == "bisecting_kmeans":
clusterer = BisectingKMeans(n_clusters=k, random_state=42)
elif algorithm == "dbscan":
clusterer = DBSCAN()
else:
clusterer = KMeans(n_clusters=k, random_state=42)
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('clusterer', clusterer)])
predictions = pipeline.fit_predict(X)
93
if algorithm == "dbscan":
k_measured = len(set(predictions)) - (1 if -1 in predictions else 0)
k = k_measured if k_measured > 0 else 1
X_transformed = preprocessor.transform(X)
if hasattr(X_transformed, 'toarray'):
X_transformed = X_transformed.toarray()
try:
silhouette = silhouette_score(X_transformed, predictions)
except ValueError:
silhouette = 0.0
if X_transformed.shape[1] >= 2:
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_transformed)
else:
X_pca = np.hstack((X_transformed, np.zeros((X_transformed.shape[0], 1))))
df_pca = pd.DataFrame(X_pca, columns=['pca_x', 'pca_y'])
df_pca['prediction'] = [f"Cluster {p}" for p in predictions]
sample_df = df_pca.sample(min(150, len(df_pca)))
centroids_data = []
if algorithm in ["kmeans", "bisecting_kmeans"] and hasattr(clusterer, "cluster_centers_"):
centroids = clusterer.cluster_centers_
if X_transformed.shape[1] >= 2:
centroids_pca_array = pca.transform(centroids)
else:
centroids_pca_array = np.hstack((centroids, np.zeros((centroids.shape[0], 1))))
for i, c in enumerate(centroids_pca_array):
94
centroids_data.append({
"pca_x": float(c[0]),
"pca_y": float(c[1]),
"cluster": f"Cluster {i}"
})
return {
"silhouette_score": float(silhouette),
"sample_data": sample_df,
"centroids": centroids_data,
"k": k
}
def generate_classification_summary(accuracy: float, f1_score: float, algorithm: str) -> Tuple[str,
List[str]]:
"""
Generate business summary and recommendations for classification.
"""
alg_name = 'Випадковий ліс' if algorithm == 'rf' else ('Метод опорних векторів (SVM)' if algorithm
== 'svm' else 'Логістична регресія')
summary = f"Обраний модуль ({alg_name}) побудував гіперплощину класифікації з Точністю
(Accuracy) {accuracy:.4f} та F1-Оцінкою {f1_score:.4f}."
fallback_recs = []
if accuracy > 0.85:
fallback_recs.append("Модель демонструє високу прогностичну здатність. Бізнесу
рекомендується автоматизувати рішення на базі цих даних.")
elif accuracy > 0.7:
fallback_recs.append("Модель показує прийнятні результати, але варто зібрати додаткові точки
дотику з клієнтами.")
else:
fallback_recs.append("Точність занадто низька. База даних не містить явних індикаторів для
класифікації.")
95
prompt = f"Виступайте як старший бізнес-аналітик. У нас є модель машинного навчання
({alg_name}), яка класифікує клієнтську базу " \
f"з точністю {accuracy:.4f}. Надайте 2 конкретні, короткі бізнес-рекомендації або поради. "
\
f"Відповідайте ВИКЛЮЧНО українською мовою."
recs = _get_llm_advice(prompt, fallback_recs)
return summary, recs
def generate_clustering_summary(silhouette: float, k: int, algorithm: str) -> Tuple[str, List[str]]:
"""
Generate business summary and recommendations for clustering.
"""
if algorithm == "dbscan":
alg_name = "DBSCAN"
elif algorithm == "kmeans":
alg_name = "Стандартний K-Means"
else:
alg_name = "Бісекційний K-Means"
summary = f"Топологічне відображення {alg_name} ініціювало {k} окремих кластерів.
Щільність силуету моделі оцінена у {silhouette:.4f}."
fallback_recs = []
if silhouette > 0.71:
fallback_recs.append("Дані чітко розділені на групи. Це ідеальна база для гіпер-
персоналізованого маркетингу.")
elif silhouette > 0.51:
fallback_recs.append("Виявлено помірну сегментацію. Зосередьте увагу на A/B тестуванні між
знайденими групами.")
elif silhouette > 0.26:
fallback_recs.append("Клієнтська база не має яскраво виражених сегментів. Впроваджуйте
масові пропозиції.")
else:
96
fallback_recs.append("Ситуація є абсолютно хаотичною. Сегментація на цей момент є
недоцільною.")
prompt = f"Виступайте як старший маркетолог-аналітик. Алгоритм ({alg_name}) розбив базу
користувачів " \
f"на {k} сегментів (кластерів) із показником silhouette density {silhouette:.4f}. " \
f"Надайте 2 короткі бізнес-рекомендації. Відповідайте ВИКЛЮЧНО українською мовою."
recs = _get_llm_advice(prompt, fallback_recs)
return summary, recs
97
ДОДАТОК В
ВЕБ-ОРІЄНТОВАНИЙ СЕРВІС ДЛЯ КЛАСИФІКАЦІЇ ТА КЛАСТЕРИЗАЦІЇ
ВЕЛИКИХ ДАНИХ НА БАЗІ АЛГОРИТМІВ МАШИННОГО НАВЧАННЯ
ІНСТРУКЦІЯ КОРИСТУВАЧА
482.ЧДТУ. 62282-01 34 01
Листів 6
Розробник _____________ Никита БОНДАРЕНКО
Черкаси – 2026
98
Веб-застосунок призначений для автоматизованого інтелектуального аналізу
великих даних, зокрема для виконання задач класифікації та кластеризації без
необхідності написання програмного коду. Застосунок дозволяє завантажувати
набори даних, здійснювати їх попереднє очищення, налаштовувати гіперпараметри
алгоритмів машинного навчання, візуалізувати результати та отримувати довідкову
інформацію щодо застосованих методів.
Для роботи із застосунком необхідний будь-який сучасний веб-браузер (Google
Chrome, Mozilla Firefox, Safari) із підключенням до мережі Інтернет. Встановлення
додаткового програмного забезпечення або середовищ розробки (наприклад, Python
чи Jupyter) не потрібне. Усі ресурсомісткі обчислення виконуються на стороні
сервера.
Завантаження даних та вибір таблиці
Робота з сервісом розпочинається із завантаження масиву даних.
1. На головній сторінці перейти до розділу «Імпорт даних»;
2. Натиснути на область завантаження або перетягніть у неї файл формату .csv або
.xlsx;
3. Якщо було завантажено багатосторінковий файл Excel, система автоматично
проаналізує його структуру і відобразить випадаючий список. Далі потрібно
оберати потрібний аркуш (таблицю) для подальшого аналізу та натиснути
«Підтвердити» (рис. В.1.).
Рисунок В.1 – Модуль завантаження файлу та селективного вибору аркуша
99
Попередній перегляд та валідація даних
Після підтвердження вибору таблиці система виконає базове структурне
очищення та відобразить інтерактивний редактор даних як на рисунку В.2. У цьому
розділі можна переглянути перші 50 записів вашого датасету у вигляді таблиці.
Потрібно перевірити коректність розпізнавання колонок (числові та категоріальні
ознаки). Якщо дані відображаються коректно, натиснути кнопку «Аналіз та
діагностика» у навігаційній панелі.
Рисунок В.2 – Інтерактивний редактор попереднього перегляду даних
Налаштування моделі машинного навчання
На екрані аналізу даних зліва розташована панель конфігурації. Для запуску
обчислень потрібно виконати наступні кроки:
Обрати тип задачі: Кластеризація (пошук прихованих груп) або Класифікація
(прогнозування категорії).
Обрати алгоритм: Зі списку доступних методів обрати потрібний метод
(наприклад, K-Means для кластеризації або Random Forest / SVM для класифікації).
Встановити параметри:
Для Кластеризації вказати бажану кількість кластерів;
100
Для Класифікації обов'язково потрібно обрати цільову змінну (Target Column) –
колонку, яку система повинна навчитися прогнозувати.
Натиснути кнопку «Аналізувати». З’явиться індикатор завантаження, що
свідчить про обробку даних на сервері (нормалізація, обробка пропусків та
тренування моделі) (рис. В.3).
Рисунок В.3 – Панель конфігурації параметрів машинного навчання
Візуалізація результатів та експорт
Після завершення обчислень у правій частині екрана з'являться результати
роботи алгоритму:
Графічна панель: Відображає інтерактивну 2D-діаграму розсіювання (Scatter
Plot). Кожен колір відповідає окремому знайденому кластеру або класу. При
наведенні курсору на точку з'являється підказка з її координатами.
Панель метрик: Відображає статистику успішності моделі (наприклад, WCSS
для кластеризації або Accuracy/Точність для класифікації). Для збереження
результатів потрібно натиснути кнопку «Завантажити оброблений датасет» (файл
101
збережеться на ваш комп'ютер у форматі .csv із новою колонкою результатів) або
«Завантажити звіт» для збереження текстової аналітики.
Рисунок В.4 – Візуалізація результатів аналізу та метрик якості моделі
Використання Бази знань
Якщо є невпевненість, який алгоритм обрати, то потрібно перейти до розділу
«Knowledge Base» через навігаційне меню.
1. На стартовій сторінці Бази знань обрати категорію: «Кластеризація» або
«Класифікація». З'явиться короткий опис суті алгоритму (методу).
2. Нижче розташовані картки доступних методів. Потрібно натиснути
мишкою на картку (наприклад, «Алгоритм K-Means»), щоб відкрити детальну
сторінку.
102
3. На сторінці методу зображено його візуалізацію, опис принципу роботи,
сфери застосування (наприклад, сегментація клієнтів), а також перелік переваг
та обмежень. Текст адаптовано для комфортного читання без використання
складних математичних формул.
103
ДОДАТОК Г
ВЕБ-ОРІЄНТОВАНИЙ СЕРВІС ДЛЯ КЛАСИФІКАЦІЇ ТА КЛАСТЕРИЗАЦІЇ
ВЕЛИКИХ ДАНИХ НА БАЗІ АЛГОРИТМІВ МАШИННОГО НАВЧАННЯ
Публікація по темі кваліфікаційної роботи бакалавра
482.ЧДТУ. 62282-01 90 01
Листів 6
Розробник _____________ Никита БОНДАРЕНКО
Черкаси – 2026
104
105
106
107
108