ПОРІВНЯННЯ
ПОКАЗУЄ ВСЕ
І НЕ РАДИТЬ НІЧОГО
Майже кожен інтернет-магазин уміє покласти два товари поруч і показати двадцять характеристик. І майже жоден не вміє головне - продати товар, який потрібен саме мені.
- Жменя товарів, трохи геометрії, нуль машинного навчання.
- 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
Пару днів тому я обирав новий телефон (чи взяти собі простіше, чи взяти дружині покраще і забрати її собі). Зійшлося так, що два варіанти впали майже в одну ціну: iPhone 15 і iPhone 16e. Відкрив порівняння - і сайт чесно виклав усе. У 15-го дві камери замість однієї і трохи старіший чип. У 16e новіший чип, одна камера й інша автономність. Усе видно, усе акуратно в колонках. І я сидів над цією таблицею хвилин десять, бо вона показала мені різницю - але жодним словом не підказала, що з цією різницею робити.
0x01ПЕРЕД ТАБЛИЦЕЮ
| iPhone 15 | iPhone 16e | |
|---|---|---|
| ціна | 30 999 грн | 26 999 грн |
| екран | 6.1″ | 6.1″ |
| Dynamic Island | так | ні |
| Apple Intelligence | ні | так |
| чип | A16 | A18 |
| камери | 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 не зводиться до наївного «обери найближче до ідеала». Товар може стояти близько до ідеала й водночас недалеко від антиідеала - посередній, але збалансований. Тому метод дивиться на співвідношення: наскільки товар далекий від антиідеала відносно загальної відстані до обох орієнтирів. Переможець - у кого цей баланс найкращий: близько до ідеала і при цьому далеко від антиідеала.
хар-ка 2 (більше = краще) ▲ │ ◆ A⁺ (ідеал: усе найкраще) │ ·P2 │ ·P1 │ ·P3 │ · ◆──┼─────────────────────▶ хар-ка 1 (більше = краще) 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 - роздільна камери):
| A | B | C | D | E | |
|---|---|---|---|---|---|
| Покупець 1 (екран → батарея → вага) | 5 | 3 | 4 | 1 | 1 |
| Покупець 2 (вага → батарея → екран) | 3 | 5 | 4 | 1 | 1 |
| Покупець 3 (лише камера) | 1 | 1 | 1 | 1 | 5 |
| Середня вага | 3 | 3 | 3 | 1 | 2.33 |
Три людини - і вже видно профіль: екран, вага й батарея йдуть нарівні попереду, роздільні здатності - позаду. Чим більша вибірка, тим стабільніші ці ваги. Але навіть на нулі даних метод не ламається: дефолт - усі ваги по 1, і ранг усе одно є, просто «нейтральний».
0x06СПРОБУЙ САМ
Нижче - не скріншот і не відео. Це справжній TOPSIS на справжньому датасеті, прямо в статті. Обери два-чотири самокати, постав пріоритети (або візьми «як у більшості») - і дивись, як рахується ранг.
Averaged visitor choices - a smart default for "what most people look at." Price, weight, and range matter most.
| criterion | weight | Electric Scooter 4 | Electric Scooter 4 Pro | Electric Scooter 5 Max | Ninebot Max G30P |
|---|---|---|---|---|---|
| Price, UAH ↓ | ×5.50 | 24 912 | 29 064 | 33 216 | 29 064 |
| Motor, W ↑ | ×1.79 | 600 | 700 | 1000 | 350 |
| Battery, mAh ↑ | ×2.57 | 370 | 475 | 477 | 551 |
| Range, km ↑ | ×4.43 | 35 | 55 | 60 | 65 |
| Top speed, km/h ↑ | ×4 | 25 | 25 | 25 | 30 |
| Weight, kg ↓ | ×5.29 | 17.2 | 17 | 18 | 19 |
| Wheels, ″ ↑ | ×1.86 | 10 | 10 | 10 | 10 |
| Foldable ↑ | ×4.07 | yes | yes | yes | yes |
| Suspension ↑ | ×2.57 | no | no | yes | no |
| Brakes ↑ | ×2.64 | disc | disc | disc | drum |
| Tires ↑ | ×2.50 | pneumatic | pneumatic | pneumatic | pneumatic |
| Warranty, yr ↑ | ×2.50 | 1 | 1 | 1 | 1 |
| Rating ↑ | ×1.86 | 4.6 | 4.7 | 4.8 | 4.7 |
Best in row is highlighted. Weight shows how much TOPSIS counts this criterion - the higher, the more impact on the final ranking.
- 1Electric Scooter 4 Pro0.557
- 2Electric Scooter 40.514
- 3Ninebot Max G30P0.494
- 4Electric Scooter 5 Max0.470
Важливий нюанс: усе рахується по обраному набору. Додаси або прибереш товар - і мінімум із максимумом по кожній характеристиці зміняться, а з ними нормалізація і весь ранг. Тож порада тут залежить не лише від ваг, а й від того, що саме ти поклав поруч.
0x07ЧИ ГАРНІ ПОРАДИ
Метод гарний на папері - але чи дає він поради, під якими я підпишусь? Я прогнав його на тому, що реально обирав би.
Спершу самокати - чотири з одного цінового діапазону: Scooter 4, 4 Pro, 5 Max і Ninebot Max G30P. Я опитав друзів, на що вони передусім дивляться, і завів ці вибори як «накопичені» дані спільноти. Більшість цінувала ціну, вагу й запас ходу. На цих вагах система радить Xiaomi Electric Scooter 4 Pro з оцінкою 0.557. І не дивно: найдешевший Scooter 4 виграє ціною, але програє по вазі та запасу, а 4 Pro ніде не найгірший - оптимальний по балансу ціна/характеристики.
Тепер ставлю свої пріоритети. У мене той самий п'ятий поверх без ліфта, тож для мене це потужність двигуна (легше в горку), вага й те, щоб самокат складався. На цих вагах система перемикається на Xiaomi Electric Scooter 5 Max - найпотужніший, а важить не сильно більше за попередню рекомендацію. Випередив 4 Pro ледь-ледь: 0.701 проти 0.692. Той самий набір товарів, інший я - інша відповідь.
З телефонами те саме, але показовіше. Беремо чотири: iPhone 16e, 17e, 17 і Air (ціни - орієнтовні роздрібні в Україні, червень 2026). Ставлю пріоритет на камеру, ціна другорядна - і попереду виходить iPhone 17, єдиний у наборі з подвійною камерою: 0.579. Тоді міняю місцями лише дві ваги, камеру й ціну, більше нічого - і вперед виходить найдешевший, iPhone 16e: 0.563. Той самий набір, та сама людина, переставлено два пріоритети - і порада перевернулась.
І ось чесний підсумок цього розділу. Рекомендація дуже чутлива до ваг. Це одночасно її сила (підлаштовується точно під тебе) і її слабкість (переставив два пріоритети - інший переможець). Тому до меж методу варто поставитись окремо.
0x08ЧОГО НЕ ЛАГОДИТЬ
Одразу зніму можливе непорозуміння: TOPSIS - не «єдино правильна» відповідь. Це один із методів, що закриває проблему, з якої почалась стаття. Хороший вибір для старту - простий, прозорий, працює на малих даних. Але система навколо нього може й має рости. Чесні межі - це радше вектори розвитку, ніж вироки.
- Garbage in. Метод чесно ранжує те, що йому дали. Брудний чи неповний каталог - і ранг буде таким самим. Якість порад не вища за якість специфікацій.
- Якісні характеристики втрачають сенс у числах. «Складається = 1/0», «гальма: дискові = 2, барабанні = 1» - це порядкова шкала, яку метод рахує як кількісну. Грубувато; для тонких якісних відмінностей потрібен інший підхід.
- Ваги спільноти на старті - це маленькі опитування. Чим більше реальних виборів, тим точніший дефолт. На нулі він просто «нейтральний».
- Немає прямого порівняння з іншими методами. Чесно: я не ганяв TOPSIS проти AHP чи ML на одному датасеті, щоб виміряти, хто кого. Це окрема робота.
Метод чесно ранжує те, що йому дали. Хочеш кращих порад - давай кращі дані.
Куди це природно росте: нейромережа на визначення ваг, коли наростуть дані; одночасний показ кількох рекомендацій під різні профілі; пошук і додавання в порівняння товарів, яких ще немає в списку. Тобто TOPSIS тут - фундамент, а не фініш.
0x09ЧОМУ НІХТО НЕ РОБИТЬ
Ринок порожній, я перевіряв ще для кваліфікаційної роботи [3]: порівняння з рекомендацією всередині немає ні в Amazon, ні в наших магазинах. І це дивно - функція ж очевидно корисна. У мене є здогад чому.
Така рекомендація штовхає до «найкраще для тебе», а не до «найвигідніше для магазину». Чесний ранг цілком може сказати «бери дешевший, він тобі підходить більше» - а це рівно протилежне до апселу. Тут напруга: впевнений покупець купує охочіше (це плюс конверсії), але система, яка радить оптимум, а не маржу, не дуже допомагає виштовхувати дорожче. І багато хто, схоже, обирає бік маржі.
Можливо, я помиляюсь, але думаю, вектор приблизно такий.
0x0AКОРОТКО
- Таблиця порівняння - це дисплей, а не порадник. Бракує рядка, що ранжує.
- Ранжування під людину - це багатокритеріальне рішення, а не нейромережа.
- TOPSIS працює на жмені товарів, прозорий, майже без холодного старту.
- Ваги беруться з пріоритетів - спільноти або власних. Це й робить ранг твоїм.
- Метод чутливий до ваг: одночасно його сила і його ризик.
- Це фундамент. Нейромережі - потім, коли наростуть дані.