**Компания:** Сбер
**Данные:** DataFrame `visits`:
| Столбец | Тип | Описание |
|---------|-----|----------|
| visitor_id | str | ID посетителя |
| source | str | Источник: organic, cpc, email, direct, social |
| visit_date | date | Дата визита |
| has_transaction | bool | Была ли транзакция |
**Задание:**
1. Постройте цепочки источников для каждого посетителя (path to conversion)
2. Найдите топ-5 цепочек, приводящих к транзакции
3. Сравните first-touch и last-touch атрибуцию
Структура для ориентира — реальные значения из эталонного решения.
import pandas as pd
# Сортировка по посетителю и дате
visits = visits.sort_values(['visitor_id', 'visit_date'])
# 1. Построение цепочек
def build_paths(df):
paths = []
for visitor_id, group in df.groupby('visitor_id'):
sources = group['source'].tolist()
transactions = group['has_transaction'].tolist()
current_path = []
for source, has_tx in zip(sources, transactions):
current_path.append(source)
if has_tx:
paths.append({
'visitor_id': visitor_id,
'path': ' → '.join(current_path),
'path_length': len(current_path),
'first_touch': current_path[0],
'last_touch': current_path[-1],
})
current_path = [] # Начинаем новую цепочку
return pd.DataFrame(paths)
conversion_paths = build_paths(visits)
# 2. Топ-5 цепочек
top_paths = (
conversion_paths
.groupby('path')
.size()
.reset_index(name='conversions')
.sort_values('conversions', ascending=False)
.head(5)
)
print("Топ-5 цепочек конверсии:")
print(top_paths)
# 3. First-touch vs Last-touch атрибуция
first_touch = (
conversion_paths
.groupby('first_touch')
.size()
.reset_index(name='ft_conversions')
.sort_values('ft_conversions', ascending=False)
)
last_touch = (
conversion_paths
.groupby('last_touch')
.size()
.reset_index(name='lt_conversions')
.sort_values('lt_conversions', ascending=False)
)
comparison = (
first_touch
.merge(last_touch,
left_on='first_touch',
right_on='last_touch',
how='outer')
.fillna(0)
)
comparison['source'] = comparison['first_touch'].fillna(comparison['last_touch'])
comparison = comparison[['source', 'ft_conversions', 'lt_conversions']]
print("\nСравнение атрибуции:")
print(comparison)
атрибуция pandas маркетинг воронка
Это задание для уровня Senior. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.
Подобные задания в категории «Python» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: атрибуция, pandas, маркетинг, воронка.
На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть 482 Python задачи с проверкой через Pyodide, конспекты Python и pandas, AI мок-собеседование с разбором ваших ответов.
← Все задания