СберСбербанксобеседованиеаналитика данныхenterpriseбанкрегуляторикакарьера

Вопросы собеса в Сбер на аналитика 2026: 25+ реальных + разбор

2026-06-04 22 мин

Сбер — самый enterprise собес среди РФ-банков. Если в Тинькофф спрашивают «как ты бы построил ML model», в Сбере — «как ты интегрируешь модель в banking flow с учётом регуляторики и SAS legacy». В этом гайде разберу 25+ реальных вопросов с 4 раундов собеса аналитика Сбер (СберТех / Бизнес-блок / Розница / Investtech) — с сильным и слабым ответом.

Главное про Сбер
Сбер ценит **enterprise reliability**: классическая статистика, regulatory-grade модели (logistic regression > GBM для credit), Oracle/PostgreSQL/Greenplum SQL, базовый Python. В отличие от Тинькофф/Yandex — меньше modern stack (no dbt/ClickHouse в core), больше legacy + banking domain expertise.

Грейды аналитика в Сбер (2026)

ГрейдCompensation/мес РФОпытЧто спрашивают
Junior130-200K ₽0-1 годSQL базовый, Excel/Power BI, базовая статистика
Middle200-310K ₽1-3 годаAdvanced SQL, Python pandas, банковские метрики
Senior310-470K ₽3-6 летML credit scoring, A/B-тесты, system integration
Lead/Manager470-650K+ ₽6+ летTeam management, vendor management (SAS/SAP), регуляторика

4 раунда собеса Сбер

РаундЧтоДлительность
1. HR + technical screenМотивация, banking experience, мини-SQL45 мин
2. Hard skillsSQL + Python + статистика90 мин
3. Бизнес-кейсBanking кейс, метрики, ETL60 мин
4. Финал с лидомBehavioral + культура + regulation60 мин

8 SQL-вопросов с собеса Сбер (часто PostgreSQL/Greenplum/Oracle)

Найди топ-10 клиентов по обороту за квартал с условием активности на счёте.

✅ Сильный ответ:

\\\sql

WITH active_clients AS (

SELECT DISTINCT client_id

FROM accounts

WHERE status = 'active' AND last_activity >= '2026-01-01'

),

quarterly_turnover AS (

SELECT t.client_id, SUM(t.amount) AS total_turnover

FROM transactions t

WHERE t.client_id IN (SELECT client_id FROM active_clients)

AND t.tx_date >= '2026-01-01' AND t.tx_date < '2026-04-01'

GROUP BY t.client_id

)

SELECT client_id, total_turnover

FROM quarterly_turnover

ORDER BY total_turnover DESC

LIMIT 10;

\\\

Senior follow-up:

Найди клиентов которые не делали транзакций последние 90 дней (dormant).

✅ Сильный ответ:

\\\sql

SELECT c.client_id, c.last_name, c.opened_at

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

AND c.status = 'active';

\\\

Senior follow-up:

→ SQL антипаттерны

ETL: ежедневный snapshot балансов, найти клиентов где баланс упал на 50%+ за неделю.

✅ Сильный ответ:

\\\sql

WITH balances_compared AS (

SELECT

today.client_id,

today.balance AS today_balance,

week_ago.balance AS week_ago_balance,

(today.balance - week_ago.balance) * 100.0 / NULLIF(week_ago.balance, 0) AS pct_change

FROM balance_snapshots today

JOIN balance_snapshots week_ago

ON today.client_id = week_ago.client_id

AND week_ago.snapshot_date = CURRENT_DATE - 7

WHERE today.snapshot_date = CURRENT_DATE

AND week_ago.balance > 0

)

SELECT client_id, today_balance, week_ago_balance, pct_change

FROM balances_compared

WHERE pct_change <= -50

ORDER BY pct_change;

\\\

Senior follow-up: «Это change detection pattern. Для real-time можно использовать LAG over window вместо self-JOIN — проще, быстрее на partitioned table.»

Pivot: остатки по типам продукта × месяцам.

✅ Сильный ответ:

\\\sql

SELECT

date_trunc('month', snapshot_date) AS month,

SUM(CASE WHEN product_type = 'debit' THEN balance END) AS debit_balance,

SUM(CASE WHEN product_type = 'credit' THEN balance END) AS credit_balance,

SUM(CASE WHEN product_type = 'savings' THEN balance END) AS savings_balance,

SUM(CASE WHEN product_type = 'mortgage' THEN balance END) AS mortgage_balance

FROM balance_snapshots

WHERE snapshot_date >= '2025-01-01'

GROUP BY 1

ORDER BY 1;

\\\

Senior follow-up: «PostgreSQL имеет \crosstab\ функцию (extension tablefunc) — но для отчёта conditional aggregation чище. Если dynamic columns — обычно делается на client side (pandas, BI tool).»

Calculate Net Profit Margin по бизнес-сегментам.

✅ Сильный ответ:

\\\sql

SELECT

business_segment,

SUM(revenue) AS total_revenue,

SUM(costs) AS total_costs,

SUM(revenue - costs) AS net_profit,

SUM(revenue - costs) * 100.0 / NULLIF(SUM(revenue), 0) AS net_margin_pct

FROM business_pnl

WHERE period_month = '2026-03-01'

GROUP BY business_segment

ORDER BY net_margin_pct DESC;

\\\

Senior follow-up: «Net Margin = Net Profit / Revenue × 100. В банке это measured per business unit: розница, корпорат, инвест, страхование. Сравнение с прошлым кварталом — operating leverage analysis

Анти-фрод: найди клиентов с подозрительными переводами на новые счёта.

✅ Сильный ответ:

\\\sql

WITH first_time_recipients AS (

SELECT DISTINCT t.sender_id, t.recipient_id, MIN(t.tx_date) AS first_tx_date

FROM transfers t

GROUP BY 1, 2

)

SELECT

t.sender_id,

COUNT(DISTINCT t.recipient_id) AS new_recipients_count,

SUM(t.amount) AS total_amount

FROM transfers t

JOIN first_time_recipients ft

ON t.sender_id = ft.sender_id

AND t.recipient_id = ft.recipient_id

WHERE t.tx_date >= CURRENT_DATE - INTERVAL '7 days'

AND ft.first_tx_date >= CURRENT_DATE - INTERVAL '7 days'

GROUP BY 1

HAVING COUNT(DISTINCT t.recipient_id) >= 5

AND SUM(t.amount) >= 500000;

\\\

Senior: «Это rules-based first-pass. В реальности дополняется ML — Isolation Forest на 100+ features (location, time, amount distribution, network topology).»

Window function: накопительная сумма transactions за последние 30 дней (rolling).

✅ Сильный ответ:

\\\sql

SELECT

client_id,

tx_date,

amount,

SUM(amount) OVER (

PARTITION BY client_id

ORDER BY tx_date

RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW

) AS rolling_30d_sum

FROM transactions

WHERE client_id = 12345;

\\\

Senior follow-up:

→ Window-функции SQL полный гайд

Recursive CTE: иерархия менеджеров банка.

✅ Сильный ответ:

\\\sql

WITH RECURSIVE manager_hierarchy AS (

SELECT employee_id, manager_id, full_name, 1 AS level, full_name::text AS path

FROM employees

WHERE manager_id IS NULL -- CEO

UNION ALL

SELECT e.employee_id, e.manager_id, e.full_name,

mh.level + 1,

mh.path || ' > ' || e.full_name

FROM employees e

JOIN manager_hierarchy mh ON e.manager_id = mh.employee_id

)

SELECT * FROM manager_hierarchy ORDER BY level, path;

\\\

Senior: «Recursive CTE — banking standard для org chart, account hierarchy (parent-child accounts), категорий продуктов. Limit recursion обязательно: \OPTION (MAXRECURSION 100)\ в SQL Server или WHERE level < 20 в PG.»

→ Recursive CTE деталь

5 Python-вопросов с собеса Сбер

Прочитай Excel (10 листов), agg каждый по client_id, объедини.

✅ Сильный ответ:

\\\python

import pandas as pd

excel = pd.ExcelFile('clients.xlsx')

all_dfs = []

for sheet in excel.sheet_names:

df = pd.read_excel(excel, sheet_name=sheet)

df_agg = df.groupby('client_id').agg(

total_amount=('amount', 'sum'),

tx_count=('amount', 'count'),

sheet_source=('amount', lambda x: sheet) # tracking source

).reset_index()

all_dfs.append(df_agg)

merged = pd.concat(all_dfs, ignore_index=True)

# Final: union by client_id, summing amounts

final = merged.groupby('client_id').agg(

total_amount=('total_amount', 'sum'),

tx_count=('tx_count', 'sum')

).reset_index()

\\\

Senior follow-up: «Это classic banking workflow. На 100K+ rows pd.read_excel медленный — используй \openpyxl\ напрямую или \pd.read_excel(engine='calamine')\ для скорости.»

Имплементируй decile binning для credit scores.

✅ Сильный ответ:

\\\python

import pandas as pd

# Decile binning

df['score_decile'] = pd.qcut(df['credit_score'], q=10, labels=range(1, 11))

# Decile analysis

decile_stats = df.groupby('score_decile').agg(

n_clients=('client_id', 'count'),

default_rate=('default_flag', 'mean'),

avg_score=('credit_score', 'mean'),

avg_balance=('balance', 'mean')

).round(3)

\\\

Senior follow-up: «\pd.qcut\ делит на equal-population бины. Альтернатива — \pd.cut\ для equal-width. Decile analysis — основа credit scoring evaluation (lift table, gain chart).»

Реализуй A/B sample size calculator на Python.

✅ Сильный ответ:

\\\python

from scipy import stats

import math

def sample_size(p_baseline, mde, alpha=0.05, power=0.80):

"""

p_baseline: baseline conversion rate (e.g., 0.10 for 10%)

mde: minimum detectable effect (e.g., 0.01 for absolute +1pp)

alpha: Type I error (default 5%)

power: 1 - beta (default 80%)

"""

p_treatment = p_baseline + mde

pooled_p = (p_baseline + p_treatment) / 2

pooled_var = 2 * pooled_p * (1 - pooled_p)

z_alpha = stats.norm.ppf(1 - alpha/2)

z_beta = stats.norm.ppf(power)

n = ((z_alpha + z_beta)**2 * pooled_var) / (mde**2)

return math.ceil(n)

# Use: detect +1pp lift from 5% baseline

n_per_group = sample_size(0.05, 0.01)

print(f"Sample size per group: {n_per_group}")

# ~7,663 per group

\\\

→ Sample size deep dive

Используй scipy для t-test: контроль vs treatment по выручке.

✅ Сильный ответ:

\\\python

from scipy import stats

control = df[df['group'] == 'control']['revenue']

treatment = df[df['group'] == 'treatment']['revenue']

# Two-sample t-test (Welch's)

t_stat, p_value = stats.ttest_ind(control, treatment, equal_var=False)

print(f"Mean control: {control.mean():.2f}")

print(f"Mean treatment: {treatment.mean():.2f}")

print(f"Lift: {(treatment.mean() - control.mean()) / control.mean() * 100:.2f}%")

print(f"p-value: {p_value:.4f}")

print(f"Significant: {p_value < 0.05}")

\\\

Senior follow-up: «Welch's vs Student's — Welch не требует equal variance (default в scipy). Для revenue которая highly skewed (lognormal) — рассмотри log-transform или bootstrap для CI.»

Detect missing values и обработай в credit data.

✅ Сильный ответ:

\\\python

# 1. Visualize missingness

missing_pct = df.isna().mean() * 100

print(missing_pct.sort_values(ascending=False))

# 2. Strategies depend on feature type:

# - <5% missing: drop rows

df_clean = df.dropna(subset=['age', 'income']) if missing_pct['age'] < 5 else df

# - 5-30% missing in numeric: impute by median (robust to outliers)

df['income'] = df['income'].fillna(df['income'].median())

# - >30% missing: feature itself может быть informative (missing = no data → high risk?)

df['has_credit_history'] = df['credit_history'].notna().astype(int)

# - Categorical: impute by mode или 'Unknown' category

df['employment'] = df['employment'].fillna('Unknown')

\\\

Senior follow-up: «В банке missing нельзя просто impute — нужен missing-as-feature. Если client не дал income — это сам по себе signal. WoE encoding обрабатывает missing как separate bin.»

5 кейсов / банковских вопросов (раунд 3)

Зарплатный клиент vs неклиент: как сравнишь PD?

✅ Сильный ответ:

«Salary client (зарплатный) — банк видит доход напрямую через counterparty payroll. Реальный income, не stated.

Non-salary client — банк polагается на client-stated income + bureau data.

Hypothesis: salary clients имеют lower PD (default rate) потому что:

Analysis:

Expected result: salary cohort PD ~ 30-50% ниже non-salary. Это bedrock business model Сбера.»

Анализ скоринг-модели: AUC 0.78. Это достаточно?

✅ Сильный ответ:

«AUC 0.78 — average для credit scoring. Сравнение:

Достаточно — зависит от:

1. Business cost of mistakes:

2. Comparison с baseline:

3. Stability:

4. Calibration:

Practical answer: AUC 0.78 + good calibration + stable = deploy. AUC 0.85 + poor calibration = don't deploy.»

Сегментация клиентов: RFM или behavioral?

✅ Сильный ответ:

«RFM (Recency, Frequency, Monetary) — классика. Простой, interpretable, работает для transactional behavior.

Behavioral segmentation — clustering на 50+ features (transactions categories, channels, products owned, time patterns). Глубже инсайт, но сложнее.

Когда RFM:

Когда behavioral:

В Сбере используется оба:

My take: начинай с RFM, эволюционируй в behavioral по мере зрелости команды.»

→ RFM сегментация в SQL

Дизайн A/B-теста: новый дизайн мобильного приложения.

✅ Сильный ответ:

«Hypothesis: новый дизайн увеличит engagement (session frequency).

Design:

Sample size:

Duration:

Analysis:

Decision:

Cross-sell campaign к existing clients: как измеришь uplift?

✅ Сильный ответ:

«Uplift modeling — измерение incremental effect от campaign vs natural conversion.

Метод 1: Holdout A/B

Метод 2: Propensity Score Matching (если A/B не возможен)

Метод 3: Uplift ML modeling

Метрики:

Гайдрейл: annoyance metric — % клиентов кто отписался от offers после campaign.»

4 behavioral / cultural вопроса (раунд 4)

Как ты работаешь с менторами из бизнеса (без data background)?

✅ Сильный ответ:

«Слушаю сначала, преподаю потом. Бизнес знает domain лучше меня; я знаю analytics. Цель — brige.

Подход:

Опыт: работа с risk officer 5 лет старше меня по seniority. Сначала я хотел сразу advanced ML, она настаивала на logistic + WoE из-за regulation. Она была права — XGBoost для credit decision не пропустил бы model risk committee.»

Этичность данных и privacy: реальный кейс из опыта.

✅ Сильный ответ:

«Кейс: маркетинг хотел использовать demographic data (age, gender) для targeted credit offer.

Issue: demographic targeting может быть disparate impact — даже если model не использует gender напрямую, через proxy features (профессия, частота транзакций) gender может коррелировать с outcomes.

Action:

Learning: в банке data ethics не optional — regulation + reputation. Lучше сразу dive deep чем feature deploy и потом откатывать.»

Если бизнес просит anti-pattern (например p-hacking)?

✅ Сильный ответ:

«Прямой отказ + предложение alternative.

Кейс: PM хотел запустить 5 разных вариантов баннера на маленькой выборке и выбрать лучший без correction for multiple testing.

Issue: classic p-hacking. Если каждый test с α=5%, вероятность false positive хотя бы в одном = 1 - (0.95)^5 = 23%.

Response:

Result: запустили с correction, тест дал значимый результат на одном варианте, выбрали честно.

Главный learning: говорить «нет» с alternative path — конструктивный отказ, а не блокер.»

Опиши свою команду мечты.

✅ Сильный ответ:

«Команда мечты:

Culture:

Что важно: diversity в опыте (academic ML + банковский background + tech-стартап опыт). Hard skills можно научить, culture fit — нет.»

Red flags на собесе Сбер (не делай)

Как готовиться к Сбер

Месяц 1: банковская терминология + SQL

Месяц 2: Python + классическая статистика

Месяц 3: кейсы + behavioral

FAQ

Сбер собес сложнее или проще Тинькофф?

По SQL примерно одинаково. По ML — проще Сбера (logistic regression > GBM, less modern ML). По banking domain — Сбер требует больше base knowledge (regulation, NIM, RWA).

Можно ли попасть в Сбер без банковского опыта?

Junior — да. Middle — сложно, но возможно если сильный SQL + понимание banking domain. Senior — нужны 2+ года банковского опыта (внешнего или Тинькофф).

Какие команды самые конкурентные?

СберТех Лаборатория (R&D), Кредитный риск (core analytics), СберИнвестиции (alpha-generation). Менее конкурентные — Маркетинг розницы, HR Analytics.

Где остальные банки (ВТБ, Газпромбанк, Альфа)?

ВТБ — похож на Сбер culture-wise, чуть менее tech-savvy. Газпромбанк — corporate-focused, меньше retail аналитики. Альфа — более tech-progressive, ближе к Тинькофф по подходу.

Important certifications?

SAS Certified Statistical Business Analyst — legacy но банковский стандарт. CFA — для инвестблока. ML/data — Yandex Practicum / Карпов курсы — recognized.

Что дальше

Сравнить Free и Pro → (1999 ₽/мес)

Источники

Тренируй SQL/Python на 521+532 задачах
Тренажёр с авто-проверкой + 453 кейса банковской аналитики. AI мок-собес как в Сбере. Первые 5 задач бесплатно.
Открыть тренажёр →