Growth 3: A/B Testlash va Statistik Rigor — MDE, Sample Size, p-value va Peeking Xatosi
📈 Growth Engineering
Growth 3: A/B Testlash va Statistik Rigor — MDE, Sample Size, p-value va Peeking Xatosi
Holat: 2026-yil sentabr. "Menga yangi tugma yoqyapti, keling uni chiqaramiz" — degan yondashuv muhandislik emas. Growth Engineering qat'iy statistik tekshirilgan tajribalar (Controlled Experiments) ustiga quriladi. Agar A/B test noto'g'ri tashkil qilinsa, siz mahsulotni rivojlantirish o'rniga tasodifiy shovqinni (random noise) muvaffaqiyat deb o'ylab, xatoga yo'l qo'yasiz. Ushbu darsda statistik xavfsiz testlash qoidalari tushuntiriladi.
Mundarija
- Gipoteza tuzishning ilmiy standarti
- Statistik parametrlar: Alfa, Beta, Power va MDE
- Namuna hajmini (Sample Size) hisoblash
- Eng katta xato: "Peeking Problem" (Erta to'xtatish)
- Swift'da deterministik Feature Flag va foydalanuvchini guruhlash
- Amaliy Python: A/B test davomiyligini hisoblagich
- Xulosa
- Manbalar
1. Gipoteza tuzishning ilmiy standarti {#gipoteza}
Har bir eksperiment aniq shablon bo'yicha yoziladi:
"Agar biz [o'zgarish X] qilsak, unda [metrika Y] [Z%] ga oshadi, chunki [sabab R]."
Misol: "Agar biz ro'yxatdan o'tishni to'liq ekranni ko'rishdan oldin emas, birinchi dars tugagandan keyin so'rasak (X), 1-kunlik faollik konversiyasi (Y) 15% ga oshadi (Z), chunki foydalanuvchi hisob ochishdan oldin ilovaning haqiqiy foydasini his qiladi (R)."
2. Statistik parametrlar: Alfa, Beta, Power va MDE {#statistika}
- Nol gipoteza ($H_0$): Boshqaruv (Control) va Sinov (Variant) guruhlari o'rtasida hech qanday farq yo'q.
- I turdagi xato ($\alpha$ — False Positive): Farq yo'q bo'lsa-da, "farq bor" deb xulosa chiqarish. Sanoat standarti: $\alpha = 0.05$ (95% ishonchlilik darajasi).
- II turdagi xato ($\beta$ — False Negative): Haqiqiy farq bor bo'lsa-da, uni sezmay qolish. Standart: $\beta = 0.20$ (Statistik quvvat $1 - \beta = 80\%$).
- MDE (Minimum Detectable Effect): Siz aniqlamoqchi bo'lgan minimal o'zgarish darajasi (masalan, konversiyani 5% dan 5.5% ga oshirish, MDE = 10%).
3. Namuna hajmini (Sample Size) hisoblash {#sample-size}
Testni boshlashdan oldin har bir guruhga nechtadan foydalanuvchi kerakligini hisoblash shart. Binomial metrikalar (masalan, Click yoki Purchase) uchun Evan Miller formulasi:
$$n \approx \frac{16 \cdot p \cdot (1 - p)}{\Delta^2}$$
Bu yerda $p$ — boshlang'ich konversiya, $\Delta$ — mutlaq kutilayotgan o'zgarish ($p \times \text{MDE}$).
4. Eng katta xato: "Peeking Problem" (Erta to'xtatish) {#peeking}
Eng keng tarqalgan xato — har kuni ertalab dashboard'ga qarab, $p < 0.05$ bo'lishi bilan testni darhol g'olib deb to'xtatish.
- Nega bu xato? Vaqtinchalik tebranishlar tufayli p-value test davomida bir necha bor 0.05 dan pastga tushib chiqadi.
- Agar siz har kuni "mo'ralab" qarasangiz, sizning haqiqiy xato qilish ehtimolingiz (False Positive Rate) 5% dan 30-40% gacha oshib ketadi!
- Qoida: Test belgilangan namuna hajmiga yetgunga qadar yoki to'liq 1-2 haftalik sikl (hafta kunlari tsikli) tugamaguncha xulosa chiqarilmaydi.
5. Swift'da deterministik Feature Flag va foydalanuvchini guruhlash {#swift-flags}
Foydalanuvchini A yoki B guruhiga tasodifiy (Double.random()) ajratish mumkin emas — har safar app ochilganda foydalanuvchi bir xil guruhda qolishi shart. Buning uchun deterministik heshlash qo'llaniladi:
import Foundation
public enum ExperimentGroup: String, Sendable {
case control = "Control"
case variant = "Variant"
}
public struct ExperimentManager: Sendable {
public static func assignGroup(userId: String, experimentKey: String) -> ExperimentGroup {
let combined = "\(userId):\(experimentKey)"
// Oddiy va tezkor deterministik hesh:
let hash = abs(combined.hashValue)
let bucket = hash % 100
// 50/50 taqsimot:
return bucket < 50 ? .control : .variant
}
}
6. Amaliy Python: A/B test davomiyligini hisoblagich {#python-ab}
Quyidagi skript ilovangizning kunlik trafigiga qarab, eksperimentni necha kun yurgizish kerakligini hisoblab beradi:
import math
def calculate_ab_sample_size(baseline_conv, mde_relative, daily_traffic):
# Standart koeffitsient (alpha=0.05, power=0.80 uchun taxminan 16):
delta = baseline_conv * mde_relative
p = baseline_conv
variance = p * (1 - p)
# Har bir guruh uchun talab qilinadigan foydalanuvchilar:
n_per_variant = math.ceil((16 * variance) / (delta ** 2))
total_required = n_per_variant * 2
required_days = math.ceil(total_required / daily_traffic)
print(f"Boshlang'ich konversiya: {baseline_conv * 100:.1f}%")
print(f"Kutilayotgan nisbiy o'sish (MDE): {mde_relative * 100:.1f}%")
print(f"Har bir variant uchun zarur namuna: {n_per_variant:,} kishi")
print(f"Jami zarur auditoriya: {total_required:,} kishi")
print(f"Tavsiya etilgan test davomiyligi: {required_days} kun")
# Misol: Kuniga 1000 ta tashrif, 5% lik checkout konversiyasini 10% ga oshirish:
calculate_ab_sample_size(baseline_conv=0.05, mde_relative=0.10, daily_traffic=1000)
7. Xulosa {#xulosa}
- A/B testlar shaxsiy hissiyotlar va taxminlarni ob'ektiv ma'lumotlar bilan almashtiradi.
- Kichik auditoriyada juda kichik farqlarni (masalan 1% lik MDE) o'lchashga urinmang — buning uchun oylab vaqt ketishi mumkin.
- Peeking muammosidan qoching: g'olibni faqat rejalashtirilgan namuna hajmi to'plangach e'lon qiling.