This commit is contained in:
2025-12-16 01:51:05 +03:00
parent a1bc89c481
commit c963b1e5ac
123 changed files with 5644 additions and 3802 deletions

View File

@@ -0,0 +1,368 @@
# План полноценного преданализа датасета «Коммуникации в Городе»
Основано на описании датасета: есть ежедневные коммуникации с клиентами в экосистеме «Город Т-Банка», активные/пассивные каналы, показы/клики и заказы по категориям (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`, `2534`, `3544`, `4554`, `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. Тесты гипотез (MannWhitney / 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, 37 кластеров
#### Таблицы
- кластер → размер → средние фичи → краткая интерпретация
#### Графики
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 для 23 ключевых фичей
---
## 12. Гипотезы и статтесты
### Примеры гипотез
1. `CTR_active > CTR_passive`
2. CR различается между категориями сервисов
3. CTR/CR различаются по полу/возрасту/платформе
4. «заспамленность» снижает CTR/CR после порога
### Таблица гипотез
- гипотеза, H0/H1, тест, p-value, вывод, бизнес-интерпретация
Графики для поддержки — использовать из разделов 410 (барчики/боксплоты).
---
## 13. Итоговая документация
1. Резюме выводов:
- качество данных
- эффективность каналов/категорий
- сегменты, где коммуникации лучше/хуже работают
- лаги (как быстро покупают после контактов)
- признаки «усталости» от коммуникаций
2. Список проблем данных и принятых решений по чистке
3. Список инсайтов для бизнеса
4. Список фичей для будущих моделей
5. Следующие шаги:
- подготовка ML-пайплайна
- список A/B-гипотез
- какие данные добрать (если нужно)
---