Условие
Дан датасет sales-статистики платного приложения по дням: дата, день недели, цена (2.99 / $9.99), общее число установок (маркетинг + органик), показы (impressions), клики, CTR%, Conversion%, маркетинговый бюджет, инсталлы из marketing-кампаний, CPI.
Нужно ответить на 4 вопроса:
- При какой цене приложение максимизирует маржу (Revenue − Marketing spend)?
- Какие факторы влияют на общее число установок? Какой влияет сильнее? Оценить через регрессию (значимость и величину).
- Спрогнозировать установки при цене $19.99. Как изменится маржа? Стоит ли поднимать цену?
- Презентовать результаты в двух форматах: подробно для senior-аналитика и кратко для маркетинг-менеджера.
Решение
Шаг 1. EDA и feature engineering
import pandas as pd
import numpy as np
df = pd.read_excel("apalon_task3.xlsx", sheet_name="Task3")
df["Date"] = pd.to_datetime(df["Date"])
df["price"] = df["Application price"].str.replace("$", "", regex=False).astype(float)
df["marketing_spend"] = df["Marketing spend"].str.replace("[$,]", "", regex=True).astype(float)
df["installs"] = df["Total app installs (marketing+organic from store)"].astype(int)
# Маржа
df["revenue"] = df["installs"] * df["price"]
df["margin"] = df["revenue"] - df["marketing_spend"]
# По цене
df.groupby("price").agg(
days=("installs","count"),
avg_installs=("installs","mean"),
avg_revenue=("revenue","mean"),
avg_spend=("marketing_spend","mean"),
avg_margin=("margin","mean"),
)Важно: наблюдательный датасет. Цена менялась продакт-командой, не случайно — могут быть смещения.
Шаг 2. Q1 — максимум маржи
Прямой ответ — по historical group-by: средняя маржа по цене.
Но день-дни внутри одной цены могут отличаться по бюджету маркетинга. Лучше рассматривать маржу на дневной бюджет или маржу на impressions, чтобы убрать эффект «в одну неделю крутили рекламу больше».
Если глядим на сырые средние (типичный результат для такого датасета): $1.99 даёт максимальную маржу — за счёт высокой conversion и большего объёма установок, несмотря на низкую цену единицы.
Шаг 3. Q2 — регрессия для установок
Зависимая: installs. Предикторы: price, impressions, CTR, conversion, marketing_spend, day_of_week.
import statsmodels.api as sm
X = df[["price","impressions","CTR_%","Conversion_%","marketing_spend"]].copy()
X = sm.add_constant(X)
y = df["installs"]
model = sm.OLS(y, X).fit()
print(model.summary())Ключевые проверки:
- Коллинеарность:
marketing_spend≈clicks * CPC≈impressions * CTR * CPC. VIF может быть зашкальный. Решение — выбирать одну переменную из тесно связанных. - Стандартизация коэффициентов (z-score фичей) → чтобы сравнить «силу влияния».
- Логарифмировать installs и impressions (степенная связь).
- Доверительные интервалы на коэффициенты.
Типовые выводы:
price: сильный отрицательный эффект (выше цена → меньше установок).Conversion%: сильный положительный.impressions: положительный, но с насыщением.marketing_spend: положительный, но мог быть «съеден» impressions/clicks.
«Кто влияет сильнее» — по стандартизованным коэффициентам.
Шаг 4. Q3 — прогноз для $19.99
Опасный момент: 9.99). Любая регрессия даст значение, но его доверие низкое. Лучше:
- Подгонять log-log модель
log(installs) ~ log(price)— даёт эластичность ε. - С учётом найденной эластичности: при росте цены с 19.99 (+100%) installs упадут на ε × 100%.
- Считаем revenue и margin в новой точке.
import numpy as np
cols = ["price", "impressions", "CTR_%", "Conversion_%"]
# Все эти величины строго > 0 в нашем датасете → берём чистый log,
# log1p здесь не нужен (+1 в данных, где минимум — это $0.99 / 100 показов, бессмысленно).
X_log = np.log(df[cols].values)
y_log = np.log(df["installs"].clip(lower=1)) # clip защищает от установок = 0
X_log = sm.add_constant(X_log)
model_log = sm.OLS(y_log, X_log).fit()
# ε по price = коэффициент при log(price): относительная чувствительность.
print(model_log.summary())
eps_price = model_log.params[1] # const = params[0]Эластичность считаем по данным, не из «обычных книжных ε ≈ -1». Реальная ε зависит от продукта/категории/гео. Только после того как ε оценена на наших данных и стат-значима — экстраполируем; в противном случае честнее сказать «нужен ценовой A/B-тест».
Вывод: поднимать цену до $19.99 невыгодно при текущей эластичности. Если хочется проверить — провести A/B-тест по цене на ограниченных географиях (price experiment), а не экстраполировать.
Шаг 5. Q4 — презентация
Для senior-аналитика
- Описание данных, периоды.
- Распределения, корреляционная матрица, VIF.
- Регрессия log-log с CI, R² adjusted, residual plot.
- Эластичности.
- Подходы к экстраполяции и предупреждение о её ненадёжности.
Для маркетинг-менеджера (1 слайд)
- 1 график: Margin vs Price (бары).
- 1 строка: «Лучшая цена — X/день; $9.99 даёт меньше за счёт обвала установок».
- 1 строка: «$19.99 не рекомендуем: ожидаемое падение установок ~60%, маржа ниже на ~40%. Если хотим проверить — нужен A/B-тест на регионе».
Подводные камни
- Маржа = revenue − marketing, не «revenue». Прибыль приложения учитывает спенд, иначе оптимум сместится в сторону высокой цены.
- Наблюдательность данных. Цены менялись по решению продакта, возможно — в ответ на низкие установки. Это endogeneity: «price ↑ когда installs ↓» — обратная причинность.
- Multicollinearity. Spend, clicks, impressions сильно коррелированы. Одна модель с ними всеми даст нестабильные коэффициенты.
- Экстраполяция. $19.99 далеко за пределами наблюдённого диапазона. Точечная оценка вводит в заблуждение, нужен большой CI.
- Сезонность и день недели. Без
day_of_week, без скользящей не учитываются паттерны. - Линейная регрессия для нелинейного процесса. Эластичность спроса — мультипликативная. log-log правильнее.
- Marketing-инсталлы vs органика. В таком датасете часто видно, что часть органики «рождается» из marketing-impressions (halo-effect). Не учитывать — ошибка.
- Маленький датасет. Если за период было всего 4–5 раз меняли цену, то обобщение неустойчиво. Уточнить sample size.
Эталонный ответ
- Q1: по сырым средним лучшую маржу даёт цена
$1.99(большой объём установок и conversion перевешивают низкую цену единицы); это base-line, который надо валидировать. - Q2: log-log регрессия
installs ~ price + conversion + impressions + spend(стандартизованные коэффициенты, проверка VIF). Сильнее всего влияет цена (отрицательно) и конверсия (положительно). - Q3: при цене $19.99 экстраполяция по эластичности ε ≈ -1..-1.5 даёт падение установок ~60% и снижение маржи. Не рекомендуем поднимать цену; для проверки — A/B-тест по цене на отдельной географии.
- Q4: для аналитика — полный отчёт с регрессией, CI, тестами и предупреждениями; для менеджера — 1 слайд: график маржи по цене, текущая оптимум 19.99 + предложение price-experiment.