IlmHamroh
Data Science va sun'iy intellekt/Regressiya4/12-dars20 daqiqa
Mundarija (22)

13.4-dars: Taxminlar va diagnostika

13-QISM — REGRESSIYA · 4-dars


1. Kirish va motivatsiya

Chiziqli regressiya taxminlar ustiga qurilgan. Ularning buzilishi modelni har doim ham yaroqsiz qilmaydi — lekin nimani buzishini bilish kerak: ba'zi buzilishlar bashoratni, ba'zilari faqat p-qiymat va ishonch oraliqlarini zararlaydi. Ikkalasini farqlay olish — professional darajadagi asosiy ko'nikma.

Bu darsda: beshta taxmin (chiziqlilik, mustaqillik, geteroskedastiklik yo'qligi, normal qoldiqlar, multikollinearlik yo'qligi), har birini diagnostika qilish, har birining buzilishi nimaga ta'sir qiladi va qanday tuzatish mumkin; ta'sirli nuqtalar (leverage, Cook masofasi) va robust standart xatolar.

Real vaziyat. Sug'urta kompaniyasi da'vo summasini modellaydi: R^2 = 0.78, p-qiymatlar ajoyib. Auditor bir savol beradi: "Qoldiqlar grafigi qani?" — grafik konus shaklida: katta polislarda xato bir necha barobar katta. Oqibat: ishonch oraliqlari haqiqiydan 3 barobar tor edi, ya'ni model o'z aniqligini oshirib ko'rsatgan. Yechim: log(y) va robust standart xatolar — endi oraliqlar haqqoniy va qaror to'g'ri qabul qilindi.

Bu darsda regressiya diagnostikasini o'rganamiz.

Bu darsda:

  • Beshta taxmin
  • Qoldiqlar diagnostikasi
  • Geteroskedastiklik
  • Normal qoldiqlar — qachon muhim
  • Ta'sirli nuqtalar
  • Robust standart xatolar
  • Tuzoqlar
  • Amaliy: to'liq diagnostika

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


2. Nazariya — chuqur tushuntirish

2.1. Beshta taxmin

text
1. CHIZIQLILIK     — y va belgilar orasidagi bog'liqlik chiziqli
      buzilsa: BASHORAT ham, talqin ham noto'g'ri
2. MUSTAQILLIK     — kuzatuvlar (qoldiqlar) o'zaro bog'liq emas
      buzilsa: standart xatolar noto'g'ri (vaqt qatori, klasterlar)
3. GOMOSKEDASTIKLIK — qoldiq dispersiyasi barcha bashoratlarda bir xil
      buzilsa: koeffitsiyent baholari to'g'ri, CI va p NOTO'G'RI
4. NORMAL QOLDIQLAR — qoldiqlar taxminan normal taqsimlangan
      buzilsa: kichik namunada CI noto'g'ri; katta namunada muhim emas 4.7-bob
5. MULTIKOLLINEARLIK YO'Q — belgilar o'zaro kuchli bog'liq emas 13.3-bob
      buzilsa: koeffitsiyentlar beqaror, bashorat zarar ko'rmaydi

Taxminlarni muhimlik tartibida ko'rish foydali: chiziqlilik — eng muhimi (buzilsa hamma narsa noto'g'ri); mustaqillik va gomoskedastiklik — statistik xulosani buzadi; normallik — katta namunada deyarli ahamiyatsiz. Eng keng tarqalgan xato — normallikka haddan tashqari e'tibor berib, chiziqlilikni tekshirmaslik.

2.2. Qoldiqlar diagnostikasi

text
Asosiy grafiklar (10.6, 12.6):
  1. qoldiq ~ bashorat    — egrilik (chiziqlilik), konus (geteroskedastiklik)
  2. Q-Q grafigi          — normallik
  3. qoldiq ~ har belgi   — qaysi belgi shaklni buzyapti
  4. qoldiq ~ tartib/vaqt — mustaqillik (avtokorrelyatsiya)
  5. leverage ~ qoldiq    — ta'sirli nuqtalar

Sonli testlar: Breusch-Pagan (geteroskedastiklik), Durbin-Watson (avtokorrelyatsiya),
               Jarque-Bera (normallik), RESET (shakl)

Qoldiq–bashorat grafigi — regressiya diagnostikasining markazi: bitta rasmda chiziqlilik va gomoskedastiklikni ko'rish mumkin. Sonli testlar foydali, lekin katta namunada hamma narsa sezilarli bo'ladi 11.5-bob — shuning uchun effekt kattaligiga qarash kerak, p-qiymatga emas.

2.3. Geteroskedastiklik

text
Belgisi: qoldiq tarqoqligi bashorat bilan birga o'sadi (konus shakli)
Sabablari: ko'paytiruvchi xato, y ning o'ng qiyshiqligi, birlashtirilgan ma'lumot

Oqibati: koeffitsiyentlar BIAS SIZ, lekin standart xatolar noto'g'ri
         (odatda juda kichik → CI tor, p-qiymat kichik → soxta ishonch)

Yechimlar:
  1. log(y) yoki sqrt(y) transformatsiyasi
  2. ROBUST (HC3) standart xatolar — cov_type="HC3"
  3. Vaznli eng kichik kvadratlar (WLS)
  4. GLM (Gamma, Poisson — 13.10)

Geteroskedastiklik — eng ko'p uchraydigan buzilish: real ma'lumotda xato deyarli har doim kattaroq qiymatlarda kattaroq bo'ladi. Muhim: u koeffitsiyentlarni buzmaydi, faqat ularning noaniqligini noto'g'ri baholaydi. Eng oddiy va ishonchli yechim — robust standart xatolar (HC3): bitta parametr, hech qanday transformatsiya kerak emas.

2.4. Normal qoldiqlar

text
NORMALLIK KERAK:
  · kichik namunada (n < 30-50) aniq CI va p-qiymat uchun
  · bashorat intervallari (prediction interval) uchun

NORMALLIK DEYARLI KERAK EMAS:
  · katta namunada — MLT tufayli koeffitsiyent taqsimoti normal 4.7-bob
  · nuqtaviy bashorat uchun

Tekshirish: Q-Q grafigi (eng yaxshi), gistogramma; testlar — katta n da haddan tashqari sezgir

Normallik — eng kam muhim taxmin, lekin eng ko'p tekshiriladigan. Katta namunada markaziy limit teoremasi 4.7-bob koeffitsiyentlarning taqsimotini normal qiladi — qoldiqlar normal bo'lmasa ham. Lekin og'ir dumlar (outlierlar) OLS ni buzadi — bu normallik emas, robustlik muammosi 13.11-bob.

2.5. Ta'sirli nuqtalar

text
leverage (h_ii) — kuzatuv X fazosida qanchalik chetda
  o'rtacha leverage = p/n;  2p/n dan katta — yuqori

standartlashtirilgan qoldiq — y bo'yicha qanchalik chetda

Cook masofasi — ikkalasini birlashtiradi: "shu nuqta olib tashlansa,
                barcha bashoratlar qancha o'zgaradi"
  D > 4/n  — e'tibor bering;  D > 1 — juda ta'sirli

⚠️ Yuqori leverage o'zi yomon emas; ta'sirli nuqta = yuqori leverage + katta qoldiq

Bitta kuzatuv butun modelni o'zgartirishi mumkin — ayniqsa u X bo'yicha chetda bo'lsa (yuqori leverage). Cook masofasi amaliy o'lchov: nuqtani olib tashlasak natija qancha o'zgaradi. Topilgan nuqtani avtomatik o'chirmang: avval tekshiring — bu xatomi (o'lchov xatosi) yoki haqiqiy, muhim kuzatuvmi.

2.6. Nima qilish kerak

text
BUZILISH                TA'SIR              YECHIM
chiziqlilik             hamma narsa         nochiziqli belgilar 13.5-bob, boshqa model
mustaqillik             CI, p               klaster/HAC standart xatolar, aralash model
geteroskedastiklik      CI, p               HC3, log(y), WLS, GLM
normallik (kichik n)    CI, p               bootstrap 11.8-bob, transformatsiya
multikollinearlik       koeffitsiyent        birlashtirish, Ridge 13.7-bob
ta'sirli nuqtalar       hammasi             tekshirish, robust regressiya (13.11)

Har buzilish uchun maqsadga qarab yechim tanlanadi: agar sizga faqat bashorat kerak bo'lsa, geteroskedastiklik va normallik deyarli muhim emas; xulosa (koeffitsiyent, CI, p) kerak bo'lsa — ular hal qiluvchi. Shuning uchun diagnostika savoldan boshlanadi: "natijani nima uchun ishlataman?"

2.7. Tuzoqlar

Asosiy tuzoqlar: normallikka haddan tashqari e'tibor; chiziqlilikni tekshirmaslik; katta namunada testlarga ishonish (hamma narsa sezilarli — 11.5); outlierlarni avtomatik o'chirish; geteroskedastiklikni e'tiborsiz qoldirib tor CI e'lon qilish; vaqt qatorida mustaqillikni tekshirmaslik; diagnostikani test to'plamida qilish (o'quvda qiling); transformatsiyadan keyin talqinni o'zgartirmaslik 13.3-bob.

2.8. Diagnostika — savolga bog'liq

Beshta taxmin: chiziqlilik (eng muhim — buzilsa hamma narsa noto'g'ri), mustaqillik, gomoskedastiklik, normallik (katta namunada deyarli ahamiyatsiz), multikollinearlik yo'qligi 13.3-bob. Markaziy vosita — qoldiq–bashorat grafigi: egrilik chiziqlilikni, konus geteroskedastiklikni ko'rsatadi. Geteroskedastiklik koeffitsiyentlarni buzmaydi, faqat CI va p-qiymatni — eng oson yechim robust (HC3) standart xatolar. Cook masofasi ta'sirli kuzatuvlarni topadi, lekin ularni avtomatik o'chirmang. Keyingi dars — polinomial va nochiziqli belgilar.


3. Tez ma'lumotnoma

python
import numpy as np
import statsmodels.api as sm
from scipy import stats
from statsmodels.stats.diagnostic import het_breuschpagan
from statsmodels.stats.stattools import durbin_watson

nat = sm.OLS(y, sm.add_constant(X)).fit()
qoldiq, bashorat = nat.resid, nat.fittedvalues

het_breuschpagan(qoldiq, nat.model.exog)[1]        # geteroskedastiklik p
durbin_watson(qoldiq)                              # ~2 — avtokorrelyatsiya yo'q
stats.probplot(qoldiq, dist="norm")                # Q-Q ma'lumoti

ta = nat.get_influence()
ta.hat_matrix_diag                                 # leverage
ta.cooks_distance[0]                               # Cook masofasi

robust = sm.OLS(y, sm.add_constant(X)).fit(cov_type="HC3")   # robust SE
QOIDA: avval chiziqlilik · qoldiq grafigi · HC3 arzon · outlierni o'chirma

Diagnostika xulosasi

Chiziqlilik — eng muhim · Gomoskedastiklik va mustaqillik — CI/p
Normallik — katta n da muhim emas · Multikollinearlik — koeffitsiyent
Qoldiq~bashorat grafigi — markaziy vosita · HC3 — eng arzon yechim
Cook > 4/n — tekshiring (o'chirmang)

4. Batafsil misollar

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

Misol 1 — To'rt holat, bir xil R^2

python
"""Taxminlarning turli buzilishlari (real numpy/statsmodels)."""

import numpy as np
import statsmodels.api as sm
from scipy import stats
from statsmodels.stats.diagnostic import het_breuschpagan


def main() -> None:
    rng = np.random.default_rng(12)
    n = 600
    x = rng.uniform(1, 20, n)

    holatlar = {
        "yaxshi": 5 + 2.0 * x + rng.normal(0, 4, n),
        "egrilik": 5 + 0.22 * x ** 2 + rng.normal(0, 4, n),
        "konus": 5 + 2.0 * x + rng.normal(0, 0.55 * x, n),
        "og'ir dum": 5 + 2.0 * x + rng.standard_t(2, n) * 3,
    }

    print("=== 1. Umumiy ko'rsatkichlar ===")
    print(f"  {'holat':<10} {'R^2':>7} {'qoldiq SD':>10}")
    natijalar = {}
    for nom, y in holatlar.items():
        nat = sm.OLS(y, sm.add_constant(x)).fit()
        natijalar[nom] = nat
        print(f"  {nom:<10} {nat.rsquared:>7.3f} {np.sqrt(nat.mse_resid):>10.2f}")

    print("\n=== 2. Qoldiq ~ bashorat: choraklar bo'yicha o'rtacha ===")
    for nom, nat in natijalar.items():
        b, e = nat.fittedvalues, nat.resid
        chegara = np.quantile(b, [0, 0.25, 0.5, 0.75, 1.0])
        ort = [e[(b >= chegara[i]) & (b <= chegara[i + 1])].mean() for i in range(4)]
        print(f"  {nom:<10}: [{', '.join(f'{v:6.2f}' for v in ort)}]")
    print("  egrilik holatida naqsh: + - - + ")

    print("\n=== 3. Geteroskedastiklik (Breusch-Pagan) ===")
    for nom, nat in natijalar.items():
        p = het_breuschpagan(nat.resid, nat.model.exog)[1]
        b, e = nat.fittedvalues, nat.resid
        nisbat = e[b >= np.median(b)].std() / e[b < np.median(b)].std()
        print(f"  {nom:<10}: p = {p:.2e}, SD nisbati = {nisbat:.2f}")

    print("\n=== 4. Normallik (Jarque-Bera) ===")
    for nom, nat in natijalar.items():
        jb = stats.jarque_bera(nat.resid)
        print(f"  {nom:<10}: p = {jb.pvalue:.2e}, "
              f"basiqlik = {stats.kurtosis(nat.resid):6.2f}")
    print("  ⭐ R^2 o'xshash, lekin muammolar butunlay boshqa")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Umumiy ko'rsatkichlar ===
  holat          R^2  qoldiq SD
  yaxshi       0.884       4.09
  egrilik      0.937       6.96
  konus        0.764       6.51
  og'ir dum    0.343      15.74

=== 2. Qoldiq ~ bashorat: choraklar bo'yicha o'rtacha ===
  yaxshi    : [  0.03,   0.04,  -0.05,  -0.02]
  egrilik   : [  4.99,  -5.22,  -4.62,   4.84]
  konus     : [ -0.12,   0.09,   0.29,  -0.26]
  og'ir dum : [  0.83,  -1.17,   0.11,   0.23]
  egrilik holatida naqsh: + - - +

=== 3. Geteroskedastiklik (Breusch-Pagan) ===
  yaxshi    : p = 6.35e-01, SD nisbati = 1.02
  egrilik   : p = 1.86e-02, SD nisbati = 0.92
  konus     : p = 3.26e-30, SD nisbati = 2.71
  og'ir dum : p = 5.61e-01, SD nisbati = 0.27

=== 4. Normallik (Jarque-Bera) ===
  yaxshi    : p = 2.03e-01, basiqlik =  -0.01
  egrilik   : p = 9.18e-03, basiqlik =  -0.50
  konus     : p = 1.78e-11, basiqlik =   1.41
  og'ir dum : p = 0.00e+00, basiqlik = 380.66
  ⭐ R^2 o'xshash, lekin muammolar butunlay boshqa

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

Misol 2 — Geteroskedastiklik: CI qanchalik noto'g'ri

python
"""Oddiy va robust standart xatolar (real numpy/statsmodels)."""

import numpy as np
import statsmodels.api as sm


def main() -> None:
    rng = np.random.default_rng(21)
    HAQIQIY = 2.0

    print("=== 1. Bitta namunada ikki xil standart xato ===")
    n = 500
    x = rng.uniform(1, 20, n)
    y = 5 + HAQIQIY * x + rng.normal(0, 0.55 * x, n)
    oddiy = sm.OLS(y, sm.add_constant(x)).fit()
    robust = sm.OLS(y, sm.add_constant(x)).fit(cov_type="HC3")
    print(f"  koeffitsiyent (ikkalasida bir xil): {oddiy.params[1]:.4f} / "
          f"{robust.params[1]:.4f}")
    print(f"  oddiy SE  = {oddiy.bse[1]:.4f}, CI = "
          f"[{oddiy.conf_int()[1, 0]:.3f}, {oddiy.conf_int()[1, 1]:.3f}]")
    print(f"  robust SE = {robust.bse[1]:.4f}, CI = "
          f"[{robust.conf_int()[1, 0]:.3f}, {robust.conf_int()[1, 1]:.3f}]")

    print("\n=== 2. Qamrov tajribasi (500 takrorlash) ===")
    qamrov_oddiy = qamrov_robust = 0
    N = 500
    for _ in range(N):
        xs = rng.uniform(1, 20, n)
        ys = 5 + HAQIQIY * xs + rng.normal(0, 0.55 * xs, n)
        Xc = sm.add_constant(xs)
        o = sm.OLS(ys, Xc).fit()
        r = sm.OLS(ys, Xc).fit(cov_type="HC3")
        lo, hi = o.conf_int()[1]
        qamrov_oddiy += lo <= HAQIQIY <= hi
        lo, hi = r.conf_int()[1]
        qamrov_robust += lo <= HAQIQIY <= hi
    print(f"  oddiy CI qamrovi : {qamrov_oddiy / N:.1%}  (kerak 95%)")
    print(f"  robust CI qamrovi: {qamrov_robust / N:.1%}")

    print("\n=== 3. Gomoskedastik holatda farq yo'q ===")
    y2 = 5 + HAQIQIY * x + rng.normal(0, 6, n)
    o2 = sm.OLS(y2, sm.add_constant(x)).fit()
    r2 = sm.OLS(y2, sm.add_constant(x)).fit(cov_type="HC3")
    print(f"  oddiy SE = {o2.bse[1]:.4f}, robust SE = {r2.bse[1]:.4f}")
    print("  (robust SE deyarli bepul — shubha bo'lsa ishlating)")

    print("\n=== 4. log(y) transformatsiyasi ===")
    y3 = np.exp(1.5 + 0.12 * x) * rng.lognormal(0, 0.3, n)
    xom = sm.OLS(y3, sm.add_constant(x)).fit()
    log_m = sm.OLS(np.log(y3), sm.add_constant(x)).fit()
    e1, b1 = xom.resid, xom.fittedvalues
    e2, b2 = log_m.resid, log_m.fittedvalues
    print(f"  xom y:    SD nisbati = "
          f"{e1[b1 >= np.median(b1)].std() / e1[b1 < np.median(b1)].std():.2f}")
    print(f"  log(y):   SD nisbati = "
          f"{e2[b2 >= np.median(b2)].std() / e2[b2 < np.median(b2)].std():.2f}")
    print("  ⭐ Ko'paytiruvchi xatoda log(y) muammoni yo'qotadi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Bitta namunada ikki xil standart xato ===
  koeffitsiyent (ikkalasida bir xil): 1.9931 / 1.9931
  oddiy SE  = 0.0541, CI = [1.887, 2.099]
  robust SE = 0.0601, CI = [1.875, 2.111]

=== 2. Qamrov tajribasi (500 takrorlash) ===
  oddiy CI qamrovi : 92.6%  (kerak 95%)
  robust CI qamrovi: 94.4%

=== 3. Gomoskedastik holatda farq yo'q ===
  oddiy SE = 0.0465, robust SE = 0.0456
  (robust SE deyarli bepul — shubha bo'lsa ishlating)

=== 4. log(y) transformatsiyasi ===
  xom y:    SD nisbati = 2.50
  log(y):   SD nisbati = 1.06
  ⭐ Ko'paytiruvchi xatoda log(y) muammoni yo'qotadi

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

Misol 3 — Ta'sirli nuqtalar

python
"""Leverage, qoldiq va Cook masofasi (real numpy/statsmodels)."""

import numpy as np
import statsmodels.api as sm


def main() -> None:
    rng = np.random.default_rng(31)
    n = 100
    x = rng.uniform(0, 10, n)
    y = 4 + 1.5 * x + rng.normal(0, 1.2, n)

    print("=== 1. Asl model ===")
    nat = sm.OLS(y, sm.add_constant(x)).fit()
    print(f"  nishab = {nat.params[1]:.3f}")

    holatlar = {
        "markazda katta qoldiq": (5.0, 4 + 1.5 * 5.0 + 9.0),
        "chetda, chiziq ustida": (25.0, 4 + 1.5 * 25.0),
        "chetda, chiziqdan uzoq": (25.0, 4 + 1.5 * 25.0 - 18.0),
    }

    print("\n=== 2. Bitta nuqta qo'shamiz ===")
    for nom, (xn, yn) in holatlar.items():
        xs, ys = np.append(x, xn), np.append(y, yn)
        m = sm.OLS(ys, sm.add_constant(xs)).fit()
        ta = m.get_influence()
        print(f"  {nom:<24}: nishab {m.params[1]:6.3f} "
              f"({m.params[1] / nat.params[1] - 1:+6.1%}), "
              f"leverage {ta.hat_matrix_diag[-1]:.3f}, "
              f"Cook {ta.cooks_distance[0][-1]:7.3f}")

    print("\n=== 3. Chegaralar ===")
    print(f"  o'rtacha leverage = p/n = {2 / (n + 1):.4f}, "
          f"ogohlantirish chegarasi 2p/n = {4 / (n + 1):.4f}")
    print(f"  Cook chegarasi 4/n = {4 / (n + 1):.4f}")

    print("\n=== 4. Asl ma'lumotda ta'sirli nuqtalar ===")
    ta = nat.get_influence()
    cook = ta.cooks_distance[0]
    yuqori = np.argsort(cook)[::-1][:3]
    for i in yuqori:
        print(f"  i={i:>3}: x={x[i]:5.2f}, qoldiq={nat.resid[i]:+6.2f}, "
              f"leverage={ta.hat_matrix_diag[i]:.3f}, Cook={cook[i]:.4f}")
    print(f"  4/n dan katta: {(cook > 4 / n).sum()} ta")
    print("  ⭐ Yuqori leverage o'zi muammo emas — qoldiq bilan birga muammo")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Asl model ===
  nishab = 1.476

=== 2. Bitta nuqta qo'shamiz ===
  markazda katta qoldiq   : nishab  1.473 ( -0.2%), leverage 0.010, Cook   0.179
  chetda, chiziq ustida   : nishab  1.483 ( +0.5%), leverage 0.333, Cook   0.025
  chetda, chiziqdan uzoq  : nishab  1.185 (-19.7%), leverage 0.333, Cook  14.637

=== 3. Chegaralar ===
  o'rtacha leverage = p/n = 0.0198, ogohlantirish chegarasi 2p/n = 0.0396
  Cook chegarasi 4/n = 0.0396

=== 4. Asl ma'lumotda ta'sirli nuqtalar ===
  i= 46: x= 9.70, qoldiq= +2.68, leverage=0.035, Cook=0.0932
  i= 18: x= 0.19, qoldiq= -2.40, leverage=0.042, Cook=0.0914
  i= 96: x= 0.64, qoldiq= +2.14, leverage=0.037, Cook=0.0626
  4/n dan katta: 5 ta
  ⭐ Yuqori leverage o'zi muammo emas — qoldiq bilan birga muammo

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — To'liq diagnostika hisoboti

python
"""Bitta funksiyada barcha tekshiruvlar (real numpy/scipy/statsmodels)."""

import numpy as np
import statsmodels.api as sm
from scipy import stats
from statsmodels.stats.diagnostic import het_breuschpagan
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.stats.stattools import durbin_watson


def tekshir(y, X, nomlar) -> dict:
    """Regressiya diagnostikasi — qisqa hisobot."""
    Xc = sm.add_constant(X)
    nat = sm.OLS(y, Xc).fit()
    e, b = nat.resid, nat.fittedvalues
    chegara = np.quantile(b, [0, 0.25, 0.5, 0.75, 1.0])
    egrilik = [e[(b >= chegara[i]) & (b <= chegara[i + 1])].mean() for i in range(4)]
    return {
        "R2": nat.rsquared,
        "egrilik": max(abs(v) for v in egrilik) / np.std(e),
        "het_p": het_breuschpagan(e, Xc)[1],
        "SD_nisbat": e[b >= np.median(b)].std() / e[b < np.median(b)].std(),
        "dw": durbin_watson(e),
        "jb_p": stats.jarque_bera(e).pvalue,
        "max_VIF": max(variance_inflation_factor(Xc, i)
                       for i in range(1, Xc.shape[1])),
        "cook_yuqori": int((nat.get_influence().cooks_distance[0]
                            > 4 / len(y)).sum()),
    }


def main() -> None:
    rng = np.random.default_rng(44)
    n = 800
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    xona = np.clip((maydon / 24).round(), 1, 7)
    markaz = (rng.random(n) < 0.3).astype(float)
    nomlar = ["maydon", "xona", "markaz"]
    X = np.column_stack([maydon, xona, markaz])

    print("=== 1. Yaxshi model ===")
    y1 = 18 + 1.52 * maydon + 4 * xona + 38 * markaz + rng.normal(0, 13, n)
    for k, v in tekshir(y1, X, nomlar).items():
        print(f"  {k:<12}: {v:.4f}" if isinstance(v, float) else f"  {k:<12}: {v}")

    print("\n=== 2. Geteroskedastik model ===")
    y2 = 18 + 1.52 * maydon + 4 * xona + 38 * markaz + rng.normal(0, 0.12 * maydon, n)
    n2 = tekshir(y2, X, nomlar)
    for k, v in n2.items():
        print(f"  {k:<12}: {v:.4f}" if isinstance(v, float) else f"  {k:<12}: {v}")

    print("\n=== 3. Nochiziqli model ===")
    y3 = 18 + 0.011 * maydon ** 2 + 38 * markaz + rng.normal(0, 13, n)
    n3 = tekshir(y3, X, nomlar)
    for k, v in n3.items():
        print(f"  {k:<12}: {v:.4f}" if isinstance(v, float) else f"  {k:<12}: {v}")

    n1 = tekshir(y1, X, nomlar)
    print("\n=== 4. Xulosa va tavsiyalar ===")
    print(f"  yaxshi      : egrilik {n1['egrilik']:.3f}, het_p {n1['het_p']:.2f} "
          f"→ chiziqlilik va gomoskedastiklik joyida")
    print(f"  geteroskedastik: SD nisbati {n2['SD_nisbat']:.2f}, het_p "
          f"{n2['het_p']:.1e} → HC3 yoki log(y)")
    print(f"  nochiziqli  : egrilik {n3['egrilik']:.3f} (yaxshida {n1['egrilik']:.3f}) "
          f"→ x^2 belgisi 13.5-bob")
    print(f"  VIF uchala modelda ham {n1['max_VIF']:.1f} — maydon va xona bog'liq 13.3-bob;")
    print("    u faqat koeffitsiyentlarga ta'sir qiladi, bashoratga emas")
    print(f"  Cook > 4/n: {n1['cook_yuqori']} ta ({n1['cook_yuqori'] / len(y1):.1%}) — "
          f"bu chegara odatda ~5% qatorni belgilaydi, hammasi muammo emas")
    print("  ⭐ Diagnostika — bitta funksiya, har loyihada takrorlanadi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Yaxshi model ===
  R2          : 0.9286
  egrilik     : 0.1249
  het_p       : 0.4520
  SD_nisbat   : 1.0804
  dw          : 2.0243
  jb_p        : 0.3020
  max_VIF     : 13.4558
  cook_yuqori : 39

=== 2. Geteroskedastik model ===
  R2          : 0.9592
  egrilik     : 0.0993
  het_p       : 0.0000
  SD_nisbat   : 1.6189
  dw          : 2.0246
  jb_p        : 0.0000
  max_VIF     : 13.4558
  cook_yuqori : 42

=== 3. Nochiziqli model ===
  R2          : 0.8951
  egrilik     : 0.4414
  het_p       : 0.0000
  SD_nisbat   : 1.3134
  dw          : 2.0474
  jb_p        : 0.0000
  max_VIF     : 13.4558
  cook_yuqori : 29

=== 4. Xulosa va tavsiyalar ===
  yaxshi      : egrilik 0.125, het_p 0.45 → chiziqlilik va gomoskedastiklik joyida
  geteroskedastik: SD nisbati 1.62, het_p 6.0e-24 → HC3 yoki log(y)
  nochiziqli  : egrilik 0.441 (yaxshida 0.125) → x^2 belgisi 13.5-bob
  VIF uchala modelda ham 13.5 — maydon va xona bog'liq 13.3-bob;
    u faqat koeffitsiyentlarga ta'sir qiladi, bashoratga emas
  Cook > 4/n: 39 ta (4.9%) — bu chegara odatda ~5% qatorni belgilaydi, hammasi muammo emas
  ⭐ Diagnostika — bitta funksiya, har loyihada takrorlanadi

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


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

Noto'g'ri fikr To'g'risi
"Qoldiqlar normal bo'lishi shart" Katta n da muhim emas
"Geteroskedastiklik koeffitsiyentni buzadi" Faqat CI va p ni
"Yuqori leverage — outlier" Qoldiq bilan birga muammo
"Ta'sirli nuqtani o'chirish kerak" Avval tekshiring
"Test p < 0.05 — muammo bor" Effekt kattaligiga qarang
"Diagnostika — statistiklar ishi" Har loyihada kerak
"R^2 yuqori — taxminlar bajarilgan" Bog'liq emas
"HC3 qimmat" Deyarli bepul

6. Keng tarqalgan xatolar va yechimlari

1. Faqat normallikni tekshirish

python
stats.shapiro(qoldiq)                                             # ⚠️
# avval qoldiq ~ bashorat grafigi (chiziqlilik)                   # ✅

2. Geteroskedastiklikni e'tiborsiz qoldirish

python
nat = sm.OLS(y, X).fit()               # tor CI                   # ⚠️
nat = sm.OLS(y, X).fit(cov_type="HC3")                            # ✅

3. Outlierni avtomatik o'chirish

python
df = df[np.abs(qoldiq) < 3 * qoldiq.std()]                        # ⚠️
# tekshiring: xatomi yoki haqiqiy kuzatuvmi                       # ✅

4. Katta namunada testga ishonish

python
if het_p < 0.05: print("muammo")       # n = 100000               # ⚠️
print(f"SD nisbati {nisbat:.2f}")      # effekt kattaligi         # ✅

5. Vaqt qatorida mustaqillikni tekshirmaslik

python
sm.OLS(y, X).fit()                     # kunlik ma'lumot          # ⚠️
durbin_watson(nat.resid); cov_type="HAC"                          # ✅

6. Diagnostikani test to'plamida qilish

python
# test qoldiqlarini tahlil qilish                                 # ⚠️
# o'quvda diagnostika, testda faqat yakuniy baho 12.3-bob           # ✅

7. Transformatsiyadan keyin eski talqin

python
# log(y) modeli: "koeffitsiyent 0.12 ming so'm"                   # ⚠️
# "+12.7%" 13.3-bob                                                 # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 4.7-dars (o'tilgan): Markaziy limit teoremasi
  • 11.5-dars (o'tilgan): Katta namunada testlar
  • 13.3-dars (o'tilgan): Multikollinearlik
  • 13.5-dars: Nochiziqli belgilar
  • 13.11-dars: Robust regressiya

8. Eng yaxshi amaliyotlar

  1. Avval chiziqlilikni tekshiring.

  2. Qoldiq–bashorat grafigini ko'ring.

  3. HC3 ni standart qiling.

  4. Effekt kattaligiga qarang.

  5. Cook masofasini hisoblang.

  6. Outlierni tekshiring, o'chirmang.

  7. Diagnostikani o'quvda qiling.

  8. Maqsaddan kelib chiqing.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # beshta taxmin?
2.  # eng muhimi?
3.  # geteroskedastiklik nimani buzadi?
4.  # eng oson yechimi?
5.  # normallik qachon muhim?
6.  # leverage nima?
7.  # Cook masofasi nima?
8.  # Cook chegarasi?
9.  # Durbin-Watson qiymati?
10. # markaziy diagnostika grafigi?
11. # katta namunada testlar nega aldaydi?
12. # diagnostika qaysi to'plamda?
Javoblar
  1. Chiziqlilik, mustaqillik, gomoskedastiklik, normallik, multikollinearlik yo'qligi
  2. Chiziqlilik
  3. CI va p-qiymat
  4. HC3 robust SE
  5. Kichik namunada
  6. X fazosidagi chetlik
  7. Nuqta olib tashlansa bashorat o'zgarishi
  8. 4/n
  9. ~2
  10. Qoldiq ~ bashorat
  11. Hamma narsa sezilarli bo'ladi
  12. O'quvda

Vazifa 2: Xatolarni tuzating

python
1.  stats.shapiro(resid)   # yagona tekshiruv

2.  nat = sm.OLS(y, X).fit()   # konus shaklli qoldiqlar

3.  df = df[np.abs(z) < 3]   # tekshirmasdan

4.  if bp_p < 0.05: print("muammo")   # n = 200000

5.  sm.OLS(y, X).fit()   # kunlik vaqt qatori
Javoblar
python
1.  # qoldiq ~ bashorat grafigi va Breusch-Pagan

2.  sm.OLS(y, X).fit(cov_type="HC3")

3.  # Cook masofasi bilan topib, har birini tekshiring

4.  print(f"SD nisbati {nisbat:.2f}")

5.  sm.OLS(y, X).fit(cov_type="HAC", cov_kwds={"maxlags": 7})

Vazifa 3: To'rt holat

Modellang:

  1. Yaxshi, egri, konus, og'ir dum
  2. Diagnostika
  3. Farqlar
  4. Xulosa

Vazifa 4: Qamrov tajribasi

Modellang:

  1. Geteroskedastik ma'lumot
  2. Oddiy va HC3 CI
  3. Qamrov o'lchash
  4. Tavsiya

Vazifa 5: Ta'sirli nuqtalar

Modellang:

  1. Uch xil nuqta
  2. Leverage va Cook
  3. Nishab o'zgarishi
  4. Qaror

Vazifa 6: Diagnostika funksiyasi

Modellang:

  1. Umumiy funksiya
  2. Uch model
  3. Hisobot
  4. Tavsiyalar

Vazifa 7: O'ylash

Ko'p amaliy loyihalarda regressiya taxminlari umuman tekshirilmaydi va modellar baribir "ishlaydi". Bu taxminlar nazariy ortiqchalikmi yoki ularni e'tiborsiz qoldirish qachondir qimmatga tushadimi?

Javob

Qisqa javob: agar model faqat bashorat uchun ishlatilsa va sifat CV bilan o'lchansa, ko'p taxminlar amalda muhim emas. Ular xulosa (koeffitsiyent, CI, p-qiymat, bashorat intervali) ishlatilganda hal qiluvchi bo'ladi — va aynan shu joyda e'tiborsizlik qimmatga tushadi.

1. Ikki xil maqsad

Maqsad Muhim taxminlar
Nuqtaviy bashorat Chiziqlilik (qolganlari deyarli emas)
Koeffitsiyent talqini Chiziqlilik, multikollinearlik
CI va p-qiymat + gomoskedastiklik, mustaqillik
Bashorat intervali + normallik (yoki kvantil/konformal)

2. Qachon qimmatga tushadi

  • Tartibga solinadigan sohalar (tibbiyot, moliya) — xulosa hisobot qilinadi
  • Qaror noaniqlikka bog'liq (zaxira, risk, narx)
  • Vaqt qatori — mustaqillik buzilsa CI bir necha barobar tor
  • Kichik namuna — normallik va outlierlar hal qiluvchi

3. Minimal amaliy to'plam

  1. Qoldiq ~ bashorat grafigi (30 soniya)
  2. cov_type="HC3" (bir so'z)
  3. Cook masofasi bo'yicha 5 ta yuqori nuqtani ko'rish
  4. Vaqt bog'liqligi bo'lsa — Durbin-Watson va HAC

4. Nega bu ko'pincha tashlab ketiladi

  • ML madaniyatida CV yetarli deb qaraladi (bashorat uchun to'g'ri)
  • Diagnostika grafiklari hisobotga kirmaydi
  • Muammo "jim" — natija yaxshi ko'rinadi

5. Xulosa

  1. Bashorat uchun — CV asosiy mezon
  2. Xulosa uchun — taxminlar majburiy
  3. Minimal to'plam bir necha daqiqa oladi
  4. HC3 — deyarli bepul sug'urta

Nimani mustahkamlaydi: 2.1, 2.6-bo'limlar.


Xulosa

Bu darsda regressiya taxminlari va diagnostikasini o'rgandik.

Eng muhim uch fikr:

  1. Taxminlarning muhimligi teng emas. Chiziqlilik — eng muhimi: buzilsa bashorat ham, talqin ham noto'g'ri. Gomoskedastiklik va mustaqillik — faqat CI va p-qiymatni buzadi (koeffitsiyentlar biassiz qoladi). Normallik — katta namunada MLT tufayli deyarli ahamiyatsiz 4.7-bob, lekin eng ko'p tekshiriladigan taxmin.

  2. Qoldiq–bashorat grafigi — markaziy vosita. Bitta rasmda egrilik (chiziqlilik buzilgan) va konus shakli (geteroskedastiklik) ko'rinadi. Sonli testlar foydali, lekin katta namunada hamma narsa sezilarli bo'ladi 11.5-bob — effekt kattaligiga qarang (masalan, yuqori va past yarimdagi qoldiq SD nisbati).

  3. Eng arzon yechim — HC3. Robust standart xatolar geteroskedastiklikda CI qamrovini tiklaydi va gomoskedastik holatda deyarli hech narsa yo'qotmaydi — shubha bo'lsa doim ishlating. Ta'sirli nuqtalar uchun Cook masofasi (> 4/n); topilganini avtomatik o'chirmang — avval o'lchov xatosimi yoki haqiqiy kuzatuvmi, tekshiring.

Keyingi darsda polinomial va nochiziqli belgilarni o'rganamiz: darajalar, splaynlar, o'zaro ta'sirlar va nochiziqlikni chiziqli model ichida ushlash.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
13.4-dars: Taxminlar va diagnostika — IlmHamroh