Собесов
12 августа 2026 г. · 1,1 тыс. просмотров

Пет-проект: дашборд продаж в Yandex DataLens — от сырого CSV до публичной ссылки

Пошаговая сборка BI-пет-проекта: генерация данных о продажах, чистка и расчёт маржи в Python, эскиз в matplotlib и полный путь в Yandex DataLens — подключение, датасет, чарты, дашборд, публикация. С реальными цифрами и вопросами с собеседования.

Это третья инструкция серии про пет-проекты аналитика. Общий контекст — зачем нужен проект, где брать данные, как упаковать — в хабе серии. Остальные инструкции: A/B-тест с нуля, когортный анализ и retention, воронка продукта. Код — в репозитории серии, папка 03-sales-dashboard.

Что собираем

Вы аналитик в розничной компании, руководитель спрашивает: «Куда мы растём, на чём реально зарабатываем и где теряем маржу?» Ответ — витрина на одном экране: динамика выручки и прибыли по месяцам, разрезы по категориям и регионам, и главное — места, где выручка высокая, а маржа низкая.

Проект отличается от остальных в серии двумя вещами. Во-первых, это связка «Python + BI»: код готовит и проверяет данные, DataLens превращает их в интерактивную витрину. Ровно так устроена работа BI-аналитика, и на собеседовании эта связка считывается сразу. Во-вторых, результат живёт по публичной ссылке — единственный проект серии, который можно открыть прямо на собеседовании, не показывая код.

Данные: синтетический датасет продаж в духе Superstore, np.random.seed(11), 10 000 заказов за два года (2023-01 — 2024-12). Колонки: order_id, order_date, category, sub_category, region, segment, sales, profit, quantity; 3 категории, 13 подкатегорий, 4 региона, 3 сегмента. В данные зашиты сезонность, лёгкий тренд роста и скидки, съедающие прибыль, — чтобы аналитике было что находить. Стек: Python (pandas, numpy, matplotlib) + Yandex DataLens, бесплатный тариф. Время: 3–4 часа.

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

Шаг 1. Сгенерировать данные

Зачем: получить «сырые» продажи, как будто их выгрузили из CRM, — с дублями и пропусками, которые предстоит чистить.

python3 gen_data.py     # создаёт data/sales_raw.csv (10 000 строк)

Что должно получиться: data/sales_raw.csv на 10 000 заказов за 2023–2024 годы.

Шаг 2. Почистить и посчитать в Python

Зачем: BI-инструменту нужно отдавать проверенные данные. Правило из практики: считает и валидирует код, BI показывает. Дашборд, в который загрузили сырой CSV, ломается тихо — цифры выглядят правдоподобно и при этом неверны.

python3 analysis.py     # чистит, считает, выгружает outputs/sales_clean.csv

Внутри скрипта:

df = df.drop_duplicates().dropna(subset=["order_date", "sales"])
df["order_month"] = df["order_date"].dt.to_period("M").dt.to_timestamp()
df["margin"] = df["profit"] / df["sales"]

by_cat = df.groupby("category")[["sales", "profit"]].sum()
by_cat["margin"] = by_cat["profit"] / by_cat["sales"]

Что должно получиться: outputs/sales_clean.csv — чистый датасет с добавленными order_month и margin, готовый к загрузке в BI, плюс outputs/results.txt со всеми контрольными цифрами.

Шаг 3. Посмотреть на черновой дашборд в matplotlib

Зачем: эскиз до BI. Четыре панели (тренд, категории, регионы, прибыль) в outputs/dashboard.png — проверка глазами, что тренд, категории и регионы выглядят логично, а не сломаны. Заодно эскиз фиксирует макет: в DataLens вы будете собирать ту же сетку 2×2, только интерактивную.

Что должно получиться — контрольные цифры, с которыми дальше сверяется дашборд:

Выручка:  10 920 410     Прибыль:  1 036 994     Маржа: 9.5%
Рост выручки 2023 -> 2024: +13.0%

Категории по марже:
  Technology       margin = 14.3%
  Office Supplies  margin = 12.8%
  Furniture        margin =  3.5%   <- съедает прибыль

Шаг 4. Зайти в Yandex DataLens

Зачем: начинается BI-часть. Откройте datalens.yandex.ru, войдите под Яндекс-аккаунтом и создайте новый воркбук — рабочую папку проекта, в которой будут жить подключение, датасет, чарты и дашборд. Бесплатного тарифа достаточно для всего проекта.

Что должно получиться: пустой воркбук с понятным названием, например «Sales Dashboard».

Шаг 5. Загрузить CSV как подключение

Зачем: подключение — источник данных для DataLens. В воркбуке: «Создать подключение» → «Файл (CSV)» → загрузить outputs/sales_clean.csv.

Обязательная проверка на этом шаге: order_date распозналась как дата, а sales, profit, margin — как числа. Неправильно определённый тип — самая частая причина «сломанного» дашборда: строковая дата не строит временную ось, строковое число не суммируется.

Что должно получиться: подключение с превью таблицы, все типы колонок корректны.

Шаг 6. Создать датасет

Зачем: датасет — семантический слой над подключением, здесь поля делятся на измерения и показатели. category, region, segment — измерения (по ним режем), sales, profit, quantity — показатели (их агрегируем).

Полезное упражнение: добавьте вычисляемое поле маржи прямо в DataLens — SUM([profit]) / SUM([sales]). Это принципиально не то же самое, что среднее по колонке margin из CSV: маржа — ratio-метрика, и агрегировать её надо как отношение сумм, а не как среднее отношений. Разница между этими двумя способами — готовый вопрос на собеседовании.

Что должно получиться: датасет с размеченными измерениями, показателями и вычисляемым полем маржи.

Шаг 7. Собрать чарты

Зачем: каждый чарт отвечает на один вопрос руководителя. Четыре чарта проекта:

  • линейный график sales и profit по order_month — «куда растём»: виден рост +13% год к году и пик в марте 2024 (645 тыс. за месяц);
  • горизонтальный бар выручки по category — «что продаём»: Technology 5,23 млн, Furniture 4,69 млн, Office Supplies 1,0 млн;
  • бар по region с маржой — «где продаём»: лидер West с 3,45 млн выручки;
  • топ/анти-топ подкатегорий по прибыли — «на чём зарабатываем»: сверху Phones и Accessories (маржа ~14%), в хвосте Tables с маржой 3,6%.

Что должно получиться: четыре сохранённых чарта, цифры которых сходятся с results.txt из шага 3. Эта сверка — не формальность: она ловит ошибки типов и агрегаций из шагов 5–6.

Шаг 8. Положить чарты на дашборд

Зачем: руководитель смотрит один экран, а не четыре вкладки. Создайте «Дашборд», перетащите чарты и расставьте сеткой 2×2 — как в эскизе dashboard.png. Логика раскладки: динамика сверху слева (первый взгляд), структурные разрезы — вокруг.

Что должно получиться: дашборд, читаемый за десять секунд: рост есть, лидер Technology, у Furniture проблема с маржой.

Шаг 9. Добавить интерактивность и поделиться

Зачем: интерактивность отличает дашборд от картинки. Повесьте селекторы-фильтры — год, регион, категория, — чтобы все чарты пересчитывались по клику. Затем «Опубликовать»: DataLens выдаст публичную ссылку.

Что должно получиться: живой дашборд по ссылке — в README, в резюме, в портфолио. Проверьте ссылку в режиме инкогнито: она должна открываться без вашей авторизации.

Выводы проекта

Формулировка для README и для рассказа — ответ на исходный вопрос руководителя:

  • Бизнес растёт: выручка 10,92 млн, прибыль 1,04 млн, рост выручки год к году +13,0%.
  • Общая маржа 9,5%, и её тянет вниз Furniture: вторая категория по выручке (4,69 млн) с маржой всего 3,5%. Много оборота, мало прибыли.
  • Technology — главный мотор: 5,23 млн выручки при марже 14,3%, категория и продаёт больше всех, и зарабатывает больше всех.
  • Регион-лидер — West (3,45 млн); пик продаж — март 2024, сезонность видна на тренде.

Одним предложением: растём за счёт Technology и West, а Furniture лечим по марже, а не наращиваем оборот.

Как рассказывать про проект на собеседовании

Заготовка на 90 секунд: «Я собрала витрину продаж по связке Python + DataLens: скрипт генерирует и чистит 10 000 заказов за два года, считает контрольные агрегаты, а DataLens показывает интерактивный дашборд — вот ссылка. Главная находка — расхождение выручки и прибыли по категориям: Furniture вторая по выручке, но маржа 3,5% против 14,3% у Technology, то есть треть оборота компании почти не приносит денег. Все цифры дашборда сверены с расчётом в Python, маржу в BI считаю как отношение сумм, а не среднее отношений».

Сильный ход — открыть ссылку и дать интервьюеру пощёлкать фильтры: год, регион, категория.

Вопросы, которые зададут по этому проекту

— Почему часть расчётов в Python, а не всё в DataLens? Разделение ответственности: код чистит, валидирует и даёт контрольные цифры, BI визуализирует. Ошибку агрегации в BI без независимого расчёта заметить трудно — дашборд с неверными цифрами выглядит так же убедительно, как с верными. Плюс чистка (дубли, пропуски) в коде воспроизводима и видна в diff.

— Как вы считаете маржу и почему это важно? margin = profit / sales, и агрегирую как ratio: SUM(profit) / SUM(sales), а не среднее построчных марж. Среднее отношений даёт равный вес копеечному и миллионному заказу и искажает картину. В моих данных общая маржа 9,5% — именно отношение сумм.

— Furniture даёт 4,69 млн выручки. Может, просто закрыть категорию? По одному дашборду такие решения не принимают — он показывает «где болит», а не «что делать». Furniture с маржой 3,5% всё же прибыльна и может приводить трафик в другие категории. Дальнейшие шаги: разложить маржу категории на цену, скидки и себестоимость, посмотреть подкатегории (Tables — 3,6%), проверить связанность покупок. Дашборд локализовал проблему — это его работа.

— Что такое измерения и показатели в датасете? Измерения — категориальные поля, по которым группируем: категория, регион, сегмент. Показатели — числовые поля, которые агрегируем: выручка, прибыль, количество. От разметки зависит, что DataLens позволит положить на оси и как агрегирует. Ошибка разметки — второй по частоте источник неверных дашбордов после ошибок типов.

— Как проверяли, что дашборд показывает правду? Сверкой с независимым расчётом: analysis.py пишет контрольные цифры в results.txt — суммарная выручка, прибыль, разрезы по категориям и регионам. После сборки каждого чарта я сверяла его значения с файлом. Расхождение означает ошибку типов, фильтр по умолчанию или неверную агрегацию.

— В данных виден пик в марте 2024. Ваши действия? Сначала проверить, реален ли он: не дубль ли выгрузки, не разовая ли мегасделка (смотрю распределение чеков за месяц). Потом — сезонность ли это: сравнить с мартом 2023. В моих данных сезонность заложена генератором, и это видно по повторяемости паттерна между годами. На реальных данных такой пик — повод для расследования по алгоритму «метрика изменилась», только со знаком плюс.

— Почему DataLens, а не Tableau или Power BI? Инструмент вторичен относительно принципов: измерения и показатели, семантический слой, ratio-метрики и фильтры устроены везде одинаково. DataLens бесплатен, работает в браузере и даёт публичные ссылки без платной лицензии — для портфолио это решающие свойства. Перенос этого дашборда в другой BI — вопрос пары часов, и это честный ответ на собеседовании.

Что дальше

Следующий проект серии — воронка продукта: от витрины «что происходит» к диагностике «где теряем пользователей». Обзор серии и источники данных — в хабе.

Источники

  • Документация Yandex DataLens: подключения, датасеты, чарты, дашборды — https://yandex.cloud/ru/docs/datalens/
  • Документация pandas — https://pandas.pydata.org/docs/
  • Документация matplotlib — https://matplotlib.org/stable/
  • Alistair Croll, Benjamin Yoskovitz. Lean Analytics. O'Reilly, 2013 — про выбор метрик для витрин.
  • Sample Superstore (Tableau Public) — структура-прототип датасета.

Дашборд закрывает «покажите, что доводите данные до решения». Разборы метрик, ratio-ловушек и кейсов «метрика изменилась» — в задачах каталога; часть открыта бесплатно.

Другие статьи