Balların hesablanması qaydalarının A/B testləri
Xal - hər hansı bir oyun ürəyi. Oyunçuların davranışı, iştirak strukturu və iqtisadiyyatı (ARPPU, bonus bonuslar) xalların dəqiq sayılmasından asılıdır. Aşağıda - xalların yeni qaydasını test etmək və metriklərin artefakt deyil, real olduğundan əmin olmaq üçün praktik resept.
1) Biz nəyi test edirik
Qaydaların nümunələri:- Bahislərin cəmi üzrə: hər €1 bahis üçün 1 xal.
- win/bet multiplikatoruna görə: eynək = bir çarpan × bir bahis üçün kapla.
- Hibrid: dövriyyə üçün xal + «seriyası» üçün but (ardıcıl N spins), dəqiqə/saat kaplar.
- Missiyalar: artan çətinliklə tapşırıqları (T1...Tn) yerinə yetirmək üçün fiks-xal.
Hipotez (nümunə): «Model «multiplikator + cap» Net ARPPU (mükafatlar/bonuslar sonra) pisləşmədən participation_net və completion rate artıracaq «.
2) Eksperimental vahid və randomizasiya
Vahid: istifadəçi (nə seans, nə cihaz).
Paylama: sabit duzlar ilə statik hash (user_id → bucket); A/B/C üçün 50/50 və ya 33/33/33 payları.
Stratifikasiya (tövsiyə olunur): payer-status (yeni ödəyən/təkrar ödəyən/ödəməyən), platforma, geo.
Sticky-assignment: istifadəçi həmişə test zamanı eyni qaydanı görür.
SRM (Sample Ratio Mismatch) yoxlaması: qrupların faktiki paylarını gündəlik olaraq gözlənilənlərlə (hi-kvadrat) müqayisə edin. SRM - trafik sızması, səhv filtrasiya, hata siqnalı.
3) Metriklər və «gözlük hunisi»
Aktivlik və iştirak
Reach: hadisəni görən pay.
Participation_gross: daxil/eligible.
Participation_net: tərəqqi başladı/eligible.
Completion: tamamlandı/başladı.
Keyfiyyət və pul
Δ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: (əlavə gəlir) − (mükafatlar + bonuslar + əməliyyat + sərbəst sızmalar).
Qarderoblar
1000 istifadəçiyə şikayət/texniki dəstək, KYC-dən imtina, anormal bahis nümunələri, RG bayraqları (limitlər, özünü istisna).
4) Uzunluq, mövsümilik və yenilik
Minimum 2 tam iş dövrü (məsələn, 2 həftə həftə sonu tutmaq üçün).
novelty-effect nəzərə alın: ilk 48-72 saat sıçrayış qeyd və fazaları təhlil (D0-D2, D3-D7, D8 +).
Böyük promo ilə keçməyin və ya qruplar üzrə «bərabər səs-küy» planlaşdırın.
5) Seçmə gücü və həcmi (hesablama nümunəsi)
Məqsəd: orta «istifadəçi başına xal» (və ya Net ARPPU) Δ fərqini aşkar etmək.
İki seçim t-testi üçün formula (qruplarda bərabər):[
n_{\text{na qrupu}} =\frac {2, (z_{1-\alpha/2}+z_{1-\beta}) ^ 2 ,\sigma ^ 2} {\Delta ^ 2}
]
Məsələn: tutmaq istəyirik Δ = 5 xal, σ = 120, α = 0,05 (ikitərəfli), gücü 80% (β = 0,2).
(z_{1-α/2}=1{,}96), (z_{1-β}=0{,}84) → cəmi 2,8 → kvadrat 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) Dispersiyanın azaldılması: testi «ucuz» edirik
CUPED: Test öncəsi kovariatlar üçün reqressiya düzəlişi (məsələn, son bir həftə üçün xal/dərəcələr).
Kovariatlar: payer-bayraq, log-transformlar dövriyyəsi, fəaliyyət, platforma, geo.
Səhvlərin klasterləşdirilməsi: istifadəçi səviyyəsində (daxili təkrar sessiyalar).
7) İnterferensiya və «boğazlar»
Xal qaydası yalnız test iştirakçılarına təsir edə bilməz:- Sosial müqayisə (ümumi liderbord) → «spillover».
- Ümumi jekpotlar/birgə missiyalar → cross effekti.
- Ayrı-ayrı qruplar və ya gizli xalların normallaşması.
- Trafik/geo klasterləri üzrə klaster randomizasiyası (daha bahalı, lakin daha təmiz).
- Per-protokol (ITT) + həssas analizlər.
8) Antifrod və Cap qaydaları
Hər hansı bir eynək dəyişikliyi optimizasiyanı stimullaşdırır: mikroskop, robot istehsalı, «eynək ferması».
Minimum qorunma:- Bir dəqiqə/saat/gün və bir bahis üçün cap xal.
- Minimum bahis dəyişkənliyi («ideal» ardıcıllıqların qadağan edilməsi).
- Deteksiya headless/təkrarlanan fingerprints, proxy.
- Böyük mükafatların gecikmiş yoxlanılması + KYC.
- Analitika: «xal/bahis» və «xal/dəq» paylama müqayisə, quyruqları axtarın.
9) Hadisələr və verilənlər sxemi (minimum)
Hadisələr:- `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-analiz eskizləri
SRM-yoxlama (qruplar üzrə paylama):sql
SELECT group, COUNT() AS users
FROM assignments
WHERE test_id =:test
GROUP BY group;
-- gözlənilən paylara qarşı hi-kvadrat
Participation/Completion qrupları üzrə:
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 və mükafatların/bonusların dəyəri:
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 (nümunə):
sql
-- pre_value: testdən əvvəl xal/gəlir; value: test zamanı
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) Xüsusi effektlər və heterogenlik
HET effektlərini yoxlayın:- Yeni başlayanlar vs core, low-value vs high-value, müxtəlif platformalar/geo.
- Bəzən balinaları dəyişdirmədən mid-core-nin yeni formulu istədiyiniz nəticədir.
- «p-hacking» tutmamaq üçün seqmentlərin əvvəlcədən qeydiyyatını edin.
12) Tez-tez tələlər
1. Bütün qruplar üçün ümumi liderbord → interferensiya.
2. Test zamanı mükafatların strukturunun dəyişdirilməsi → müqayisə olunmazlıq.
3. Pharm gözlük mikro dərəcələri → qeyri-sabit uplift.
4. SRM və ETL → sürüşmə qiymətləndirmələrində «üzən filtrlər».
5. Mükafatlar/bonuslar çıxılmadan «çirkli» ARPPU-ya güvən.
6. Düzgün ardıcıl statistika olmadan fluktuasiyaya görə erkən stop.
13) Bayes vs tezlik və ardıcıl həllər
Framework: Bayes yanaşmasından istifadə edə bilərsiniz (metriklərin post-serial fərqi, «B A-dan yaxşıdır» ehtimalı), xüsusən də zaman monitorinqində.
Diqqətli olun: eynək qaydaları üçün banditlər təsdiqlənmiş upliftdən sonra uyğundur - əməliyyat mərhələsində, ilkin validasiyada deyil.
14) Məsuliyyətli oyun və uyğunluq
Şəffaf qaydalar və qapaqlar: oyunçu xal qazanmağı başa düşməlidir.
Aktivlik və depozitlərin limitləri, «fasilələr» və RG məsləhətləri.
Oyun tərzi üçün gizli «cərimələr» yoxdur.
15) Mini case (sintetik)
Kontekst: həftəlik tədbir, A = «€1 bahis üçün xal», B = «win/bet multiplikatoru üzrə xal, cap = 50/bahis».
Ölçüsü: 2 × 10 000 istifadəçi, payer statusuna görə təbəqələşmə. SRM - təqribən.
Nəticələr:- 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 (dəyişməyib).
- Şikayətlər/1k: dəyişməz; frod bayraqları kaplar hesabına ↓ 0,3 p.p.
- Nəticə: B qaydası - qalib; mükafatların «uzun quyruğu» ilə ölçmək və qapaqları saxlamaq.
16) Xal üzrə A/B buraxılış çek siyahısı
- Vahid = istifadəçi, sticky-assignment, stratifikasiya.
- Ayrı lider bordları/müdaxiləni aradan qaldırmaq üçün normallaşma.
- Eynək, antibot siqnalları, KYC böyük mükafatçılar üçün aydın kaplar.
- Hipotezlərin və metriklərin yenidən qeydiyyatı (primary/secondary/guardrails).
- Güc və müddət planı, mövsümilik nəzərə alınır.
- CUPED/kovariatlar bağlı, SRM-alert payline.
- Дашборд «Reach → Participation → Progress → Completion → Value».
- Hesabat: mükafatlardan/bonuslardan sonra pulda inkrement, post-effect quyruğu.
Xal qaydası davranış qoludur. Düzgün dizayn edilmiş A/B testi (SRM olmadan, antifrod və hiyləgərlərlə) oyunçuların etibarını və kampaniya iqtisadiyyatını qoruyaraq iştirakın, completion və Net ARPPU-nun təhlükəsiz artmasına imkan verir.