Условие
Даны логи событий рекламы одного рекламодателя в двух регионах:
device_id,device_type,datetime,ev_type(0=показ, 1=клик),adv_type,region_id,age,gender.
Сформулируйте рекомендации для рекламодателя — какие дополнительные настройки добавить, чтобы улучшить эффективность кампаний (таргетинг по группам, время показа и т. д.). Используйте кластеризацию пользователей или классификатор целевого действия.
Решение
План
- EDA: агрегация в pivot по сегментам (
region × adv_type × device × age_bin × gender × hour); считаем CTR = clicks / impressions. - Поиск "горячих" сегментов: где CTR заметно выше среднего и
n_impressionsдостаточен (≥ N). - Кластеризация пользователей по поведению (число показов, кликов, времени активности) — найти «кликабельных».
- Классификатор клика на уровне показа: features = час, день недели, девайс, возраст, пол, тип рекламы. Обучить градиентный бустинг (LightGBM), посмотреть feature importance / SHAP — это и есть факторы, влияющие на клик.
Реализация
import pandas as pd, numpy as np
from sklearn.cluster import KMeans
from lightgbm import LGBMClassifier
df = pd.read_csv("ads.csv", parse_dates=["datetime"])
df["hour"] = df.datetime.dt.hour
df["age_bin"] = pd.cut(df.age, bins=[0, 25, 35, 50, 100], labels=["18-25","26-35","36-50","50+"])
# 1) Сегментный CTR
seg_ctr = (df.groupby(["region_id","adv_type","device_type","age_bin","gender","hour"])
.agg(impr=("ev_type","count"), clicks=("ev_type","sum"))
.reset_index())
seg_ctr["ctr"] = seg_ctr.clicks / seg_ctr.impr
hot = seg_ctr[(seg_ctr.impr > 1000) & (seg_ctr.ctr > seg_ctr.ctr.median()*1.5)]
# 2) Классификатор
X = pd.get_dummies(df[["device_type","adv_type","region_id","age_bin","gender","hour"]])
y = df.ev_type
m = LGBMClassifier().fit(X, y)
fi = pd.Series(m.feature_importances_, index=X.columns).sort_values(ascending=False)Рекомендации (примерные)
- Добавить временной таргетинг: «показывать только в часы X–Y», если в эти часы CTR в 2× выше.
- Девайс: если desktop CTR в N раз выше mobile → cap mobile.
- Возраст: фокус на наиболее кликабельной когорте.
- Тип рекламы × регион: разные креативы для разных регионов.
- Пол × тип: если adv_type=2 на женщинах CTR в 3× выше — пушить.
Подводные камни
- CTR ≠ конверсия. Высокий CTR может означать кликбейт, но низкий ROI. В идеале — оптимизировать ROAS.
- Симсон: высокий CTR в одном сегменте может быть из-за смещённой выборки.
- Class imbalance: кликов в 10–100 раз меньше показов; в LightGBM использовать
is_unbalance=Trueилиscale_pos_weight. - Если данные одного рекламодателя — feature importance не обобщается на других.
- На малых сегментах (impr < 100) CTR шумный — фильтр обязателен.
Эталонный ответ
Сегментный CTR + бустинг-классификатор клика; рекомендации — таргетинг по комбинациям (час, девайс, возраст, регион) с CTR заметно выше медианы.