Вопросы для собеседования аналитика данных
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании аналитика данных хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 167 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.
Что хотим услышать
- WHERE фильтрует строки до группировки, HAVING фильтрует группы после
- В WHERE нельзя агрегаты, в HAVING можно
- Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT
- Условия без агрегатов лучше писать в WHERE: меньше строк до группировки
- Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000
Если ответил, копните глубже
Расскажите, как работает groupby в pandas и какие у него есть режимы.
Что хотим услышать
- Схема split-apply-combine
aggсворачивает группу в одно значение, именованная агрегацияtransformвозвращает результат формы исходной таблицыfilterоставляет группы целиком по условию- Ключ уходит в индекс,
as_index=Falseилиreset_index - NaN в ключе по умолчанию выпадает
Если ответил, копните глубже
size отличается от count?apply не обойтись?Вам дали выгрузку чеков за месяц. Как вы опишете распределение, прежде чем делать выводы?
Что хотим услышать
- Объём данных, пропуски, явные ошибки
- Среднее и медиана вместе, их сравнение говорит о хвосте
- Разброс: std и IQR, квантили p5/p25/p75/p95/p99
- Гистограмма, лучше в логарифмической шкале для денег
- Выбросы: ошибка данных или реальные крупные клиенты
- Разрезы по сегментам, где распределение может отличаться
Если ответил, копните глубже
Объясните, как считать retention и какие бывают виды.
Что хотим услышать
- Когорты по моменту начала
- Классический N-day: активен ровно в день N
- Rolling: в день N или позже
- Bracket: активен в интервале
- Выбор по естественной частоте продукта
- Взвешенное среднее по когортам
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Расскажи, какие бывают JOIN и как каждый влияет на число строк в результате.
Что хотим услышать
- INNER: только пары, где условие ON истинно
- LEFT/RIGHT: все строки одной стороны, у недостающей стороны NULL
- FULL: все строки обеих сторон
- CROSS: декартово произведение, N × M строк
- Связь один ко многим размножает строки «одной» стороны, два таких JOIN перемножают
- Строки с NULL в ключе не соединяются: NULL = NULL не true
Если ответил, копните глубже
Какие проблемы вы проверяете сразу после чтения файла в pandas?
Что хотим услышать
shape,head,dtypes: правильно ли разобраны колонки- Числа и даты не стали строками:
sep,decimal,parse_dates - ID с ведущими нулями прочитаны строкой
- Пропуски:
isna().sum(), не съел ли парсер реальные значения вродеNA - Кодировка: нет ли кракозябр
- Дубликаты и неожиданные значения
Если ответил, копните глубже
Объясните продакт-менеджеру без формул, что такое p-value и как читать результат теста.
Что хотим услышать
- Предполагаем, что эффекта нет
- p-value: как часто случайность дала бы такую же или большую разницу
- Маленький p-value: случайностью объяснить трудно, отвергаем H0
- Не вероятность того, что гипотеза верна, и не размер эффекта
- Порог α выбран заранее, обычно 5%
- Большой p-value: эффект не доказан, а не доказано отсутствие
Если ответил, копните глубже
Какие метрики вовлечённости вы будете смотреть для приложения для фитнеса?
Что хотим услышать
- Определение активности через тренировку, а не открытие
- DAU, WAU, MAU и stickiness с учётом естественной частоты
- Частота: тренировок в неделю на активного
- Глубина: завершённые тренировки, длительность
- Распределение L28 или L7
- Связь с удержанием и подпиской
Если ответил, копните глубже
Какие у вас слабые стороны?
Что хотим услышать
- Назвал реальную слабость, а не штамп
- Слабость не критична для роли
- Рассказал, что делает, чтобы её компенсировать
- Есть пример прогресса
- Коротко, без самобичевания
Если ответил, копните глубже
Объясни проблему N+1: как она возникает, как её заметить и как исправить.
Что хотим услышать
- Один запрос за списком и по запросу на каждый элемент за связанными данными
- Типично возникает из-за ленивой загрузки в ORM в цикле
- Заметить: число запросов растёт с размером списка, логи SQL, APM, счётчик запросов в тестах
- Исправить: JOIN, запрос по списку id (IN или ANY), eager loading, DataLoader в GraphQL
- Следить, чтобы JOIN не размножил строки и не тянул лишнее
Если ответил, копните глубже
Расскажите, какими способами в pandas меняют форму таблицы и когда какой выбрать.
Что хотим услышать
- Длинный формат против широкого
pivotбез агрегации и его ошибка на дубляхpivot_tableсaggfunc,fill_value,marginsmeltдля колонок-месяцевstack/unstackдля MultiIndex после groupbycrosstabдля частот двух признаков
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Спроектируй схему базы для заказов интернет-магазина: клиенты, товары, заказы, оплаты. Какие таблицы, ключи и ограничения?
Что хотим услышать
- Таблицы customers, products, orders, order_items, payments и их связи
- order_items как связь заказа и товара с qty и ценой на момент покупки
- Ограничения: FK, NOT NULL, CHECK (qty > 0), UNIQUE там, где нужно
- Типы: numeric или копейки для денег, timestamptz для времени, статус через CHECK или enum
- Индексы на FK и под частые запросы (заказы клиента по дате)
- Платежи отдельной таблицей с идемпотентным внешним id от платёжки
Если ответил, копните глубже
Вам выгрузили CSV из CRM. Опишите по шагам, как вы приведёте его в порядок перед анализом.
Что хотим услышать
- Разведка: shape, info, head, describe, доля пропусков по колонкам
- Типы: даты через to_datetime, числа через to_numeric с coerce, категории
- Строки: strip, регистр, единый формат, лишние символы
- Дубли: полные и по ключу, правило какую запись оставить
- Пропуски: природа и стратегия, флаг пропуска
- Проверки: диапазоны, уникальность ключа, сверка сумм с источником
Если ответил, копните глубже
Нам нужно протестировать новую кнопку оплаты в одном клике. Как спроектируете тест?
Что хотим услышать
- Гипотеза с механизмом и ожидаемым эффектом
- Целевая метрика (конверсия в оплату), прокси и guardrail (ошибки оплаты, возвраты, скорость)
- Единица рандомизации: пользователь; анализ по дошедшим до оплаты
- MDE, альфа, мощность: размер выборки и длительность целыми неделями
- Проверки: A/A, SRM, критерий решения заранее
- Что делаем при каждом исходе
Если ответил, копните глубже
Спроектируйте дашборд для продакта мобильного приложения доставки.
Что хотим услышать
- Аудитория и вопрос: как чувствует себя продукт сегодня и за неделю
- Верхний ряд: North Star и 3-4 ключевые метрики со сравнением
- Воронка заказа по шагам
- Retention и новые пользователи
- Срезы: платформа, город, канал
- Определения, источники, алерты
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.
Что хотим услышать
- Низкая селективность: нужна большая доля строк, seq scan дешевле
- Функция или приведение типа над колонкой: нужен индекс по выражению или переписать условие
- Условие не по ведущей колонке составного индекса
- Устаревшая статистика: оценки rows не совпадают с фактом, помогает ANALYZE
- Маленькая таблица, LIKE с % в начале, OR по разным колонкам
- Проверка: EXPLAIN (ANALYZE, BUFFERS), сравнить оценки с фактом
Если ответил, копните глубже
Как посчитать DAU и WAU по московскому времени, если события лежат в UTC? Какие ловушки?
Что хотим услышать
to_datetime(..., utc=True)иtz_convert("Europe/Moscow")до взятия даты- День:
dt.normalize()илиdt.dateпосле конвертации nuniqueпользователей, а не число событийresampleили полная сетка дат, чтобы пустые дни были видны- WAU не равен сумме DAU, считать уникальных за неделю
- Неделя с понедельника:
to_period("W")
Если ответил, копните глубже
Менеджер спрашивает: «Почему нельзя остановить тест, как только он стал значимым? Это же экономит время». Объясните.
Что хотим услышать
- 5% ошибки гарантированы только для одной проверки в конце
- Каждая промежуточная проверка даёт ещё шанс случайно пересечь порог
- При ежедневных проверках ложных побед в разы больше
- Ранние дни не покрывают недельную сезонность и новизну
- Если досрочная остановка нужна, её закладывают в дизайн: последовательные тесты
- Промежуточно можно смотреть guardrail и SRM
Если ответил, копните глубже
Число оплаченных заказов за неделю упало на 15%. Опишите свои шаги.
Что хотим услышать
- Проверка данных: трекинг, расчёт, сверка с биллингом
- Форма и момент, сравнение с обычным разбросом и прошлым годом
- Внешние причины: сезон, праздники, конкуренты, платёжные сбои
- Внутренние: релизы, эксперименты, цены, маркетинг
- Декомпозиция и срезы: платформа, версия, регион, канал, новые и старые
- Гипотеза, проверка, исправление, коммуникация, алерт
Если ответил, копните глубже
Почему вы считаете себя middle-разработчиком?
Что хотим услышать
- Показал самостоятельность: вёл задачу сам от требований до прода
- Привёл пример фичи, которую довёл целиком
- Упомянул работу с неясными требованиями
- Есть результат с цифрой
- Не завысил и не принизил себя
Если ответил, копните глубже
Когда ты выберешь NoSQL вместо PostgreSQL? Приведи примеры задач.
Что хотим услышать
- Выбор от модели доступа, объёма, консистентности и опыта команды, а не от моды
- PostgreSQL по умолчанию: транзакции, JOIN, ограничения, jsonb
- Redis: кеш, сессии, счётчики, rate limiting
- Cassandra: огромный поток записи с запросами по ключу партиции
- ClickHouse: аналитика, Elasticsearch: полнотекстовый поиск
- Цена NoSQL: денормализация, слабее консистентность, сложно менять запросы
Если ответил, копните глубже
Вам дали CSV на 40 ГБ, а на ноутбуке 16 ГБ памяти. Как посчитаете нужные метрики?
Что хотим услышать
- Сначала посмотреть заголовок и пару тысяч строк:
nrows usecolsи экономныеdtype(category,int32,float32)chunksizeдля складываемых агрегатов- Медиана и уникальные по кускам не складываются: нужны другие подходы
- Конвертировать в Parquet один раз
- DuckDB или Polars для запросов прямо по файлу
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Что хотим услышать
UPDATEсоздаёт новую версию строки, старая остаётся сxmax;DELETEтолько помечает версию- Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
- VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
- Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
- Autovacuum настраивают по таблицам:
autovacuum_vacuum_scale_factor, лимиты стоимости; мониторинг черезpg_stat_user_tables - HOT-обновления и
fillfactorуменьшают нагрузку на индексы
Если ответил, копните глубже
VACUUM FULL отличается от обычного?Что изменилось в pandas 3.0 и на что это влияет в существующем коде?
Что хотим услышать
- Copy-on-Write по умолчанию: результат индексации ведёт себя как копия
- Цепочное присваивание
df["a"][0] = 1больше не меняет df - SettingWithCopyWarning ушёл вместе со старой моделью
- Строки по умолчанию получают dtype
strвместоobject - Проверки
dtype == objectв коде надо пересмотреть - Перед обновлением прогнать тесты на 2.x с включёнными опциями будущего поведения
Если ответил, копните глубже
Как вы поступаете с выбросами в данных при анализе и в A/B-тестах?
Что хотим услышать
- Сначала понять природу: ошибка, бот, тест или реальный крупный клиент
- Ошибки и ботов исправить или исключить по правилу, записанному заранее
- Реальные значения не удалять: они часть бизнеса
- Для тестов: винзоризация или устойчивые метрики, правило до запуска
- Проверить чувствительность вывода: с выбросами и без
- Одинаковая обработка во всех группах
Если ответил, копните глубже
Директор по маркетингу хочет урезать соцсети, потому что в отчёте по last click у них худший CPA. Что вы скажете?
Что хотим услышать
- Last click недооценивает каналы знакомства
- Посмотреть пути и другие модели: first click, position-based
- Учесть качество клиентов: LTV по каналам
- Проверить инкрементальность экспериментом
- Предложить постепенное изменение с контролем
- Решение по приросту выручки, а не по отчёту
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
На проде в логах появились ошибки deadlock detected. Как вы будете разбираться и что сделаете, чтобы они ушли?
Что хотим услышать
- Deadlock это цикл ожидания: транзакции держат блокировки и ждут друг друга
- PostgreSQL проверяет цикл после
deadlock_timeout(1 с по умолчанию) и откатывает одну из транзакций с ошибкой 40P01 - В логе есть оба запроса и тип блокировок; включаю
log_lock_waitsдля долгих ожиданий - Главное лечение: единый порядок взятия блокировок, короткие транзакции, блокировка заранее через
SELECT ... FOR UPDATEв порядке ключа - Приложение должно уметь повторять транзакцию при 40P01 и 40001
Если ответил, копните глубже
FOR UPDATE отличается от FOR NO KEY UPDATE?lock_timeout?Вам дали новый датасет заказов. Какие графики построите в первые полчаса и что будете в них искать?
Что хотим услышать
- Динамика числа заказов и выручки по дням: провалы, всплески, неполные периоды
- Распределения ключевых чисел, часто в логарифме: хвосты, выбросы, нули
- Доли пропусков по колонкам
- Сравнение сегментов: boxplot или ECDF
- Связи: scatter или heatmap корреляций
- Проверка гипотез о качестве данных, а не красивые картинки
Если ответил, копните глубже
Как вы выбираете α и мощность для теста? Какая ошибка дороже в продукте?
Что хотим услышать
- α и мощность задают цену ложного срабатывания и пропуска
- Стандарт 5% и 80% не догма
- Рискованное изменение (цены, платёжный поток): строже α, жёсткие guardrail
- Дешёвые обратимые изменения: можно мягче α ради скорости
- Пропуск эффекта дорог, если трафика мало и тестов мало
- Решение фиксируется до теста
Если ответил, копните глубже
Конверсия из корзины в оплату упала с 30% до 24% за неделю. Как будете разбираться по воронке?
Что хотим услышать
- Проверить данные и разметку событий
- Найти шаг между корзиной и оплатой, где выросли потери
- Срезы: платформа, версия, способ оплаты, регион, новые и старые
- Сопоставить с релизами, сбоями провайдера, изменениями цен и доставки
- Проверить окно конверсии и микс трафика
- Подтвердить гипотезу и исправить, поставить алерт
Если ответил, копните глубже
Чем, по-вашему, резюме senior должно отличаться от резюме middle?
Что хотим услышать
- Акцент на масштаб и влияние, а не на список фич
- Метрики бизнес-эффекта
- Лидерство: менторинг, процессы, архитектурные решения
- Компактность: старый опыт свёрнут
- Понимание, что резюме под роль, а не под всё сразу
Если ответил, копните глубже
Как выбрать порядок колонок в составном индексе? Разбери на примере WHERE tenantid = ? AND status = ? AND createdat ? ORDER BY createdat.
Что хотим услышать
- Индекс работает по левому префиксу: ведущие колонки должны быть в условии
- Сначала колонки с равенством, затем одна колонка с диапазоном или сортировкой
- После колонки с диапазоном следующие колонки для поиска уже не помогают
- Для примера: (tenant_id, status, created_at) закрывает и фильтр, и ORDER BY
- Учитывать, какие ещё запросы обслужит индекс, чтобы не плодить похожие
- Проверять на реальных данных через EXPLAIN ANALYZE
Если ответил, копните глубже
Почему нельзя просто заполнить пропуски средним? Как тип пропусков влияет на выбор стратегии?
Что хотим услышать
- Три типа: MCAR (полностью случайные), MAR (зависят от наблюдаемых признаков), MNAR (зависят от самого значения)
- Среднее сжимает дисперсию и рвёт связи между признаками
- При MNAR любое заполнение смещает выводы: например, богатые не указывают доход
- Варианты: заполнение по группе, модельное (KNN, итеративное), флаг пропуска
- Статистики считать на train, без утечки
- Проверить чувствительность выводов к способу заполнения
Если ответил, копните глубже
Задача для live coding
Доля отменённых заказов в процентах
Для каждого клиента, у которого есть заказы, посчитай долю отменённых заказов в процентах, округлив до одного знака после запятой. Гостевые заказы не учитывай.
Колонки: customer_id, cancel_pct. Порядок строк не важен.
- Подсказка, если застрял: Что вернёт
1 / 3в PostgreSQL? - Подсказка, если застрял: Условный подсчёт:
COUNT(*) FILTER (WHERE ...).
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: Аналитик данных