Режим просмотра: HR Переключить: Менеджер Коллега

Продуктовый аналитик — для найма

Роль, стек и метрики — чтобы сверить с вакансией.

Анализ

SQL Python pandas scikit-learn DuckDB визуализация

Визуализация

Plotly Tableau Superset Astro

Эксперименты

A/B AA-tests Causal Inference

Удержание и сегментация

когортный анализ retention-кривые RFM

Инфра

GitHub Actions Docker Airflow Supabase PostHog
Все проекты →

Все проекты

  • Volta Neobank — Product Analytics

    Эксперименты

    Ситуация
    «Volta» — вымышленный необанк, терявший пользователей на онбординге: у каждого отдела своя цифра, и ни одна не объясняла, где утекают деньги
    Задача
    Найти критический шаг онбординга и доказать вывод так, чтобы его нельзя было списать на удобную выборку
    Действия
    Одна петля discover → validate → measure → optimize: воронка, A/B прогресс-бара KYC, когорты, KMeans-сегментация, DiD-проверка причинности
    Результат
    KYC-фикс: +5,72pp конверсии (p<0,0001) → €208,5K за 12 мес при 13,9× ROI; M3-удержание +9,2pp

    Python · pandas / NumPy · SciPy / Statsmodels · scikit-learn

  • A/B Testing Methodology Toolkit

    Эксперименты

    Ситуация
    Метод A/B-теста хорош настолько, насколько верны его Type I error под нулём и мощность под эффектом
    Задача
    Сделать свойства методов проверяемыми: контроль ошибки подкреплён прогоном, а не ссылкой на литературу
    Действия
    Реализация методов из первичной литературы — SRM, CUPED, delta-method, mSPRT, HTE, BH — и калибровка каждого симуляцией
    Результат
    CUPED срезает дисперсию на 17.7% (SE 0.00360 → 0.00327), delta-method находит CTR-лифт +0.51 pp при p < 0.0001, SRM p = 0.8376 — все 18 модулей откалиброваны симуляцией

    Python · NumPy / SciPy · pytest · uv

  • Ситуация
    Аналитические концепции абстрактны: рекрутер или студент не прочувствует их из текста
    Задача
    Сделать смысл метрики очевидным из самого действия, а не из объяснения
    Действия
    Игры в self-contained SVG: A/B-тест, funnel drop, cohort catch, retention day, SQL и metric match
    Результат
    10 игр: 7 аналитических и 3 аркадных, один файл без сервера; smoke-тесты Playwright ловят поломки

    SVG · JavaScript · Astro · Playwright

  • Ситуация
    Аналитическое портфолио показывает метрики на чистом CSV, а невидимой остаётся аналитика внутри multi-tenant продукта
    Задача
    Собрать слой целиком: авторизация, изоляция по организациям, приём событий и результат эксперимента, считаемый в базе
    Действия
    SQL-вьюхи считают funnel, cohort, MRR и DAU; v_results считает A/B в базе; RLS изолирует строки по организациям
    Результат
    Итог A/B на сидированном потоке: control 29,6% против treatment 40,7%, +11,1 пп при p ≈ 1,7·10⁻¹⁰ (χ²); метрики считаются в живой базе для любого клиента

    Python · Streamlit · Supabase (Postgres + RLS + Edge Functions) · SQL

  • Ситуация
    Аналитическое портфолио обычно начинается с готового CSV; здесь работа стартует раньше — с инструментирования приложения
    Задача
    Определить события без утечек PII, довести их до аналитического инструмента и превратить в решения
    Действия
    Каталог событий и скрабинг PII; A/B с chi-square, uplift, Wilson CI и SRM; SQL-зеркало метрик, Streamlit-дашборд, CI и Docker
    Результат
    Онбординг-тест на сидированном потоке: завершение 55.9% → 70.8% (+26.6%, χ² = 40.10, p < 0.0001, SRM p = 0.90), а до платного апгрейда доходят 6.3% завершивших регистрацию

    Python · PostHog · FastAPI · Streamlit

  • Ситуация
    Портфолио показывает весь AARRR-цикл на одном датасете из 8 000 синтетических пользователей, а не одну метрику
    Задача
    Собрать метрики так, чтобы они читались как один связный сюжет, а не набор отдельных графиков
    Действия
    Детерминированный seed и общий кэш: одна база для Funnel, Retention, Revenue и Segments; 5 страниц на Streamlit
    Результат
    Funnel, Retention, Revenue и Segments читаются на одной базе; тот же UI стал слоем презентации Supabase-проекта

    Python · Streamlit · pandas / NumPy

  • Ситуация
    ИИ-обзвон — 4-шаговая воронка на 16 891 синтетическом звонке; выгрузка не говорит, где бот теряет клиента
    Задача
    Снять разбор звонков с ручного просмотра и показать шаг воронки с наибольшей потерей
    Действия
    Разметка шага по маркерам шаблонного скрипта, утечка по типам, взвешенная потеря контактов, вовлечённость по часам
    Результат
    Ответ за минуту: где бот теряет клиента и что чинить; на выходе — взвешенная потеря контактов и первый A/B-сценарий

    Python · Streamlit · pandas

  • SQL Analytics Case Study

    Аналитика

    Ситуация
    Нет продакшен-данных, а учебные задачи не показывают системное мышление: 25 кейсов на синтетическом датасете
    Задача
    Собрать кейсы, где каждый запрос отвечает на продуктовый вопрос и воспроизводится одной командой
    Действия
    Самодостаточный .sql на кейс, генератор данных на DuckDB, dbt-слой staging → marts, regression-тесты, живой отчёт на Pages
    Результат
    Воронка теряет 78% на add-to-cart → checkout (54% — это шаг view→cart); retention с ~19.5% (D1) до ~4% (D30); повторных покупок 3.5%; на real data возвращаются 72.4%

    SQL · dbt · DuckDB · Python

  • Ситуация
    Кейсы ClickHouse проверялись на глаз: снапшот результатов не был связан с SQL-файлами, а выигрыш оптимизации смешивал переписывание запроса и изменение схемы
    Задача
    Мне нужно было собрать лабораторию, где каждый кейс сверяется со снапшотом и независимым движком, а выигрыш оптимизации измеряется при неизменном тексте запроса
    Действия
    50 млн синтетических событий в MergeTree, десять кейсов от windowFunnel до RFM, DuckDB-двойники для семи из них, проекция по product_id и тест на побайтовую идентичность slow и fast SQL
    Результат
    Снапшот и семь DuckDB-двойников сходятся, идентичность slow и fast SQL закреплена тестом, а проекция проходит заложенный в тест порог ускорения ≥10× на полном скане

    ClickHouse · DuckDB · SQL · Python

  • Delivery Control Tower

    Аналитика

    Ситуация
    Доставка измеряется средним временем, а вопрос «где теряется время и хватит ли мощности под прогноз» требует разреза по категориям, каналам и городам
    Задача
    Собрать воспроизводимый контур: ETL, витрины, прогноз заказов, анализ узких мест, проверяемые гипотезы и SQL-слой с замерами
    Действия
    DuckDB star-schema, rolling-origin бэктест четырёх моделей, декомпозиция времени и кривая нагрузки, Mann-Whitney с bootstrap-CI, 14 оконных запросов и 3 пары оптимизаций под EXPLAIN ANALYZE
    Результат
    Лучший WAPE 6.01% на h=7 у seasonal_naive; время доставки почти не зависит от нагрузки (rho = −0.092), но закуски идут 40.0 мин против 26.6 мин у пиццы; доля mp выросла на 5.7 п.п.

    python · sql · duckdb · superset

  • Ситуация
    Алерт «GMV упал на 10%» не говорит, где теряются деньги: общий спад одинаково правдоподобно объясняется десятью разными сегментами
    Задача
    Мне нужно было разложить падение до конкретного сегмента и доказать, что атрибуция полная, а не удобная нарезка
    Действия
    Дерево метрик GMV = users × orders_per_user × AOV на именованной базе, декомпозиция country × дециль, гостевой адденд отдельно, Shapley-вклады, executive-дашборд
    Результат
    UK дециль-1 объясняет 56,2% именованного падения (−£195 218,25); полная атрибуция сходится в £0,00 при общем спаде −10,0%

    Python · pandas · DuckDB · Plotly

  • Ситуация
    Платформа не видит сделку: она закрывается вне платформы, поэтому ликвидность считается по самоотчёту продавца, а не по факту продажи
    Задача
    Мне нужно было измерить расхождение прокси с посаженной истиной по категориям и отдельно проверить, создаёт ли платная видимость контактный спрос или перераспределяет его
    Действия
    Синтетический лог на 6 000 объявлений и 40 000 сессий с посаженной истиной, EM-смесь sold/unsold на наблюдаемых сигналах ответа, поправка по категориям, рандомизированный холдаут с гардрейлами
    Результат
    Прокси 0,2413 против истины 0,3070: ошибка −0,0657 (−21,4%); после поправки худшая категория ошибается на 1,61 п.п., а платная видимость даёт −2,47% контактов на сессию при p = 0,308

    Python · pandas · DuckDB · SciPy

  • Ситуация
    Банк накапливает транзакции клиентов, а маркетинг шлёт всем одинаковые предложения
    Задача
    Заменить единое предложение адресным: для каждого сегмента — своя стратегия удержания
    Действия
    Очистка транзакций, расчёт Recency, Frequency и Monetary, RFM-скоринг, сегментация и визуализация в Tableau
    Результат
    Шесть именованных сегментов; топ-20% клиентов держат 38,2% выручки (Gini 0,324), а Champions — 6,4% базы, дающие 12,1% дохода

    Python · SQL · Tableau

  • Cohort Analysis Dashboard

    Аналитика

    Ситуация
    Когортный анализ удержания и LTV на синтетических данных: средний retention прячет динамику
    Задача
    Показать поведение каждой когорты отдельно, а не сглаженную среднюю по всей базе
    Действия
    Матрица удержания, ARPU и LTV по когортам, оговорка о возрасте наблюдения, выгрузка в Tableau (CSV + Hyper)
    Результат
    Python внутри Tableau: 4 когортных расчёта на TabPy-сервере и 65 тестов; когортная матрица вместо среднего retention показывает скорость оттока и расхождение монетизации с удержанием

    Python · pandas · matplotlib / seaborn · Jupyter Notebook

  • Ситуация
    Модель оттока для подписочного продукта: случайный сплит подкладывает будущую активность в обучение
    Задача
    Оценить модель так, чтобы качество на тесте не было следствием утечки будущего
    Действия
    Признаки as-of, метка — будущее окно неактивности, хронологический сплит, решение по recall@top-decile и lift
    Результат
    В топ-10% самых рискующих модель ловит 54,4% отточников при lift 5,44×, но на at-risk подгруппе — 1,75×: 69,7% когорты — почти гарантированные негативы по конструкции.

    Python · LightGBM · scikit-learn · pandas / NumPy

  • Ситуация
    Двухвыборочный t-тест не использует пред-период: эксперименты просят лишний трафик, а retention-акции уходят всем
    Задача
    Реализовать CUPED и uplift-моделирование и доказать отсутствие смещения там, где верный ответ известен заранее
    Действия
    CUPED на ковариате пред-периода и T-/S-лернеры на LightGBM; сверка с ground truth по AUUC и QINI
    Результат
    CUPED срезает стандартную ошибку на 26% (5,5k пользователей на руку вместо 10k), а предрегистрированный порог окупаемости 0.05 отправляет кампанию только на new.

    Python · LightGBM · scikit-learn · pandas / NumPy

  • Ситуация
    Продуктовые A/B-практики, перенесённые в CRM, ломают рандомизацию: пользователя бакетируют при первом показе, а не при сборке сегмента
    Задача
    Собрать лабораторию, где каждый этап CRM-эксперимента проверяется на данных с известным ответом и может сломаться наглядно
    Действия
    Симулятор на 20 000 пользователей и 12 кампаний: сегментная рандомизация, глобальная контрольная группа, балансировщик отправок, эффект нетто отписок
    Результат
    Сегментная рандомизация держит SRM p=0.266, GCG-аплифт +0.9968 [0.9433, 1.0502], а нетто-эффект +50.5 на 1 000 обработанных — положительный, но guardrail отписок пробит.

    Python · pandas / NumPy · SciPy · statsmodels

  • Ситуация
    RAG-демо легко показать, но не измерить: непонятно, ошибка в поиске или в генерации, и воспроизводится ли результат вообще
    Задача
    Собрать пайплайн с офлайн-харнессом оценки, который разделяет метрики ретрива и генерации и работает без API-ключей
    Действия
    TF-IDF-индекс на корпусе концепт-документов, cosine top-k, детерминированный экстрактивный ответчик; Claude подключается флагом --llm, харнесс тот же
    Результат
    recall@5 и MRR = 1.00 на 20 вопросах и 0.00 на 11-вопросном контроле с промахами ретрива (MRR@all 0.12) — метрика способна падать; correctness 0.37 у офлайн-базлайна (faithfulness ≡1.00 — инвариант экстрактива); ретрив и генерация оцениваются раздельно

    Python · scikit-learn · pandas / NumPy · TF-IDF

  • Ситуация
    Продуктовый анализ обычно начинается одинаково: загрузка выгрузки, чистка, распределения, графики — каждый раз с нуля
    Задача
    Вынести общую часть в модули, которые можно передать коллеге и не бояться сломать
    Действия
    Модули load / clean / EDA / viz / pipeline под требования PRD; тесты в tests/ проверяют эти требования; тулинг uv + ruff
    Результат
    Покрытие pytest ≥80%; модули маленькие и одноцелевые, требования в PRD, инструмент можно дорабатывать, не ломая существующее

    Python · pandas / NumPy · Matplotlib · pytest

  • Data Analyst Telegram Bot

    Эксперименты

    Ситуация
    У PM и аналитика нет BI-доступа: проверка A/B-гипотезы ждёт дашборда, а CSV из выгрузки остаётся без статистики
    Задача
    Проверить гипотезу прямо в Telegram — из CSV получить корректный результат с гардрейлами, без BI и без ноутбука
    Действия
    Бот на aiogram, pandas, scipy и statsmodels: 12 команд, Welch t-test или χ², SRM- и power-гардрейлы, аналитика как чистые модули, pytest + ruff + mypy в CI
    Результат
    Из CSV — p-value, лифт и 95% CI менее чем за 30 секунд, плюс заметка по мощности и график; /export отдаёт standalone HTML

    Python · aiogram · pandas · SciPy / statsmodels

  • Scrolly English Speaking

    Инженерия

    Ситуация
    Рабочие разговоры на английском (A2–B1): грамматика есть, а связная речь и реакции в реальном времени буксуют
    Задача
    Закрыть разрыв между грамматикой и живой речью: ситуации, где фразы применяют, а не узнают
    Действия
    Единый ScrollyLayout, MDX-нарратив по секциям, типизированный data-модуль для viz, IntersectionObserver с lazy import
    Результат
    Нарратив и визуализация синхронны: читатель доходит до абзаца, график меняется; новая сцена — data-файл плюс MDX

    Astro · TypeScript · MDX · D3

  • Ситуация
    Знания в виде хронологических постов теряют связи; цифровой сад связывает заметки через wikilinks
    Задача
    Опубликовать личный Zettelkasten как статический сайт, где связи между заметками видны читателю
    Действия
    Атомарные заметки в Obsidian-flavored Markdown; Quartz: TypeScript-плагины, бэклинки, graph view, статический вывод
    Результат
    Связи вместо хронологии: бэклинки делают заметку узлом, граф превращает накопление заметок в навигируемую структуру

    TypeScript · Quartz v4 · Markdown · Obsidian

  • SERP Rank Lab

    Аналитика

    Ситуация
    Метапоиск зарабатывает на позиции оффера, поэтому ранжирование и монетизация не измеряются одним числом
    Задача
    Выяснить, сколько выручки даёт ранжирование по деньгам и чем эта выручка платится в кликах
    Действия
    Две feasible-политики на одном информационном множестве, раскатка по user_id с guardrails и правилом остановки, диагноз через источник сигнала
    Результат
    На синтетическом логе: +34.45% выручки на поиск за −16.84% CTR; в раскатке −14.26% (p = 0.11) и −16.05% конверсии → не катим

    Python · DuckDB · Streamlit · NumPy / SciPy

  • Airflow DAG Platform

    Инженерия

    Ситуация
    Ручной отчёт из Postgres в Google Sheets давал задержки, ошибки копирования и полное отсутствие воспроизводимости
    Задача
    Заменить ручную выгрузку воспроизводимым идемпотентным пайплайном с DQ-валидацией, алертами и метриками запусков
    Действия
    Платформа на Airflow 3: DAG-шаблон fetch → validate → write → record_metrics и shared-модули config, dq, alerts, metrics, output, windows
    Результат
    Три DAG-а по общему шаблону, 72 теста без Airflow-сервисов и БД; полный прогон DAG занимает 440 с, из них задача forecast — 413 с

    Python · Apache Airflow 3 · PostgreSQL · Docker Compose

  • Ситуация
    Предобработка — фундамент всей ML-работы: утечка теста в обучение или ручная обработка пропусков обесценивают любую модель выше по стеку
    Задача
    Собрать предобработку корректно с точки зрения современного scikit-learn: без утечки, без опоры на случайный сид и с воспроизводимым результатом
    Действия
    ColumnTransformer (SimpleImputer → StandardScaler для чисел, OneHotEncoder для категорий), фит только на трейне; детерминированный сплит через сортировку по (Country, Age); генератор датасетов и EDA-графики
    Результат
    Сплит воспроизводим без сида (Train (8, 5), Test (2, 5)), четыре синтетических датасета и 21 тест (7 + 9 + 5) держат конвейер запускаемым

    Python · scikit-learn · pandas · matplotlib

  • LinkedIn Content Analytics

    Аналитика

    Ситуация
    Рейтинг форматов, у которого доверительный интервал накрывает всё поле, — не ответ: показать его как ответ хуже, чем не показать ничего
    Задача
    Отвечать не на «сколько показов я набрал», а на «какой формат писать дальше — и доказано ли вообще, что разница есть»
    Действия
    Одно ядро разбора workbook, четыре рендера (markdown-отчёт, HTML-дашборд, SVG-график, заметка в хранилище) и bootstrap-интервалы по постам вместо точечного рейтинга
    Результат
    50 101 показов, охват 9 440, ER 1.71 % за окно 12.10.2025 — 11.10.2026; три из четырёх разрезов оказались внутри шума, и это записано как результат

    Python · openpyxl · uv · bootstrap

  • Ситуация
    Промо в офлайн-ритейле измеряют средним допериодом, а глубину скидки выбирают без цены каннибализации и маржи
    Задача
    Измерить промо в рублях маржи и выбрать глубину и набор магазинов под бюджет так, чтобы числа можно было перепроверить
    Действия
    Синтетическая панель с известной правдой, контрфактуал, четырёхбакетный ledger, P&L, breakeven, кластерный тест по симуляции, Qini против policy value, аллокация бюджета
    Результат
    Промо даёт +68.5 млн ₽ выручки и −24.4 млн ₽ прибыли; 97.9% волн убыточны при breakeven-глубине 1.0–19.5% и фактической 25.4%, а на одном бюджете оптимизатор зарабатывает +231 496 ₽ против +136 648 ₽ у top-15%

    Python · pandas · scikit-learn · PySpark

  • Ситуация
    Подписочный B2C-сервис решает, раскатывать ли новый онбординг, и не может ответить, какой рычаг даёт больший прирост выручки
    Задача
    Связать результат эксперимента с воронкой, когортным удержанием и юнит-экономикой и выдать один управленческий вердикт
    Действия
    A/B с SRM-, ITT- и силовой проверками, воронка до оплаты, когорты и LTV, сравнение конверсии и удержания при равном шаге
    Результат
    SHIP: activation → paid +19.59% (p=0.000946) без деградации guardrails; при равном шаге конверсия даёт +10.00% к LTV против +8.65% у удержания

    Python · pandas / NumPy · DuckDB · SciPy

  • Ситуация
    Каталог проектов вёлся руками: карточки расходились с GitHub, а метаданные и ссылки приходилось обновлять в двух местах
    Задача
    Мне нужно было сделать каталог, где данные приходят из одного машинного источника, страницы собираются из него, а повторная синхронизация не ломает ручные правки
    Действия
    Astro 7 с content collections, Python-синхронизация GitHub API в TOML, генератор frontmatter с маркером владения, валидатор заметок и 26 тестов, CI от дешёвого гейта к сборке
    Результат
    47 страниц проектов и 15 полей метаданных собираются из одного TOML; повторный рендер идемпотентен, а 26 тестов покрывают три ветки сопоставления записей

    Astro · TypeScript · Bun · Python

  • Ситуация
    Страница программы конференции — это Vue SPA: данные живут в API, вёрстка в бандле, и «сделать так же» обычно означает «сделать похоже»
    Задача
    Разобрать чужой интерфейс до измеримых величин и собрать работающую копию без сборки и бэкенда
    Действия
    Вытащил программу из публичного API, снял метрики сетки с отрендеренного DOM, собрал HTML/CSS/JS и прогнал четыре независимых проверки: ревью, security, браузерные тесты, визуальный аудит
    Результат
    Сетка совпадает с оригиналом до пикселя: колонка времени 99 px, зал 420 px, карточка 391 px, строка 550 px, верх сетки y = 414; тесты ловят расхождение данных и вёрстки

    HTML · CSS · JavaScript · Python

  • This Portfolio Site

    Инженерия

    Ситуация
    Статическое портфолио на GitHub Pages: контент — проекты и посты — редактируется в Markdown, а не в разметке компонентов
    Задача
    Свести публикацию проекта к добавлению файла, без правки компонентов и ручных шагов между коммитом и продакшеном
    Действия
    Content collections с Zod-схемами, withBase() для base-path, inline-скрипт темы без flash, SEO-набор, деплой на Pages по push
    Результат
    Невалидный frontmatter ломает сборку, а не деплой; ни одна ссылка не хардкодит base; новый проект — без правки кода

    Astro · TypeScript · Markdown · CSS custom properties

Пришлите вакансию

Сверю требования с кейсами и скажу прямо: где опыт подтверждается цифрами, а где его нужно проверять на интервью.

Открыть контакты →