Вопросы на собеседовании: Аналитик данных
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Middle.
Смотреть пример резюме: Аналитик данных →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Эти три функции по-разному назначают позиции при совпадении значений.
- ROW_NUMBER присваивает каждой строке уникальный порядковый номер, даже при совпадении значений.
- RANK присваивает совпавшим строкам один номер и пропускает следующие позиции.
- DENSE_RANK присваивает совпавшим строкам один номер, не оставляя пропусков.
- Для дедупликации до одной строки используйте ROW_NUMBER, а в топ-N запросах осознанно выбирайте нужную логику ранжирования.
Зачем это спрашивают: Интервьюер проверяет, ловил ли кандидат реальные баги с обработкой одинаковых значений в продакшн-запросах, а не заучил определения из учебника.
Для дедупликации я ранжирую записи каждого пользователя от самой новой к самой старой.
- Считаю ROW_NUMBER с PARTITION BY user_id и ORDER BY updated_at DESC.
- Фильтрую результат по rn = 1, чтобы оставить одну полную строку на пользователя.
- После updated_at добавляю стабильный тайбрейкер, например первичный ключ.
- Не использую GROUP BY с MAX, если нужны колонки именно из той же последней записи.
Зачем это спрашивают: Сильный ответ включает деталь про тайбрейкер, которая отличает тех, кто отлаживал нестабильную дедупликацию, от тех, кто просто видел паттерн.
Надёжный расчёт скользящего среднего за 7 дней начинается с полного дневного ряда.
- Сначала агрегирую выручку ровно до одной строки на календарный день.
- Применяю AVG с рамкой ROWS BETWEEN 6 PRECEDING AND CURRENT ROW.
- Джойню календарный ряд дат, чтобы дни без заказов тоже присутствовали.
- Заполняю пропущенную дневную выручку нулём, если отсутствие заказов действительно означает нулевую выручку.
Зачем это спрашивают: Деталь про календарную таблицу и есть настоящая проверка, потому что скользящие метрики по данным с пропусками регулярно дают незаметно неверные дашборды.
Я выбираю между этими вариантами с учётом читаемости, переиспользования и необходимости материализации.
- CTE использую для именования этапов трансформации и читаемого аналитического SQL.
- Подзапрос подходит для небольшой встроенной подстановки или одной простой вложенной операции.
- Временная таблица нужна, когда несколько следующих запросов переиспользуют дорогой промежуточный результат.
- Проверяю поведение движка, потому что некоторые хранилища пересчитывают CTE при каждом обращении вместо материализации.
Зачем это спрашивают: Интервьюер хочет услышать рассуждение про материализацию и переиспользование, а не просто стилистическое предпочтение CTE.
Фильтр по правой таблице в WHERE чаще всего и заставляет LEFT JOIN терять строки без совпадений.
- После джойна колонки правой таблицы у строк без совпадения равны NULL.
- Условие вроде WHERE orders.status = 'paid' отбрасывает такие строки с NULL.
- Поэтому оставшийся результат фактически ведёт себя как INNER JOIN.
- Если строки из левой таблицы нужно сохранить, перенесите условие по правой таблице в ON.
Зачем это спрашивают: Это лакмусовая бумажка реального опыта отладки: почти каждый аналитик хоть раз выкатывал этот баг, и сильный кандидат называет его мгновенно.
Точный подсчёт уникальных значений дорог, потому что движку приходится отслеживать каждое из них.
- На больших таблицах операция требует много памяти, хеширования или сортировки.
- Приближённые функции и скетчи HyperLogLog дают погрешность около 1-2 процентов при значительно меньших затратах на вычисления.
- Если отчёт требует точности, регулярно используемые метрики с подсчётом уникальных значений стоит предагрегировать в сводные таблицы.
- Метод нужно выбирать по требованиям к точности, а не по умолчанию брать самый дорогой вариант.
Зачем это спрашивают: Интервьюер смотрит на понимание модели стоимости аналитических баз и привычку к предагрегации, а не просто на знание волшебной функции.
Даты первого и последнего заказа можно посчитать одним запросом с группировкой.
- Группирую по user_id и считаю MIN(order_date) и MAX(order_date).
- К двум полученным значениям применяю функцию разницы дат из используемой СУБД.
- Если нужны атрибуты крайних заказов, использую FIRST_VALUE или LAST_VALUE.
- Для LAST_VALUE задаю рамку до UNBOUNDED FOLLOWING, иначе функция по умолчанию вернёт текущую строку.
Зачем это спрашивают: Упоминание подвоха с рамкой LAST_VALUE сигнализирует о живом опыте с оконными функциями, а не о скопированных сниппетах.
LAG и LEAD дают доступ к соседним строкам без self-join.
- LAG читает предыдущую строку, а LEAD следующую строку внутри выбранного окна.
- LAG(revenue) по месяцам ставит выручку прошлого месяца рядом с текущим значением.
- Тогда рост месяц к месяцу равен разнице текущего и прошлого значений, делённой на прошлое.
- LAG по таймстемпам событий также подходит для анализа пауз между действиями, сессий и оттока.
Зачем это спрашивают: Хороший ответ привязывает функцию к бизнес-расчёту, а не пересказывает синтаксис.
При замедлении запроса я отдельно проверяю изменения в данных, плане выполнения и состоянии хранилища.
- Сравниваю объёмы строк, новые партиции и недавние бэкфиллы с последним нормальным запуском.
- В плане выполнения ищу пропавшее отсечение партиций, полные сканы и смену порядка джойнов.
- Проверяю, не стал ли джойн many-to-many и не вызвал ли сильное размножение строк.
- Прежде чем винить SQL, проверяю очередь запросов и размер вычислительных ресурсов.
Зачем это спрашивают: Интервьюер оценивает структурный метод, разделяющий изменения данных, плана и инфраструктуры, вместо хаотичного переписывания запроса.
В SQL я отношусь к NULL как к неизвестному значению, а не как к обычному сравнимому значению.
- Предпочитаю NOT EXISTS, потому что NOT IN может не вернуть ни одной строки, если подзапрос содержит NULL.
- Помню, что COUNT по колонке и большинство агрегатов пропускают NULL, а подсчёт всех строк учитывает такие строки.
- Использую COALESCE только там, где бизнес-смысл подстановочного значения явно определён.
- Проверяю долю NULL и применяю IS DISTINCT FROM для NULL-безопасных сравнений там, где он поддерживается.
Зачем это спрашивают: Сильные кандидаты называют именно связку NOT IN и NULL, потому что из всех этих багов она самая разрушительная и наименее заметная.
Для сравнения каждой строки со средним по группе обычно нужна оконная функция.
- AVG(order_value) OVER (PARTITION BY customer_id) сохраняет исходную гранулярность строк.
- Отклонение можно посчитать сразу рядом с каждым заказом.
- Self-join с предагрегацией добавляет код и ещё одну возможность ошибиться в ключах джойна.
- Джойн оправдан только при слабой поддержке окон или когда агрегат строится по другому отфильтрованному набору строк.
Зачем это спрашивают: Вопрос проверяет, стали ли окна для кандидата инструментом по умолчанию для сравнений строки с группой.
WHERE фильтрует исходные строки, а HAVING фильтрует группы после агрегации.
- Неагрегатные условия помещаю в WHERE, чтобы лишние строки отбрасывались раньше.
- HAVING использую для условий вроде SUM(amount) > 1000.
- Обычное условие на строку в HAVING может сработать, но заставит движок делать лишнюю агрегацию.
- Для каждого условия определяю, зависит ли оно от результата агрегатной функции.
Зачем это спрашивают: Интервьюер ищет интуицию о производительности за правилом, а не только учебниковое различие.
Сессионизация сводится к поиску разрывов и последующему накопительному подсчёту.
- Через LAG получаю таймстемп предыдущего события каждого пользователя.
- Помечаю новую сессию, если прошлого события нет или разрыв превышает 30 минут.
- Считаю нарастающую SUM флага по пользователю и получаю номера сессий.
- Если таймстемпы могут совпадать, добавляю детерминированный тайбрейкер событий.
Зачем это спрашивают: Сессионизация относится к стандартным паттернам middle-уровня, и свободное описание трюка с флагом и нарастающей суммой выдаёт реальный опыт с событийными данными.
Перцентили описывают скошенные распределения лучше, чем одно среднее.
- Для точной непрерывной медианы использую PERCENTILE_CONT(0.5) там, где функция поддерживается.
- Для очень больших данных в хранилище при необходимости использую приближённую функцию квантилей.
- Тяжёлые хвосты в распределениях выручки и времени отклика могут сильно отдалять среднее от типичного наблюдения.
- Показываю медиану вместе с хвостовой метрикой вроде p90, чтобы отразить типичные значения и хвост распределения.
Зачем это спрашивают: Интервьюеру нужно статистическое рассуждение о скошенности, а не название функции.
По умолчанию я использую UNION ALL, если дедупликация не является явным требованием.
- UNION ALL просто добавляет наборы строк и не ищет дубли в общем результате.
- UNION добавляет глобальную сортировку или хеширование, что дорого на широких данных.
- Автоматическая дедупликация может скрыть дубли, которые на самом деле нужно расследовать.
- UNION стоит брать только после определения колонок, по которым две строки результата считаются дублями.
Зачем это спрашивают: Осознанный дефолт UNION ALL с озвученной причиной выдаёт человека, который думает и о стоимости, и о незаметной потере данных.
Условная агрегация является переносимым способом развернуть известные значения в колонки средствами SQL.
- Группирую по измерению, которое должно остаться в строках.
- Каждую выходную колонку строю через SUM и условие CASE для нужного месяца.
- Нативный PIVOT короче, но обычно тоже требует заранее перечислить значения колонок.
- По-настоящему динамические колонки оставляю BI-слою, а не генерирую нестабильный SQL.
Зачем это спрашивают: Вынос динамического пивота в презентационный слой демонстрирует архитектурное чутьё, которое на этом уровне важнее синтаксиса.
Рекурсивные CTE полезны, когда число шагов обхода заранее неизвестно.
- Использую их для обхода иерархий parent-child, например оргструктур и деревьев категорий.
- На движках без функций-генераторов ими также можно создавать последовательности дат или чисел.
- Свёртка затрат по таблице связанных подразделений с разной глубиной веток является практическим примером.
- Добавляю предел глубины или проверку циклов, чтобы некорректные связи не зациклили запрос.
Зачем это спрашивают: Упоминание защиты от циклов показывает, что кандидат гонял рекурсию на грязных реальных данных, а не на чистых примерах.
Партиционирование и кластеризация важны, потому что форма запроса определяет объём сканируемых данных.
- Фильтрую напрямую по колонке партиции, чтобы движок пропускал ненужные партиции.
- Не оборачиваю эту колонку в преобразования, которые могут отключить отсечение партиций.
- Фильтры и джойны по колонкам кластеризации сокращают сканирование внутри партиции.
- Перед дорогим запросом к хранилищу проверяю определение таблицы.
Зачем это спрашивают: Интервьюер проверяет осознание стоимости: аналитики, игнорирующие отсечение партиций, жгут реальные деньги в современных хранилищах.
p-value показывает, насколько необычен наблюдаемый результат при предположении об отсутствии эффекта.
- Сначала предполагаем, что тестируемое изменение не даёт реального эффекта.
- Представляем повторение эксперимента и выборочную вариативность при этом предположении.
- p-value равен вероятности получить результат не менее экстремальный, чем наблюдаемый.
- Это не вероятность того, что изменение сработало или что нулевая гипотеза верна.
Зачем это спрашивают: Интервьюер проверяет и корректное понимание, и умение перевести его без классической ошибки инверсии.
Доверительный интервал показывает выборочную неопределённость вокруг оценки.
- Процедура для 95-процентного интервала накрывает истинное значение примерно в 95 процентах повторных выборок.
- Оценку прироста показываю вместе с нижней и верхней границами.
- Интервал от -1 до +7 ведёт к другим решениям, чем интервал от +2 до +4.
- Сравниваю правдоподобный диапазон с важными для бизнеса выгодами и потерями, а не только с нулём.
Зачем это спрашивают: Использование интервала для оформления бизнес-решения, а не пересказ определения, и отличает работающего аналитика.
Закрытые вопросы
- 21
Опишите ошибки первого и второго рода и приведите бизнес-кейс, где одна явно хуже другой.
hypothesis-testingbudget - 22
Приведите пример, где корреляция ввела команду в заблуждение, и как бы вы проверили причинность связи.
causalcorrelation - 23
Что определяет нужный размер выборки для теста и какой рычаг команды чаще всего игнорируют?
sampling - 24
Когда вы используете t-тест, а когда непараметрический тест вроде Манна-Уитни?
hypothesis-testing - 25
Что такое парадокс Симпсона и как вы защищаетесь от него в повседневном анализе?
paradoxes - 26
Как вы выявляете и обрабатываете конфаундеры в наблюдательном анализе?
causal - 27
После эксперимента вы проверили 20 метрик, и одна значима на уровне 0.05. В чём проблема и что вы делаете?
experimentsmonitoring - 28
Объясните разницу между стандартным отклонением и стандартной ошибкой и почему различие важно в отчётах.
dispersioninferencedistinct - 29
Как вы решаете, убирать ли выброс из анализа?
outliers - 30
Почему центральная предельная теорема важна для A/B-тестов на скошенных метриках вроде выручки на пользователя?
distributionscltmonitoring - 31
Спроектируйте A/B-тест редизайна страницы чекаута с нуля. Что вы фиксируете до запуска?
ab-testingdesign - 32
PM спрашивает, сколько должен идти его тест. Какие входные данные вы запрашиваете и как отвечаете?
- 33
Почему ежедневная проверка результатов теста с остановкой при появлении значимости считается проблемой?
- 34
Тест закончился с приростом +2 процента, но p = 0.2. PM спрашивает, катить ли. Что вы отвечаете?
- 35
Как вы выбираете единицу рандомизации для эксперимента и что ломается при неверном выборе?
experiments - 36
Что такое A/A-тест и когда вы реально его запускаете?
- 37
Чем коварны метрики-отношения вроде CTR в A/B-тестах?
ab-testingmonitoringtesting - 38
Как эффекты новизны и первичности искажают результаты экспериментов и как вы их учитываете?
experiments - 39
Что такое sample ratio mismatch и почему он должен намертво останавливать анализ?
srm - 40
Общий результат теста нулевой, но один сегмент показывает сильную победу. Как вы это интерпретируете?
- 41
Чем ваш дизайн дашборда для руководителей отличается от дизайна для операционной команды?
design - 42
Extract или live-подключение в Tableau, import или DirectQuery в Power BI: как выбираете?
bi - 43
Стейкхолдер жалуется, что дашборд грузится минуту. Как вы атакуете проблему?
stakeholder-managementcommunication - 44
Как вы выбираете тип графика и когда правильный ответ выглядит как обычная таблица?
chart-choice - 45
Вы обнаружили, что у поддерживаемого вами дашборда два месяца нет ни одного просмотра. Что делаете?
- 46
Зачем централизовать определения метрик в семантическом слое, вместо того чтобы каждый дашборд считал свои?
semantic-layermonitoring - 47
Как вы работаете с часовыми поясами в отчётности и где прячутся классические баги?
soft-skills - 48
Когда вы заменяете статичный отчёт автоматическими алертами и как избегаете усталости от оповещений?
alerting - 49
Объясните схему звезда и почему аналитику важно различать факты и измерения.
schemamodeling - 50
Что такое медленно меняющиеся измерения типа 1 и типа 2 и когда разница кусает аналитика?
scd - 51
Какие проблемы решает dbt для аналитической команды по сравнению с папкой SQL-скриптов на расписании?
sqldbt - 52
Инкрементальные модели или полное перестроение: как выбираете и где ломается инкрементальная логика?
- 53
Что реально изменилось при переходе от ETL к ELT и почему это важно для аналитиков?
etl - 54
Какие тесты данных вы повесили бы на таблицу выручки, прежде чем позволить дашбордам от неё зависеть?
testing - 55
Что означает грануляция таблицы и почему вы определяете её до написания любого запроса?
queries - 56
Почему пайплайн данных должен быть идемпотентным и как на практике сделать идемпотентной дневную загрузку?
pipelinesidempotencyci-cd - 57
Ваш дневной отчёт фиксирует числа в 6 утра, но часть событий приходит с опозданием на часы или дни. Как вы это решаете?
soft-skills - 58
Когда вы предпочитаете денормализованную широкую таблицу нормализованной модели для аналитики?
normalizationdenormalization - 59
Проведите меня через построение когортного анализа удержания. Какие решения формируют результат?
retentioncohorts - 60
Как вы определяете шаги воронки и что делаете с пользователями, перепрыгивающими шаги?
funnel - 61
Кривая удержания одного продукта выходит на полку в 25 процентов, другого стабильно падает к нулю. Какие выводы?
retention - 62
Как вы выбираете переменные сегментации, чтобы сегменты были реально actionable?
- 63
Объясните RFM-сегментацию и когда она уместна.
- 64
Свежие когорты регистраций удерживаются заметно хуже старых. Как расследуете?
cohorts - 65
Как выбор окна конверсии меняет числа воронки и как вы его подбираете?
funnel - 66
Поведенческая кластеризация вроде k-means против сегментов на правилах: когда что?
clustering - 67
Стейкхолдер говорит: продажи упали, посмотри, что там. Что вы делаете до написания первого SQL?
stakeholder-managementsqlcommunication - 68
Что делает определение метрики достаточно полным, чтобы реализовать его без уточняющих вопросов?
monitoring - 69
Объясните связь между north star метрикой и метриками-гардрейлами.
north-starguardrailsmonitoring - 70
Две команды репортят разное число активных пользователей, и обе настаивают на своей правоте. Как разруливаете?
- 71
Стейкхолдер просит данные под решение, которое он уже явно принял. Как вы действуете?
soft-skillscommunicationstakeholder-management - 72
Как вы приоритизируете, когда ad-hoc запросы постоянно прерывают долгосрочные аналитические проекты?
prioritization - 73
Как вы структурируете презентацию находок для руководителей?
- 74
Когда вы говорите стейкхолдеру, что данные не могут ответить на его вопрос, и что предлагаете взамен?
stakeholder-managementcommunication - 75
Merge в pandas молча умножил число строк. Что произошло и как это предотвращать?
pandas - 76
Когда в pandas groupby вы используете transform вместо agg?
pandas - 77
Вам прислали CSV на 30 ГБ, а в машине 16 ГБ оперативки. Какие у вас варианты?
- 78
Что означает SettingWithCopyWarning и как писать pandas-код, который его избегает?
pandas - 79
Почему df.apply с построчной лямбдой медленный и что вы делаете вместо него?
lambda - 80
Как вы агрегируете событийные данные в недельные ряды в pandas и что при этом тихо ломается?
aggregationpandas - 81
Когда вы используете pd.concat, а когда merge, и какая самая частая ошибка с concat?
ownershippandas - 82
Как устроен ваш процесс решения по пропущенным значениям в аналитическом датасете?
missing-dataconcurrency - 83
Ваш ноутбук с анализом должен перезапустить коллега через полгода. Что вы делаете иначе, чем в одноразовом ноутбуке?
- 84
Одна и та же метрика в pandas и в SQL даёт разные результаты на одних исходных данных. Куда смотрите?
sqlmonitoringpandas - 85
Ваш дашборд показывает месячную выручку на 8 процентов ниже, чем репортят финансы. Как реконсилируете системно?
system-design - 86
Вчерашняя выручка в дашборде за ночь просела на 30 процентов. Ваши первые три проверки?
- 87
Как вы обнаруживаете и лечите дублирующиеся события, раздувающие продуктовые метрики?
monitoring - 88
Изменение трекинга посреди квартала переопределило ключевое событие и сломало непрерывность метрики. Как сохранить доверие к тренду?
monitoring - 89
Google Analytics показывает на 20 процентов больше покупок, чем ваша бэкенд-база. Какому числу доверяете и почему?
database - 90
Какие симптомы заставляют вас заподозрить баг с часовым поясом в отчёте и как вы его подтверждаете?
- 91
Что бы вы мониторили проактивно, чтобы ловить проблемы качества данных раньше стейкхолдеров?
qualitymonitoringcommunication - 92
Как вы держите команду в курсе известных оговорок по данным, например двухнедельного сбоя трекинга в прошлом году?
- 93
Вы обнаружили ошибку в анализе, который презентовали месяц назад, и по нему уже приняли решение. Что делаете?
- 94
Расскажите о случае, когда ваш анализ изменил решение, которое команда собиралась принять.
story - 95
Как выглядит ваш личный процесс QA перед тем, как поделиться анализом?
discoveryconcurrency - 96
Как вы работаете с дата-инженерами, чтобы изменение пайплайна приоритизировали и довезли?
ci-cd - 97
Директор просит число через час, а строгий ответ требует трёх дней. Как поступаете?
soft-skills - 98
Как вы объясняете техническое ограничение, например сэмплирование в аналитическом инструменте, нетехническому стейкхолдеру?
communicationsamplingstakeholder-management - 99
Как вы поддерживаете актуальность навыков и что реально поменяли в своём рабочем процессе за последний год?
- 100
Руководитель оспаривает ваши числа на живой встрече, утверждая, что чутьё говорит иное. Как отвечаете?