Короткий ответ
Конверсия по группе — это доля пользователей с converted=1 внутри группы; lift — относительная разница конверсии группы B к группе A, которую считают после агрегации по группам.
Как это работает подробнее
группировка по колонке group и агрегация среднего по converted (0/1) напрямую даёт долю сконвертировавшихся, так как среднее бинарной переменной равно её доле.
Пример кода
example.py
import pandas as pd
df = pd.DataFrame({
"user_id": [1, 2, 3, 4, 5, 6],
"group": ["A", "A", "A", "B", "B", "B"],
"converted": [0, 1, 0, 1, 1, 0],
})
cr = df.groupby("group")["converted"].mean()
lift = (cr["B"] - cr["A"]) / cr["A"]
print(cr, lift)Что использовать на практике
- перед расчётом стоит убедиться, что в датафрейме нет дублей user_id внутри одной группы и нет пользователей, присутствующих в обеих группах — это первый sanity check перед любым анализом.
- Ожидаемый результат: cr_A = 0.333, cr_B = 0.667, lift ≈ 1.0 (рост конверсии на 100%). Sanity check: df.groupby("user_id")["group"].nunique().max() должен быть равен 1 — каждый пользователь только в одной группе.
Подводные камни
- расчёт конверсии на уровне строк-событий вместо уникальных пользователей, когда у одного пользователя несколько строк (например, несколько попыток), что искажает долю converted.