IlmHamroh
Data Science va sun'iy intellekt/Loyihalar va karyera9/12-dars49 daqiqa
Mundarija (31)

29.9-dars: Intervyu: statistika va ehtimollik

29-QISM — LOYIHALAR VA KARYERA · 9-dars


1. Kirish va motivatsiya

Oldingi darsda rezyume va ish qidirishni o'rgandik: rezyume suhbatga taklif olish uchun, voronka esa bu jarayonni o'lchash uchun. Taklif kelganidan keyin navbat intervyuga keladi. Data Science intervyularining deyarli hammasida statistika va ehtimollik bo'limi bor — Data Analyst uchun ham, ML Engineer uchun ham. Sabab oddiy: bu kasbning har kunlik qarorlari noaniqlik ostida qabul qilinadi — "bu farq haqiqiymi?", "testni qachon to'xtatamiz?", "bu model yaxshiroqmi yoki omadli bo'ldimi?".

Intervyuda bu savollar ko'pincha qisqa masala shaklida keladi: "Kasallik testi 95% aniq, natija musbat — kasal bo'lish ehtimoli qancha?", "Tangani ketma-ket ikki gerb chiqquncha tashlaymiz — o'rtacha necha marta?", "p-qiymat 0.03 — bu nimani anglatadi?". Ular qisqa, lekin tuzoqli: birinchi xayolga kelgan javob ko'pincha noto'g'ri. Kasallik masalasida ko'p odam "95%" deydi — to'g'ri javob esa bu darsning 1-misolida 8.8% chiqadi.

Real vaziyat. Nomzod texnik intervyuda "p-qiymat — nol gipoteza to'g'ri bo'lish ehtimoli" deb javob berdi. Intervyuer davom etdi: "Demak, p = 0.04 bo'lsa, ta'sir yo'qligi ehtimoli 4%mi?" Nomzod "ha" dedi. Bu — eng keng tarqalgan xato, va u amalda qimmatga tushadi: "sezilarli" deb e'lon qilingan natijalarning katta qismi yolg'on bo'lishi mumkin. 2-misolda aynan shu savolni simulyatsiya bilan tekshiramiz: haqiqiy ta'sirlar kam bo'lgan dunyoda p < 0.05 bo'lgan testlarning deyarli yarmida nol gipoteza to'g'ri.

Bu darsda intervyuda tez-tez so'raladigan statistika va ehtimollik savollarini ko'rib chiqamiz. Har bir savol uchun: savol → yaxshi javob tuzilishi → tez-tez qilinadigan xato → kod bilan tekshiruv. Oxirgi qism eng muhim: intervyuda ham, ishda ham javobingizni simulyatsiya bilan tekshira olish — sizni boshqa nomzodlardan ajratib turadi.

Bu darsda:

  • Intervyu javobining tuzilishi: aniqlashtirish → formula → intuitsiya → tekshiruv
  • Bayes teoremasi: tibbiy test masalasi
  • Tug'ilgan kun paradoksi
  • Kutilgan qiymat: ketma-ket ikki gerb uchun 6 ta tashlash
  • p-qiymat nima va nima EMAS
  • Ishonch oralig'i talqini va qamrov
  • I va II tur xatolar, quvvat, "g'olib la'nati"
  • Markaziy limit teoremasi va uning chegaralari
  • A/B test dizayni: namuna hajmi, peeking, ko'p testlash
  • Simpson paradoksi, korrelyatsiya va sabab, omon qolganlar tarafkashligi
  • Qo'shimcha klassikalar: Monty Hall, kutish paradoksi, o'rtachaga qaytish, chastotali va Bayes
  • Tuzoqlar

ℹ Misollar real numpy/scipy/pandas bilan (Python 3.14). Har javob analitik formula va Monte Carlo simulyatsiyasi bilan solishtiriladi. Nazariy asoslar 04, 09 va 11-qismlarda o'tilgan — bu dars ularni intervyu formatiga keltiradi.


2. Nazariya — chuqur tushuntirish

2.1. Intervyu javobining tuzilishi

Intervyuer faqat to'g'ri raqamni emas, fikrlash jarayonini baholaydi. To'g'ri raqamni tushuntirishsiz aytish ham, noto'g'ri raqamni yaxshi mulohaza bilan aytish ham — turli signal beradi.

text
1. ANIQLASHTIRISH (10-20 soniya)
   "95% aniq" - sezgirlikmi, spetsifiklikmi, ikkalasimi?
   tanga adolatli-mi? kunlar bir tekis taqsimlanganmi? kabisa yili?
2. MODEL / FORMULA
   Bayes, kombinatorika, Markov holatlari, CLT
3. INTUITSIYA (sonli misol)
   "1000 odamni tasavvur qilaylik: 10 kasal, ..."
4. TEKSHIRUV
   chegaraviy holat (tarqalish 0 yoki 1 bo'lsa?), o'lcham tekshiruvi,
   "kompyuterim bo'lsa - 5 qatorli simulyatsiya bilan tekshirardim"
5. AMALIY MA'NO
   "shuning uchun skrining testidan keyin tasdiqlovchi test kerak"

XATOLAR: darhol raqam aytish; jim o'ylash (fikrni ovoz chiqarib ayting);
         noaniq javobni "ishonchli" qilib aytish; tekshirmaslik

Simulyatsiya — sizning qo'shimcha qurolingiz. Jonli kodlash imkoni bo'lsa 29.10-bob, ko'p ehtimollik masalasini 5-10 qatorli Monte Carlo bilan tekshirish mumkin. Bu darsdagi har bir misol shu uslubda yozilgan: avval formula, keyin simulyatsiya, keyin ular mos keladimi — 2*SE bilan.

2.2. Bayes: tibbiy test masalasi

Savol. Kasallik aholining 1% ida bor. Test kasallarda 95% holatda musbat (sezgirlik), sog'lomlarda 90% holatda manfiy (spetsifiklik). Test musbat chiqdi. Kasal bo'lish ehtimoli qancha?

Yaxshi javob tuzilishi.

text
Bayes 9.4-bob:  P(K | +) = P(+ | K) P(K) / P(+)
  P(+) = P(+ | K) P(K) + P(+ | sog') P(sog')
       = 0.95 * 0.01 + 0.10 * 0.99 = 0.0095 + 0.099 = 0.1085
  P(K | +) = 0.0095 / 0.1085 = 0.0876  (~9%)

INTUITSIYA (1000 odam):
  10 kasal   -> ~10 ta musbat (haqiqiy)
  990 sog'lom -> ~99 ta musbat (yolg'on)
  musbatlar ichida kasal: 10 / (10 + 99) ~ 9%

AMALIY: kam tarqalgan holatda skrining testi ko'p yolg'on musbat beradi;
  ikkinchi mustaqil test: prior endi 0.0876 -> P ~ 0.48
  ML dagi aynan shu hodisa: nomutanosib sinflarda precision past (14.9)

Tez-tez qilinadigan xato. "95%" deyish — P(+ | K) ni P(K | +) bilan almashtirish (asosiy stavkani e'tiborsiz qoldirish, base rate fallacy). Yana bir xato — ikkinchi test "ham xuddi shunday 9% beradi" deyish: ikkinchi testda prior endi 1% emas, 8.76%.

Kod bilan tekshiruv: 1-misol, 1-bo'lim — million odam simulyatsiyasi.

2.3. Tug'ilgan kun paradoksi

Savol. Xonada nechta odam bo'lsa, kamida ikkitasining tug'ilgan kuni bir xil bo'lish ehtimoli 50% dan oshadi?

Yaxshi javob tuzilishi.

text
Aniqlashtirish: 365 kun, bir tekis, kabisa yili yo'q, egizaklar yo'q
Teskari hodisa 9.2-bob: HAMMASI turlicha
  P(turlicha) = 365/365 * 364/365 * ... * (365 - k + 1)/365
  P(kamida bitta juft) = 1 - P(turlicha)
  k = 23 -> 0.507;  k = 57 -> 0.99

INTUITSIYA: savol "MENING tug'ilgan kunim bilan" emas, "ISTALGAN ikki
  kishi" haqida; 23 kishida juftliklar soni 23 * 22 / 2 = 253 ta
AMALIY: xesh to'qnashuvlari, A/B test uchun ID lar, takror yozuvlar -
  "kichik ehtimol * ko'p juftlik = katta ehtimol"

Tez-tez qilinadigan xato. 365 / 2 = 183 deyish — bu "kimdir mening tug'ilgan kunimda" degan boshqa savolga yaqin javob. Yoki k / 365 ni qo'shish (ehtimollar qo'shilmaydi, hodisalar kesishadi).

Kod bilan tekshiruv: 1-misol, 2-bo'lim.

2.4. Kutilgan qiymat: ketma-ket ikki gerb

Savol. Adolatli tangani ketma-ket ikki gerb (HH) chiqquncha tashlaymiz. O'rtacha nechta tashlash kerak? HT uchun-chi?

Yaxshi javob tuzilishi — Markov holatlari va kutilmaning chiziqliligi 9.6-bob:

text
HH uchun holatlar: S0 (boshlanish yoki oxirgi T), S1 (oxirgi H)
  E0 = 1 + 0.5 * E1 + 0.5 * E0      (H -> S1, T -> S0)
  E1 = 1 + 0.5 * 0  + 0.5 * E0      (H -> tamom, T -> S0 ga QAYTISH)
  -> E0 = 2 + E1,  E1 = 1 + 0.5 * E0  -> E0 = 6

HT uchun:
  E0 = 1 + 0.5 * E1 + 0.5 * E0
  E1 = 1 + 0.5 * 0  + 0.5 * E1      (T -> tamom, H -> S1 da QOLADI)
  -> E1 = 2, E0 = 4

UMUMIY: k ta ketma-ket gerb uchun 2^(k+1) - 2  (HHH -> 14)
INTUITSIYA: ikkala naqsh ehtimoli bir xil (1/4), lekin HH "o'z-o'zi bilan
  ustma-ust tushadi" - muvaffaqiyatsizlik butun yutuqni yo'qotadi

Tez-tez qilinadigan xato. "Ehtimol 1/4, demak 4 ta tashlash" — bu HH ni mustaqil juftliklar (1-2, 3-4, ...) sifatida tashlaganda bo'lardi va u ham to'g'ri emas (u holda 8 ta tashlash). Yoki HH va HT uchun bir xil javob berish.

Kod bilan tekshiruv: 1-misol, 3-bo'lim — 100 000 ketma-ketlik.

2.5. p-qiymat nima va nima EMAS

Savol. "p = 0.03 chiqdi. Bu nimani anglatadi?"

Yaxshi javob tuzilishi.

text
TA'RIF 11.1-bob: nol gipoteza to'g'ri bo'lsa, kuzatilgan yoki undan ham
  chetroq natijani olish ehtimoli.
  p = P(shunday yoki chetroq ma'lumot | H0)

p-QIYMAT NIMA EMAS:
  1. P(H0 | ma'lumot) EMAS            - buning uchun prior kerak (Bayes)
  2. ta'sir kattaligi EMAS            - katta n da kichik ta'sir ham p ~ 0
  3. natija takrorlanish ehtimoli EMAS
  4. p > 0.05 -> "ta'sir yo'q" EMAS   - quvvat past bo'lishi mumkin
  5. p = 0.049 va p = 0.051 - deyarli bir xil dalil

H0 TO'G'RI BO'LSA: p ~ Uniform(0, 1) -> P(p < 0.05) = 0.05 = alfa

"p < 0.05 li testlarning qanchasida H0 to'g'ri?" (FDR) - bog'liq:
  haqiqiy ta'sirlar ulushi pi va quvvat:
  FDR = (1 - pi) * alfa / ((1 - pi) * alfa + pi * quvvat)
  pi = 0.1, quvvat 0.48 -> FDR ~ 0.48  (deyarli yarmi!)

Tez-tez qilinadigan xato. "p = 0.03 — nol gipoteza to'g'ri bo'lish ehtimoli 3%" yoki "ta'sir 97% ehtimol bilan haqiqiy". Ikkinchi xato: "p juda kichik — demak ta'sir katta".

Kod bilan tekshiruv: 2-misol, 1-3-bo'limlar.

2.6. Ishonch oralig'i talqini

Savol. "95% ishonch oralig'i [2.1, 3.4] — bu nimani anglatadi?"

Yaxshi javob tuzilishi.

text
CHASTOTALI TALQIN (4.13, 11-qism):
  PROTSEDURA 95% qamrovga ega: tajribani ko'p marta takrorlasak, qurilgan
  oraliqlarning ~95% i haqiqiy parametrni qamraydi.
  BITTA tayyor oraliq [2.1, 3.4] parametrni yo qamraydi, yo yo'q -
  "95% ehtimol bilan parametr shu oraliqda" chastotali ma'noda NOTO'G'RI
  (Bayes kredibl oralig'ida esa bunday talqin to'g'ri - prior bilan)

QAMROV SHARTLARI: t-oraliq normal ma'lumotda aniq; boshqa taqsimotda CLT
  ga tayanadi -> kichik n va og'ir dumli taqsimotda qamrov 95% dan PAST
  (2-misol: lognormal, n=5 -> 0.766)
  yechim: katta n, log-transformatsiya, bootstrap (11.8)

Tez-tez qilinadigan xato. "Ma'lumotlarning 95% i shu oraliqda" (bu bashorat oralig'i yoki taqsimot kvantillari bilan chalkashtirish) yoki "parametr 95% ehtimol bilan shu oraliqda" (chastotali oraliq uchun).

Kod bilan tekshiruv: 2-misol, 4-bo'lim — 20 000 takror bilan qamrov.

2.7. I va II tur xatolar va quvvat

Savol. "I va II tur xatolarni tushuntiring. Quvvat nima va nega muhim?"

Yaxshi javob tuzilishi.

text
                    H0 to'g'ri           H1 to'g'ri
H0 rad etildi       I TUR XATO (alfa)    to'g'ri (quvvat = 1 - beta)
H0 rad etilmadi     to'g'ri              II TUR XATO (beta)

MISOL (mahsulot): I tur - ishlamaydigan funksiyani chiqarish;
                  II tur - foydali funksiyani tashlab yuborish
QUVVAT 11.2-bob oshadi: n kattalashsa, ta'sir katta bo'lsa, dispersiya
  kichik bo'lsa, alfa katta bo'lsa
KAM QUVVAT XAVFI:
  1. haqiqiy ta'sirlar ko'p o'tkazib yuboriladi
  2. "G'OLIB LA'NATI" (type M xato): sezilarli chiqqan natijalar
     ta'sirni OSHIRIB ko'rsatadi - faqat "omadli" katta baholar
     chegaradan o'tadi

Tez-tez qilinadigan xato. "p > 0.05, demak ta'sir yo'q" — kam quvvatli testda bu II tur xato bo'lishi mumkin. Yoki kichik testda topilgan "+1.8 p.p." ni haqiqiy ta'sir deb biznes rejaga qo'yish.

Kod bilan tekshiruv: 3-misol, 1-2-bo'limlar.

2.8. Markaziy limit teoremasi

Savol. "Markaziy limit teoremasi nima deydi va qachon ishlamaydi?"

Yaxshi javob tuzilishi.

text
CLT 4.7-bob: mustaqil, bir xil taqsimlangan, CHEKLI dispersiyali X_i uchun
  n kattalashganda o'rtacha taqsimoti ~ Normal(mu, sigma^2 / n)
  - TAQSIMOTNING o'zi emas, O'RTACHA normallashadi
  - std(o'rtacha) = sigma / sqrt(n)
  - asimmetriya(o'rtacha) = asimmetriya(X) / sqrt(n) -> sekin kamayadi

QACHON EHTIYOT BO'LISH KERAK:
  - og'ir dumli, asimmetrik (daromad, chek summasi): n=30 "qoidasi" yetmaydi
  - dispersiya cheksiz (Koshi taqsimoti) - CLT umuman ishlamaydi
  - kuzatuvlar bog'liq (bitta foydalanuvchining ko'p sessiyasi) -
    samarali n kichikroq, SE ni klaster bo'yicha hisoblang

Tez-tez qilinadigan xato. "CLT bo'yicha ma'lumot normal taqsimlanadi" yoki "n = 30 dan keyin hamma narsa normal". Daromad kabi metrikalarda A/B test uchun bu qimmat xato.

Kod bilan tekshiruv: 2-misol, 4-5-bo'limlar.

2.9. A/B test dizayni: namuna hajmi, peeking, ko'p testlash

Savol. "Konversiya 10%. +1 foiz punktni aniqlash uchun A/B testni qanday rejalashtirasiz?" Ketidan: "Menejer har kuni natijaga qarab, sezilarli bo'lganda to'xtatmoqchi — nima deysiz?" va "Biz 20 ta metrikani kuzatamiz — muammo bormi?"

Yaxshi javob tuzilishi.

text
1. METRIKA: bitta asosiy (konversiya) + guardrail lar (qaytish, xatolar)
2. MDE (minimal aniqlanadigan ta'sir) - biznes uchun muhim eng kichik farq
3. NAMUNA HAJMI (11.2, 11.4):
   n = ( z_(1-alfa/2) * sqrt(2 * p_ort * q_ort)
         + z_(1-beta) * sqrt(p0 q0 + p1 q1) )^2 / MDE^2
   p0 = 0.10, MDE = 0.01 -> har guruhga ~14 750
   tez qoida: n ~ 16 * p (1 - p) / MDE^2 = 14 400
4. DAVOMIYLIK: n / kunlik trafik, kamida to'liq hafta(lar) - hafta kuni ta'siri
5. TASODIFIY TAQSIMLASH: foydalanuvchi bo'yicha (xesh, 27.13), SRM tekshiruvi
6. TAHLIL: oldindan yozilgan reja bo'yicha, bir marta

PEEKING 27.13-bob: har qarash - yangi imkoniyat "tasodifan" p < 0.05 olish
  20 qarash -> yolg'on musbat 0.05 dan ~0.25 ga
  yechim: oldindan belgilangan n; ketma-ket testlar (alfa sarflash)
KO'P TESTLASH 11.9-bob: 20 ta H0 metrikada P(>=1 yolg'on) = 1 - 0.95^20 = 0.64
  Bonferroni (alfa/m) - FWER nazorati, konservativ
  Benjamini-Hochberg - FDR nazorati, ko'proq topadi

Tez-tez qilinadigan xato. Namuna hajmini "bir hafta" deb tanlash (hisobsiz); peeking ga rozi bo'lish; 20 metrikadan bittasi "sezilarli" chiqsa, uni g'alaba deb e'lon qilish; har kuni qarab, sezilarli bo'lmaguncha "yana bir hafta" davom ettirish.

Kod bilan tekshiruv: 3-misol, 1, 3, 4-bo'limlar.

2.10. Simpson paradoksi

Savol. "Yangi sahifa har bir segmentda konversiyani oshirdi, lekin umumiy konversiya tushdi. Qanday bo'lishi mumkin?"

Yaxshi javob tuzilishi.

text
Sabab: guruhlar tarkibi farq qiladi (8.4, 28.11)
  yangi sahifa ko'proq MOBIL foydalanuvchilarga ko'rsatilgan,
  mobil konversiya o'z-o'zidan past (4% va 12%)
  -> umumiy yangi guruh "past konversiyali" segmentga og'gan

QAYSI JAVOB TO'G'RI: segment (qurilma) sahifa tanloviga SABAB bo'lsa -
  segment ichidagi farqlar, segment ulushlari bilan standartlanadi
TO'G'RI RANDOMIZATSIYADA (A/B): segmentlar ulushi guruhlarda teng ->
  Simpson yuz bermaydi (katta n da); yuz bersa - taqsimlash buzilgan
  (SRM), rollout bosqichma-bosqich bo'lgan yoki trafik aralashgan

Tez-tez qilinadigan xato. Umumiy natijani segment tarkibini tekshirmasdan qabul qilish; yoki aksincha — har doim segmentlash kerak deb o'ylash (segment muolajaning natijasi bo'lsa, umumiy farq to'g'ri — 28.11).

Kod bilan tekshiruv: 4-misol, 1-bo'lim.

2.11. Korrelyatsiya va sabab

Savol. "Qo'llab-quvvatlashga ko'p murojaat qilgan mijozlar ko'proq ketadi. Murojaat qilishni qiyinlashtirsak, ketish kamayadimi?"

Yaxshi javob tuzilishi.

text
Uchta tushuntirish 4.10-bob:
  1. yashirin sabab: tarmoq muammosi -> murojaat VA ketish
  2. teskari yo'nalish: ketishga qaror qilgan mijoz shartnomani
     bekor qilish uchun murojaat qiladi
  3. haqiqiy sabab: yomon xizmat ko'rsatish mijozni ketkazadi
TEKSHIRISH: yashirin sabab bo'yicha qatlamlash, vaqt tartibi,
  tajriba (murojaat jarayonini tasodifiy yaxshilash), 28.11 usullari
AMALIY: murojaatni qiyinlashtirish - muammoni yashiradi, ketishni
  kamaytirmaydi (va ehtimol oshiradi)

Tez-tez qilinadigan xato. Korrelyatsiyadan to'g'ridan-to'g'ri choraga o'tish. Yoki "korrelyatsiya sabab emas" deb to'xtab qolish — intervyuer nima qilish kerakligini ham kutadi: qanday tekshirasiz?

Kod bilan tekshiruv: 4-misol, 2-bo'lim.

2.12. Tanlash tarafkashligi va omon qolganlar

Savol. "Muvaffaqiyatli startaplar asoschilarining ko'pi universitetni tashlagan. Demak, universitetni tashlash foydalimi?" yoki "Ilovamiz sharhlari o'rtachasi 4.6 — mijozlar mamnunmi?"

Yaxshi javob tuzilishi.

text
OMON QOLGANLAR (survivorship): faqat "omon qolganlar" ko'rinadi
  muvaffaqiyatsiz startaplar (universitetni tashlaganlar ham) hisobda yo'q
  -> o'rtacha, ulushlar oshirib ko'rsatiladi
  savol: "ko'rinmaydiganlar kim va ular qancha?"

BERKSON (tanlash - kollayder, 28.11): tanlash ikki mustaqil omilga bog'liq
  bo'lsa, tanlangan guruhda ular SOXTA bog'lanadi
  (muvaffaqiyat = joy + jamoa -> muvaffaqiyatlilar ichida joy va jamoa
   manfiy korrelyatsiyali)

BOSHQA TANLASH TURLARI: faqat sharh qoldirganlar, faqat so'rovnomaga
  javob berganlar, faqat ilovani o'chirmaganlar, maoshini ochiq e'lon
  qilganlar (29.8, 2.8)

Tez-tez qilinadigan xato. Ko'rinadigan namunani butun populyatsiya deb qabul qilish; tanlangan guruh ichidagi korrelyatsiyadan umumiy xulosa chiqarish.

Kod bilan tekshiruv: 4-misol, 3-4-bo'limlar.

2.13. Monty Hall masalasi

Savol. Uchta eshik: birining ortida mashina, ikkitasida echki. Siz bitta eshikni tanlaysiz. Boshlovchi (mashina qayerdaligini biladi) qolgan ikkitadan echkili birini ochadi va "tanlovni almashtirasizmi?" deb so'raydi.

Yaxshi javob tuzilishi.

text
Aniqlashtirish: boshlovchi HAR DOIM echkili eshikni ochadimi? (ha - klassik shart)
Almashtirish yutadi, agar birinchi tanlov NOTO'G'RI bo'lsa:
  P(birinchi tanlov to'g'ri) = 1/3  -> qolish 1/3
  P(birinchi tanlov noto'g'ri) = 2/3 -> almashish 2/3
INTUITSIYA: 100 eshik, boshlovchi 98 ta echkini ochadi - qolgan bitta
  eshik "boshlovchi tanlagan" eshik
Agar boshlovchi tasodifan ochsa va tasodifan echki chiqsa - javob 1/2
  (shart o'zgarsa - javob o'zgaradi; shuning uchun aniqlashtirish kerak)

Tez-tez qilinadigan xato. "Ikki eshik qoldi — 50/50". Boshlovchining harakati tasodifiy emas, u ma'lumot beradi.

Kod bilan tekshiruv:

python
mashina = rng.integers(0, 3, 200_000)
tanlov = rng.integers(0, 3, 200_000)
qolish = (tanlov == mashina).mean()        # ~0.333
almashish = (tanlov != mashina).mean()     # ~0.667 - almashganda yutish

2.14. Kutish paradoksi (inspection paradox)

Savol. Avtobuslar o'rtacha har 10 daqiqada keladi. Bekatga tasodifiy vaqtda keldingiz — o'rtacha qancha kutasiz?

Yaxshi javob tuzilishi.

text
Aniqlashtirish: avtobuslar JADVAL bo'yicha (aniq 10 daqiqada) yoki
  tasodifiy (Puasson oqimi) keladimi?
JADVAL:     kutish ~ Uniform(0, 10) -> o'rtacha 5 daqiqa
PUASSON:    oraliqlar eksponensial, xotirasiz -> o'rtacha 10 daqiqa (!)
NEGA: tasodifiy vaqtda kelgan odam UZUN oraliqqa tushish ehtimoli yuqori
  (uzun oraliq vaqt o'qida ko'proq joy egallaydi) - "uzunlik bo'yicha
  tanlash"; umumiy formula: E[kutish] = E[T^2] / (2 E[T])
DS DAGI SHAKLLARI: "o'rtacha sinf hajmi" talabalar nuqtai nazaridan
  kattaroq; tasodifiy foydalanuvchi sessiyasi o'rtachadan uzunroq;
  tasodifiy tanlangan mijozning buyurtmasi "o'rtacha buyurtma"dan katta

Tez-tez qilinadigan xato. Har doim "yarim oraliq — 5 daqiqa" deyish; oraliqlar taqsimotini so'ramaslik.

Kod bilan tekshiruv (simulyatsiyada: Puasson oqimida ~10, jadvalda ~5 daqiqa):

python
oraliq = rng.exponential(10, 200_000)
vaqt = np.cumsum(oraliq)
kelish = rng.uniform(0, vaqt[-1], 200_000)
kutish = vaqt[np.searchsorted(vaqt, kelish)] - kelish   # o'rtacha ~10, 5 emas

2.15. O'rtachaga qaytish (regression to the mean)

Savol. "Birinchi oyda eng yomon natija ko'rsatgan 10% do'konga yangi menejer yubordik — keyingi oyda ular sezilarli yaxshilandi. Menejerlar samarali ekanmi?"

Yaxshi javob tuzilishi.

text
Kuzatilgan natija = doimiy qobiliyat + tasodifiy omad
Eng chetdagilar (eng yomon / eng yaxshi) - o'rtacha OMADSIZ / OMADLI
Keyingi o'lchovda omad qaytadan tasodifiy -> natija o'rtachaga yaqinlashadi
  HECH NARSA qilmasa ham!
Simulyatsiya (qobiliyat va shovqin dispersiyasi teng): 1-testdagi top-10%
  o'rtachasi 2.49, 2-testda 1.23 - yarmiga "tushdi"
TEKSHIRISH: nazorat guruhi - xuddi shunday tanlangan, lekin menejer
  YUBORILMAGAN do'konlar; ta'sir = farqlar farqi (28.11 DiD)

Tez-tez qilinadigan xato. Chetdan tanlangan guruhning yaxshilanishini aralashuv ta'siri deb e'lon qilish. Klassik holatlar: "eng yomon o'quvchilarga repetitor", "eng ko'p shikoyat qilgan mijozlarga chegirma", "eng yomon haftadan keyin reklamani o'zgartirdik".

2.16. Chastotali va Bayes yondashuvlari — qisqa

Savol. "Chastotali va Bayes statistikasi farqi nima? Qachon qaysi birini ishlatasiz?"

text
                 CHASTOTALI                    BAYES
parametr         noma'lum, lekin QAT'IY        tasodifiy o'zgaruvchi
                                               (ishonch darajasi)
ehtimol          uzoq muddatli chastota        ishonch darajasi
natija           p-qiymat, ishonch oralig'i    posterior, kredibl oraliq
oldingi bilim    formal ravishda kirmaydi      prior orqali kiradi
savolga javob    "H0 da bunday ma'lumot         "ma'lumotni ko'rgach,
                  qanchalik kutilmagan?"         parametr qayerda?"
qachon qulay     standart tajribalar,           kichik namuna + oldingi bilim,
                 regulyator talablari           ketma-ket qarorlar (29.8 voronka)

Yaxshi javob — "ikkalasi ham asbob": katta tajribada ular ko'pincha o'xshash javob beradi; farq kichik namunada va oldingi bilim kuchli bo'lganda seziladi. 29.8 ning 4-misolida kichik sonli voronka konversiyalari uchun Beta posterior aynan shuning uchun ishlatilgan.

2.17. Tuzoqlar

Asosiy tuzoqlar: savolni aniqlashtirmasdan raqam aytish; P(A | B) ni P(B | A) bilan almashtirish (asosiy stavka); ehtimollarni qo'shish (kesishuvlarni hisobga olmasdan); p-qiymatni P(H0 | ma'lumot) yoki ta'sir kattaligi deb talqin qilish; p > 0.05 ni "ta'sir yo'q" deb o'qish; bitta ishonch oralig'iga "95% ehtimol" berish; CLT ni "ma'lumot normal" deb tushunish; og'ir dumli metrikada kichik n da normal oraliq; namuna hajmini hisobsiz tanlash; peeking; ko'p metrikadan "sezilarli"sini tanlash; kam quvvatli testdagi sezilarli natijaga ishonish (g'olib la'nati); umumiy jadvalni segment tarkibisiz talqin qilish; korrelyatsiyadan choraga o'tish; faqat ko'rinadigan (omon qolgan) namunadan xulosa; Monty Hall da boshlovchi ma'lumotini e'tiborsiz qoldirish; kutish vaqtida oraliqlar taqsimotini so'ramaslik; chetdan tanlangan guruhning o'rtachaga qaytishini aralashuv ta'siri deb bilish; javobni tekshirmaslik.


3. Tez ma'lumotnoma

python
import numpy as np
from scipy import stats

# Bayes
p_k_musbat = sez * prev / (sez * prev + (1 - spes) * (1 - prev))

# tug'ilgan kun
p_juft = 1 - np.prod(1 - np.arange(k) / 365)

# Monte Carlo tekshiruv shabloni
rng = np.random.default_rng(0)
x = rng.random(1_000_000) < p            # hodisa
baho, se = x.mean(), x.std() / np.sqrt(x.size)
mos = abs(baho - nazariy) < 2 * se

# ishonch oralig'i (t) va ikki proporsiya testi
lo, hi = stats.t.interval(0.95, n - 1, loc=x.mean(), scale=stats.sem(x))
p_qiymat = stats.norm.sf(abs(z)) * 2

# A/B namuna hajmi (har guruhga)
za, zb = stats.norm.ppf(0.975), stats.norm.ppf(0.8)
pb = (p0 + p1) / 2
n = ((za * np.sqrt(2 * pb * (1 - pb))
      + zb * np.sqrt(p0 * (1 - p0) + p1 * (1 - p1))) / (p1 - p0)) ** 2

Tez-tez so'raladigan savollar — qisqa javoblar

Savol Qisqa to'g'ri javob
Kasallik 1%, sezgirlik 95%, spetsifiklik 90%, test musbat ~8.8% (1000 odam: 10 haqiqiy, 99 yolg'on musbat)
Tug'ilgan kun: 50% uchun necha odam? 23 (253 juftlik)
HH uchun kutilgan tashlashlar 6 (HT uchun 4, HHH uchun 14)
p-qiymat H0 to'g'ri bo'lsa, shunday yoki chetroq natija ehtimoli
95% CI protsedura 95% qamraydi; bitta oraliq uchun "95% ehtimol" emas
I / II tur xato yolg'on musbat (alfa) / o'tkazib yuborish (beta); quvvat = 1 - beta
CLT o'rtacha taqsimoti normallashadi; og'ir dumda sekin
Namuna hajmi (10%, +1 p.p.) har guruhga ~14 750 (tez qoida 16 p q / MDE^2)
Peeking yolg'on musbatni oshiradi (20 qarash ~0.25)
20 metrika P(>=1 yolg'on) = 0.64; Bonferroni yoki BH
Simpson guruh tarkibi farqi; sabab tuzilmasi bo'yicha standartlash
Korrelyatsiya yashirin sabab, teskari yo'nalish, tanlash; tajriba bilan tekshirish
Omon qolganlar ko'rinmaydiganlarni so'rang; o'rtacha oshirib ko'rsatiladi
Monty Hall almashtiring: 2/3 (boshlovchi biladi va har doim echkini ochadi)
Avtobus har 10 daqiqada, tasodifiy keldim jadvalda 5, Puasson oqimida 10 daqiqa (kutish paradoksi)
Eng yomonlar keyingi safar yaxshilandi o'rtachaga qaytish; nazorat guruhi kerak

Intervyu javobi shabloni

aniqlashtirish -> formula -> intuitsiya (1000 odam) -> tekshiruv (chegara, simulyatsiya) -> amaliy ma'no
P(A|B) != P(B|A); p != P(H0|ma'lumot); CI - protsedura xossasi
n oldindan; bitta asosiy metrika; peeking yo'q; ko'p test - tuzatish
tarkib (Simpson), yashirin sabab, tanlash - "ma'lumot qanday paydo bo'lgan?"

4. Batafsil misollar

Misollar real numpy/scipy/pandas bilan (Python 3.14). Har misol mustaqil ishlaydi; har javob analitik formula va simulyatsiya bilan tekshiriladi.

Misol 1 — Ehtimollik klassikasi: Bayes, tug'ilgan kunlar, HH uchun kutilma

python
"""Ehtimollik klassikasi: Bayes (tibbiy test), tug'ilgan kun paradoksi, HH uchun kutilma."""

import numpy as np


def bayes(prev, sez, spes):
    """P(kasal | test musbat) - analitik."""
    tp = prev * sez
    fp = (1 - prev) * (1 - spes)
    return tp / (tp + fp)


def birinchi_juftlik(tangalar, naqsh):
    """Har qatorda naqsh (masalan [1, 1]) birinchi marta TUGAGAN tashlash raqami."""
    k = len(naqsh)
    mos = np.ones((tangalar.shape[0], tangalar.shape[1] - k + 1), dtype=bool)
    for j, v in enumerate(naqsh):
        mos &= tangalar[:, j:tangalar.shape[1] - k + 1 + j] == v
    bor = mos.any(axis=1)
    return mos.argmax(axis=1) + k, bor


def main() -> None:
    rng = np.random.default_rng(9)

    print("=== 1. Bayes: kasallik 1%, sezgirlik 0.95, spetsifiklik 0.90 ===")
    prev, sez, spes = 0.01, 0.95, 0.90
    n = 1_000_000
    kasal = rng.random(n) < prev
    musbat = np.where(kasal, rng.random(n) < sez, rng.random(n) < 1 - spes)
    mc = kasal[musbat].mean()
    se = np.sqrt(mc * (1 - mc) / musbat.sum())
    an = bayes(prev, sez, spes)
    print(f"  analitik P(kasal | +) = {an:.4f}")
    print(f"  Monte Carlo ({n} odam): {mc:.4f} (SE {se:.4f}), "
          f"mos: {abs(mc - an) < 2 * se}")
    print(f"  1000 odamda: {int(round(1000 * prev * sez))} haqiqiy musbat, "
          f"{int(round(1000 * (1 - prev) * (1 - spes)))} yolg'on musbat")
    ikkinchi = bayes(an, sez, spes)
    print(f"  ikkinchi mustaqil test ham musbat: {ikkinchi:.4f}")
    for p in [0.001, 0.01, 0.1, 0.3]:
        print(f"    tarqalish {p:<5} -> P(kasal | +) = {bayes(p, sez, spes):.3f}")

    print("\n=== 2. Tug'ilgan kun paradoksi (365 kun, bir tekis) ===")
    print(f"  {'odam':>5} {'analitik':>9} {'Monte Carlo':>12} {'SE':>6}")
    for k in [10, 23, 30, 50, 57]:
        an = 1 - np.prod(1 - np.arange(k) / 365)
        kun = np.sort(rng.integers(0, 365, (50_000, k)), axis=1)
        mc = (np.diff(kun, axis=1) == 0).any(axis=1).mean()
        print(f"  {k:>5} {an:>9.3f} {mc:>12.3f} {np.sqrt(mc * (1 - mc) / 50_000):>6.4f}")
    kerak = next(k for k in range(1, 366)
                 if 1 - np.prod(1 - np.arange(k) / 365) >= 0.5)
    print(f"  ehtimol 0.5 dan oshadigan eng kichik guruh: {kerak} odam")
    print(f"  23 odamda juftliklar soni: {23 * 22 // 2} (shuning uchun ehtimol katta)")

    print("\n=== 3. Kutilgan tashlashlar: HH, HT, HHH (H - gerb) ===")
    tangalar = rng.integers(0, 2, (100_000, 400), dtype=np.int8)
    nazariy = {"HH": 6, "HT": 4, "HHH": 14}
    naqshlar = {"HH": [1, 1], "HT": [1, 0], "HHH": [1, 1, 1]}
    for nom, nq in naqshlar.items():
        t, bor = birinchi_juftlik(tangalar, nq)
        o, s = t.mean(), t.std(ddof=1) / np.sqrt(len(t))
        print(f"  {nom:<4} nazariy {nazariy[nom]:>3}, simulyatsiya {o:6.3f} "
              f"(SE {s:.3f}), topilmagan {int((~bor).sum())}, "
              f"mos: {abs(o - nazariy[nom]) < 2 * s}")
    print("  HH (6) > HT (4): HT kutilganda H dan keyin yana H kelsa, 'H' holati")
    print("  saqlanadi; HH kutilganda H dan keyingi T hammasini boshiga qaytaradi")

    print("\n=== 4. Xulosa ===")
    print(f"  musbat testdan keyin kasallik ehtimoli {bayes(prev, sez, spes):.1%} - "
          "95% emas")
    print("  ⭐ Javob: formula + intuitsiya (1000 odam) + simulyatsiya bilan tekshiruv")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Bayes: kasallik 1%, sezgirlik 0.95, spetsifiklik 0.90 ===
  analitik P(kasal | +) = 0.0876
  Monte Carlo (1000000 odam): 0.0884 (SE 0.0009), mos: True
  1000 odamda: 10 haqiqiy musbat, 99 yolg'on musbat
  ikkinchi mustaqil test ham musbat: 0.4769
    tarqalish 0.001 -> P(kasal | +) = 0.009
    tarqalish 0.01  -> P(kasal | +) = 0.088
    tarqalish 0.1   -> P(kasal | +) = 0.514
    tarqalish 0.3   -> P(kasal | +) = 0.803

=== 2. Tug'ilgan kun paradoksi (365 kun, bir tekis) ===
   odam  analitik  Monte Carlo     SE
     10     0.117        0.120 0.0015
     23     0.507        0.509 0.0022
     30     0.706        0.702 0.0020
     50     0.970        0.971 0.0008
     57     0.990        0.990 0.0004
  ehtimol 0.5 dan oshadigan eng kichik guruh: 23 odam
  23 odamda juftliklar soni: 253 (shuning uchun ehtimol katta)

=== 3. Kutilgan tashlashlar: HH, HT, HHH (H - gerb) ===
  HH   nazariy   6, simulyatsiya  5.993 (SE 0.015), topilmagan 0, mos: True
  HT   nazariy   4, simulyatsiya  4.002 (SE 0.006), topilmagan 0, mos: True
  HHH  nazariy  14, simulyatsiya 13.936 (SE 0.037), topilmagan 0, mos: True
  HH (6) > HT (4): HT kutilganda H dan keyin yana H kelsa, 'H' holati
  saqlanadi; HH kutilganda H dan keyingi T hammasini boshiga qaytaradi

=== 4. Xulosa ===
  musbat testdan keyin kasallik ehtimoli 8.8% - 95% emas
  ⭐ Javob: formula + intuitsiya (1000 odam) + simulyatsiya bilan tekshiruv

Natija tahlili.

1-bo'lim — Bayes. Analitik javob 0.0876, million odamlik simulyatsiya 0.0884 (SE 0.0009) — 2*SE ichida mos. "1000 odam" intuitsiyasi: 10 ta haqiqiy musbat va 99 ta yolg'on musbat — musbat natijalilarning 10 dan 1 qismigina kasal. Test yomon emas (95% sezgirlik, 90% spetsifiklik), lekin kasallik kam: sog'lom odamlar shunchalik ko'pki, ularning 10% xatosi kasallarning 95% to'g'ri natijasidan ko'p. Ikkinchi mustaqil test ham musbat bo'lsa, ehtimol 0.4769 — prior endi 0.0876, 0.01 emas. Tarqalish jadvali eng muhim intervyu fikrini ko'rsatadi: bir xil test tarqalish 0.001 da 0.009, 0.3 da 0.803 beradi. "Test qanchalik ishonchli?" savoliga javob — "qaysi aholida?".

2-bo'lim — tug'ilgan kunlar. Analitik va Monte Carlo qiymatlari yaqin: 23 odamda 0.507 va 0.509, 57 odamda ikkalasi 0.990. Eng katta farq 10 odamda (0.117 va 0.120, taxminan 2*SE) — beshta taqqoslashdan birida bunday og'ish tasodifan kutiladigan narsa (3-misoldagi ko'p testlash g'oyasi). Kod ehtimol 0.5 dan oshadigan eng kichik guruhni 23 deb topdi — 253 ta juftlik bor, har birida ehtimol 1/365, shuning uchun kamida bitta to'qnashuv ehtimoli katta.

3-bo'lim — kutilgan tashlashlar. HH: nazariy 6, simulyatsiya 5.993 (SE 0.015); HT: 4 va 4.002; HHH: 14 va 13.936 (SE 0.037) — hammasi 2*SE ichida. 400 tashlash ichida naqsh topilmagan qator yo'q — simulyatsiya uzunligi yetarli ekanini tekshirish ham muhim (aks holda kutilma kam baholanardi). HH va HT ning farqi — intervyuerlarning sevimli davomi: ikki naqshning ehtimoli bir xil, lekin kutish vaqti har xil, chunki HH kutilganda "H" dan keyingi "T" hamma yutuqni yo'qotadi.

4-bo'lim — xulosa natijadan: musbat testdan keyin kasallik ehtimoli 8.8%. Uch masala ham bir xil sxemada yechildi: formula, sonli intuitsiya, simulyatsiya va 2*SE bilan solishtirish.

Misol 2 — p-qiymat nima va nima emas, ishonch oralig'i va CLT

python
"""p-qiymat nima va nima emas, ishonch oralig'i qamrovi va markaziy limit teoremasi."""

import numpy as np
from scipy import stats


def t_test(a, b):
    """Qatorlar bo'yicha vektorlashgan Welch t-test p-qiymatlari."""
    va, vb = a.var(axis=1, ddof=1) / a.shape[1], b.var(axis=1, ddof=1) / b.shape[1]
    t = (a.mean(axis=1) - b.mean(axis=1)) / np.sqrt(va + vb)
    df = (va + vb) ** 2 / (va ** 2 / (a.shape[1] - 1) + vb ** 2 / (b.shape[1] - 1))
    return 2 * stats.t.sf(np.abs(t), df)


def main() -> None:
    rng = np.random.default_rng(99)
    m, n = 20_000, 30

    print("=== 1. H0 to'g'ri bo'lganda p-qiymat taqsimoti (20 000 test, n=30) ===")
    p0 = t_test(rng.normal(0, 1, (m, n)), rng.normal(0, 1, (m, n)))
    hist = np.histogram(p0, bins=10, range=(0, 1))[0] / m
    print("  o'nliklar ulushi: " + " ".join(f"{h:.3f}" for h in hist))
    ulush = (p0 < 0.05).mean()
    print(f"  p < 0.05 ulushi: {ulush:.4f} (SE {np.sqrt(0.05 * 0.95 / m):.4f})"
          f" - bu alfa, ya'ni I tur xato")

    print("\n=== 2. p-qiymat P(H0 | ma'lumot) EMAS ===")
    haq = rng.random(m) < 0.10                    # testlarning 10% ida haqiqiy ta'sir
    siljish = np.where(haq, 0.5, 0.0)[:, None]
    p = t_test(rng.normal(0, 1, (m, n)) + siljish, rng.normal(0, 1, (m, n)))
    sez = p < 0.05
    quvvat = sez[haq].mean()
    yolgon = (~haq[sez]).mean()
    print(f"  haqiqiy ta'sir ulushi 0.10, ta'sir 0.5 std, n=30 -> quvvat {quvvat:.3f}")
    print(f"  p < 0.05 bo'lgan testlar: {sez.sum()} ta; ulardan H0 to'g'ri: "
          f"{yolgon:.3f}")
    nazariy = 0.9 * 0.05 / (0.9 * 0.05 + 0.1 * quvvat)
    print(f"  Bayes bilan: 0.9*0.05 / (0.9*0.05 + 0.1*{quvvat:.3f}) = {nazariy:.3f}")
    oraliq = (p > 0.04) & (p < 0.05)
    print(f"  0.04 < p < 0.05 bo'lgan testlarda H0 to'g'ri: "
          f"{(~haq[oraliq]).mean():.3f} (n={oraliq.sum()})")

    print("\n=== 3. p-qiymat ta'sir kattaligi EMAS ===")
    for nn, d in [(100, 0.30), (200_000, 0.01)]:
        a, b = rng.normal(d, 1, nn), rng.normal(0, 1, nn)
        pv = stats.ttest_ind(a, b, equal_var=False).pvalue
        print(f"  n={nn:>7} har guruhda, haqiqiy farq {d:.2f} std: "
              f"farq {a.mean() - b.mean():+.4f}, p = {pv:.2g}")

    print("\n=== 4. 95% ishonch oralig'i qamrovi (o'rtacha uchun) ===")
    print(f"  {'taqsimot':<14} {'n':>4} {'t-oraliq':>9} {'z-oraliq':>9}")
    for nom, gen, mu in [("normal", lambda s: rng.normal(5, 2, s), 5.0),
                         ("lognormal", lambda s: rng.lognormal(0, 1.2, s),
                          float(np.exp(1.2 ** 2 / 2)))]:
        for nn in [5, 30, 200]:
            x = gen((m, nn))
            o, s = x.mean(axis=1), x.std(axis=1, ddof=1) / np.sqrt(nn)
            tq = stats.t.ppf(0.975, nn - 1)
            qt = ((o - tq * s <= mu) & (mu <= o + tq * s)).mean()
            qz = ((o - 1.96 * s <= mu) & (mu <= o + 1.96 * s)).mean()
            print(f"  {nom:<14} {nn:>4} {qt:>9.3f} {qz:>9.3f}")
    print("  talqin: 100 ta tajribada ~95 ta oraliq haqiqiy qiymatni qamraydi;")
    print("  BITTA tayyor oraliq uchun 'ehtimol 95%' - chastotali talqinda noto'g'ri")

    print("\n=== 5. Markaziy limit teoremasi: lognormal daromad o'rtachasi ===")
    print(f"  {'n':>4} {'asimmetriya':>12} {'nazariy':>8} {'std':>7} {'nazariy':>8}")
    sigma = np.sqrt((np.exp(1.2 ** 2) - 1) * np.exp(1.2 ** 2))
    asim = (np.exp(1.2 ** 2) + 2) * np.sqrt(np.exp(1.2 ** 2) - 1)
    for nn in [1, 5, 30, 200]:
        o = rng.lognormal(0, 1.2, (m, nn)).mean(axis=1)
        print(f"  {nn:>4} {stats.skew(o):>12.2f} {asim / np.sqrt(nn):>8.2f} "
              f"{o.std():>7.3f} {sigma / np.sqrt(nn):>8.3f}")

    print("\n=== 6. Xulosa (natijadan hisoblangan) ===")
    print(f"  H0 da p < 0.05 ulushi {ulush:.3f}; lekin p < 0.05 li testlarning "
          f"{yolgon:.0%} ida H0 to'g'ri")
    print("  ⭐ p - 'H0 to'g'ri bo'lsa, shunday yoki undan chetroq natija ehtimoli'")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. H0 to'g'ri bo'lganda p-qiymat taqsimoti (20 000 test, n=30) ===
  o'nliklar ulushi: 0.098 0.097 0.098 0.101 0.097 0.099 0.102 0.103 0.106 0.099
  p < 0.05 ulushi: 0.0509 (SE 0.0015) - bu alfa, ya'ni I tur xato

=== 2. p-qiymat P(H0 | ma'lumot) EMAS ===
  haqiqiy ta'sir ulushi 0.10, ta'sir 0.5 std, n=30 -> quvvat 0.481
  p < 0.05 bo'lgan testlar: 1925 ta; ulardan H0 to'g'ri: 0.497
  Bayes bilan: 0.9*0.05 / (0.9*0.05 + 0.1*0.481) = 0.484
  0.04 < p < 0.05 bo'lgan testlarda H0 to'g'ri: 0.696 (n=250)

=== 3. p-qiymat ta'sir kattaligi EMAS ===
  n=    100 har guruhda, haqiqiy farq 0.30 std: farq +0.2705, p = 0.049
  n= 200000 har guruhda, haqiqiy farq 0.01 std: farq +0.0128, p = 5.5e-05

=== 4. 95% ishonch oralig'i qamrovi (o'rtacha uchun) ===
  taqsimot          n  t-oraliq  z-oraliq
  normal            5     0.952     0.880
  normal           30     0.948     0.938
  normal          200     0.948     0.947
  lognormal         5     0.766     0.689
  lognormal        30     0.851     0.841
  lognormal       200     0.911     0.910
  talqin: 100 ta tajribada ~95 ta oraliq haqiqiy qiymatni qamraydi;
  BITTA tayyor oraliq uchun 'ehtimol 95%' - chastotali talqinda noto'g'ri

=== 5. Markaziy limit teoremasi: lognormal daromad o'rtachasi ===
     n  asimmetriya  nazariy     std  nazariy
     1         6.71    11.16   3.553    3.687
     5         5.20     4.99   1.688    1.649
    30         3.10     2.04   0.694    0.673
   200         0.79     0.79   0.261    0.261

=== 6. Xulosa (natijadan hisoblangan) ===
  H0 da p < 0.05 ulushi 0.051; lekin p < 0.05 li testlarning 50% ida H0 to'g'ri
  ⭐ p - 'H0 to'g'ri bo'lsa, shunday yoki undan chetroq natija ehtimoli'

Natija tahlili.

1-bo'lim — H0 to'g'ri bo'lganda 20 000 t-testning p-qiymatlari bir tekis taqsimlangan: har o'nlikda ~0.1 (0.097 dan 0.106 gacha). p < 0.05 ulushi 0.0509 (SE 0.0015) — bu aynan alfa, I tur xato ehtimoli. Muhim fikr: H0 to'g'ri bo'lsa, p = 0.01 ham, p = 0.9 ham bir xil ehtimol bilan chiqadi — p-qiymat "H0 ga qanchalik ishonish" o'lchovi emas.

2-bo'lim — p-qiymat P(H0 | ma'lumot) EMAS. Dunyoda testlarning 10% ida haqiqiy ta'sir bor (0.5 std, n=30, quvvat 0.481). p < 0.05 chiqqan 1925 ta testdan 0.497 ulushida H0 to'g'ri — deyarli yarmi yolg'on kashfiyot. Bayes formulasi bilan nazariy qiymat 0.484 — simulyatsiyaga yaqin. p chegaraga yaqin bo'lsa (0.04 < p < 0.05), H0 to'g'ri bo'lganlar ulushi 0.696 (n=250) — "zo'rg'a sezilarli" natija juda kuchsiz dalil. Bu raqamlar haqiqiy ta'sirlar ulushiga bog'liq (Vazifa 4): 50% bo'lsa FDR kichik, 1% bo'lsa — juda katta.

3-bo'lim — p-qiymat ta'sir kattaligi EMAS. 100 kuzatuvda katta farq (0.3 std, baho +0.2705) — p = 0.049; 200 000 kuzatuvda amalda ahamiyatsiz farq (0.01 std, baho +0.0128) — p = 5.5e-05. Kichikroq p kattaroq ta'sirni anglatmaydi; har doim ta'sir kattaligi va oraliqni ayting.

4-bo'lim — ishonch oralig'i qamrovi. Normal ma'lumotda t-oraliq har n da ~0.95 (0.952, 0.948, 0.948), z-oraliq esa n=5 da 0.880 — kichik n da t taqsimoti kerak. Lognormal (og'ir dumli, daromadga o'xshash) ma'lumotda hammasi yomonroq: n=5 da t-oraliq 0.766, n=30 da 0.851, hatto n=200 da ham 0.911. "n = 30 dan keyin CLT ishlaydi" qoidasi og'ir dumli metrikalar uchun noto'g'ri — A/B testda daromad metrikasi bilan ishlaganda buni bilish shart.

5-bo'lim — markaziy limit teoremasi. O'rtachalar std si nazariya bilan mos (n=200 da 0.261 va 0.261), asimmetriya esa 1/sqrt(n) tezlikda kamayadi: nazariy 11.16 dan n=200 da 0.79 gacha — simulyatsiya ham 0.79. Kichik n da tanlanma asimmetriyasi nazariyadan uzoq (n=1 da 6.71 va 11.16) — og'ir dumli taqsimotda asimmetriyaning o'zini baholash ham beqaror. n=200 da ham asimmetriya 0.79 — o'rtacha taqsimoti hali normal emas, shuning uchun 4-bo'limdagi qamrov 0.911.

6-bo'lim — xulosa natijadan: H0 da p < 0.05 ulushi 0.051, lekin p < 0.05 li testlarning 50% ida H0 to'g'ri. Ikki raqam ikki xil savolga javob beradi — intervyuda aynan shu farqni tushuntirish so'raladi.

Misol 3 — A/B test: namuna hajmi, quvvat, peeking va ko'p testlash

python
"""A/B test savollari: namuna hajmi, I/II tur xato, quvvat, peeking, ko'p testlash."""

import numpy as np
from scipy import stats


YOLGON = "yolg'on"


def namuna_hajmi(p0, mde, alfa=0.05, quvvat=0.8):
    """Ikki proporsiya uchun har guruhga kerakli n (normal yaqinlashish)."""
    p1 = p0 + mde
    za, zb = stats.norm.ppf(1 - alfa / 2), stats.norm.ppf(quvvat)
    pb = (p0 + p1) / 2
    s = za * np.sqrt(2 * pb * (1 - pb)) + zb * np.sqrt(p0 * (1 - p0) + p1 * (1 - p1))
    return int(np.ceil((s / mde) ** 2))


def z_p(xa, xb, n):
    """Ikki proporsiya z-testi (birlashgan), vektorlashgan; p-qiymat."""
    pa, pb = xa / n, xb / n
    pp = (xa + xb) / (2 * n)
    se = np.sqrt(2 * pp * (1 - pp) / n)
    z = np.divide(pb - pa, se, out=np.zeros_like(se), where=se > 0)
    return 2 * stats.norm.sf(np.abs(z)), pb - pa


def bh(p, q=0.05):
    """Benjamini-Hochberg: rad etilgan gipotezalar maskasi."""
    m = len(p)
    tartib = np.argsort(p)
    chegara = q * np.arange(1, m + 1) / m
    ok = p[tartib] <= chegara
    k = np.max(np.nonzero(ok)[0]) + 1 if ok.any() else 0
    rad = np.zeros(m, dtype=bool)
    rad[tartib[:k]] = True
    return rad


def main() -> None:
    rng = np.random.default_rng(2710)
    p0, mde, sim = 0.10, 0.01, 4000
    tekshir = []

    print("=== 1. Namuna hajmi: konversiya 10%, MDE +1 p.p., alfa 0.05, quvvat 0.8 ===")
    n = namuna_hajmi(p0, mde)
    print(f"  har guruhga n = {n}")
    for nom, d in [("H0 (farq yo'q)", 0.0), ("H1 (+1 p.p.)", mde)]:
        xa = rng.binomial(n, p0, sim)
        xb = rng.binomial(n, p0 + d, sim)
        p, _ = z_p(xa, xb, n)
        u = (p < 0.05).mean()
        se = np.sqrt(u * (1 - u) / sim)
        print(f"  {nom:<16} p < 0.05 ulushi {u:.3f} (SE {se:.3f})")
        tekshir.append(abs(u - (0.05 if d == 0 else 0.8)) < 2 * se)

    print("\n=== 2. Kam quvvatli test va 'g'olib la'nati' (n/4) ===")
    n4 = n // 4
    xa = rng.binomial(n4, p0, sim)
    xb = rng.binomial(n4, p0 + mde, sim)
    p, farq = z_p(xa, xb, n4)
    sez = p < 0.05
    print(f"  n = {n4}: quvvat {sez.mean():.3f} -> II tur xato {1 - sez.mean():.3f}")
    print(f"  haqiqiy farq {mde:.4f}; sezilarli natijalardagi o'rtacha farq "
          f"{farq[sez].mean():.4f} (x{farq[sez].mean() / mde:.2f} oshirilgan)")
    print("  'sezilarli emas' != 'ta'sir yo'q': "
          f"{1 - sez.mean():.0%} holatda haqiqiy ta'sir o'tkazib yuborildi")

    print("\n=== 3. Peeking: 20 marta qarab, p < 0.05 da to'xtatish (H0 to'g'ri) ===")
    qadam = n // 20
    ka = rng.binomial(qadam, p0, (sim, 20)).cumsum(axis=1)
    kb = rng.binomial(qadam, p0, (sim, 20)).cumsum(axis=1)
    nlar = qadam * np.arange(1, 21)
    pk, _ = z_p(ka, kb, nlar[None, :])
    for k in [1, 5, 10, 20]:
        qarash = np.linspace(0, 19, k).round().astype(int) if k > 1 else np.array([19])
        u = (pk[:, qarash] < 0.05).any(axis=1).mean()
        print(f"  {k:>2} marta qarash: yolg'on musbat {u:.3f}")
    bonf = (pk < 0.05 / 20).any(axis=1).mean()
    print(f"  20 marta, har birida alfa/20: {bonf:.3f} (konservativ)")

    print("\n=== 4. Ko'p testlash: 20 metrika ===")
    m = 20
    print(f"  hammasi H0: P(kamida bitta p < 0.05) nazariy 1 - 0.95^20 = "
          f"{1 - 0.95 ** m:.3f}")
    p_h0 = rng.random((sim, m))
    print(f"  simulyatsiya: {(p_h0 < 0.05).any(axis=1).mean():.3f}")
    haq = np.zeros(m, dtype=bool)
    haq[:4] = True                                 # 4 ta metrikada haqiqiy ta'sir
    natija = {"tuzatishsiz": [], "Bonferroni": [], "BH (FDR 0.05)": []}
    for _ in range(sim):
        z = rng.normal(np.where(haq, 3.0, 0.0), 1.0)
        p = 2 * stats.norm.sf(np.abs(z))
        for nom, rad in [("tuzatishsiz", p < 0.05), ("Bonferroni", p < 0.05 / m),
                         ("BH (FDR 0.05)", bh(p))]:
            natija[nom].append((rad[haq].sum(), rad[~haq].sum(),
                                rad[~haq].sum() / max(rad.sum(), 1)))
    print(f"  4 ta haqiqiy ta'sir (z ~ 3), 16 ta H0; {sim} takror:")
    print(f"  {'usul':<14} {'topildi (4 dan)':>15} {YOLGON:>8} {'FDR':>6} "
          f"{'P(>=1 ' + YOLGON + ')':>15}")
    for nom, v in natija.items():
        v = np.array(v)
        print(f"  {nom:<14} {v[:, 0].mean():>15.2f} {v[:, 1].mean():>8.2f} "
              f"{v[:, 2].mean():>6.3f} {(v[:, 1] > 0).mean():>15.3f}")

    print("\n=== 5. Xulosa (natijadan hisoblangan) ===")
    print(f"  n={n}: yolg'on musbat 0.05 ga, quvvat 0.8 ga 2*SE ichida mos: "
          f"{tekshir[0]}, {tekshir[1]}")
    print("  ⭐ Namuna hajmi oldindan; bitta asosiy metrika; qarashlar rejalashtirilgan")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Namuna hajmi: konversiya 10%, MDE +1 p.p., alfa 0.05, quvvat 0.8 ===
  har guruhga n = 14751
  H0 (farq yo'q)   p < 0.05 ulushi 0.046 (SE 0.003)
  H1 (+1 p.p.)     p < 0.05 ulushi 0.792 (SE 0.006)

=== 2. Kam quvvatli test va 'g'olib la'nati' (n/4) ===
  n = 3687: quvvat 0.287 -> II tur xato 0.713
  haqiqiy farq 0.0100; sezilarli natijalardagi o'rtacha farq 0.0183 (x1.83 oshirilgan)
  'sezilarli emas' != 'ta'sir yo'q': 71% holatda haqiqiy ta'sir o'tkazib yuborildi

=== 3. Peeking: 20 marta qarab, p < 0.05 da to'xtatish (H0 to'g'ri) ===
   1 marta qarash: yolg'on musbat 0.052
   5 marta qarash: yolg'on musbat 0.166
  10 marta qarash: yolg'on musbat 0.212
  20 marta qarash: yolg'on musbat 0.253
  20 marta, har birida alfa/20: 0.019 (konservativ)

=== 4. Ko'p testlash: 20 metrika ===
  hammasi H0: P(kamida bitta p < 0.05) nazariy 1 - 0.95^20 = 0.642
  simulyatsiya: 0.652
  4 ta haqiqiy ta'sir (z ~ 3), 16 ta H0; 4000 takror:
  usul           topildi (4 dan)  yolg'on    FDR  P(>=1 yolg'on)
  tuzatishsiz               3.43     0.80  0.163           0.561
  Bonferroni                1.96     0.05  0.018           0.045
  BH (FDR 0.05)             2.51     0.15  0.040           0.138

=== 5. Xulosa (natijadan hisoblangan) ===
  n=14751: yolg'on musbat 0.05 ga, quvvat 0.8 ga 2*SE ichida mos: True, True
  ⭐ Namuna hajmi oldindan; bitta asosiy metrika; qarashlar rejalashtirilgan

Natija tahlili.

1-bo'lim — namuna hajmi. Konversiya 10%, MDE +1 p.p., alfa 0.05, quvvat 0.8 uchun formula har guruhga 14751 beradi (tez qoida 16 * 0.09 / 0.0001 = 14 400 — yaqin). Simulyatsiya formulani tasdiqlaydi: H0 da p < 0.05 ulushi 0.046 (SE 0.003), H1 da 0.792 (SE 0.006) — ikkalasi ham rejalashtirilgan 0.05 va 0.8 ga 2*SE ichida.

2-bo'lim — kam quvvatli test (n = 3687, rejadagining to'rtdan biri). Quvvat 0.287 — haqiqiy ta'sir bor, lekin 71% holatda test uni topmaydi (II tur xato 0.713). Eng xavflisi — "g'olib la'nati": sezilarli chiqqan testlarda o'rtacha farq 0.0183, haqiqiy 0.0100 — x1.83 oshirilgan. Kichik testda faqat tasodifan katta chiqqan baholar chegaradan o'tadi. Biznes rejaga "+1.8 p.p." yozilsa, keyin natija "yomonlashgandek" ko'rinadi — aslida u hech qachon 1.8 bo'lmagan.

3-bo'lim — peeking (H0 to'g'ri). Faqat oxirida bir marta qarash: yolg'on musbat 0.052. 5 marta qarab, birinchi p < 0.05 da to'xtatish — 0.166; 10 marta — 0.212; 20 marta — 0.253, besh barobar. Har qarashda alfa/20 ishlatish yolg'on musbatni 0.019 ga tushiradi (konservativ — quvvat ham tushadi). To'g'ri yo'l — 27.13 dagidek oldindan belgilangan n yoki maxsus ketma-ket testlar.

4-bo'lim — ko'p testlash. 20 ta metrika hammasi H0 bo'lsa, kamida bittasi "sezilarli" chiqish ehtimoli nazariy 0.642, simulyatsiyada 0.652. 4 ta haqiqiy ta'sir va 16 ta H0 bo'lgan holatda: tuzatishsiz — 4 dan 3.43 ta topildi, lekin o'rtacha 0.80 ta yolg'on, FDR 0.163, 56.1% tajribada kamida bitta yolg'on kashfiyot. Bonferroni — yolg'on deyarli yo'q (0.05, P(>=1) 0.045), lekin haqiqiylardan faqat 1.96 tasi topildi. Benjamini-Hochberg o'rtada: 2.51 ta topildi, FDR 0.040 — va'da qilingan 0.05 dan past. Qaysi birini tanlash — savolga bog'liq: bitta ham yolg'on qimmat bo'lsa (tibbiyot, ishga tushirish qarori) — Bonferroni; ko'p nomzoddan keyingi tekshiruv uchun ro'yxat kerak bo'lsa — BH.

5-bo'lim — xulosa natijadan: n=14751 da yolg'on musbat va quvvat rejaga 2*SE ichida mos (True, True). A/B test dizayni savoliga javob: metrika, MDE, namuna hajmi va qarashlar soni — hammasi test boshlanishidan oldin yoziladi.

Misol 4 — Tarafkashliklar: Simpson, korrelyatsiya va sabab, omon qolganlar

python
"""Tarafkashliklar: Simpson paradoksi, korrelyatsiya va sabab, omon qolganlar (survivorship)."""

import numpy as np
import pandas as pd


def main() -> None:
    rng = np.random.default_rng(404)

    print("=== 1. Simpson: yangi to'lov sahifasi (mobil foydalanuvchilarga ko'proq) ===")
    n = 60_000
    mobil = rng.random(n) < 0.5
    yangi = rng.random(n) < np.where(mobil, 0.8, 0.2)       # taqsimlash TASODIFIY EMAS
    p = np.where(mobil, 0.04, 0.12) + 0.01 * yangi          # har segmentda +1 p.p.
    df = pd.DataFrame({"qurilma": np.where(mobil, "mobil", "kompyuter"),
                       "sahifa": np.where(yangi, "yangi", "eski"),
                       "xarid": rng.random(n) < p})
    jad = df.pivot_table(index="qurilma", columns="sahifa", values="xarid",
                         aggfunc="mean")
    jad["farq"] = jad["yangi"] - jad["eski"]
    umumiy = df.groupby("sahifa")["xarid"].mean()
    for q, r in jad.iterrows():
        print(f"  {q:<10} eski {r['eski']:.4f}  yangi {r['yangi']:.4f}  "
              f"farq {r['farq']:+.4f}")
    uf = umumiy["yangi"] - umumiy["eski"]
    print(f"  {'UMUMIY':<10} eski {umumiy['eski']:.4f}  yangi {umumiy['yangi']:.4f}  "
          f"farq {uf:+.4f}")
    ulush = df["qurilma"].value_counts(normalize=True)
    st = float(sum(jad.loc[q, "farq"] * ulush[q] for q in jad.index))
    print(f"  segment ulushlari bilan standartlangan farq: {st:+.4f} (haqiqiy +0.0100)")

    print("\n=== 2. Korrelyatsiya va sabab: murojaatlar va mijoz ketishi ===")
    n = 20_000
    muammo = rng.random(n) < 0.2                   # tarmoq muammosi (yashirin sabab)
    murojaat = rng.poisson(np.where(muammo, 3.0, 0.5))
    ketdi = rng.random(n) < np.where(muammo, 0.30, 0.08)   # murojaat ketishga TA'SIR QILMAYDI
    r = np.corrcoef(murojaat, ketdi)[0, 1]
    print(f"  corr(murojaatlar, ketish) = {r:+.3f}")
    for m, nom in [(False, "muammosiz"), (True, "muammoli")]:
        s = muammo == m
        print(f"  {nom:<10} ichida corr = {np.corrcoef(murojaat[s], ketdi[s])[0, 1]:+.3f}"
              f" (n={s.sum()})")
    kop = murojaat >= 3
    print(f"  ketish: >=3 murojaat {ketdi[kop].mean():.3f}, <3 murojaat "
          f"{ketdi[~kop].mean():.3f}")
    print("  xato xulosa: 'murojaatni qiyinlashtirsak, ketish kamayadi'")

    print("\n=== 3. Omon qolganlar: startaplar o'sishi ===")
    n = 5_000
    osish = rng.normal(0.0, 0.30, n)               # yillik o'sish, haqiqiy o'rtacha 0
    omon = osish > 0.15                            # faqat yaxshi o'sganlar "ko'rinadi"
    print(f"  hamma startaplar: o'rtacha o'sish {osish.mean():+.3f} (n={n})")
    print(f"  omon qolganlar:   o'rtacha o'sish {osish[omon].mean():+.3f} "
          f"(n={omon.sum()}, {omon.mean():.1%})")

    print("\n=== 4. Berkson: tanlash mustaqil belgilarni bog'laydi ===")
    joy = rng.normal(0, 1, n)                      # joylashuv sifati
    jamoa = rng.normal(0, 1, n)                    # jamoa tajribasi (mustaqil)
    tanlandi = joy + jamoa + rng.normal(0, 0.5, n) > 1.5
    print(f"  hamma: corr(joy, jamoa) = {np.corrcoef(joy, jamoa)[0, 1]:+.3f}")
    rt = np.corrcoef(joy[tanlandi], jamoa[tanlandi])[0, 1]
    print(f"  faqat muvaffaqiyatlilar ({tanlandi.mean():.1%}): corr = {rt:+.3f}")
    print("  xato xulosa: 'yaxshi joy tanlaganlar jamoaga e'tibor bermaydi'")

    print("\n=== 5. Xulosa (natijadan hisoblangan) ===")
    if np.sign(uf) != np.sign(st):
        print(f"  Simpson: umumiy farq {uf:+.4f}, segmentlar ichida esa ijobiy "
              f"({st:+.4f})")
    ichki = max(abs(np.corrcoef(murojaat[muammo == m], ketdi[muammo == m])[0, 1])
                for m in [False, True])
    print(f"  korrelyatsiya {r:+.3f} -> yashirin sabab ichida {ichki:.3f} gacha tushdi")
    print(f"  omon qolganlar o'rtachasi {osish[omon].mean() - osish.mean():+.3f} "
          f"ga oshirib ko'rsatilgan")
    print("  ⭐ Avval so'rang: ma'lumot qanday tanlangan va nima taqsimlashni hal qilgan?")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Simpson: yangi to'lov sahifasi (mobil foydalanuvchilarga ko'proq) ===
  kompyuter  eski 0.1192  yangi 0.1352  farq +0.0159
  mobil      eski 0.0403  yangi 0.0501  farq +0.0099
  UMUMIY     eski 0.1036  yangi 0.0671  farq -0.0365
  segment ulushlari bilan standartlangan farq: +0.0129 (haqiqiy +0.0100)

=== 2. Korrelyatsiya va sabab: murojaatlar va mijoz ketishi ===
  corr(murojaatlar, ketish) = +0.193
  muammosiz  ichida corr = +0.005 (n=15981)
  muammoli   ichida corr = +0.027 (n=4019)
  ketish: >=3 murojaat 0.290, <3 murojaat 0.105
  xato xulosa: 'murojaatni qiyinlashtirsak, ketish kamayadi'

=== 3. Omon qolganlar: startaplar o'sishi ===
  hamma startaplar: o'rtacha o'sish -0.007 (n=5000)
  omon qolganlar:   o'rtacha o'sish +0.348 (n=1537, 30.7%)

=== 4. Berkson: tanlash mustaqil belgilarni bog'laydi ===
  hamma: corr(joy, jamoa) = -0.024
  faqat muvaffaqiyatlilar (15.5%): corr = -0.564
  xato xulosa: 'yaxshi joy tanlaganlar jamoaga e'tibor bermaydi'

=== 5. Xulosa (natijadan hisoblangan) ===
  Simpson: umumiy farq -0.0365, segmentlar ichida esa ijobiy (+0.0129)
  korrelyatsiya +0.193 -> yashirin sabab ichida 0.027 gacha tushdi
  omon qolganlar o'rtachasi +0.355 ga oshirib ko'rsatilgan
  ⭐ Avval so'rang: ma'lumot qanday tanlangan va nima taqsimlashni hal qilgan?

Natija tahlili.

1-bo'lim — Simpson paradoksi. Har segmentda yangi sahifa yaxshiroq: kompyuterda +0.0159, mobilda +0.0099 (haqiqiy ikkalasida +0.01, kompyuterdagi og'ish — shovqin, bu segmentda yangi sahifa ko'rganlar kam). Lekin umumiy jadvalda yangi sahifa yomon: 0.0671 va 0.1036, farq -0.0365. Sabab: yangi sahifa 80% mobil foydalanuvchilarga ko'rsatilgan, mobil konversiya esa uch barobar past. Segment ulushlari bilan standartlangan farq +0.0129 — haqiqiy +0.0100 ga yaqin. Intervyuda muhim qo'shimcha: to'g'ri randomizatsiyalangan A/B testda bunday bo'lmasligi kerak; bo'lsa — taqsimlash buzilgan (SRM tekshiruvi, 27.13).

2-bo'lim — korrelyatsiya va sabab. Murojaatlar va ketish korrelyatsiyasi +0.193: 3 va undan ko'p murojaat qilganlar 0.290 ulushda ketadi, qolganlar 0.105. Lekin simulyatsiyada murojaat ketishga umuman ta'sir qilmaydi — ikkalasining sababi tarmoq muammosi. Yashirin sabab bo'yicha qatlamlaganda korrelyatsiya yo'qoladi: muammosizlarda +0.005, muammolilarda +0.027. "Murojaatni qiyinlashtiramiz" qarori ketishni kamaytirmaydi — faqat muammo haqidagi signalni yo'qotadi.

3-bo'lim — omon qolganlar. Barcha 5000 startapning o'rtacha o'sishi -0.007 (haqiqiy 0), lekin faqat "ko'rinadiganlar" (o'sishi 15% dan yuqori, 30.7%) o'rtachasi +0.348. Maqolalarda, konferensiyalarda, muvaffaqiyat hikoyalarida biz faqat shu 30.7% ni ko'ramiz.

4-bo'lim — Berkson tarafkashligi. Joylashuv sifati va jamoa tajribasi mustaqil (corr = -0.024). Muvaffaqiyat ikkalasiga bog'liq; faqat muvaffaqiyatlilarni (15.5%) olsak — corr = -0.564: "yaxshi joy tanlaganlarning jamoasi kuchsiz" degan soxta qonuniyat. Sabab: muvaffaqiyatga yetish uchun yo joy, yo jamoa kuchli bo'lishi kerak — ulardan biri kuchsiz bo'lsa, ikkinchisi kuchli bo'lgani uchun tanlangan. Bu 28.11 dagi kollayder — tanlash orqali.

5-bo'lim — xulosalar natijadan hisoblandi: Simpson (umumiy -0.0365, segmentlar ichida +0.0129), korrelyatsiya +0.193 dan qatlamlar ichida eng ko'pi 0.027 gacha tushdi, omon qolganlar o'rtachasi +0.355 ga oshirib ko'rsatilgan. To'rtala tuzoqqa bitta savol yordam beradi: ma'lumot qanday paydo bo'lgan va kim taqsimlashni hal qilgan?


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

Noto'g'ri fikr To'g'risi
"Test 95% aniq — musbat natija 95% kasallik" Asosiy stavka muhim: 1% tarqalishda ~8.8%
"23 odam — ehtimol 23/365" Istalgan ikki kishi: 253 juftlik, ehtimol ~0.507
"HH va HT — bir xil kutilma" HH 6, HT 4: HH muvaffaqiyatsizlikda boshiga qaytadi
"p = 0.03 — H0 ehtimoli 3%" p = P(ma'lumot yoki chetroq | H0); P(H0 | p < 0.05) 50% gacha bo'lishi mumkin
"p juda kichik — ta'sir katta" 200 000 kuzatuvda 0.01 std farq ham p ~ 5.5e-05
"p > 0.05 — ta'sir yo'q" Kam quvvatda 71% holatda haqiqiy ta'sir o'tkazib yuborildi
"Bu oraliq parametrni 95% ehtimol bilan qamraydi" Protsedura 95% qamraydi; bitta oraliq — yo qamraydi, yo yo'q
"n = 30 dan keyin CLT ishlaydi" Lognormal daromadda n=30 da qamrov 0.851, n=200 da ham 0.911
"Har kuni qarasak, tezroq xulosa qilamiz" 20 qarashda yolg'on musbat 0.253
"20 metrikadan biri sezilarli — g'alaba" Hammasi H0 bo'lsa ham 0.64 ehtimol bilan kamida bittasi "sezilarli"
"Umumiy konversiya tushdi — yangi sahifa yomon" Har segmentda oshgan bo'lishi mumkin (Simpson)
"Omon qolgan startaplar o'rtachasi — bozor o'rtachasi" Ko'rinmaydiganlar hisobga olinmagan: +0.348 va -0.007

6. Keng tarqalgan xatolar va yechimlari

1. Asosiy stavkani unutish

python
p_kasal = sezgirlik                                                         # ⚠️
p_kasal = sez * prev / (sez * prev + (1 - spes) * (1 - prev))              # ✅

2. p-qiymatni noto'g'ri talqin qilish

text
⚠️ "p = 0.03, demak ta'sir 97% ehtimol bilan haqiqiy"
✅ "Agar ta'sir bo'lmasa, bunday yoki kattaroq farq 3% ehtimol bilan chiqardi.
    Ta'sir kattaligi va oralig'i: +1.2 p.p. [0.1, 2.3]"

3. Ishonch oralig'ini ehtimol deb aytish

text
⚠️ "Haqiqiy o'rtacha 95% ehtimol bilan [2.1, 3.4] da"
✅ "Bu protsedura bilan qurilgan oraliqlarning 95% i haqiqiy qiymatni qamraydi"

4. Namuna hajmisiz A/B test

python
davomiylik = "1 hafta"                                                      # ⚠️
n = namuna_hajmi(p0=0.10, mde=0.01)   # ~14 750 har guruhga -> kunlar      # ✅

5. Peeking

python
for kun in range(30):
    if p_qiymat(kun) < 0.05:
        break                                                               # ⚠️
natija = p_qiymat(oxirgi_kun)   # oldindan belgilangan n da bir marta       # ✅

6. Ko'p testlash tuzatishsiz

python
sezilarli = [m for m, p in zip(metrikalar, pqiymatlar) if p < 0.05]          # ⚠️
sezilarli = [m for m, r in zip(metrikalar, bh(np.array(pqiymatlar))) if r]  # ✅

7. Kam quvvatli testdagi ta'sirni biznes rejaga qo'yish

text
⚠️ "Kichik testda +1.8 p.p. chiqdi - rejaga +1.8 yozamiz"
✅ "Quvvat 0.29 edi; sezilarli natijalar o'rtacha x1.8 oshirilgan.
    Katta test bilan tasdiqlaymiz yoki konservativ baho olamiz"

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 4.7, 4.13-darslar (o'tilgan): Markaziy limit teoremasi, t-test va ishonch oralig'i
  • 4.10, 8.4-darslar (o'tilgan): Korrelyatsiya va sababiyat, Simpson paradoksi
  • 9.2, 9.3, 9.4, 9.6-darslar (o'tilgan): Kombinatorika, shartli ehtimollik, Bayes, kutilma
  • 9.10-dars (o'tilgan): Monte Carlo — javobni simulyatsiya bilan tekshirish
  • 11.1, 11.2, 11.4, 11.9-darslar (o'tilgan): p-qiymat, quvvat va namuna hajmi, proporsiyalar, ko'p taqqoslash
  • 27.13-dars (o'tilgan): Onlayn A/B test, peeking, guardrail metrikalar
  • 28.11-dars (o'tilgan): Sababiy xulosa, kollayder va tanlash
  • 29.10-dars: Intervyu — ML, SQL va case study; statistik fikrlash case study da ham kerak
  • 29.11-dars: Ma'lumot etikasi — tanlash tarafkashligi adolatlilik masalasi sifatida

8. Eng yaxshi amaliyotlar

  1. Avval savolni aniqlashtiring: taxminlarni ovoz chiqarib ayting.

  2. Formula + sonli intuitsiya ("1000 odam") + tekshiruv — uchalasi birga.

  3. Imkon bo'lsa, javobni 5-10 qatorli simulyatsiya bilan tekshiring; mos kelishini 2*SE bilan baholang.

  4. p-qiymat bilan birga ta'sir kattaligi va ishonch oralig'ini ayting.

  5. A/B test: metrika, MDE, namuna hajmi, davomiylik — hammasi oldindan; peeking yo'q.

  6. Ko'p metrika yoki ko'p segment — tuzatish (Bonferroni yoki BH) yoki bitta asosiy metrika.

  7. Har bog'liqlikda so'rang: yashirin sabab? teskari yo'nalish? ma'lumot qanday tanlangan?

  8. Bilmagan joyingizni tan oling va qanday tekshirishingizni ayting — bu ham kuchli javob.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # tarqalish 0.1% bo'lsa, musbat testdan keyin kasallik ehtimoli?
2.  # ikkinchi mustaqil test ham musbat - taxminan qancha?
3.  # 57 odamda umumiy tug'ilgan kun ehtimoli?
4.  # HHH uchun kutilgan tashlashlar?
5.  # H0 to'g'ri bo'lsa, p-qiymatlarning qancha ulushi 0.2 dan 0.3 gacha?
6.  # haqiqiy ta'sirlar 10%, quvvat ~0.48: p < 0.05 lardan qanchasida H0 to'g'ri?
7.  # lognormal (sigma 1.2), n=5: t-oraliq qamrovi 0.95 dan yuqorimi, pastmi?
8.  # namuna hajmi n/4 bo'lsa quvvat taxminan qancha?
9.  # 5 marta qarab to'xtatish: yolg'on musbat taxminan?
10. # Bonferroni va BH: qaysi biri ko'proq haqiqiy ta'sir topadi?
11. # tasodifiy taqsimlangan katta A/B testda Simpson paradoksi bo'ladimi?
12. # omon qolganlar ichida mustaqil ikki omil qanday bog'lanadi?
Javoblar
  1. 0.009 — musbatlarning 1% dan ham kami kasal
  2. ~0.48 (prior 0.0876 bilan)
  3. 0.990
  4. 14 (simulyatsiya 13.936)
  5. ~0.1 — H0 da p bir tekis taqsimlangan
  6. ~0.5 (simulyatsiya 0.497, Bayes 0.484)
  7. Ancha past — 0.766
  8. ~0.29 (simulyatsiya 0.287)
  9. ~0.17 (simulyatsiya 0.166)
  10. BH (2.51 va 1.96 ta), lekin biroz ko'proq yolg'on bilan
  11. Katta n da deyarli yo'q — segment ulushlari guruhlarda teng; bo'lsa — taqsimlashni tekshiring
  12. Soxta (odatda manfiy) korrelyatsiya paydo bo'ladi — -0.564

Vazifa 2: Xatolarni tuzating

python
1.  p_kasal = 0.95     # test sezgirligi 95%
2.  natija = "ta'sir yo'q" if p > 0.05 else "ta'sir bor"
3.  if min(pqiymatlar) < 0.05: xulosa = "yangi dizayn yaxshiroq"
4.  while p >= 0.05: kun += 1; p = test(kun)
5.  oraliq = (x.mean() - 1.96 * x.std() / np.sqrt(5), x.mean() + 1.96 * x.std() / np.sqrt(5))   # daromad, n=5
Javoblar
python
1.  p_kasal = sez * prev / (sez * prev + (1 - spes) * (1 - prev))   # asosiy stavka bilan

2.  natija = f"farq {farq:+.3f}, 95% CI [{lo:.3f}, {hi:.3f}], quvvat {quvvat:.2f}"
    # p > 0.05 - "ma'lumot yetarli emas", ayniqsa quvvat past bo'lsa

3.  rad = bh(np.array(pqiymatlar))   # yoki oldindan tanlangan BITTA asosiy metrika

4.  n = namuna_hajmi(p0, mde); p = test(n)   # bir marta, oldindan belgilangan n da

5.  # og'ir dumli, kichik n: log-transformatsiya yoki bootstrap 11.8-bob, n ni oshirish
    lo, hi = np.percentile([rng.choice(x, x.size).mean() for _ in range(5000)], [2.5, 97.5])

Vazifa 3: Ehtimollik masalalari

1-misol asosida simulyatsiya bilan tekshiring:

  1. Kupon kolleksioneri: 10 xil stiker bor, har paketda tasodifiy bittasi. Hammasini yig'ish uchun o'rtacha nechta paket kerak? (Javob: 10 * (1 + 1/2 + ... + 1/10) ~ 29.3)
  2. Tayoqni ikki tasodifiy nuqtada sindiramiz — bo'laklardan uchburchak yasash ehtimoli? (Javob: 0.25)
  3. Ikki farzandli oila, kamida bittasi o'g'il — ikkalasi o'g'il bo'lish ehtimoli? "Kattasi o'g'il" bo'lsa-chi? (1/3 va 1/2)
  4. HT va TH o'yini: tanga tashlanadi, qaysi naqsh birinchi chiqsa o'sha yutadi. HH va TH o'yinida-chi?

Vazifa 4: p-qiymat va oraliqlar

2-misol asosida:

  1. Haqiqiy ta'sirlar ulushi 0.5 va 0.01 bo'lganda P(H0 | p < 0.05) ni hisoblang
  2. Lognormal ma'lumot uchun bootstrap percentil oralig'i qamrovini n=5, 30, 200 da o'lchang — t-oraliqdan yaxshimi?
  3. Log-transformatsiya qilingan ma'lumot uchun oraliq — u qaysi parametrni qamraydi (o'rtachani emas, geometrik o'rtachani)?
  4. Koshi taqsimoti uchun o'rtachalar std si n oshganda kamayadimi?

Vazifa 5: A/B test

3-misol asosida:

  1. MDE ni +0.5 p.p. qiling — namuna hajmi necha barobar oshadi? (1 / MDE^2)
  2. Quvvatni 0.9 ga oshirish uchun n qanchaga oshishi kerak?
  3. 5 ta rejalashtirilgan qarash uchun Pocock chegarasi (har qarashda ~`0.0158`) bilan yolg'on musbatni o'lchang
  4. BH da q = 0.10 qiling — topilgan va yolg'on ta'sirlar qanday o'zgaradi?

Vazifa 6: Tarafkashliklar

4-misol asosida:

  1. Simpson misolida sahifani tasodifiy taqsimlang (mobil va kompyuterga teng) — paradoks yo'qoladimi?
  2. Murojaat va ketish misoliga teskari yo'nalish qo'shing: ketishga qaror qilganlar 2 ta qo'shimcha murojaat qiladi — qatlamlash buni ushlaydimi?
  3. Omon qolganlar chegarasini 0.0 va 0.3 qiling — tarafkashlik qanday o'zgaradi?
  4. Berkson misolida tanlash shovqinini oshiring (0.5 → 2.0) — soxta korrelyatsiya qanday o'zgaradi?

Vazifa 7: O'ylash

Intervyuer: "Biz yangi tavsiya algoritmini 3 kun sinadik. Birinchi kuni sezilarli emas edi, uchinchi kuni p = 0.04 chiqdi va biz to'xtatdik. 15 ta metrikani kuzatdik, ulardan 'o'rtacha chek' sezilarli oshdi, qolganlari — yo'q. Mobil ilovada natija yaxshi, veb-saytda yomonroq. Algoritmni hamma uchun ishga tushirishni tavsiya qilasizmi?"

Javob

Qisqa javob: hozircha yo'q — bu natija uchta mustaqil sababga ko'ra ishonchli emas. Lekin "yo'q" deyish ham yetmaydi: to'g'ri tajribani qanday o'tkazishni taklif qilish kerak.

1. Peeking. Test oldindan belgilangan hajmsiz, p < 0.05 bo'lgan birinchi kuni to'xtatilgan. 3-misolda 5 marta qarash yolg'on musbatni 0.05 dan 0.166 ga oshirdi. Bundan tashqari, 3 kun — to'liq hafta ham emas: hafta kunlari ta'siri va "yangilik effekti" (foydalanuvchilar yangi narsani dastlab ko'proq bosadi) aralashgan.

2. Ko'p testlash. 15 ta metrikadan bittasi "sezilarli" — hammasi H0 bo'lsa ham kamida bittasi 1 - 0.95^15 = 0.54 ehtimol bilan sezilarli chiqadi. "O'rtacha chek" oldindan asosiy metrika sifatida tanlanganmidi? Agar yo'q bo'lsa, bu — keyin tanlangan natija. BH yoki Bonferroni bilan tuzatilgan p-qiymatni ko'rish kerak. Bundan tashqari, o'rtacha chek og'ir dumli metrika — 2-misolda n kichik bo'lganda oddiy oraliq qamrovi 95% dan ancha past edi.

3. Segmentlar. "Mobilda yaxshi, vebda yomon" — segmentlar ham qo'shimcha testlar (yana ko'p testlash). Agar taqsimlash to'g'ri bo'lsa, umumiy natija asosiy; segment farqi — keyingi test uchun gipoteza. Agar mobil va vebdagi foydalanuvchilar ulushi guruhlarda farq qilsa — taqsimlash buzilgan (SRM), 4-misoldagi Simpson holati mumkin.

4. Kam quvvat va g'olib la'nati. 3 kunlik test ehtimol kam quvvatli. 3-misolda kam quvvatli testning sezilarli natijalari ta'sirni o'rtacha x1.83 oshirib ko'rsatdi — "o'rtacha chek oshdi" raqamining o'zi ham oshirilgan bo'lishi mumkin.

5. Taklif.

  • Oldindan reja yozish: asosiy metrika (masalan, foydalanuvchiga daromad), guardrail lar, MDE, namuna hajmi — kamida 1-2 to'liq hafta.
  • Daromad metrikasi uchun bootstrap yoki log-transformatsiya, SE foydalanuvchi bo'yicha.
  • Segmentlar (mobil/veb) — oldindan e'lon qilingan ikkinchi darajali tahlil, tuzatish bilan.
  • Natija bir marta, oldindan belgilangan kunda o'qiladi.

Intervyuerga javob: "Hozirgi natija bilan ishga tushirishni tavsiya qilmayman: test sezilarli bo'lgan kunda to'xtatilgan, 15 metrikadan bittasi tasodifan ham sezilarli chiqishi mumkin, 3 kun esa haftalik mavsumiylikni qamramaydi. Lekin natija qiziqarli — uni gipoteza sifatida olib, asosiy metrikasi va namuna hajmi oldindan belgilangan ikki haftalik test o'tkazishni taklif qilaman. Shundan keyin ishga tushirish qarori raqam bilan asoslanadi."

Nimani mustahkamlaydi: 2.2, 2.5, 2.6, 2.9, 2.10-bo'limlar.


Xulosa

Bu darsda intervyuda tez-tez so'raladigan statistika va ehtimollik savollarini ko'rib chiqdik va har bir javobni simulyatsiya bilan tekshirdik.

Eng muhim uch fikr:

  1. Javob — formula, intuitsiya va tekshiruv. 1-misolda tibbiy test masalasida to'g'ri javob 8.8% (analitik 0.0876, simulyatsiya 0.0884), "95%" emas — asosiy stavka hal qiladi; tug'ilgan kun paradoksida 23 odam (0.507, 253 juftlik); ketma-ket ikki gerb uchun 6 ta tashlash (5.993), HT uchun esa 4 ta. Har javob Monte Carlo bilan 2*SE ichida tasdiqlandi — intervyuda ham shu uslubda javob bering.

  2. p-qiymat va oraliqlar — nima ekanini va nima emasligini biling. 2-misolda H0 da p bir tekis va p < 0.05 ulushi 0.051, lekin haqiqiy ta'sirlar kam bo'lgan dunyoda p < 0.05 li testlarning ~50% ida H0 to'g'ri; 200 000 kuzatuvda ahamiyatsiz farq ham p = 5.5e-05. Ishonch oralig'i — protsedura xossasi; og'ir dumli ma'lumotda n=30 da qamrov 0.851, n=200 da ham 0.911 — CLT sekin ishlaydi.

  3. A/B test va tarafkashliklar — dizayn oldindan. 3-misolda formula 14751 ni berdi va simulyatsiya quvvat 0.792 ni tasdiqladi; kam quvvatli testda ta'sir x1.83 oshirib ko'rsatildi; 20 marta qarash yolg'on musbatni 0.253 ga, 20 metrika esa P(>=1 yolg'on) ni 0.64 ga chiqardi. 4-misolda Simpson paradoksi, yashirin sabab, omon qolganlar va Berkson tarafkashligi bitta savolga olib keldi: ma'lumot qanday paydo bo'lgan?

Keyingi darsda Intervyu: ML, SQL va case study: bias-variance, regularizatsiya, nomutanosib sinflar, sizish va gradient boosting bo'yicha savollar — kod bilan tekshiruv; sqlite3 da haqiqiy jadvallar bilan SQL savollari (JOIN, GROUP BY, oyna funksiyalari, retention); jonli kodlash masalalari va "sotuv 10% tushdi — nima qilasiz?" degan case study ning to'liq tahlili.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
29.9-dars: Intervyu: statistika va ehtimollik — IlmHamroh