# План полноценного преданализа датасета «Коммуникации в Городе»

Основано на описании датасета: есть ежедневные коммуникации с клиентами в экосистеме «Город Т-Банка», активные/пассивные каналы, показы/клики и заказы по категориям (ent, super, transport, shopping, hotel, avia), а также демография и устройство.

Обозначения:

- `*_imp_*` — показы (impressions) активных/пассивных каналов по категориям (`ent`, `super`, `transport`, `shopping`, `hotel`, `avia`).
- `*_click_*` — клики/касания по тем же категориям.
- `orders_amt_*` — число заказов по категориям.
- `gender_cd`, `age`, `device_platform_cd` — демография и устройство.

---

## 0. Технический скелет проекта

Файлы/ноутбуки:

1. `01_load_and_clean.ipynb` — загрузка, чистка, базовые описания.
2. `02_univariate_bivariate.ipynb` — распределения и связи признаков.
3. `03_time_and_lags.ipynb` — время, лаги, сезонность.
4. `04_clients_segmentation.ipynb` — агрегаты по клиенту, сегменты.
5. `05_exploratory_models.ipynb` — простые модели как часть EDA.
6. `eda_report.md` / `eda_report.ipynb` — итоговый отчёт.

---

## 1. Загрузка и структура данных

### Таблицы/выводы

1. `df.info()` — список столбцов, типы, количество ненулевых.
2. `df.head(5)` — первые строки для визуальной проверки.
3. Размерность:
   - `n_rows`, `n_cols`
   - `n_unique_clients = df['id'].nunique()`
   - диапазон дат: `min(business_dt)`, `max(business_dt)`
4. Проверка ключа:
   - таблица: `df.groupby(['id', 'business_dt']).size().value_counts().head()`  
     (показывает, есть ли дубликаты по ключу)
5. Среднее число дней на клиента:
   - `df.groupby('id').size().describe()`

### Графики

1. Количество записей по датам:
   - `bar/line`: X = `business_dt`, Y = `count(*)`
   - цель: увидеть провалы/пики выгрузки

---

## 2. Качество данных и аномалии

### Таблицы/метрики

1. Пропуски:
   - таблица: колонка → количество пропусков → доля пропусков
2. Базовый `describe` по числовым:
   - `df[num_cols].describe().T`
3. Доля нулей:
   - таблица: колонка → доля нулей → min/max → 95-й, 99-й перцентили
4. Логические проверки:
   - все `*_imp_*`, `*_click_*`, `orders_amt_*` должны быть `>= 0`
   - поиск отрицательных/странных значений
5. Возраст:
   - мин/макс, перцентили (1-й, 99-й), доля мусора (например, `<14` или `>100`)
6. Категориальные:
   - уникальные значения `gender_cd`, `device_platform_cd`
   - приведение к единому формату (trim, upper, `unknown`)

### Графики

1. Boxplot возраста:
   - Y = `age`
   - цель: выбросы и мусор
2. Barplot пропусков:
   - X = столбец, Y = доля NaN (только где NaN > 0)

---

## 3. Одномерный анализ (univariate)

### 3.1. Числовые признаки (показы/клики/заказы)

#### Таблицы

1. Для каждой группы (`active_imp_*`, `passive_imp_*`, `active_click_*`, `passive_click_*`, `orders_amt_*`):
   - `count, mean, median, std, min, q25, q75, max, share_zero, p95, p99`
2. Агрегаты по всем категориям:
   - создать `active_imp_total`, `passive_imp_total`, `active_click_total`, `passive_click_total`, `orders_amt_total`
   - таблица `describe()` для них

#### Графики

1. Гистограммы (лог-масштаб или `log1p`) для каждой категории и типа:
   - `active_imp_ent`, `active_click_ent`, `passive_imp_ent`, `orders_amt_ent`, …
2. Boxplot для агрегатов:
   - `active_imp_total`, `passive_imp_total`, `active_click_total`, `passive_click_total`, `orders_amt_total`

### 3.2. Категориальные признаки

#### Таблицы

1. Распределение `gender_cd`: counts, доли, `unknown`
2. Распределение `device_platform_cd`: counts, доли
3. Возрастные группы:
   - `<25`, `25–34`, `35–44`, `45–54`, `55+`
   - таблица: группа → число клиентов → доля

#### Графики

1. Barplot пола: X = `M/F/Unknown`, Y = доля
2. Barplot платформ: X = platform, Y = доля
3. Гистограмма возраста

---

## 4. Время и сезонность

Создать дневные агрегаты:

- сумма показов/кликов/заказов по дням
- метрики:
  - `CTR_active = active_click_total / active_imp_total`
  - `CTR_passive = passive_click_total / passive_imp_total`
  - `CR_click2order = orders_amt_total / (active_click_total + passive_click_total)`
  - `CR_imp2order = orders_amt_total / (active_imp_total + passive_imp_total)`
- день недели: `day_of_week`

### Таблицы

1. `daily.describe()` по дневным агрегатам
2. Таблица по дням недели:
   - `day_of_week` → среднее `impressions, clicks, orders, CTR, CR`

### Графики

1. Линейные временные ряды:
   - `business_dt` vs total impressions
   - `business_dt` vs total clicks
   - `business_dt` vs total orders
2. Линии CTR/CR во времени (rolling mean 7 дней по желанию):
   - `active_ctr`, `passive_ctr`, `cr_click2order`
3. Сезонность по дням недели:
   - barplot для `active_ctr`, `passive_ctr`, `cr_click2order`
4. (Опционально) календарная heatmap заказов/CTR

---

## 5. Парные связи (bivariate)

### Таблицы

1. Корреляции Спирмена (на уровне клиента/дня):
   - между всеми числовыми признаками + `age`
2. Для каждой категории:
   - биннинг показов по квантилям → средний `imp, click, CTR, orders, CR`

### Графики

1. Scatter/hexbin «показы → клики»:
   - `active_imp_*` vs `active_click_*`
   - `passive_imp_*` vs `passive_click_*`
2. Scatter «клики → заказы»:
   - `*_click_*` vs `orders_amt_*`
3. CTR по бинам показов (линия/бар)
4. CR по бинам кликов (линия/бар)
5. Heatmap корреляций

---

## 6. Демография и устройство vs эффективность

Агрегировать по клиенту:

- суммы показов/кликов/заказов
- CTR/CR на уровне клиента
- добавить `gender_cd`, `age_group`, `device_platform_cd`

### Таблицы

1. По полу:
   - средние `impressions, clicks, orders, CTR, CR`
2. По возрастным группам:
   - те же метрики
3. По платформам:
   - те же метрики
4. Тесты гипотез (Mann–Whitney / t-test):
   - разница CTR/CR между группами

### Графики

1. Barplot CTR/CR по полу
2. Barplot CTR/CR по возрастным группам
3. Barplot CTR/CR по платформам
4. Boxplot заказов по возрастным группам
5. Stacked bar: возраст → доли категорий заказов (наполнение корзины сервисами)

---

## 7. Поведение по клиенту и сегментация

### 7.1. Простые сегменты

Флаги на уровне клиента:

- `has_active_comm`, `has_passive_comm`
- `has_any_order`
- `order_categories_count` (в скольких категориях есть заказ)

#### Таблицы

1. Сегменты каналов:
   - `only_active`, `only_passive`, `both`
   - доля клиентов, средние заказы, CTR/CR
2. Сегменты мультикатегорийности:
   - `1`, `2`, `3+` категорий заказов
   - средние коммуникации/заказы, демография

#### Графики

1. Barplot по сегментам каналов:
   - средние заказы, CTR/CR
2. Barplot по числу категорий заказов
3. Stacked bar: сегменты → пол/возраст (по желанию)

### 7.2. Кластеризация (расширенный EDA)

1. Вектор фичей:
   - суммы по категориям + CTR/CR + доли заказов
2. Нормализация
3. KMeans / GMM, 3–7 кластеров

#### Таблицы

- кластер → размер → средние фичи → краткая интерпретация

#### Графики

1. Профили кластеров (bar/radar)
2. Scatter PCA/UMAP: цвет = кластер

---

## 8. Воронка: показы → клики → заказы

### Таблицы

1. Общая воронка:
   - `channel_type`, `category`, `impressions`, `clicks`, `orders`, `CTR`, `CR_click2order`, `CR_imp2order`
2. Воронка по сегментам:
   - пол/возраст/платформа → те же метрики

### Графики

1. Funnel chart active vs passive (общий)
2. Barplot CTR по категориям + сравнение active/passive
3. Barplot CR по категориям + сравнение active/passive
4. Funnel/Bar по возрастным группам

---

## 9. Временные лаги между коммуникациями и заказами

С учётом «поздних покупок» (особенно travel).

### 9.1. Лаги на дневном уровне

#### Таблицы

1. Лаговые признаки `lag1..lag7` для показов/кликов
2. Кросс-корреляция:
   - lag → corr(orders*t, impressions*{t-lag})

#### Графики

1. Линия «lag vs корреляция» по:
   - `hotel`, `avia` (и др. при желании)
   - active vs passive

### 9.2. Лаги на клиентском уровне

#### Таблицы

1. `first_imp_date`, `first_click_date`, `first_order_date`
2. `days_to_order`
3. Квантили `days_to_order` по категориям

#### Графики

1. Гистограмма/ECDF `days_to_order` по категориям

---

## 10. Мультиканальность и «заспамленность»

### Таблицы

1. `contact_days`, `avg_impressions_per_contact_day`, `max_impressions_per_day`
2. Бины по `avg_impressions_per_contact_day` → средний CTR/CR

### Графики

1. Гистограмма `avg_impressions_per_contact_day`
2. Линия/бар: CTR/CR vs уровень спама

---

## 11. Простые модели как часть EDA

### 11.1. Бинарная модель «есть заказ / нет заказа»

Target:

- `has_any_order`

Features:

- суммы показов/кликов по типам и категориям
- CTR/CR
- демография и платформа

#### Таблицы

1. Логистическая регрессия:
   - коэффы, p-value, odds ratio
2. Feature importance из дерева/лесов

#### Графики

1. Barplot важностей
2. (Опционально) partial dependence для 2–3 ключевых фичей

---

## 12. Гипотезы и статтесты

### Примеры гипотез

1. `CTR_active > CTR_passive`
2. CR различается между категориями сервисов
3. CTR/CR различаются по полу/возрасту/платформе
4. «заспамленность» снижает CTR/CR после порога

### Таблица гипотез

- гипотеза, H0/H1, тест, p-value, вывод, бизнес-интерпретация

Графики для поддержки — использовать из разделов 4–10 (барчики/боксплоты).

---

## 13. Итоговая документация

1. Резюме выводов:
   - качество данных
   - эффективность каналов/категорий
   - сегменты, где коммуникации лучше/хуже работают
   - лаги (как быстро покупают после контактов)
   - признаки «усталости» от коммуникаций
2. Список проблем данных и принятых решений по чистке
3. Список инсайтов для бизнеса
4. Список фичей для будущих моделей
5. Следующие шаги:
   - подготовка ML-пайплайна
   - список A/B-гипотез
   - какие данные добрать (если нужно)

---
