Условие
Дан датасет выгрузки из рекламного кабинета (dataset_task3):
- месяц,
- название рекламной кампании,
- номер кампании,
- количество показов рекламного объявления,
- средняя позиция показа.
Нужно подготовить один слайд для отчёта руководству, иллюстрирующий результаты маркетологов в части роста видимости рекламы.
На слайде:
- % показов на позициях ТОП-1 и ТОП-3 для:
- брендовых кампаний (название содержит «brand»);
- не брендовых;
- всех в целом.
Позиции — целые числа от 1 до 8. Ожидаемый результат: PPTX или PDF (1 слайд) + ноутбук с расчётами.
Решение
Шаг 1. Понимание данных
Каждая строка — это кампания за месяц. У неё есть impressions и средняя позиция за этот месяц. Средняя позиция — взвешенная по показам или нет — обычно НЕ указано; уточнить.
Чтобы посчитать «% показов на ТОП-1», нужно различать сколько показов было именно на позиции 1, 2, 3 и т.д. Если в датасете только средняя позиция — это уже агрегат, и точное распределение по позициям не восстановить.
Два сценария:
Сценарий A. Если в датасете есть отдельная колонка impressions_at_position_k или top1_impressions / top3_impressions — задача сводится к прямой агрегации (Сценарий A ниже).
Сценарий B. Если только средняя позиция и общие показы — приходится аппроксимировать: например, считать, что кампания показывалась только на одной позиции (округление средней). Это спорно, но иногда приемлемо.
Скорее всего, в dataset_task3 есть колонка с разбивкой — типичный вариант таблицы рекламы. Решаем по ней.
Шаг 2. Формула
Для группы кампаний:
% top1 = sum(impressions where position == 1) / sum(impressions all positions) * 100
% top3 = sum(impressions where position in (1,2,3)) / sum(impressions all positions) * 100
Шаг 3. SQL-агрегация (если данные в БД)
WITH labelled AS (
SELECT
CASE WHEN LOWER(campaign_name) LIKE '%brand%' THEN 'brand' ELSE 'non_brand' END AS group_,
position,
impressions
FROM dataset_task3
)
SELECT
group_,
ROUND(100.0 * SUM(CASE WHEN position = 1 THEN impressions ELSE 0 END) / SUM(impressions), 1) AS pct_top1,
ROUND(100.0 * SUM(CASE WHEN position <= 3 THEN impressions ELSE 0 END) / SUM(impressions), 1) AS pct_top3
FROM labelled
GROUP BY ROLLUP(group_)
ORDER BY group_;ROLLUP даёт строку «всего» (group_ = NULL) — это то, что нужно для категории «общий».
Шаг 4. Pandas-вариант
import pandas as pd
df = pd.read_excel("dataset_task3.xlsx")
df["group"] = df["campaign_name"].str.lower().str.contains("brand").map({True: "brand", False: "non_brand"})
def top_share(g):
total = g["impressions"].sum()
top1 = g.loc[g["position"] == 1, "impressions"].sum()
top3 = g.loc[g["position"] <= 3, "impressions"].sum()
return pd.Series({"pct_top1": top1 / total * 100, "pct_top3": top3 / total * 100})
by_group = df.groupby("group").apply(top_share).round(1)
overall = pd.DataFrame({"pct_top1": [df.loc[df["position"] == 1, "impressions"].sum() / df["impressions"].sum() * 100],
"pct_top3": [df.loc[df["position"] <= 3, "impressions"].sum() / df["impressions"].sum() * 100]},
index=["overall"]).round(1)
result = pd.concat([by_group, overall])
print(result)Шаг 5. Слайд
Минималистичный, в корпоративном стиле:
- Заголовок: «Доля показов на ТОП-1 и ТОП-3 — растущая видимость рекламы»
- Три столбчатые группы (брендовые / небрендовые / общие):
- две полоски «ТОП-1» и «ТОП-3» в %.
- Подзаголовок: «Период: <месяцы>; источник: внутренний кабинет, выгрузка от <дата>».
- Главный вывод (1–2 строки): «Брендовые кампании достигли 92% показов на ТОП-3 (рост на 14 п.п. за период). У небрендовых — 67%, рост за счёт оптимизации ставок.»
Не перегружать слайд: только три ключевых числа на каждую группу. Если есть данные по месяцам — добавить тренд (одна линия по каждой группе) — это сильнее покажет «результат маркетологов».
Подводные камни
- Что такое «средняя позиция». Если в датасете средневзвешенная по показам — это другая метрика, чем «доля на ТОП-1». Не путайте.
- Регистр в
brand. Условие говорит «по наличию brand в названии» — приведите к нижнему регистру. - Позиции > 8. Условие гарантирует 1..8, но проверьте. Аномалии — отдельный график.
- Пустые показы (0). Делить на ноль нельзя; кампании без показов выкидывайте из расчётов.
- % округление. Для слайда — одна цифра после запятой. Для отчёта — целые проценты.
- Слайд для руководства, не для аналитика. Не показывать SQL/код/raw-таблицы. Картина «что произошло, на сколько изменилось, что мы из этого делаем».
Эталонный ответ
Один слайд + ноутбук:
- В ноутбуке: чтение данных, агрегация по группам, формула.
- На слайде: 6 чисел (3 группы × 2 метрики), подпись, главный вывод.