Skip to content

Вопросы на собеседовании: Аналитик данных

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Middle.

Смотреть пример резюме: Аналитик данных

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

window-functions

Эти три функции по-разному назначают позиции при совпадении значений.

  • ROW_NUMBER присваивает каждой строке уникальный порядковый номер, даже при совпадении значений.
  • RANK присваивает совпавшим строкам один номер и пропускает следующие позиции.
  • DENSE_RANK присваивает совпавшим строкам один номер, не оставляя пропусков.
  • Для дедупликации до одной строки используйте ROW_NUMBER, а в топ-N запросах осознанно выбирайте нужную логику ранжирования.

Зачем это спрашивают: Интервьюер проверяет, ловил ли кандидат реальные баги с обработкой одинаковых значений в продакшн-запросах, а не заучил определения из учебника.

queries

Для дедупликации я ранжирую записи каждого пользователя от самой новой к самой старой.

  • Считаю ROW_NUMBER с PARTITION BY user_id и ORDER BY updated_at DESC.
  • Фильтрую результат по rn = 1, чтобы оставить одну полную строку на пользователя.
  • После updated_at добавляю стабильный тайбрейкер, например первичный ключ.
  • Не использую GROUP BY с MAX, если нужны колонки именно из той же последней записи.

Зачем это спрашивают: Сильный ответ включает деталь про тайбрейкер, которая отличает тех, кто отлаживал нестабильную дедупликацию, от тех, кто просто видел паттерн.

sql

Надёжный расчёт скользящего среднего за 7 дней начинается с полного дневного ряда.

  • Сначала агрегирую выручку ровно до одной строки на календарный день.
  • Применяю AVG с рамкой ROWS BETWEEN 6 PRECEDING AND CURRENT ROW.
  • Джойню календарный ряд дат, чтобы дни без заказов тоже присутствовали.
  • Заполняю пропущенную дневную выручку нулём, если отсутствие заказов действительно означает нулевую выручку.

Зачем это спрашивают: Деталь про календарную таблицу и есть настоящая проверка, потому что скользящие метрики по данным с пропусками регулярно дают незаметно неверные дашборды.

ctesubqueries

Я выбираю между этими вариантами с учётом читаемости, переиспользования и необходимости материализации.

  • CTE использую для именования этапов трансформации и читаемого аналитического SQL.
  • Подзапрос подходит для небольшой встроенной подстановки или одной простой вложенной операции.
  • Временная таблица нужна, когда несколько следующих запросов переиспользуют дорогой промежуточный результат.
  • Проверяю поведение движка, потому что некоторые хранилища пересчитывают CTE при каждом обращении вместо материализации.

Зачем это спрашивают: Интервьюер хочет услышать рассуждение про материализацию и переиспользование, а не просто стилистическое предпочтение CTE.

joins

Фильтр по правой таблице в WHERE чаще всего и заставляет LEFT JOIN терять строки без совпадений.

  • После джойна колонки правой таблицы у строк без совпадения равны NULL.
  • Условие вроде WHERE orders.status = 'paid' отбрасывает такие строки с NULL.
  • Поэтому оставшийся результат фактически ведёт себя как INNER JOIN.
  • Если строки из левой таблицы нужно сохранить, перенесите условие по правой таблице в ON.

Зачем это спрашивают: Это лакмусовая бумажка реального опыта отладки: почти каждый аналитик хоть раз выкатывал этот баг, и сильный кандидат называет его мгновенно.

distinct

Точный подсчёт уникальных значений дорог, потому что движку приходится отслеживать каждое из них.

  • На больших таблицах операция требует много памяти, хеширования или сортировки.
  • Приближённые функции и скетчи HyperLogLog дают погрешность около 1-2 процентов при значительно меньших затратах на вычисления.
  • Если отчёт требует точности, регулярно используемые метрики с подсчётом уникальных значений стоит предагрегировать в сводные таблицы.
  • Метод нужно выбирать по требованиям к точности, а не по умолчанию брать самый дорогой вариант.

Зачем это спрашивают: Интервьюер смотрит на понимание модели стоимости аналитических баз и привычку к предагрегации, а не просто на знание волшебной функции.

queries

Даты первого и последнего заказа можно посчитать одним запросом с группировкой.

  • Группирую по user_id и считаю MIN(order_date) и MAX(order_date).
  • К двум полученным значениям применяю функцию разницы дат из используемой СУБД.
  • Если нужны атрибуты крайних заказов, использую FIRST_VALUE или LAST_VALUE.
  • Для LAST_VALUE задаю рамку до UNBOUNDED FOLLOWING, иначе функция по умолчанию вернёт текущую строку.

Зачем это спрашивают: Упоминание подвоха с рамкой LAST_VALUE сигнализирует о живом опыте с оконными функциями, а не о скопированных сниппетах.

window-functions

LAG и LEAD дают доступ к соседним строкам без self-join.

  • LAG читает предыдущую строку, а LEAD следующую строку внутри выбранного окна.
  • LAG(revenue) по месяцам ставит выручку прошлого месяца рядом с текущим значением.
  • Тогда рост месяц к месяцу равен разнице текущего и прошлого значений, делённой на прошлое.
  • LAG по таймстемпам событий также подходит для анализа пауз между действиями, сессий и оттока.

Зачем это спрашивают: Хороший ответ привязывает функцию к бизнес-расчёту, а не пересказывает синтаксис.

queries

При замедлении запроса я отдельно проверяю изменения в данных, плане выполнения и состоянии хранилища.

  • Сравниваю объёмы строк, новые партиции и недавние бэкфиллы с последним нормальным запуском.
  • В плане выполнения ищу пропавшее отсечение партиций, полные сканы и смену порядка джойнов.
  • Проверяю, не стал ли джойн many-to-many и не вызвал ли сильное размножение строк.
  • Прежде чем винить SQL, проверяю очередь запросов и размер вычислительных ресурсов.

Зачем это спрашивают: Интервьюер оценивает структурный метод, разделяющий изменения данных, плана и инфраструктуры, вместо хаотичного переписывания запроса.

sqlfundamentals

В SQL я отношусь к NULL как к неизвестному значению, а не как к обычному сравнимому значению.

  • Предпочитаю NOT EXISTS, потому что NOT IN может не вернуть ни одной строки, если подзапрос содержит NULL.
  • Помню, что COUNT по колонке и большинство агрегатов пропускают NULL, а подсчёт всех строк учитывает такие строки.
  • Использую COALESCE только там, где бизнес-смысл подстановочного значения явно определён.
  • Проверяю долю NULL и применяю IS DISTINCT FROM для NULL-безопасных сравнений там, где он поддерживается.

Зачем это спрашивают: Сильные кандидаты называют именно связку NOT IN и NULL, потому что из всех этих багов она самая разрушительная и наименее заметная.

joinswindow-functionsrevenue

Для сравнения каждой строки со средним по группе обычно нужна оконная функция.

  • AVG(order_value) OVER (PARTITION BY customer_id) сохраняет исходную гранулярность строк.
  • Отклонение можно посчитать сразу рядом с каждым заказом.
  • Self-join с предагрегацией добавляет код и ещё одну возможность ошибиться в ключах джойна.
  • Джойн оправдан только при слабой поддержке окон или когда агрегат строится по другому отфильтрованному набору строк.

Зачем это спрашивают: Вопрос проверяет, стали ли окна для кандидата инструментом по умолчанию для сравнений строки с группой.

aggregation

WHERE фильтрует исходные строки, а HAVING фильтрует группы после агрегации.

  • Неагрегатные условия помещаю в WHERE, чтобы лишние строки отбрасывались раньше.
  • HAVING использую для условий вроде SUM(amount) > 1000.
  • Обычное условие на строку в HAVING может сработать, но заставит движок делать лишнюю агрегацию.
  • Для каждого условия определяю, зависит ли оно от результата агрегатной функции.

Зачем это спрашивают: Интервьюер ищет интуицию о производительности за правилом, а не только учебниковое различие.

sqlsessions

Сессионизация сводится к поиску разрывов и последующему накопительному подсчёту.

  • Через LAG получаю таймстемп предыдущего события каждого пользователя.
  • Помечаю новую сессию, если прошлого события нет или разрыв превышает 30 минут.
  • Считаю нарастающую SUM флага по пользователю и получаю номера сессий.
  • Если таймстемпы могут совпадать, добавляю детерминированный тайбрейкер событий.

Зачем это спрашивают: Сессионизация относится к стандартным паттернам middle-уровня, и свободное описание трюка с флагом и нарастающей суммой выдаёт реальный опыт с событийными данными.

percentilessql

Перцентили описывают скошенные распределения лучше, чем одно среднее.

  • Для точной непрерывной медианы использую PERCENTILE_CONT(0.5) там, где функция поддерживается.
  • Для очень больших данных в хранилище при необходимости использую приближённую функцию квантилей.
  • Тяжёлые хвосты в распределениях выручки и времени отклика могут сильно отдалять среднее от типичного наблюдения.
  • Показываю медиану вместе с хвостовой метрикой вроде p90, чтобы отразить типичные значения и хвост распределения.

Зачем это спрашивают: Интервьюеру нужно статистическое рассуждение о скошенности, а не название функции.

union

По умолчанию я использую UNION ALL, если дедупликация не является явным требованием.

  • UNION ALL просто добавляет наборы строк и не ищет дубли в общем результате.
  • UNION добавляет глобальную сортировку или хеширование, что дорого на широких данных.
  • Автоматическая дедупликация может скрыть дубли, которые на самом деле нужно расследовать.
  • UNION стоит брать только после определения колонок, по которым две строки результата считаются дублями.

Зачем это спрашивают: Осознанный дефолт UNION ALL с озвученной причиной выдаёт человека, который думает и о стоимости, и о незаметной потере данных.

sqlschema

Условная агрегация является переносимым способом развернуть известные значения в колонки средствами SQL.

  • Группирую по измерению, которое должно остаться в строках.
  • Каждую выходную колонку строю через SUM и условие CASE для нужного месяца.
  • Нативный PIVOT короче, но обычно тоже требует заранее перечислить значения колонок.
  • По-настоящему динамические колонки оставляю BI-слою, а не генерирую нестабильный SQL.

Зачем это спрашивают: Вынос динамического пивота в презентационный слой демонстрирует архитектурное чутьё, которое на этом уровне важнее синтаксиса.

cterecursion

Рекурсивные CTE полезны, когда число шагов обхода заранее неизвестно.

  • Использую их для обхода иерархий parent-child, например оргструктур и деревьев категорий.
  • На движках без функций-генераторов ими также можно создавать последовательности дат или чисел.
  • Свёртка затрат по таблице связанных подразделений с разной глубиной веток является практическим примером.
  • Добавляю предел глубины или проверку циклов, чтобы некорректные связи не зациклили запрос.

Зачем это спрашивают: Упоминание защиты от циклов показывает, что кандидат гонял рекурсию на грязных реальных данных, а не на чистых примерах.

queriespartitioningwarehouse

Партиционирование и кластеризация важны, потому что форма запроса определяет объём сканируемых данных.

  • Фильтрую напрямую по колонке партиции, чтобы движок пропускал ненужные партиции.
  • Не оборачиваю эту колонку в преобразования, которые могут отключить отсечение партиций.
  • Фильтры и джойны по колонкам кластеризации сокращают сканирование внутри партиции.
  • Перед дорогим запросом к хранилищу проверяю определение таблицы.

Зачем это спрашивают: Интервьюер проверяет осознание стоимости: аналитики, игнорирующие отсечение партиций, жгут реальные деньги в современных хранилищах.

communicationhypothesis-testingstakeholder-management

p-value показывает, насколько необычен наблюдаемый результат при предположении об отсутствии эффекта.

  • Сначала предполагаем, что тестируемое изменение не даёт реального эффекта.
  • Представляем повторение эксперимента и выборочную вариативность при этом предположении.
  • p-value равен вероятности получить результат не менее экстремальный, чем наблюдаемый.
  • Это не вероятность того, что изменение сработало или что нулевая гипотеза верна.

Зачем это спрашивают: Интервьюер проверяет и корректное понимание, и умение перевести его без классической ошибки инверсии.

confidence-intervalsmonitoring

Доверительный интервал показывает выборочную неопределённость вокруг оценки.

  • Процедура для 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

    Руководитель оспаривает ваши числа на живой встрече, утверждая, что чутьё говорит иное. Как отвечаете?