andrii@volkovskey : ~/notes $ cat 03-compare-decides-nothing.md
МОВА
0x03 · ECOMMERCE · TOPSIS · DECISIONS

ПОРІВНЯННЯ
ПОКАЗУЄ ВСЕ
І НЕ РАДИТЬ НІЧОГО

Майже кожен інтернет-магазин уміє покласти два товари поруч і показати двадцять характеристик. І майже жоден не вміє головне - продати товар, який потрібен саме мені.

- Жменя товарів, трохи геометрії, нуль машинного навчання.

/ META - ПОСТ
PATH
~/notes/03-compare-decides-nothing.md
DATE
2026-06-02
READ
~14 MIN
AUTHOR
Andrii Volkov · @volkovskey
TAGS
ecommerce · topsis · javascript · decisions
SERIES
/notes · 03
STATUSОПУБЛІКОВАНОSERIES~/notes · 03UPDATED2026-06-02

Пару днів тому я обирав новий телефон (чи взяти собі простіше, чи взяти дружині покраще і забрати її собі). Зійшлося так, що два варіанти впали майже в одну ціну: iPhone 15 і iPhone 16e. Відкрив порівняння - і сайт чесно виклав усе. У 15-го дві камери замість однієї і трохи старіший чип. У 16e новіший чип, одна камера й інша автономність. Усе видно, усе акуратно в колонках. І я сидів над цією таблицею хвилин десять, бо вона показала мені різницю - але жодним словом не підказала, що з цією різницею робити.

0x01ПЕРЕД ТАБЛИЦЕЮ

iPhone 15iPhone 16e
ціна30 999 грн26 999 грн
екран6.1″6.1″
Dynamic Islandтакні
Apple Intelligenceнітак
чипA16A18
камери48 + 12 МП48 МП
батарея3349 мА·год4005 мА·год
MagSafeтакні
вага171 г167 г
порада???

Це не вперше. Рік тому я так само завис над двома самокатами в одну ціну: один їде далі, інший легший і зручніше складається. Дрібниця? Для мене ні - я жив тоді на п'ятому поверсі без ліфта, і кожен зайвий кілограм доведеться тягнути руками двічі на день. Але таблиця про мій поверх не знає. Вона просто кладе «60 км» навпроти «55 км» і «18 кг» навпроти «17 кг» - і лишає мене сам на сам із вибором.

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

Функція порівняння зроблена, щоб показувати відмінності, а не щоб їх вирішувати.

Чого мені бракувало щоразу - це одного рядка під таблицею. Не «схожих товарів», не реклами, не «з цим купують». Рядка, який покаже те, що важливо саме мені, і скаже: тобі - оцей.

Виявляється, це цілком розв'язувана задача. Я знаю, бо колись її вже розв'язав.

0x02ЧОМУ НЕ ПРАЦЮЄ

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

  • Набір характеристик не мій. Таблиця показує те, що має магазин, а не те, що важливо мені. Половина рядків - про речі, які мене не турбують, а параметр, що вирішив би все, може взагалі не потрапити в таблицю.
  • Не можна зважити переваги. Один товар кращий тут, інший - там, і таблиця кладе їх поруч як рівних. Хоч для мене одна характеристика важить уп'ятеро більше за решту. Зважування лишається у мене в голові, а не на екрані.
  • Перевантаження. Що детальніша таблиця, то ближча вона до технічного даташита. Двадцять рядків - і ти вже не обираєш, ти аналізуєш.
  • Нуль персоналізації. Таблиця однакова для мене, для мого діда і для блогера-оглядача. Вона не знає ні мого поверху без ліфта, ні того, що камерою я користуюсь раз на місяць.
  • Нічого для тих, хто не в темі. «Тактова частота», «Вт·год», «нанометри» - для людини без фону це просто числа. Таблиця їх показує і жодного разу не пояснює, що з них насправді важливе.

Найболючіший - другий. Повернімось до самокатів: перший їде далі, другий легший. Таблиця чесно покаже «60 км» проти «55 км» і «18 кг» проти «17 кг». Але вона не знає, що для мене з тим п'ятим поверхом без ліфта зайві п'ять кілометрів запасу нічого не варті проти одного кілограма ваги. Для сусіда знизу - рівно навпаки. Той самий рядок, протилежні висновки - і таблиця однаково мовчить для обох.

Той самий рядок, протилежні висновки - і таблиця однаково мовчить для обох.

І це не вада конкретного магазину. Зайди в Rozetka, Comfy, куди завгодно - порівняння там є, часто непогане. А от системи, яка б усередині цього порівняння щось радила, немає ніде. Тобі запропонують «з цим купують» і «схожі товари» - але це про вітрину магазину, а не про твій вибір між уже відібраними варіантами.

0x03ЯКБИ ВОНА РАНЖУВАЛА

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

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

Що я перебрав. Колаборативна фільтрація («схожим на тебе сподобалось оце») потужна, але хоче гори даних про поведінку і страждає від холодного старту: новому товару чи магазину рекомендувати нічим. Нейромережа дає найвищу точність на великих даних - і найвищу ціну: дані, сервери, команда, місяці. Для порівняння в малому магазині це мікроскопом по цвяху, та ще й чорна скриня, де не поясниш користувачу, чому обрано саме це. Метод аналізу ієрархій уже ближче - ваги зі свідомих порівнянь, - але матриця парних порівнянь розростається з кожною характеристикою і теж хоче багато виборів, щоб бути достовірною.

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

Усьому цьому відповідає TOPSIS - техніка впорядкування за схожістю до ідеального рішення. Метод багатокритеріального вибору, який Чінг-Лай Хванг і Кьонг Юн описали ще 1981 року. [1] Ідея в одному реченні: уяви ідеальний товар (найкраще по кожній характеристиці) і антиідеал (найгірше по кожній) - і постав реальні товари в порядок за тим, наскільки кожен близький до ідеала й далекий від антиідеала.

Ранжування не потребує нейромережі. Воно потребує методу, який можна пояснити рядок за рядком.
ПідхідДаних требаХолодний стартПрозорістьМалий магазин
Колаборативна фільтраціябагато (поведінка)такнизькані
Нейромережадуже багато + серверитакчорна скриняні
AHP (аналіз ієрархій)багато порівняньпомірносереднячастково
TOPSISжменя товарівмайже немаєвисокатак

Звучить просто? Воно й просте - і це його головна перевага. Ось як воно рахує.

0x04ЯК ПРАЦЮЄ TOPSIS

Уся хитрість методу - не порівнювати товари між собою (це й є та каша, з якої ми тікаємо), а порівняти кожен із двома вигаданими орієнтирами. Перший - ідеальний товар: береш найкраще значення кожної характеристики серед наявних і складаєш із них одного «франкенштейна». Другий - антиідеал: те саме, але з найгірших значень. Жодного з них не існує в продажу; вони потрібні лише як дві точки відліку.

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

/ FIG
  хар-ка 2 (більше = краще)     │           ◆ A⁺  (ідеал: усе найкраще)     │        ·P2     │     ·P1     │   ·P3     │ ·  ◆──┼─────────────────────▶  хар-ка 1 (більше = краще)  A⁻ (антиідеал: усе найгірше)
Кожен товар - точка після нормалізації. Переможець - не той, хто найближче до ідеала A⁺, а той, у кого найкращий баланс: близько до A⁺ і далеко від A⁻.

Тепер те саме п'ятьма кроками. На вході - матриця: рядки це товари, колонки це характеристики.

1. нормалізація (під напрям характеристики):
     більше-краще:  r = (x - min) / (max - min)
     менше-краще:   r = (max - x) / (max - min)

2. зважування:
     t = r × w          w - вага (пріоритет) характеристики

3. орієнтири:
     A⁺ = max у кожній колонці t   (ідеал)
     A⁻ = min у кожній колонці t   (антиідеал)

4. відстані (евклідові):
     d⁺ = √ Σ (t - A⁺)²
     d⁻ = √ Σ (t - A⁻)²

5. близькість:
     C = d⁻ / (d⁺ + d⁻)            0 ≤ C ≤ 1
     сортуємо за C спадаюче → найкращий товар перший

Перший крок робить найважливіше - приводить усе до спільної шкали 0..1. Без цього ємність батареї в тисячах мА·год просто задавила б вагу в десятках кілограмів самим лише масштабом, хоча для вибору вони рівноправні. Заразом тут вирішується напрям: для ціни й ваги «менше = краще», тому формула перевертається, і після нормалізації більше завжди означає краще. Зручний наслідок - ідеал стає просто максимумом кожної колонки, а антиідеал мінімумом, без окремого розбору «де вигода, де витрата». [2]

Лишилося єдине, чого ми ще не чіпали: звідки беруться ваги w. Бо саме вони перетворюють «об'єктивний» ранг на рекомендацію особисто для тебе.

0x05ЗВІДКИ ВАГИ

Ваги - це те місце, де «об'єктивний» ранг стає рекомендацією особисто для тебе. Бо без ваг TOPSIS вважає всі характеристики рівними, а так не буває: комусь головне ціна, комусь камера, комусь вага на п'ятий поверх.

Найгірше, що тут можна зробити, - попросити людину ввести числа. Ніхто не хоче друкувати «екран = 0.32, батарея = 0.21». Тому ваги беруться з порядку, а не з цифр. Користувач просто розставляє, що для нього важливіше: найважливіше - перше. Систему це влаштовує: якщо характеристик N, то першому пріоритету дається вага N, наступному N-1 і так далі до 1, а все, що людина не чіпала, отримує 1. Перетягнув список - ваги перерахувались.

І звідси два режими.

  • Спільнота. Магазин накопичує вибори всіх відвідувачів і усереднює їх по кожній характеристиці. Новачку, якому ліньки щось налаштовувати, одразу видається розумний дефолт - «на що насправді дивиться більшість у цій категорії». Це рекомендація «з коробки».
  • Власні пріоритети. Перетягуєш характеристики під себе - і ранг моментально перебудовується. Жодного холодного старту: працює з першого ж вибору, бо нічиїх даних, крім твоїх, не потребує.

Ось як виглядає усереднення на трьох покупцях, що обирали телефон (характеристики: A - екран, B - вага, C - батарея, D - роздільна екрана, E - роздільна камери):

ABCDE
Покупець 1 (екран → батарея → вага)53411
Покупець 2 (вага → батарея → екран)35411
Покупець 3 (лише камера)11115
Середня вага33312.33

Три людини - і вже видно профіль: екран, вага й батарея йдуть нарівні попереду, роздільні здатності - позаду. Чим більша вибірка, тим стабільніші ці ваги. Але навіть на нулі даних метод не ламається: дефолт - усі ваги по 1, і ранг усе одно є, просто «нейтральний».

0x06СПРОБУЙ САМ

Нижче - не скріншот і не відео. Це справжній TOPSIS на справжньому датасеті, прямо в статті. Обери два-чотири самокати, постав пріоритети (або візьми «як у більшості») - і дивись, як рахується ранг.

/ topsis-demoSCOOTERS · 8 ITEMS
1pick 2-5 scooters4/5
2weight source

Averaged visitor choices - a smart default for "what most people look at." Price, weight, and range matter most.

3comparison by criteria
criterionweightElectric Scooter 4Electric Scooter 4 ProElectric Scooter 5 MaxNinebot Max G30P
Price, UAH×5.5024 91229 06433 21629 064
Motor, W×1.796007001000350
Battery, mAh×2.57370475477551
Range, km×4.4335556065
Top speed, km/h×425252530
Weight, kg×5.2917.2171819
Wheels, ″×1.8610101010
Foldable×4.07yesyesyesyes
Suspension×2.57nonoyesno
Brakes×2.64discdiscdiscdrum
Tires×2.50pneumaticpneumaticpneumaticpneumatic
Warranty, yr×2.501111
Rating×1.864.64.74.84.7

Best in row is highlighted. Weight shows how much TOPSIS counts this criterion - the higher, the more impact on the final ranking.

4ranking→ Electric Scooter 4 Pro
  1. 1Electric Scooter 4 Pro0.557
  2. 2Electric Scooter 40.514
  3. 3Ninebot Max G30P0.494
  4. 4Electric Scooter 5 Max0.470
normalizationweightsideal / anti-idealcloseness C

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

0x07ЧИ ГАРНІ ПОРАДИ

Метод гарний на папері - але чи дає він поради, під якими я підпишусь? Я прогнав його на тому, що реально обирав би.

Спершу самокати - чотири з одного цінового діапазону: Scooter 4, 4 Pro, 5 Max і Ninebot Max G30P. Я опитав друзів, на що вони передусім дивляться, і завів ці вибори як «накопичені» дані спільноти. Більшість цінувала ціну, вагу й запас ходу. На цих вагах система радить Xiaomi Electric Scooter 4 Pro з оцінкою 0.557. І не дивно: найдешевший Scooter 4 виграє ціною, але програє по вазі та запасу, а 4 Pro ніде не найгірший - оптимальний по балансу ціна/характеристики.

0.557Scooter 4 Proрекомендація спільноти

Тепер ставлю свої пріоритети. У мене той самий п'ятий поверх без ліфта, тож для мене це потужність двигуна (легше в горку), вага й те, щоб самокат складався. На цих вагах система перемикається на Xiaomi Electric Scooter 5 Max - найпотужніший, а важить не сильно більше за попередню рекомендацію. Випередив 4 Pro ледь-ледь: 0.701 проти 0.692. Той самий набір товарів, інший я - інша відповідь.

0.701 vs 0.6925 Max обійшов 4 Proмої пріоритети

З телефонами те саме, але показовіше. Беремо чотири: iPhone 16e, 17e, 17 і Air (ціни - орієнтовні роздрібні в Україні, червень 2026). Ставлю пріоритет на камеру, ціна другорядна - і попереду виходить iPhone 17, єдиний у наборі з подвійною камерою: 0.579. Тоді міняю місцями лише дві ваги, камеру й ціну, більше нічого - і вперед виходить найдешевший, iPhone 16e: 0.563. Той самий набір, та сама людина, переставлено два пріоритети - і порада перевернулась.

0.579 → 0.563iPhone 17 → 16eпоміняли місцями камеру й ціну

І ось чесний підсумок цього розділу. Рекомендація дуже чутлива до ваг. Це одночасно її сила (підлаштовується точно під тебе) і її слабкість (переставив два пріоритети - інший переможець). Тому до меж методу варто поставитись окремо.

0x08ЧОГО НЕ ЛАГОДИТЬ

Одразу зніму можливе непорозуміння: TOPSIS - не «єдино правильна» відповідь. Це один із методів, що закриває проблему, з якої почалась стаття. Хороший вибір для старту - простий, прозорий, працює на малих даних. Але система навколо нього може й має рости. Чесні межі - це радше вектори розвитку, ніж вироки.

  • Garbage in. Метод чесно ранжує те, що йому дали. Брудний чи неповний каталог - і ранг буде таким самим. Якість порад не вища за якість специфікацій.
  • Якісні характеристики втрачають сенс у числах. «Складається = 1/0», «гальма: дискові = 2, барабанні = 1» - це порядкова шкала, яку метод рахує як кількісну. Грубувато; для тонких якісних відмінностей потрібен інший підхід.
  • Ваги спільноти на старті - це маленькі опитування. Чим більше реальних виборів, тим точніший дефолт. На нулі він просто «нейтральний».
  • Немає прямого порівняння з іншими методами. Чесно: я не ганяв TOPSIS проти AHP чи ML на одному датасеті, щоб виміряти, хто кого. Це окрема робота.
Метод чесно ранжує те, що йому дали. Хочеш кращих порад - давай кращі дані.

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

0x09ЧОМУ НІХТО НЕ РОБИТЬ

Ринок порожній, я перевіряв ще для кваліфікаційної роботи [3]: порівняння з рекомендацією всередині немає ні в Amazon, ні в наших магазинах. І це дивно - функція ж очевидно корисна. У мене є здогад чому.

Така рекомендація штовхає до «найкраще для тебе», а не до «найвигідніше для магазину». Чесний ранг цілком може сказати «бери дешевший, він тобі підходить більше» - а це рівно протилежне до апселу. Тут напруга: впевнений покупець купує охочіше (це плюс конверсії), але система, яка радить оптимум, а не маржу, не дуже допомагає виштовхувати дорожче. І багато хто, схоже, обирає бік маржі.

Можливо, я помиляюсь, але думаю, вектор приблизно такий.

0x0AКОРОТКО

  1. Таблиця порівняння - це дисплей, а не порадник. Бракує рядка, що ранжує.
  2. Ранжування під людину - це багатокритеріальне рішення, а не нейромережа.
  3. TOPSIS працює на жмені товарів, прозорий, майже без холодного старту.
  4. Ваги беруться з пріоритетів - спільноти або власних. Це й робить ранг твоїм.
  5. Метод чутливий до ваг: одночасно його сила і його ризик.
  6. Це фундамент. Нейромережі - потім, коли наростуть дані.
/ ПРИМІТКИ
[1]Метод TOPSIS запропонували Чінг-Лай Хванг і Кьонг Юн, 1981 (Hwang & Yoon, Multiple Attribute Decision Making: Methods and Applications).
[2]Класичний TOPSIS використовує векторну нормалізацію r = x / √Σx² і розбирає вигоду/витрату на кроці орієнтирів. У реалізації я взяв min-max із напрямом, вшитим у нормалізацію - поширений варіант, і саме його рахує демо вище, тож числа в ньому збігаються з формулами в 0x04.
[3]Ця стаття - за моєю бакалаврською кваліфікаційною роботою «Розробка та впровадження системи рекомендацій у функції порівняння товарів на сайтах інтернет-магазинів» (НТУ «Дніпровська політехніка», 2025).
AV
Andrii Volkov · @volkovskey
Інженер · Системний будівельник · Дніпро / Україна
← ПОВЕРНУТИСЬ НА ГОЛОВНУ
ЗРОБЛЕНО В УКРАЇНІ · НЕ ДЛЯ РОСІЇ · © 2026
VOLKOVSKEY · 2026-06-06 15:50:24