Files
dano2025/preanalysis/task.md
2025-12-12 20:19:59 +03:00

369 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План полноценного преданализа датасета «Коммуникации в Городе»
Основано на описании датасета: есть ежедневные коммуникации с клиентами в экосистеме «Город Т-Банка», активные/пассивные каналы, показы/клики и заказы по категориям (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-гипотез
- какие данные добрать (если нужно)
---