Балл есептеу ережелерінің A/B-тестілері
Ұпай есептеу - кез келген ойынның жүрегі. Ойыншылардың мінез-құлқы, қатысу құрылымы және экономика (ARPPU, бонус-сүйектер) ұпайлардың нақты қалай саналатынына байланысты. Төменде - практикалық рецепт, көзілдіріктің жаңа ережесін тестілеу және метриканың артефакт емес, шынайы болуына көз жеткізу.
1) Нені тестілейміз
Ережелер мысалдары:- Ставкалардың сомасы бойынша: әр €1 ставка үшін 1 ұпай.
- win/bet мультипликаторы бойынша: көзілдірік =, көбейткіш ×, бір мөлшерлемеге каппен.
- Гибрид: айналымы үшін көзілдірік + «сериясы» үшін буст (қатарынан N спин), минут/сағат бойынша капалар.
- Миссиясы: үдемелі күрделілікпен міндеттерді (T1...Tn) орындағаны үшін фикс-көзілдірік.
Гипотеза (мысал): "Мультипликатор + кап" моделі Net ARPPU-ны нашарлатпай (сыйлықтар/бонустардан кейін) participation_net және completion rate арттырады ".
2) Эксперименттік бірлік және рандомизация
Бірлік: пайдаланушы (сессия емес, құрылғы емес).
Бөлу: тұздары бар статикалық хэш (user_id → bucket); A/B/C үшін 50/50 немесе 33/33/33 үлестер.
Стратификация (ұсынылады): payer-status (жаңа төлеушілер/қайта төлеушілер/төлемеушілер), платформа, гео.
Sticky-assignment: пайдаланушы әрқашан тест барысында бір ережені көреді.
SRM (Sample Ratio Mismatch) тексеру: күн сайын топтардың нақты үлестерін күтілгендермен (хи-квадрат) салыстырыңыз. SRM - трафиктің ағып кету сигналы, қате сүзу, ақаулар.
3) Метрика және «көзілдірік шұңқыры»
Белсенділік және қатысу
Reach: оқиғаны көрген үлес.
Participation_gross: кірді/eligible.
Participation_net: ілгерілеу басталды/eligible.
Completion: аяқталды/басталды.
Сапа және ақша
ΔDAU/WAU и stickiness (DAU/WAU).
Avg Bets per Session, Avg Bet Size.
ARPPU (net) = ARPPU − (Prize + Bonus Cost per payer).
Avg Deposit, Paying Share.
Net Uplift: (қосымша түсім) − (сыйлықтар + бонустар + операциялық + фрод-ағулар).
Киім ілетін орындар
1000 юзерге шағымдар/техникалық қолдау, KYC бойынша бас тартулар, аномальды ставкалар паттерндері, RG-жалаулар (лимиттер, өздігінен алып тастау).
4) Ұзақтығы, маусымдылығы және жаңалығы
Кем дегенде 2 толық бизнес-цикл (мысалы, демалыс күндерін алу үшін 2 апта).
novelty-effect ескеріңіз: алғашқы 48-72 сағ. (D0-D2, D3-D7, D8 +).
Ірі жарнамаларды кесіп өтпеу немесе топтар бойынша «тең шуды» жоспарлау.
5) Іріктеменің қуаты мен көлемі (есептеу мысалы)
Мақсаты: орташа «пайдаланушы көзілдірігі» (немесе Net ARPPU) бойынша Δ айырмашылығын табу.
Екі іріктемелі t-тестіге арналған формула (топтарда тең):[
n_{\text{на}} =\frac {2, (z_{1-\alpha/2}+z_{1-\beta}) ^ 2 ,\sigma ^ 2} {\Delta ^ 2}
]
Мысалы: Δ = 5 ұпай ұстағымыз келеді, σ = 120, α = 0,05 (екі жақты), қуаты 80% (β = 0,2).
(z_{1-α/2}=1{,}96), (z_{1-β}=0{,}84) → қосындысы 2,8 → шаршы 7,84.
(\sigma^2 = 14,400).
(n =\frac {2\times 7 {,} 84\times 14,400} {25 }\approx\frac {225,792} {25 }\approx 9,032) топқа.
6) Дисперсияны төмендету: тест «арзан»
CUPED: тест алдындағы ковариаттарға регрессиялық түзету (мысалы, өткен аптадағы көзілдірік/ставкалар).
Ковариаттар: payer-ту, айналым лог-трансформдері, белсенділік, платформа, гео.
Қателерді кластерлеу: пайдаланушы деңгейінде (ішіндегі қайталанған сессиялар).
7) Интерференция және «бұғаздар»
Ұпай ережесі тест қатысушыларына ғана әсер етпейді:- Әлеуметтік салыстыру (жалпы лидборд) → «spillover».
- Ортақ джекпоттар/бірлескен миссиялар → кросс-эффект.
- Топтар бойынша жеке көшбасшы борттар немесе көзілдіріктерді жасырын қалыпқа келтіру.
- Трафик/гео кластерлері бойынша кластерлік рандомизация (қымбат, бірақ таза).
- Пер-хаттама (ITT) + сезімтал талдаулар.
8) Антифрод және ереже қақпақтары
Көзілдіріктің кез келген өзгерісі оңтайландыруды ынталандырады: микроставкалар, бот шаруашылығы, «көзілдірік фермасы».
Ең аз қорғаныс:- Көзілдірік қақпағы минутына/сағатына/тәулігіне және бір ставка үшін.
- Мөлшерлемелердің ең төменгі құбылмалылығы («мінсіз» реттілікке тыйым салу).
- headless/қайталанатын fingerprints, прокси детекциясы
- Ірі жүлделердің кейінге қалдырылған верификациясы + KYC.
- Талдау: «көзілдірік/мөлшерлеме» және «көзілдірік/мин» бөлуді салыстыру, қалдықтарды іздеу.
9) Оқиғалар және деректер схемасы (ең аз)
Оқиғалар:- `session_start {user_id, ts, platform}`
- `event_view {user_id, event_id, ts}`
- `event_join {user_id, event_id, ts}`
- `points_awarded {user_id, event_id, rule_id, amount, source, ts}`
- `mission_progress {user_id, mission_id, step, value, ts}`
- `mission_complete {user_id, mission_id, ts}`
- `bet {user_id, game_id, bet, win, ts}`
- `deposit {user_id, amount, ts}`
- `rules {rule_id, name, params, caps_minute, caps_hour, caps_day, version}`
- `assignments {user_id, test_id, group, assigned_at}`
10) Талдау үшін SQL-скетч
SRM-тексеру (топтар бойынша бөлу):sql
SELECT group, COUNT() AS users
FROM assignments
WHERE test_id =:test
GROUP BY group;
- - одан әрі күтілетін үлестерге қарсы хи-квадрат
Participation/Completion топтары бойынша:
sql
WITH eligible AS (
SELECT user_id FROM users
WHERE last_active_at >=:start - INTERVAL '14 day'
), joined AS (
SELECT DISTINCT user_id FROM event_join
WHERE event_id =:event AND ts BETWEEN:start AND:end
), started AS (
SELECT DISTINCT user_id FROM mission_progress
WHERE ts BETWEEN:start AND:end AND mission_id IN (:missions)
), completed AS (
SELECT DISTINCT user_id FROM mission_complete
WHERE ts BETWEEN:start AND:end AND mission_id IN (:missions)
)
SELECT a. group, COUNT(DISTINCT j. user_id)::float/COUNT(DISTINCT e. user_id) AS participation_gross, COUNT(DISTINCT s. user_id)::float/COUNT(DISTINCT e. user_id) AS participation_net, COUNT(DISTINCT c. user_id)::float/NULLIF(COUNT(DISTINCT s. user_id),0) AS completion
FROM eligible e
JOIN assignments a USING (user_id)
LEFT JOIN joined j USING (user_id)
LEFT JOIN started s USING (user_id)
LEFT JOIN completed c USING (user_id)
WHERE a. test_id =:test
GROUP BY a. group;
Net ARPPU және сыйлықтар/бонустар құны:
sql
WITH payors AS (
SELECT DISTINCT user_id FROM payments
WHERE ts BETWEEN:start AND:end
), rev AS (
SELECT user_id, SUM(ggr) AS ggr
FROM revenue
WHERE ts BETWEEN:start AND:end
GROUP BY user_id
), costs AS (
SELECT user_id, SUM(prize + bonus) AS cost
FROM promo_costs
WHERE ts BETWEEN:start AND:end
GROUP BY user_id
)
SELECT a. group, AVG(COALESCE(r. ggr,0) - COALESCE(c. cost,0)) FILTER (WHERE p. user_id IS NOT NULL) AS net_arppu
FROM assignments a
LEFT JOIN payors p USING (user_id)
LEFT JOIN rev r USING (user_id)
LEFT JOIN costs c USING (user_id)
WHERE a. test_id =:test
GROUP BY a. group;
CUPED (мысал):
sql
-- pre_value: көзілдірік/тестке дейінгі түсім; value: тест кезінде
SELECT group, AVG(value - theta pre_value) AS cuped_mean
FROM (
SELECT a. group, x.user_id, x.value, x.pre_value, (SELECT COVAR_SAMP(value, pre_value)/VAR_SAMP(pre_value)
FROM x) AS theta
FROM assignments a
JOIN x ON x.user_id = a. user_id
WHERE a. test_id =:test
) t
GROUP BY group;
11) Жеке әсерлер және гетерогенділік
HET эффекттерін тексеріңіз:- Жаңа келгендер vs core, low-value vs high-value, әртүрлі платформалар/гео.
- Кейде көзілдіріктің жаңа формуласы киттерді өзгертпей mid-core-ді «тұтатады» - бұл қажетті нәтиже.
- «p-hacking» ұстамас үшін сегменттерді алдын ала тіркеңіз.
12) Жиі тұзақтар
1. Барлық топтар үшін ортақ лидборд → интерференция.
2. Тест кезінде жүлделердің құрылымын өзгерту → теңдестірілмеушілік.
3. Фарм көзілдірік микроставкалары → қалыпсыз uplift.
4. SRM және ETL → жылжытылған бағалардағы «қалқымалы сүзгілер».
5. Сыйлықтар/бонустар шегерілмей «лас» ARPPU-ға сүйену.
6. Дұрыс дәйекті статистикасыз флюктуация салдарынан ерте тоқта.
13) Байес vs жиілік және дәйекті шешімдер
Фреймворк: әсіресе уақыттағы мониторинг кезінде Байес тәсілін пайдалануға болады (метрикадан кейінгі айырмашылық, «B жақсы A» ықтималдығы).
Абайлаңыз: көзілдірік ережелерінің бендиттері бастапқы валидацияда емес, пайдалану кезеңінде uplift расталғаннан кейін орынды.
14) Жауапты ойын және комплаенс
Ашық ережелер мен кепкалар: ойыншы ұпай жинауды түсінуі тиіс.
Белсенділік және депозиттер, «үзілістер» және RG-кеңестер лимиттері.
Ойын стилі үшін жасырын «айыппұл» жоқ.
15) Шағын кейс (синтетикалық)
Контекст: апталық ивент, А = «€1 ставка үшін көзілдірік», В = «win/bet мультипликаторы бойынша көзілдірік, кап = 50/ставка».
Өлшемі: 2 × 10 000 пайдаланушы, payer-мәртебесі бойынша стратификация. SRM - шамамен.
Нәтижелері:- Participation_net: A 17,3% → B 22,1% (+4,8 п.п.).
- Completion: A 38,9% → B 44,0% (+5,1 п.п.).
- Net ARPPU: A €41,2 → B €43,5 (+ €2,3) Prize + Bonus per payer ≈ €6,4 (өзгерген жоқ).
- Шағымдар/1k: өзгеріссіз; фрод-жалаулар ↓ каптар есебінен 0,3 п.т.
- Қорытынды: В ережесі - жеңімпаз; жүлделердің «ұзын құйрығымен» масштабтаймыз және қақпақтарды сақтаймыз.
16) Ұяшықтар бойынша A/B ұшырудың чек-парағы
- Бірлік = пайдаланушы, sticky-assignment, стратификация.
- Интерференцияны алып тастау үшін бөлек жетекші борттар/қалыпқа келтіру.
- Көзілдіріктерге, антибот сигналдарына, ірі жүлдегерлерге арналған KYC.
- Гипотезалар мен метриктерді қайта тіркеу (primary/secondary/guardrails).
- Қуат және ұзақтық жоспары, маусымдылық ескерілді.
- CUPED/ковариаттар қосылған, SRM-алерт пайплайны.
- Дашборд «Reach → Participation → Progress → Completion → Value».
- Есеп: жүлделерден/бонустардан кейін ақшамен инкремент, post-effect құйрығы.
Ұпай есептеу ережесі - мінез-құлық тұтқасы. Дұрыс жобаланған A/B-тест (SRM-сіз, антифродпен және ковариатпен) ойыншылардың сенімін және науқан экономикасын сақтай отырып, қатысуды, completion және Net ARPPU-ны қауіпсіз ұлғайтуға мүмкіндік береді.