# 🧬 Affinity-профиль

Профиль аффинитивности пользователя собирается для каждого пользователя на основании:

- Событий
- Ценности атрибутов товара

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

Аффинитивность собирается по следующим событиям:

- Page view
- Product View
- Add to Cart
- Purchase
- Add to favorites

---

## 📦 Товарный фид и атрибуты

- По умолчанию Affinity Score считается по полю `categories` (вся иерархия).
- Чтобы учитывать другие поля (например, `brand`, `color`, `gender`), их необходимо указать через менеджера по персонализации.
- Рекомендуемое количество атрибутов — до **5**, максимум — **10**.

---

## ⚙️ События и вес

| Событие                     | Вес действия |
|----------------------------|--------------|
| Просмотр товара            | 2            |
| Добавление в избранное     | 2            |
| Добавление в корзину       | 4            |
| Покупка                    | 6            |

Также учитываются **коэффициенты давности**:

| Срок взаимодействия | Коэффициент |
|---------------------|-------------|
| До 2 дней           | 8           |
| До 30 дней          | 2           |
| До 180 дней         | 1           |

### 🔍 Пример оценки по типу действия

Если пользователь 4 раза посмотрел товар, 1 раз добавил в корзину и 1 раз купил:

```
(4 × 2 × 1) + (1 × 4 × 20) + (1 × 6 × 60) = 8 + 80 + 360 = 448
```

### 🔍 Пример оценки с учётом давности

| Сессия       | Действие     | Вес | Коэфф. | Итог |
|--------------|--------------|-----|--------|------|
| 15 дней назад| Просмотр × 4 | 2   | 2      | 16   |
| 15 дней назад| В корзину ×1 | 4   | 2      | 8    |
| Сейчас       | Покупка ×1   | 6   | 8      | 48   |
|              |              |     |        | **72** |

---

## 📌 Где используется Affinity-профиль?

- В стратегиях с алгоритмом **User Affinity**
- Для выбора fallback-товаров, если основной алгоритм не дал результата
- При закреплении товаров (Pin), если нужный SKU не найден
- В построении аудиторий на основе предпочтений

---

## 🧱 Требования к фиду

1. Выбрать атрибуты для сбора предпочтений (`color`, `size`, `brand`…)
2. Убедиться в:
   - Однородности значений (например: `Белый`, `белый` → `белый`)
   - Заполненности большинства товаров по этим атрибутам
   - Дискретности значений (ограниченный список, без уникальных ID)

---

## ⏱ Срок хранения и обновления

- События хранятся до **180 дней**
- Оценки обновляются автоматически при каждом взаимодействии

---

## ❓ FAQ

### Какие поля можно использовать для построения Affinity-профиля?
Только те, что содержат **дискретные значения** — например, `brand`, `color`, `gender`, `style`. Нельзя использовать поля с уникальными или числовыми значениями (например, `price`, `sku`, `name`).

### Где настраиваются поля, участвующие в профиле?
По умолчанию используется `categories`. Остальные поля настраиваются вручную через Менеджера по Персонализации. Максимум — 10 полей (оптимально — до 5).

### Когда начинается сбор Affinity-профиля?
Сразу после первого действия пользователя на сайте (просмотр, добавление в избранное, в корзину, покупка).

### Какой срок хранения предпочтений?
Данные об интересах пользователя хранятся и участвуют в расчётах до **180 дней**.

### Можно ли сбросить или обновить Affinity-профиль вручную?
Нет, профиль обновляется автоматически на основе пользовательских действий. 

### Какие действия учитываются?
- Просмотр товара (Product View)
- Добавление в избранное (Add to Favorites)
- Добавление в корзину (Add to Cart)
- Покупка (Purchase)
- Просмотр страницы (Page View)

> ❗️Фильтрация не учитывается

### Как Affinity влияет на рекомендации?
Affinity используется в:
- Алгоритме `User Affinity` (все страницы)
- Фолбеке, если основной алгоритм не дал результата
- При выборе товара в `Pin`, если SKU не найден в фиде или стратегии

### Могут ли быть использованы товары, которых больше нет в наличии?
В Affinity-профиле они учитываются, но при расчёте рекомендаций система исключает товары, у которых `in_stock = false`, если это указано в настройках стратегии.

### Как Affinity работает на разных устройствах?
Если реализована идентификация пользователя (через `cuid`) — поведение агрегируется между устройствами.
