IlmHamroh
Data Science va sun'iy intellekt/Gipoteza testlari2/10-dars19 daqiqa
Mundarija (22)

11.2-dars: Statistik quvvat va namuna hajmi

11-QISM — GIPOTEZA TESTLARI · 2-dars


1. Kirish va motivatsiya

11.1-darsda ikki xato turini ko'rdik: I tur (yolg'on kashfiyot) va II tur (haqiqiy farqni o'tkazib yuborish). Amalda birinchisi haqida hamma o'ylaydi (alfa = 0.05), ikkinchisi esa unutiladi — natijada quvvati yetmagan testlar o'tkaziladi: ular haqiqiy ta'sirni ko'ra olmaydi, lekin baribir "natija" e'lon qilinadi.

Quvvat — haqiqiy farq mavjud bo'lganda uni aniqlash ehtimoli (1 - beta). Quvvati past test ikki tomondan zararli: (1) haqiqiy yaxshilanishni "ishlamaydi" deb rad etadi; (2) agar tasodifan "muhim" natija chiqarsa, u odatda haqiqiy effektdan ancha katta bo'ladi (g'olib la'nati — winner's curse). Shuning uchun test oldindan loyihalanadi: kerakli namuna hajmi, minimal aniqlanadigan effekt (MDE) va davomiylik hisoblanadi.

Real vaziyat. Mahsulot jamoasi haftada 2 000 foydalanuvchi keladigan sahifada A/B test o'tkazmoqchi, joriy konversiya 4%. Ular "5% nisbiy yaxshilanish" ni ko'rmoqchi (4% → 4.2%). Data Scientist quvvat hisobini qiladi: 80% quvvat va alfa = 0.05 bilan har variant uchun ~154 000 foydalanuvchi kerak — ikki variantga 308 000, ya'ni 154 hafta. Xulosa: bunday kichik effektni bu sahifada o'lchab bo'lmaydi. Variantlar: kattaroq o'zgarish sinash (MDE ni oshirish), trafikni birlashtirish, boshqa metrika (konversiya emas, chek o'rtachasi), yoki testdan voz kechish. Bu hisob bir kunda qilinadi va jamoaning uch yilini tejaydi.

Bu darsda statistik quvvat va namuna hajmini o'rganamiz.

Bu darsda:

  • Quvvat nima va nimaga bog'liq
  • Namuna hajmini hisoblash (o'rtachalar va ulushlar)
  • MDE — minimal aniqlanadigan effekt
  • Simulyatsiya bilan quvvat hisobi
  • G'olib la'nati (past quvvat va bo'rttirilgan effekt)
  • Test davomiyligi va amaliy cheklovlar
  • Quvvat tuzoqlari (post-hoc quvvat)
  • Amaliy: A/B testni loyihalash

ℹ Misollar real numpy/scipy/statsmodels bilan (Python 3.14).


2. Nazariya — chuqur tushuntirish

2.1. Quvvat nima

text
Quvvat = P( H0 ni rad etamiz | H1 rost )  = 1 - beta

Nimaga bog'liq:
  EFFEKT KATTALIGI ↑  → quvvat ↑   (katta farqni ko'rish oson)
  NAMUNA HAJMI n   ↑  → quvvat ↑   (shovqin kamayadi: SE = SD / sqrt(n))
  TARQOQLIK SD     ↑  → quvvat ↓
  ALFA             ↑  → quvvat ↑   (lekin I tur xato oshadi)

Standart maqsad: quvvat = 0.80 (yoki 0.90), alfa = 0.05

Quvvat — testning "sezgirligi": haqiqatda farq bor bo'lsa, uni ko'rish ehtimoli. 80% quvvat — "haqiqiy effektni 5 tadan 4 marta aniqlaymiz" (ya'ni 20% holatda o'tkazib yuboramiz — bu ham kam emas!). Quvvat testdan oldin hisoblanadi: qanday effektni ko'rmoqchimiz, qancha ma'lumot bor, bu yetarlimi. Quvvat — H1 ga bog'liq: "quvvat 80%" deyish faqat aniq effekt kattaligi bilan ma'noga ega.

2.2. Namuna hajmini hisoblash

text
IKKI O'RTACHA (har guruhda n):
  n ≈ 2 × (z_{alfa/2} + z_{beta})^2 / d^2         d = Cohen's d = farq / SD
  alfa = 0.05, quvvat = 0.80 →  (1.96 + 0.84)^2 ≈ 7.85
  n ≈ 15.7 / d^2     (d = 0.5 → n ≈ 63;  d = 0.2 → n ≈ 393)

IKKI ULUSH (konversiya p1 → p2):
  n ≈ (z_{alfa/2} + z_{beta})^2 × (p1(1-p1) + p2(1-p2)) / (p2 - p1)^2

Python (statsmodels):
  from statsmodels.stats.power import TTestIndPower
  TTestIndPower().solve_power(effect_size=0.3, alpha=0.05, power=0.8)
  from statsmodels.stats.proportion import proportion_effectsize
  h = proportion_effectsize(0.042, 0.04)   # Cohen's h

Formuladan ikki muhim xulosa: n effekt kvadratiga teskari proporsional — effektni ikki marta kichik qilsangiz, namuna to'rt marta ko'p kerak; kichik effektlar (d = 0.1) uchun minglab kuzatuv talab qilinadi. Konversiyalarda: bazaviy konversiya kichik bo'lsa (1-5%), kerakli hajm keskin oshadi. Hisobni statsmodels bilan (aniq formulalar) yoki simulyatsiya bilan 2.4-bob qilish mumkin.

2.3. MDE — minimal aniqlanadigan effekt

Ko'pincha savol teskari bo'ladi: "Bizda 10 000 foydalanuvchi bor — qanday farqni ko'ra olamiz?" Javob — MDE (Minimum Detectable Effect): berilgan n, alfa va quvvat bilan aniqlanadigan eng kichik effekt. MDE haqiqatdan katta bo'lsa (masalan, MDE = +3% konversiya, lekin real kutilgan yaxshilanish +0.5%), test ma'nosiz: natija deyarli har doim "muhim emas" bo'ladi. MDE ni biznes bilan muhokama qilish — testni o'tkazish yoki o'tkazmaslik qarorining asosi.

2.4. Simulyatsiya bilan quvvat hisobi

text
1. Haqiqiy dunyoni tanlang (masalan, pA = 0.04, pB = 0.042)
2. N marta: shu dunyodan namuna yarating → testni o'tkazing → p-qiymatni saqlang
3. Quvvat = (p < alfa) ulushi

Afzalligi: har qanday murakkab holat uchun ishlaydi (nostandart metrika,
klasterlangan ma'lumot, ketma-ket tekshiruv, nostandart taqsimot)

Simulyatsiya 9.1-bob — quvvat hisobining universal usuli: formula yo'q bo'lganda ham ishlaydi. Qadamlar: ma'lumot generatorini yozish, testni qo'llash, ulushni sanash. Bonus: bir vaqtning o'zida I tur xatoni ham tekshirish mumkin (H0 dunyosida simulyatsiya qilib, p < alfa ulushi alfa ga teng chiqishi kerak) — bu test to'g'ri qo'llanayotganini tasdiqlaydi.

2.5. G'olib la'nati

Quvvati past testda "muhim" chiqqan natijalar bo'rttirilgan bo'ladi: faqat tasodifan katta chiqqan farqlar chegaradan o'tadi (8.7 dagi kichik namuna paradoksiga o'xshash). Buni M-tur xato (kattalikni bo'rttirish) va S-tur xato (ishorani noto'g'ri ko'rsatish) deyishadi. Oqibati: 20% quvvatli testda topilgan "+40% o'sish" amalda +5% bo'lib chiqadi; jamoa umidsizlanadi. Yechim: quvvatni oldindan ta'minlash, natijani takroriy test bilan tasdiqlash, effektni ehtiyotkor (konservativ) baholash.

2.6. Test davomiyligi va amaliy cheklovlar

Kerakli n dan davomiylik kelib chiqadi: n / kunlik trafik. Amaliy qoidalar: test kamida bir necha to'liq hafta davom etsin (hafta kunlari effekti, 8.7); mavsumiy hodisalar (bayram, aksiya) davrida boshlanmasin; ketma-ket tekshirish (har kuni "p < 0.05 bo'ldimi?") I tur xatoni keskin oshiradi 11.9-bob — oldindan belgilangan muddatgacha kutish yoki maxsus ketma-ket usullar. Trafik cheklangan bo'lsa: kattaroq o'zgarish sinash, sezgirroq metrika tanlash, guruhlarni 50/50 qilish (eng yuqori quvvat).

2.7. Quvvat tuzoqlari

Asosiy tuzoqlar: post-hoc quvvat (testdan keyin kuzatilgan effekt bilan quvvat hisoblash — ma'nosiz, u faqat p ning qayta ifodasi; quvvat oldindan, kutilgan effekt bilan hisoblanadi); effektni optimistik baholash (kutilgan "+20%" o'rniga real "+2%" — n ko'p marta ko'p kerak); faqat bitta metrikaga quvvat (asosiy metrika uchun hisoblab, keyin 10 ta boshqa metrikani ham tekshirish — 11.9); klasterlangan ma'lumot (bir foydalanuvchining ko'p sessiyasi — effektiv n kichikroq, 9.7); ketma-ket tekshirish; kunlik tebranishni unutish; guruhlarni nomutanosib bo'lish (90/10 — quvvat pasayadi).

2.8. Quvvat — testni oldindan loyihalash

Quvvat = 1 - beta — haqiqiy effektni aniqlash ehtimoli; effekt, n, SD, alfa ga bog'liq; standart: 80% quvvat, alfa = 0.05. n ~ 1/effekt^2 — kichik effekt juda katta namuna talab qiladi. MDE — mavjud n bilan ko'rinadigan eng kichik effekt (test o'tkazish mantiqiymi?). Simulyatsiya — universal hisob usuli (va I tur xatoni tekshirish). G'olib la'nati — past quvvatda "muhim" natijalar bo'rttirilgan. Post-hoc quvvat — ma'nosiz. Keyingi dars — t-testlar va ularning farazlari.


3. Tez ma'lumotnoma

python
import numpy as np
from scipy import stats
from statsmodels.stats.power import TTestIndPower, NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize

# O'RTACHALAR: kerakli n (har guruhda)
TTestIndPower().solve_power(effect_size=0.3, alpha=0.05, power=0.8, alternative="two-sided")

# ULUSHLAR: 4% → 4.2%
h = proportion_effectsize(0.042, 0.04)
NormalIndPower().solve_power(effect_size=h, alpha=0.05, power=0.8)

# MDE: mavjud n bilan qanday effekt ko'rinadi
TTestIndPower().solve_power(nobs1=500, alpha=0.05, power=0.8)

# SIMULYATSIYA
def quvvat(n, p1, p2, alfa=0.05, N=20000, seed=0):
    rng = np.random.default_rng(seed)
    a = rng.binomial(n, p1, N); b = rng.binomial(n, p2, N)
    pa, pb = a / n, b / n
    pp = (a + b) / (2 * n)
    z = (pb - pa) / np.sqrt(pp * (1 - pp) * 2 / n)
    return float((2 * stats.norm.sf(np.abs(z)) < alfa).mean())
QOIDA: quvvat oldindan · n ~ 1/effekt^2 · MDE ni biznes bilan kelish · post-hoc quvvat yo'q

Quvvat xulosasi

Quvvat = 1 - beta = P(rad etish | H1 rost); maqsad 0.80
Bog'liq: effekt, n, SD, alfa
n ~ 1 / effekt^2 — effekt yarmi → n to'rt barobar
MDE — mavjud n bilan ko'rinadigan eng kichik effekt
Simulyatsiya — universal quvvat hisobi (+ I tur tekshiruvi)
Past quvvat → g'olib la'nati (bo'rttirilgan effekt)

4. Batafsil misollar

Misollar real numpy/scipy/statsmodels bilan (Python 3.14).

Misol 1 — Quvvat nimaga bog'liq

python
"""Quvvat: effekt, n va alfa ta'siri (real numpy/scipy)."""

import numpy as np
from scipy import stats


def quvvat_ortacha(n: int, farq: float, sd: float = 15.0, alfa: float = 0.05,
                   N: int = 4000, seed: int = 0) -> float:
    rng = np.random.default_rng(seed)
    a = rng.normal(farq, sd, (N, n))
    b = rng.normal(0.0, sd, (N, n))
    res = stats.ttest_ind(a, b, axis=1, equal_var=False)
    return float((res.pvalue < alfa).mean())


def main() -> None:
    print("=== 1. Namuna hajmi (farq 5, SD 15 → d = 0.33) ===")
    for n in [20, 50, 100, 200, 400]:
        print(f"  n={n:>3}: quvvat {quvvat_ortacha(n, 5.0):.3f}")

    print("\n=== 2. Effekt kattaligi (n = 100) ===")
    for farq in [1.0, 3.0, 5.0, 10.0]:
        print(f"  farq={farq:>4}: d = {farq / 15:.2f}, quvvat {quvvat_ortacha(100, farq):.3f}")

    print("\n=== 3. Alfa (n = 100, farq 5) ===")
    for alfa in [0.01, 0.05, 0.10]:
        print(f"  alfa={alfa:.2f}: quvvat {quvvat_ortacha(100, 5.0, alfa=alfa):.3f}")

    print("\n=== 4. H0 rost: 'quvvat' = I tur xato ===")
    print(f"  farq=0, alfa=0.05: {quvvat_ortacha(100, 0.0):.3f}  (≈ 0.05 bo'lishi kerak)")
    print("  ⭐ Quvvat — effekt, n, SD va alfa ning funksiyasi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Namuna hajmi (farq 5, SD 15 → d = 0.33) ===
  n= 20: quvvat 0.179
  n= 50: quvvat 0.377
  n=100: quvvat 0.641
  n=200: quvvat 0.917
  n=400: quvvat 0.997

=== 2. Effekt kattaligi (n = 100) ===
  farq= 1.0: d = 0.07, quvvat 0.081
  farq= 3.0: d = 0.20, quvvat 0.287
  farq= 5.0: d = 0.33, quvvat 0.641
  farq=10.0: d = 0.67, quvvat 0.996

=== 3. Alfa (n = 100, farq 5) ===
  alfa=0.01: quvvat 0.401
  alfa=0.05: quvvat 0.641
  alfa=0.10: quvvat 0.746

=== 4. H0 rost: 'quvvat' = I tur xato ===
  farq=0, alfa=0.05: 0.054  (≈ 0.05 bo'lishi kerak)
  ⭐ Quvvat — effekt, n, SD va alfa ning funksiyasi

Nima ko'rsatdi: 2.1, 2.4-bo'limlar.

Misol 2 — Kerakli namuna hajmi (statsmodels)

python
"""Namuna hajmi: o'rtachalar va konversiyalar uchun (real statsmodels)."""

import numpy as np
from statsmodels.stats.power import NormalIndPower, TTestIndPower
from statsmodels.stats.proportion import proportion_effectsize


def main() -> None:
    print("=== 1. O'rtachalar: effekt kattaligiga qarab n ===")
    p = TTestIndPower()
    for d in [0.8, 0.5, 0.3, 0.2, 0.1]:
        n = p.solve_power(effect_size=d, alpha=0.05, power=0.8, alternative="two-sided")
        print(f"  d={d:.1f}: har guruhda n = {np.ceil(n):.0f}")

    print("\n=== 2. Formula bilan tekshirish (n ≈ 15.7 / d^2) ===")
    for d in [0.5, 0.2]:
        print(f"  d={d}: formula {15.7 / d ** 2:.0f}, statsmodels "
              f"{p.solve_power(effect_size=d, alpha=0.05, power=0.8):.0f}")

    print("\n=== 3. Konversiya 4% dan turli yaxshilanishlar ===")
    zp = NormalIndPower()
    for yangi in [0.042, 0.045, 0.05, 0.06]:
        h = proportion_effectsize(yangi, 0.04)
        n = zp.solve_power(effect_size=h, alpha=0.05, power=0.8)
        nisbiy = (yangi - 0.04) / 0.04
        print(f"  4% → {yangi:.1%} ({nisbiy:+.0%}): har guruhda n = {np.ceil(n):>9,.0f}")

    print("\n=== 4. Haftada 2000 foydalanuvchi bo'lsa ===")
    h = proportion_effectsize(0.042, 0.04)
    n = zp.solve_power(effect_size=h, alpha=0.05, power=0.8)
    print(f"  kerak: {2 * np.ceil(n):,.0f} foydalanuvchi → {2 * n / 2000:.0f} hafta")
    print("  ⭐ Kichik effekt — juda katta namuna")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. O'rtachalar: effekt kattaligiga qarab n ===
  d=0.8: har guruhda n = 26
  d=0.5: har guruhda n = 64
  d=0.3: har guruhda n = 176
  d=0.2: har guruhda n = 394
  d=0.1: har guruhda n = 1571

=== 2. Formula bilan tekshirish (n ≈ 15.7 / d^2) ===
  d=0.5: formula 63, statsmodels 64
  d=0.2: formula 392, statsmodels 393

=== 3. Konversiya 4% dan turli yaxshilanishlar ===
  4% → 4.2% (+5%): har guruhda n =   154,283
  4% → 4.5% (+12%): har guruhda n =    25,531
  4% → 5.0% (+25%): har guruhda n =     6,726
  4% → 6.0% (+50%): har guruhda n =     1,846

=== 4. Haftada 2000 foydalanuvchi bo'lsa ===
  kerak: 308,566 foydalanuvchi → 154 hafta
  ⭐ Kichik effekt — juda katta namuna

Nima ko'rsatdi: 2.2, 2.6-bo'limlar.

Misol 3 — MDE: mavjud trafik bilan nimani ko'ra olamiz

python
"""MDE: berilgan n va quvvat bilan eng kichik aniqlanadigan effekt (real statsmodels)."""

import numpy as np
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize


def mde_konversiya(n: int, baza: float, alfa: float = 0.05, quvvat: float = 0.8) -> float:
    """Berilgan n uchun aniqlanadigan eng kichik yangi konversiya."""
    kerak_h = NormalIndPower().solve_power(nobs1=n, alpha=alfa, power=quvvat)
    lo, hi = baza, min(1.0, baza * 5)
    for _ in range(60):                      # ikkiga bo'lish usuli
        orta = (lo + hi) / 2
        if proportion_effectsize(orta, baza) < kerak_h:
            lo = orta
        else:
            hi = orta
    return (lo + hi) / 2


def main() -> None:
    baza = 0.04
    print("=== 1. Har guruhdagi n va MDE (baza 4%) ===")
    for n in [1_000, 5_000, 20_000, 100_000, 500_000]:
        m = mde_konversiya(n, baza)
        print(f"  n={n:>7,}: MDE = {m:.3%} ({(m - baza) / baza:+.1%} nisbiy)")

    print("\n=== 2. Bazaviy konversiya ta'siri (n = 20 000) ===")
    for b in [0.01, 0.04, 0.10, 0.30]:
        m = mde_konversiya(20_000, b)
        print(f"  baza {b:.0%}: MDE = {m:.2%} ({(m - b) / b:+.1%} nisbiy)")

    print("\n=== 3. Qaror ===")
    print("  Kutilgan yaxshilanish MDE dan kichik bo'lsa — test ma'nosiz")
    print("  ⭐ MDE — testdan oldin beriladigan asosiy savol")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Har guruhdagi n va MDE (baza 4%) ===
  n=  1,000: MDE = 6.809% (+70.2% nisbiy)
  n=  5,000: MDE = 5.170% (+29.2% nisbiy)
  n= 20,000: MDE = 4.567% (+14.2% nisbiy)
  n=100,000: MDE = 4.249% (+6.2% nisbiy)
  n=500,000: MDE = 4.111% (+2.8% nisbiy)

=== 2. Bazaviy konversiya ta'siri (n = 20 000) ===
  baza 1%: MDE = 1.30% (+29.8% nisbiy)
  baza 4%: MDE = 4.57% (+14.2% nisbiy)
  baza 10%: MDE = 10.86% (+8.6% nisbiy)
  baza 30%: MDE = 31.29% (+4.3% nisbiy)

=== 3. Qaror ===
  Kutilgan yaxshilanish MDE dan kichik bo'lsa — test ma'nosiz
  ⭐ MDE — testdan oldin beriladigan asosiy savol

Nima ko'rsatdi: 2.3-bo'lim.

Misol 4 — G'olib la'nati va post-hoc quvvat

python
"""Past quvvatli testda 'muhim' natijalar bo'rttirilgan bo'ladi (real numpy/scipy)."""

import numpy as np
from scipy import stats


def main() -> None:
    rng = np.random.default_rng(3)
    haqiqiy_farq, sd = 2.0, 15.0

    print("=== 1. Turli n: quvvat va 'muhim' natijalarning o'rtacha effekti ===")
    for n in [30, 100, 400, 2000]:
        a = rng.normal(haqiqiy_farq, sd, (5000, n))
        b = rng.normal(0.0, sd, (5000, n))
        res = stats.ttest_ind(a, b, axis=1, equal_var=False)
        farqlar = a.mean(axis=1) - b.mean(axis=1)
        muhim = res.pvalue < 0.05
        bort = farqlar[muhim].mean() / haqiqiy_farq if muhim.any() else np.nan
        teskari = (farqlar[muhim] < 0).mean() if muhim.any() else np.nan
        print(f"  n={n:>4}: quvvat {muhim.mean():.3f}, 'muhim' effekt o'rtachasi "
              f"{farqlar[muhim].mean():+.2f} ({bort:.1f}× haqiqiy), teskari ishora {teskari:.1%}")

    print("\n=== 2. Post-hoc quvvat — ma'nosiz ===")
    a = rng.normal(haqiqiy_farq, sd, 60)
    b = rng.normal(0.0, sd, 60)
    res = stats.ttest_ind(a, b, equal_var=False)
    d_kuzatilgan = (a.mean() - b.mean()) / sd
    print(f"  p = {res.pvalue:.3f}, kuzatilgan d = {d_kuzatilgan:.3f}")
    print("  'Kuzatilgan effekt bilan quvvat' faqat p ning boshqa ko'rinishi")
    print("  ⭐ Past quvvat — bo'rttirilgan effekt va ba'zan noto'g'ri ishora")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Turli n: quvvat va 'muhim' natijalarning o'rtacha effekti ===
  n=  30: quvvat 0.080, 'muhim' effekt o'rtachasi +7.78 (3.9× haqiqiy), teskari ishora 8.0%
  n= 100: quvvat 0.156, 'muhim' effekt o'rtachasi +5.17 (2.6× haqiqiy), teskari ishora 1.2%
  n= 400: quvvat 0.465, 'muhim' effekt o'rtachasi +2.89 (1.4× haqiqiy), teskari ishora 0.0%
  n=2000: quvvat 0.986, 'muhim' effekt o'rtachasi +2.01 (1.0× haqiqiy), teskari ishora 0.0%

=== 2. Post-hoc quvvat — ma'nosiz ===
  p = 0.602, kuzatilgan d = -0.101
  'Kuzatilgan effekt bilan quvvat' faqat p ning boshqa ko'rinishi
  ⭐ Past quvvat — bo'rttirilgan effekt va ba'zan noto'g'ri ishora

Nima ko'rsatdi: 2.5, 2.7-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Quvvat — testdan keyin hisoblanadi" Oldindan (post-hoc — ma'nosiz)
"n ni ikki marta oshirsam, effektni ikki marta kichigini ko'raman" To'rt marta n kerak
"p > 0.05 — ta'sir yo'q" Quvvat past bo'lishi mumkin
"Kichik testda 'muhim' natija — kuchli dalil" Bo'rttirilgan (g'olib la'nati)
"Quvvat ma'lumotga bog'liq emas" Effekt, n, SD, alfa
"Har kuni tekshirish zararsiz" I tur xato oshadi
"90/10 taqsimot ham bir xil" 50/50 — eng yuqori quvvat
"MDE — nazariy tushuncha" Test o'tkazish qaroriga asos

6. Keng tarqalgan xatolar va yechimlari

1. Quvvatsiz test

python
# "2 hafta o'tkazamiz, ko'ramiz"                                  # ⚠️
n = TTestIndPower().solve_power(effect_size=0.2, alpha=0.05, power=0.8)  # ✅

2. Post-hoc quvvat

python
quvvat = power(effect_size=kuzatilgan_d, nobs1=n)                 # ⚠️
# oldindan kutilgan effekt bilan hisoblang                        # ✅

3. Optimistik effekt

python
n = solve_power(effect_size=0.8, ...)     # "katta ta'sir kutamiz" # ⚠️
n = solve_power(effect_size=0.2, ...)     # ehtiyotkor baho        # ✅

4. Ketma-ket tekshirish

python
# har kuni p ni ko'rib, p < 0.05 bo'lsa to'xtatish                # ⚠️
# oldindan belgilangan n ga yetguncha kutish                      # ✅

5. Klaster effekti

python
n = sessiyalar_soni                                               # ⚠️
n = foydalanuvchilar_soni    # mustaqil birlik                    # ✅

6. Nomutanosib guruhlar

python
# 90% eski, 10% yangi                                             # ⚠️
# 50/50 (agar xavf yo'q bo'lsa) — maksimal quvvat                 # ✅

7. Ko'p metrika

python
# asosiy metrikaga quvvat, keyin 15 ta metrikani tekshirish       # ⚠️
# asosiy metrikani oldindan belgilash; qolganlari — tuzatish bilan 11.9-bob  # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 11.1-dars (o'tilgan): I va II tur xatolar
  • 9.1, 9.6-darslar (o'tilgan): Simulyatsiya, standart xato
  • 8.8-dars (o'tilgan): Oldindan reja, p-hacking
  • 11.9-dars: Ko'p taqqoslash, ketma-ket tekshirish
  • 11.10-dars: A/B test loyihasi

8. Eng yaxshi amaliyotlar

  1. Testdan oldin quvvat hisobi qiling.

  2. Effektni ehtiyotkor baholang.

  3. MDE ni biznes bilan muhokama qiling.

  4. Davomiylikni to'liq haftalarga yaxlitlang.

  5. 50/50 taqsimot.

  6. Mustaqil birlikni to'g'ri aniqlang.

  7. Ketma-ket tekshirishdan saqlaning.

  8. Post-hoc quvvat hisoblamang.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # quvvat ta'rifi?
2.  # standart maqsad?
3.  # n effektga qanday bog'liq?
4.  # d = 0.5 uchun n (80% quvvat)?
5.  # d = 0.25 uchun n?
6.  # alfa oshsa quvvat?
7.  # SD oshsa quvvat?
8.  # MDE nima?
9.  # past quvvatli "muhim" natija?
10. # post-hoc quvvat?
11. # 50/50 yoki 80/20 — qaysi quvvatli?
12. # H0 rost bo'lganda "quvvat" = ?
Javoblar
  1. P(H0 ni rad etish | H1 rost)
  2. 0.80 (yoki 0.90)
  3. n ~ 1 / effekt^2
  4. ~63
  5. ~252
  6. Oshadi
  7. Kamayadi
  8. Aniqlanadigan eng kichik effekt
  9. Bo'rttirilgan
  10. Ma'nosiz
  11. 50/50
  12. alfa

Vazifa 2: Xatolarni tuzating

python
1.  # "test 2 hafta, keyin ko'ramiz"

2.  quvvat = TTestIndPower().power(effect_size=kuzatilgan_d, nobs1=n, alpha=0.05)

3.  n = solve_power(effect_size=1.0, alpha=0.05, power=0.8)   # "katta ta'sir"

4.  # har kuni p ni tekshirish va p < 0.05 da to'xtatish

5.  n = len(sessiyalar)   # bir foydalanuvchi ko'p sessiya
Javoblar
python
1.  n = solve_power(effect_size=0.2, alpha=0.05, power=0.8); kunlar = 2 * n / kunlik_trafik

2.  # oldindan kutilgan effekt bilan hisoblang (post-hoc emas)

3.  n = solve_power(effect_size=0.2, alpha=0.05, power=0.8)

4.  # oldindan belgilangan n ga yetguncha kutish

5.  n = df["user_id"].nunique()

Vazifa 3: Quvvat egri chizig'i

Modellang:

  1. n = 10..2000
  2. Turli effekt (d = 0.1, 0.3, 0.5)
  3. Quvvat grafigi
  4. 80% chegarasi

Vazifa 4: A/B rejasi

Modellang:

  1. Baza konversiya 6%, kutilgan +10% nisbiy
  2. Kerakli n va davomiylik
  3. MDE (mavjud 3 haftalik trafik bilan)
  4. Tavsiya

Vazifa 5: G'olib la'nati

Modellang:

  1. Haqiqiy effekt d = 0.1
  2. n = 50, 200, 1000 uchun 5000 simulyatsiya
  3. "Muhim" natijalarning o'rtacha effekti
  4. Bo'rttirish koeffitsiyenti

Vazifa 6: Integratsiya

Modellang:

  1. Simulyatsiya (9.1)
  2. Standart xato (9.6)
  3. t-test (4.13)
  4. Oldindan reja (8.8)

Vazifa 7: O'ylash

Ko'p kompaniyalar "tezkor tajriba madaniyati" ni targ'ib qiladi: har hafta o'nlab A/B test. Lekin ularning ko'pi quvvati past. Nima uchun "ko'p test" avtomatik ravishda "ko'p bilim" degani emas? Cheklangan trafik sharoitida tajriba dasturini qanday loyihalash kerak?

Javob

Qisqa javob: quvvati past testlar shovqin ishlab chiqaradi: haqiqiy effektlarni o'tkazib yuboradi va tasodifiy "g'olib"lar beradi. Ko'p test o'tkazish yolg'on kashfiyotlar sonini ham oshiradi 11.9-bob. Cheklangan trafikda kamroq, lekin kattaroq va yaxshi loyihalangan tajribalar ko'proq bilim beradi.

1. Nega ko'p test ≠ ko'p bilim

  • Har test kamida MDE dan katta effektni ko'ra olishi kerak
  • 20% quvvatda haqiqiy effektlarning 80% i yo'qoladi
  • alfa = 0.05 bilan 40 ta testdan ~2 tasi yolg'on "g'olib"
  • "G'olib" natijalar bo'rttirilgan — keyinchalik takrorlanmaydi

2. Cheklangan trafikda strategiya

Yondashuv Ta'siri
Kattaroq o'zgarishlar sinash MDE ga yetadigan effekt
Sezgirroq metrika SD kichik → quvvat yuqori
Testlarni ketma-ket emas, ustuvorlik bilan Har biriga yetarli trafik
Uzoqroq davomiylik n oshadi
Sath (guardrail) metrikalari Zararni erta sezish

3. Tashkiliy amaliyotlar

  1. Har test uchun oldindan hujjat: gipoteza, metrika, MDE, n, davomiylik
  2. Testlar registri (nechta o'tkazildi — yolg'on kashfiyot bahosi uchun)
  3. G'olib natijalarni takroriy test bilan tasdiqlash
  4. Natijasi "noaniq" bo'lgan testlarni ham hisobot qilish

4. Data Scientist qanday

  • Test o'tkazishdan oldin "bu testni o'tkazishga arziydimi?" savolini beradi
  • MDE ni biznes bilan kelishadi
  • Quvvatsiz testni o'tkazishdan ko'ra, o'zgarishni kattalashtirishni taklif qiladi

5. Xulosa

  1. Quvvatsiz test — vaqt va trafik isrofi
  2. Ko'p test — ko'p yolg'on kashfiyot
  3. Kamroq, lekin yaxshi loyihalangan tajribalar
  4. Oldindan hujjat va registr — madaniyat asosi

Nimani mustahkamlaydi: 2.3, 2.5-bo'limlar.


Xulosa

Bu darsda statistik quvvat va namuna hajmini o'rgandik.

Eng muhim uch fikr:

  1. Quvvat = 1 - beta. Haqiqiy effektni aniqlash ehtimoli; effekt kattaligi, n, SD va alfa ga bog'liq; standart maqsad — 80%. Kichik testda "p > 0.05" ko'pincha "quvvat yetmadi" degani.

  2. n va MDE. n effekt kvadratiga teskari proporsional (d = 0.5 → ~63, d = 0.25 → ~252 har guruhda); konversiya kichik bo'lsa, kerakli hajm keskin oshadi. MDE — mavjud trafik bilan ko'rinadigan eng kichik effekt: kutilgan yaxshilanish MDE dan kichik bo'lsa, testni o'tkazishning ma'nosi yo'q. Hisob — statsmodels yoki simulyatsiya bilan.

  3. G'olib la'nati va post-hoc quvvat. Past quvvatli testda "muhim" chiqqan effektlar bo'rttirilgan (ba'zan ishorasi ham noto'g'ri). Post-hoc quvvat (kuzatilgan effekt bilan) — ma'nosiz: quvvat oldindan, kutilgan effekt bilan hisoblanadi. Ketma-ket tekshirish, klaster effekti va nomutanosib guruhlar quvvatni buzadi.

Keyingi darsda t-testlarni chuqur o'rganamiz: bir namunali, mustaqil (Welch) va juftlashgan t-test, ularning farazlari, ishonch oralig'i va farazlar buzilganda nima qilish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!