Middle-позиция в команде управления рисками микро и малого бизнеса: продуктовая аналитика кредитной линейки, метрики воронки и рисков, формирование требований к стратегии принятия решений и сопровождение алгоритмов.
Фишка: Enterprise-формат Сбера: акцент на надёжность, регуляторику и банковский домен. Для команды кредитования ММБ ценят умение связать продуктовые метрики (TU, AR, воронка, каналы) с риск-метриками и перевести это в требования к стратегии принятия решений и приёмке алгоритмов.
| Этап | Длительность | Что проверяют |
|---|---|---|
| HR-скрининг | 20–30 мин | Опыт BA от 2+ лет, мотивация, зарплатные ожидания, готовность к офису (м. Кутузовская), уточнение команды и формата следующих этапов |
| Техническое интервью | 45–90 мин | SQL (JOIN, оконные функции, CTE, GROUP BY), базовая статистика, Python/pandas на среднем уровне, работа с JSON/XML, примеры из банковской аналитики |
| Кейс-интервью | 45–60 мин | Разбор бизнес-ситуации: метрики воронки заявок, рисковые показатели, требования к алгоритму/scorecard, декомпозиция проблемы и план анализа |
| Финальное / панельное | 30–60 мин | Опыт работы с заказчиками и командой, STAR-кейсы, культурный fit, понимание регуляторики и банковского контекста |
Обязательный минимум
Плюсом будет
В чём разница между INNER JOIN и LEFT JOIN? Когда LEFT JOIN + WHERE IS NULL даёт другой результат, чем NOT IN?
INNER — только совпадения; LEFT — все строки левой таблицы. NOT IN ломается на NULL в подзапросе; anti-join безопаснее через NOT EXISTS или LEFT JOIN + IS NULL.
Как найти клиентов без транзакций за последние 90 дней (dormant)?
Anti-join: LEFT JOIN transactions ON ... AND tx_date >= CURRENT_DATE - 90, WHERE t.tx_id IS NULL. Альтернатива: NOT EXISTS.
Как посчитать rolling sum транзакций за 30 дней по клиенту?
SUM(amount) OVER (PARTITION BY client_id ORDER BY tx_date RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW). Для time-based — RANGE, не ROWS.
Как найти топ-10 клиентов по обороту за квартал с условием активности?
JOIN accounts/transactions, фильтр по дате квартала, GROUP BY client_id, ORDER BY SUM(amount) DESC LIMIT 10. Продумать: что если client есть только в одной таблице.
Как сгруппировать события по календарному месяцу в PostgreSQL?
GROUP BY DATE_TRUNC('month', event_time) — усекает до начала месяца. EXTRACT(month) без года смешает разные годы.
Как обнаружить клиентов, у которых баланс упал на 50%+ за неделю по ежедневным снапшотам?
Self-join или LAG(balance) OVER (PARTITION BY client_id ORDER BY snapshot_date), сравнить current vs lag_7d.
Как исправить фильтр, если в phone есть пробелы и часть пользователей не находится?
TRIM(phone) = '+79991234567'. Не CAST в int — потеря формата; SUBSTRING режет номер.
Совет: В Сбере SQL часто на PostgreSQL/Greenplum/Oracle. Пишите читаемо: CTE вместо вложенных подзапросов, проговаривайте индексы и план (EXPLAIN) на follow-up.
Ловушка: LEFT JOIN + фильтр по правой таблице в WHERE превращает его в INNER JOIN. Фильтры правой таблицы — в ON.
Фишка: Для роли ММБ типичны задачи на воронку заявок, сегменты каналов и change detection по снапшотам — это близко к production SQL в риск-командах.
Что такое take-up (TU) и approval rate (AR) в контексте кредитной воронки?
AR — доля одобренных от поданных/рассмотренных заявок. TU — доля клиентов, которые воспользовались одобренным продуктом. Считать на согласованной базе (заявка vs одобрение vs выдача).
Как построить воронку заявок на кредит для ММБ?
Этапы: заявка → скоринг/решение → одобрение → выдача → активный договор. Для каждого этапа — count и conversion rate. Сегментировать по каналу, продукту, региону.
Доля просроченных кредитов выросла на 8% за к quarter. Как будете разбираться?
Уточнить: абсолютный рост или относительный. Декомпозиция по продукту, каналу, vintage, score-band. Проверить изменения политики, макро, data quality.
На агрегированных или детальных данных строишь дашборд?
Оперативные KPI — на агрегатах (быстро, стабильно). Drill-down — на детальных. Для риск-метрик часто нужен grain: заявка/клиент/договор.
Как выявить клиентов с высоким риском дефолта по кредиту?
Признаки: просрочка, снижение оборотов, negative bureau signals, sector stress. Начать с гипотез и доступных данных, не с «чёрного ящика».
Как сравнить зарплатных и незарплатных клиентов по PD?
Когорты с контролем confounders (сегмент, сумма, срок). Salary client = verified income → гипотеза lower PD. Проверить статзначимость и бизнес-эффект.
Совет: На кейсах начинайте с уточняющих вопросов: определение метрики, период, grain, сегменты, доступные данные.
Ловушка: Сравнивать AR/TU до и после изменения политики без учёта seasonality и mix shift — частая ошибка.
Фишка: Вакансия явно требует потоковые и качественные метрики — готовьте примеры расчёта и интерпретации TU, AR, рисковых KPI.
В чём разница между функциональными и нефункциональными требованиями?
Функциональные — что система делает («отклонить заявку при score < X»). Нефункциональные — как: latency, SLA, audit trail, регуляторное хранение.
Что такое user story и критерии INVEST?
Формат: Как [роль], хочу [действие], чтобы [ценность]. INVEST: Independent, Negotiable, Valuable, Estimable, Small, Testable.
Как формировать требования к стратегии принятия решений?
Бизнес-цель → правила/пороги → входные данные → исключения → мониторинг → критерии приёмки и rollback.
Как принимать и сопровождать алгоритм скоринга?
Acceptance: метрики на holdout, стабильность по сегментам, regulatory constraints. Сопровождение: drift, пересмотр порогов, документация изменений.
Стейкхолдер просит добавить правило в середине спринта. Ваши действия?
Оценить impact на scope, риски, зависимости. Варианты: MVP, swap, следующий спринт. Зафиксировать решение письменно.
Что такое FR (functional requirements) в контексте BA?
Функциональные требования — описание поведения системы/процесса. Отличать от business requirements (зачем) и technical specs (как реализовать).
Совет: Для Сбера важно показать, что решения привязаны к бизнес-эффекту и compliance, а не только к «красивой аналитике».
Ловушка: Путать «изменить порог score» с «переобучить модель» — разные процессы, сроки и стейкхолдеры.
Как сделать выборку обязательных вопросов из XML-анкеты по атрибуту обязательности?
XPath: //question[@required='true'] или DOM-парсинг. В Python: xml.etree/lxml. Проверить namespace, кодировку, вложенность.
Как извлечь поле из JSON в SQL (PostgreSQL)?
column->>'field' или jsonb_path_query. Для массивов — jsonb_array_elements. Валидировать schema.
Что такое REST API и зачем BA его понимает?
HTTP-методы, ресурсы, JSON payload. BA описывает контракт: endpoints, поля, ошибки, SLA — не пишет backend.
Какие вопросы задаёте при интеграции с внешним сервисом?
Формат (REST/SOAP/file), частота, маппинг статусов, retry, ошибки, безопасность, SLA, audit.
Фишка: В вакансии JSON/XML указаны явно — ждите задачу на парсинг анкеты/заявки или маппинг полей интegration flow.
Как агрегировать несколько Excel-листов по client_id в pandas?
pd.read_excel(sheet_name=None) → concat → groupby('client_id').agg(...). На больших объёмах — calamine/openpyxl.
Как сделать decile binning для credit scores?
pd.qcut(scores, 10, labels=False) — равные по численности бины. Для equal-width — pd.cut.
Как обработать пропуски в credit data?
Missing-as-feature: отдельная категория/WoE bin. Не impute blindly — в банке пропуск может быть сигналом.
Как проверить значимость разницы выручки control vs treatment?
scipy.stats.ttest_ind(..., equal_var=False) — Welch. Для skewed data — log-transform или bootstrap.
Совет: Python для этой роли — плюс к SQL, не замена. Покажите pandas для ad-hoc и приёмки, не ML-pipeline ради ML.
Какие основные элементы диаграммы BPMN?
Events (start/end/intermediate), Tasks, Gateways (exclusive/parallel/inclusive), Sequence flows, Pools/Lanes.
Какие виды шлюзов (gateways) есть в BPMN?
Exclusive (XOR — один путь), Parallel (AND — все), Inclusive (OR — один или несколько), Event-based.
Что такое UML и какие диаграммы релевантны BA?
Use case (сценарии пользователя), Activity (поток действий), Sequence (взаимодействие компонентов). Не нужно знать все 14 типов.
В чём разница между as-is и to-be процессом?
As-is — текущее состояние с узкими местами. To-be — целевое после оптimизации. BA документирует gap и согласует изменения.
Совет: На собесе могут попросить нарисовать процесс «заявка → решение → выдача» — достаточно базовых элементов BPMN.
В чём разница между активными и пассивными счетами?
Активные — имущество/дебиторка (кредиты выданные). Пассивные — обязательства (депозиты, капитал). Дебет/кредит и баланс.
Что такое PD, NPL, LTV в контексте кредитования?
PD — probability of default. NPL — non-performing loans (просрочка 90+). LTV — lifetime value клиента/портфеля.
Почему в банке logistic regression часто предпочитают GBM для credit?
Интерпретируемость, стабильность, регуляторная explainability, проще audit и approval модели.
Фишка: Команда ММБ работает на стыке продукта и риска — покажите понимание trade-off между одобрением (AR/TU) и качеством портфеля (NPL/PD).
Dormant-клиенты без транзакций 90 дней
Таблицы clients(client_id) и transactions(client_id, tx_date, amount). Найдите клиентов, у которых не было ни одной транзакции за последние 90 дней.
SELECT c.client_id FROM clients c LEFT JOIN transactions t ON c.client_id = t.client_id AND t.tx_date >= CURRENT_DATE - INTERVAL '90 days' WHERE t.client_id IS NULL;
Сложность: O(n + m) при индексе на (client_id, tx_date)
Воронка заявок по каналам
Таблица applications(app_id, channel, status, created_at). status ∈ {submitted, approved, issued}. Посчитайте конверсию submitted→approved→issued по каждому channel за последний месяц.
WITH base AS (
SELECT channel,
COUNT(*) FILTER (WHERE status = 'submitted') AS submitted,
COUNT(*) FILTER (WHERE status = 'approved') AS approved,
COUNT(*) FILTER (WHERE status = 'issued') AS issued
FROM applications
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month'
AND created_at < DATE_TRUNC('month', CURRENT_DATE)
GROUP BY channel
)
SELECT channel,
approved::float / NULLIF(submitted, 0) AS ar,
issued::float / NULLIF(approved, 0) AS tu
FROM base;Сложность: O(n) scan + group
Падение баланса на 50%+ за неделю
Таблица balance_snapshots(client_id, snapshot_date, balance). Найдите клиентов, у которых balance упал минимум на 50% за 7 календарных дней.
WITH lagged AS (
SELECT client_id, snapshot_date, balance,
LAG(balance, 7) OVER (PARTITION BY client_id ORDER BY snapshot_date) AS balance_7d_ago
FROM balance_snapshots
)
SELECT client_id, snapshot_date, balance, balance_7d_ago
FROM lagged
WHERE balance_7d_ago > 0
AND balance <= balance_7d_ago * 0.5;Сложность: O(n log n) per partition для window
Обязательные вопросы из XML-анкеты
XML анкеты содержит элементы <question id="..." required="true|false" text="..."/>. Извлеките id и text всех обязательных вопросов.
Python (lxml):
from lxml import etree
root = etree.fromstring(xml_string)
required = [
{'id': q.get('id'), 'text': q.get('text')}
for q in root.xpath('//question[@required="true"]')
]
Или XPath в других инструментах: //question[@required='true']Сложность: O(n) по числу элементов
Decile analysis credit scores
DataFrame с колонками client_id, score, default_flag (0/1). Разбейте на 10 decile по score и посчитайте default rate в каждом.
import pandas as pd
df['decile'] = pd.qcut(df['score'], 10, labels=False, duplicates='drop')
result = df.groupby('decile').agg(
clients=('client_id', 'count'),
default_rate=('default_flag', 'mean')
).reset_index()Сложность: O(n log n) для qcut
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| SQL | за 15 мин решаешь dormant, rolling sum и воронку с GROUP BY/window без подсказок |
| Метрики ММБ | объясняешь TU, AR, воронку и trade-off одобрения vs NPL |
| Требования | из бизнес-задачи формулируешь user stories + acceptance criteria + NFR |
| JSON/XML | извлекаешь обязательные поля из XML/JSON и описываешь edge cases |
| Python | делаешь decile analysis и groupby-агрегацию в pandas |
| BPMN | рисуешь credit decision flow с gateways и events |
| Кейсы | за 10 мин структурируешь ответ: вопросы → декомпозиция → метрики → план |
| Behavioral | 2–3 STAR-кейса с измеримым результатом, без воды |
В день собеседования