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

13.2-dars: Ko'p o'zgaruvchili regressiya

13-QISM — REGRESSIYA · 2-dars


1. Kirish va motivatsiya

Bitta belgili regressiya kamdan-kam yetarli: uy narxi faqat maydonga emas, hududga, yoshga, holatiga ham bog'liq. Belgi qo'shish modelni aniqroq qiladi — lekin talqinni butunlay o'zgartiradi. Ko'p o'zgaruvchili modelda koeffitsiyent endi "x va y bog'liqligi" emas, "boshqa belgilar nazoratga olingandagi" bog'lanish.

Bu darsda: model geometriyasi (giperslip), nazorat qilish (controlling for) tushunchasi va u nega Simpson paradoksini 4.10-bob hal qiladi, belgi qo'shganda R^2 nega har doim o'sishi, adjusted R^2, model sig'imi va belgilar sonining namunaga nisbati, statsmodels bilan to'liq statistik hisobot.

Real vaziyat. Ta'lim platformasi "kurs narxi va tugatish darajasi" bog'liqligini o'lchaydi: qimmat kurslar ko'proq tugatilar ekan (r = 0.41) — "narxni oshiraylik" degan taklif paydo bo'ladi. Ko'p o'zgaruvchili model oldingi tajriba va haftalik vaqt belgilarini qo'shgach, narx koeffitsiyenti deyarli nolga tushdi: qimmat kurslarni tayyorroq va ko'proq vaqt ajratadigan odamlar sotib olar ekan. Narx sabab emas edi.

Bu darsda ko'p o'zgaruvchili regressiyani o'rganamiz.

Bu darsda:

  • Model geometriyasi
  • "Nazoratga olish" nimani anglatadi
  • R^2 va adjusted R^2
  • Belgi qo'shish qachon foydali
  • statsmodels hisoboti
  • Model sig'imi
  • Tuzoqlar
  • Amaliy: ko'p belgili model

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


2. Nazariya — chuqur tushuntirish

2.1. Geometriya

text
1 belgi:   chiziq        (2 o'lchamli fazoda)
2 belgi:   tekislik      (3 o'lchamli fazoda)
p belgi:   giperslip     (p+1 o'lchamli fazoda)

Bashorat = y ning X ustunlari yoyadigan fazoga PROYEKSIYASI   10.6-bob
Qoldiq   = shu fazoga perpendikulyar qism

Geometrik ma'no: OLS y vektorini belgilar yoyadigan qism fazoga proyeksiya qiladi (10.2, 10.6). Shuning uchun qoldiq har bir belgiga perpendikulyar (korrelyatsiyasiz) bo'ladi — bu OLS ning ta'rifidan kelib chiqadi, ma'lumot xossasi emas. Bu ko'rinish nega belgi qo'shganda qoldiq hech qachon oshmasligini darhol tushuntiradi: fazo kengaydi, proyeksiya yaqinroq bo'ladi.

2.2. Nazoratga olish

text
"x2 nazoratga olinganda x1 ning ta'siri" =
  1. x1 ni x2 ga regressiya qiling → qoldiq r1 (x1 ning x2 bilan tushuntirilmagan qismi)
  2. y ni x2 ga regressiya qiling  → qoldiq ry
  3. ry ni r1 ga regressiya qiling → nishab = ko'p o'zgaruvchili modeldagi w1

Bu — Frisch-Waugh-Lovell teoremasi

Nazoratga olish — "boshqa belgilarning hissasini chiqarib tashlab qolganini o'lchash". FWL teoremasi buni aniq ko'rsatadi: ko'p o'zgaruvchili koeffitsiyent — qoldiqlar bo'yicha oddiy regressiya nishabi. Shuning uchun koeffitsiyent belgi qo'shilganda keskin o'zgarishi mumkin (hatto ishorasi ham) — bu xato emas, boshqa savolga javob.

2.3. R^2 va adjusted R^2

text
Belgi qo'shilsa R^2 HAR DOIM o'sadi (hatto tasodifiy belgi bo'lsa ham)

adjusted R^2 = 1 - (1 - R^2) × (n - 1) / (n - p - 1)
  → foydasiz belgi qo'shilsa TUSHADI

Solishtirish uchun: adjusted R^2, AIC/BIC yoki (eng ishonchlisi) CROSS-VALIDATION

R^2 ni model tanlashda ishlatib bo'lmaydi: u belgi qo'shilganda monoton o'sadi. adjusted R^2 jazo qo'shadi, AIC/BIC — informatsion mezonlar; lekin amaliyotda eng ishonchlisi — cross-validation 12.3-bob, chunki u to'g'ridan-to'g'ri yangi ma'lumotdagi ishlashni o'lchaydi.

2.4. Belgi qo'shish qachon foydali

text
FOYDALI:
  · belgi y bilan bog'liq va mavjud belgilar bilan kuchli bog'liq EMAS
  · namuna hajmi yetarli (n >> p)
  · belgi bashorat paytida mavjud 12.2-bob

ZARARLI:
  · maqsaddan keyin paydo bo'ladi (leakage — 12.9)
  · mavjud belgilar bilan deyarli bir xil (multikollinearlik — 13.3)
  · shovqin (n ga nisbatan p katta bo'lsa overfitting — 12.4)

Qoida: belgi yangi ma'lumot olib kelishi kerak. Mavjud belgilar bilan kuchli korrelyatsiyaga ega belgi R^2 ni deyarli oshirmaydi, lekin koeffitsiyentlarni beqaror qiladi 13.3-bob. Namuna hajmi cheklangan bo'lsa, amaliy qoida: har belgi uchun kamida 10-20 kuzatuv.

2.5. statsmodels hisoboti

python
import statsmodels.api as sm

X = sm.add_constant(X)                 # kesma ustuni
nat = sm.OLS(y, X).fit()
print(nat.summary())

nat.params      # koeffitsiyentlar        nat.bse       # standart xatolar
nat.tvalues     # t statistikalari        nat.pvalues   # p-qiymatlar
nat.conf_int()  # ishonch oraliqlari      nat.rsquared_adj

sklearn bashorat uchun, statsmodels esa statistik xulosa uchun: standart xatolar, t-testlar, p-qiymatlar, ishonch oraliqlari va diagnostika. Koeffitsiyentning noaniqligini bilish muhim: w = 1.52 ± 0.04 va w = 1.52 ± 1.30 — butunlay boshqa xulosalar. Ishonch oralig'i nolni o'z ichiga olsa, belgi ta'siri isbotlanmagan 11.8-bob.

2.6. Model sig'imi

text
n — kuzatuvlar soni, p — belgilar soni

p >= n        → OLS yagona yechimga ega emas (cheksiz ko'p yechim)
p ~ n         → mukammal o'quv, halokatli test 12.4-bob
p << n        → barqaror

Yechim: regularizatsiya (13.7-13.8), belgi tanlash, ko'proq ma'lumot

Belgi soni namunaga yaqinlashganda OLS buziladi: o'quv R^2 1.0 ga intiladi, test natijasi esa halokatli tushadi (CV R^2 manfiy bo'lishi mumkin). Bu — 12.4 dagi overfittingning eng sof ko'rinishi. Matn yoki genetika kabi p > n vazifalarida OLS umuman ishlatilmaydi — Ridge/Lasso majburiy.

2.7. Tuzoqlar

Asosiy tuzoqlar: koeffitsiyentni yakka bog'lanish deb o'qish (u nazoratlangan); R^2 bo'yicha model tanlash; ko'p belgi qo'shib overfitting; leakage belgilari 12.9-bob; kategoriyani noto'g'ri kodlash 13.9-bob; belgi qo'shgach koeffitsiyent o'zgarishidan cho'chish (bu normal); p-qiymatlarga ko'p test tuzatishisiz ishonish 11.9-bob; masshtablanmagan koeffitsiyentlarni "muhimlik" deb solishtirish.

2.8. Ko'p belgi — boshqa savol

Ko'p o'zgaruvchili regressiya bashoratni yaxshilaydi va koeffitsiyentlar ma'nosini o'zgartiradi: har biri endi "boshqa belgilar nazoratga olingan" ta'sir (FWL teoremasi). Belgi qo'shilsa R^2 har doim o'sadi — shuning uchun model tanlashda adjusted R^2, AIC/BIC yoki (eng ishonchlisi) cross-validation kerak. Belgi yangi ma'lumot bersa foydali; mavjudlari bilan deyarli bir xil bo'lsa koeffitsiyentlarni beqaror qiladi. p n ga yaqinlashsa OLS buziladi — regularizatsiya kerak. Keyingi dars — koeffitsiyentlarni talqin qilish va multikollinearlik.


3. Tez ma'lumotnoma

python
import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

m = LinearRegression().fit(X, y)
dict(zip(nomlar, m.coef_))

# statistik hisobot
nat = sm.OLS(y, sm.add_constant(X)).fit()
nat.summary(); nat.conf_int(); nat.rsquared_adj

# model tanlash — CV
cross_val_score(LinearRegression(), X, y, cv=5, scoring="neg_mean_absolute_error")

# adjusted R^2 qo'lda
adj = 1 - (1 - r2) * (n - 1) / (n - p - 1)
QOIDA: koeffitsiyent — nazoratlangan ta'sir · R^2 bilan tanlama · n >> p · CI ni ko'rsat

Xulosa

Geometriya: proyeksiya · FWL: koeffitsiyent = qoldiqlar regressiyasi
R^2 har doim o'sadi · adjusted R^2 / AIC / CV bilan tanlang
Belgi yangi ma'lumot bersa foydali · p ~ n bo'lsa OLS buziladi
statsmodels — CI va p-qiymat; sklearn — bashorat

4. Batafsil misollar

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

Misol 1 — Nazoratga olish: koeffitsiyent nega o'zgaradi

python
"""Yashirin o'zgaruvchi va FWL teoremasi (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression


def main() -> None:
    rng = np.random.default_rng(4)
    n = 3000
    # tayyorgarlik — yashirin sabab: ham narxga, ham tugatishga ta'sir qiladi
    tayyorgarlik = rng.normal(0, 1, n)
    narx = 300 + 90 * tayyorgarlik + rng.normal(0, 60, n)
    tugatish = 45 + 12 * tayyorgarlik + 0.0 * narx + rng.normal(0, 8, n)

    print("=== 1. Faqat narx bilan ===")
    m1 = LinearRegression().fit(narx.reshape(-1, 1), tugatish)
    print(f"  narx koeffitsiyenti = {m1.coef_[0]:+.4f}")
    print(f"  korrelyatsiya r = {np.corrcoef(narx, tugatish)[0, 1]:.3f}")
    print("  ('qimmat kurslar ko'proq tugatiladi')")

    print("\n=== 2. Tayyorgarlik nazoratga olinganda ===")
    X = np.column_stack([narx, tayyorgarlik])
    m2 = LinearRegression().fit(X, tugatish)
    print(f"  narx koeffitsiyenti = {m2.coef_[0]:+.4f}  ← deyarli nol")
    print(f"  tayyorgarlik        = {m2.coef_[1]:+.4f}")
    print("  (haqiqiy model: narx ta'siri = 0, tayyorgarlik = 12)")

    print("\n=== 3. FWL teoremasi bilan tekshiruv ===")
    # narxning tayyorgarlik bilan tushuntirilmagan qismi
    r_narx = narx - LinearRegression().fit(
        tayyorgarlik.reshape(-1, 1), narx).predict(tayyorgarlik.reshape(-1, 1))
    r_tug = tugatish - LinearRegression().fit(
        tayyorgarlik.reshape(-1, 1), tugatish).predict(tayyorgarlik.reshape(-1, 1))
    fwl = LinearRegression().fit(r_narx.reshape(-1, 1), r_tug).coef_[0]
    print(f"  qoldiqlar regressiyasi nishabi = {fwl:+.4f}")
    print(f"  ko'p o'zgaruvchili koeffitsiyent = {m2.coef_[0]:+.4f}")
    print(f"  ikkalasi teng: {np.isclose(fwl, m2.coef_[0])}")

    print("\n=== 4. Xulosa ===")
    print("  yakka koeffitsiyent: narx → tugatish (soxta bog'lanish)")
    print("  nazoratlangan: narx ta'siri yo'q, sabab — tayyorgarlik")
    print("  ⭐ Belgi qo'shilganda koeffitsiyent o'zgarishi — normal")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Faqat narx bilan ===
  narx koeffitsiyenti = +0.0927
  korrelyatsiya r = 0.700
  ('qimmat kurslar ko'proq tugatiladi')

=== 2. Tayyorgarlik nazoratga olinganda ===
  narx koeffitsiyenti = +0.0016  ← deyarli nol
  tayyorgarlik        = +11.9349
  (haqiqiy model: narx ta'siri = 0, tayyorgarlik = 12)

=== 3. FWL teoremasi bilan tekshiruv ===
  qoldiqlar regressiyasi nishabi = +0.0016
  ko'p o'zgaruvchili koeffitsiyent = +0.0016
  ikkalasi teng: True

=== 4. Xulosa ===
  yakka koeffitsiyent: narx → tugatish (soxta bog'lanish)
  nazoratlangan: narx ta'siri yo'q, sabab — tayyorgarlik
  ⭐ Belgi qo'shilganda koeffitsiyent o'zgarishi — normal

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

Misol 2 — R^2 aldaydi: tasodifiy belgilar

python
"""Belgi qo'shilsa R^2 har doim o'sadi (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import KFold, cross_val_score


def main() -> None:
    rng = np.random.default_rng(1)
    n = 200
    x = rng.normal(0, 1, n)
    y = 3 + 2 * x + rng.normal(0, 2, n)
    cv = KFold(5, shuffle=True, random_state=0)

    print("=== 1. Tasodifiy (foydasiz) belgilar qo'shamiz ===")
    print(f"  {'belgilar':>9} {'''o'quv R^2''':>11} {'adjusted R^2':>14} {'CV R^2':>9}")
    for qosh in [0, 5, 20, 50, 100, 150]:
        X = np.column_stack([x] + [rng.normal(0, 1, n) for _ in range(qosh)])
        p = X.shape[1]
        m = LinearRegression().fit(X, y)
        r2 = r2_score(y, m.predict(X))
        adj = 1 - (1 - r2) * (n - 1) / (n - p - 1)
        cvr = cross_val_score(LinearRegression(), X, y, cv=cv, scoring="r2").mean()
        print(f"  {p:>9} {r2:>11.3f} {adj:>14.3f} {cvr:>9.3f}")

    print("\n=== 2. Nima bo'ldi ===")
    print("  o'quv R^2 — monoton o'sadi (foydasiz belgilarda ham)")
    print("  adjusted R^2 — tushadi")
    print("  CV R^2 — keskin tushadi (haqiqiy ishlash)")

    print("\n=== 3. p namunaga yaqinlashganda ===")
    X = np.column_stack([x] + [rng.normal(0, 1, n) for _ in range(190)])
    m = LinearRegression().fit(X, y)
    print(f"  p = {X.shape[1]}, n = {n}: o'quv R^2 = {r2_score(y, m.predict(X)):.3f}")
    print(f"  koeffitsiyentlarning maksimal moduli = {np.abs(m.coef_).max():.1f}")
    print("  (OLS deyarli mukammal 'yodlaydi' — 12.4)")

    print("\n=== 4. Xulosa ===")
    print("  ⭐ Model tanlashda R^2 emas, CV ishlatiladi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
<<NATIJA>>

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

Misol 3 — statsmodels: to'liq statistik hisobot

python
"""Koeffitsiyentlar, standart xatolar va ishonch oraliqlari (real statsmodels)."""

import numpy as np
import statsmodels.api as sm


def yarat(seed: int = 11, n: int = 800):
    rng = np.random.default_rng(seed)
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    xona = np.clip((maydon / 24).round(), 1, 7)
    yosh = rng.integers(0, 45, n).astype(float)
    markaz = (rng.random(n) < 0.3).astype(float)
    shovqin_belgi = rng.normal(0, 1, n)                 # ta'sirsiz belgi
    narx = (18 + 1.52 * maydon + 4.0 * xona - 0.62 * yosh + 38 * markaz
            + rng.normal(0, 13, n))
    X = np.column_stack([maydon, xona, yosh, markaz, shovqin_belgi])
    return X, narx


def main() -> None:
    X, y = yarat()
    nomlar = ["maydon", "xona", "yosh", "markaz", "shovqin"]
    Xc = sm.add_constant(X)
    nat = sm.OLS(y, Xc).fit()

    print("=== 1. Koeffitsiyentlar va noaniqlik ===")
    ci = nat.conf_int()
    haqiqiy = [18, 1.52, 4.0, -0.62, 38.0, 0.0]
    print(f"  {'belgi':<9} {'baho':>8} {'st.xato':>8} {'p':>8} "
          f"{'95% CI':>20} {'haqiqiy':>8}")
    for i, nom in enumerate(["kesma"] + nomlar):
        print(f"  {nom:<9} {nat.params[i]:>8.3f} {nat.bse[i]:>8.3f} "
              f"{nat.pvalues[i]:>8.3f} "
              f"[{ci[i, 0]:>8.3f}, {ci[i, 1]:>7.3f}] {haqiqiy[i]:>8.2f}")

    print("\n=== 2. Ta'sirsiz belgi ===")
    i = nomlar.index("shovqin") + 1
    print(f"  shovqin: p = {nat.pvalues[i]:.3f}, "
          f"CI = [{ci[i, 0]:.2f}, {ci[i, 1]:.2f}] — nolni o'z ichiga oladi")

    print("\n=== 3. Model sifati ===")
    print(f"  R^2 = {nat.rsquared:.4f}, adjusted R^2 = {nat.rsquared_adj:.4f}")
    print(f"  F-test p = {nat.f_pvalue:.2e} (model umuman ma'noli)")
    print(f"  qoldiq SD = {np.sqrt(nat.mse_resid):.2f} (haqiqiy shovqin 13)")

    print("\n=== 4. Namuna hajmi va aniqlik ===")
    for n in [100, 400, 1600]:
        Xn, yn = yarat(n=n)
        r = sm.OLS(yn, sm.add_constant(Xn)).fit()
        print(f"  n = {n:>4}: maydon koeffitsiyenti {r.params[1]:.3f} "
              f"± {r.bse[1]:.3f}")
    print("  ⭐ Noaniqlik ~ 1/sqrt(n) (4.7, 11.8)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Koeffitsiyentlar va noaniqlik ===
  belgi         baho  st.xato        p               95% CI  haqiqiy
  kesma       17.709    1.683    0.000 [  14.406,  21.012]    18.00
  maydon       1.469    0.064    0.000 [   1.344,   1.594]     1.52
  xona         4.717    1.503    0.002 [   1.767,   7.666]     4.00
  yosh        -0.568    0.036    0.000 [  -0.638,  -0.498]    -0.62
  markaz      38.651    0.990    0.000 [  36.708,  40.594]    38.00
  shovqin      0.774    0.451    0.087 [  -0.112,   1.660]     0.00

=== 2. Ta'sirsiz belgi ===
  shovqin: p = 0.087, CI = [-0.11, 1.66] — nolni o'z ichiga oladi

=== 3. Model sifati ===
  R^2 = 0.9264, adjusted R^2 = 0.9259
  F-test p = 0.00e+00 (model umuman ma'noli)
  qoldiq SD = 12.95 (haqiqiy shovqin 13)

=== 4. Namuna hajmi va aniqlik ===
  n =  100: maydon koeffitsiyenti 1.106 ± 0.182
  n =  400: maydon koeffitsiyenti 1.626 ± 0.081
  n = 1600: maydon koeffitsiyenti 1.481 ± 0.047
  ⭐ Noaniqlik ~ 1/sqrt(n) (4.7, 11.8)

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Belgi qo'shish: foydali va foydasiz

python
"""Qaysi belgi haqiqatan foyda beradi (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold, cross_val_score


def main() -> None:
    rng = np.random.default_rng(9)
    n = 1500
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    xona = np.clip((maydon / 24).round(), 1, 7)          # maydon bilan kuchli bog'liq
    markaz = (rng.random(n) < 0.3).astype(float)          # mustaqil va muhim
    shovqin = rng.normal(0, 1, n)                         # ta'sirsiz
    y = 18 + 1.52 * maydon + 38 * markaz + rng.normal(0, 13, n)
    cv = KFold(5, shuffle=True, random_state=0)

    def baho(X):
        r2 = cross_val_score(LinearRegression(), X, y, cv=cv, scoring="r2").mean()
        mae = -cross_val_score(LinearRegression(), X, y, cv=cv,
                               scoring="neg_mean_absolute_error").mean()
        return r2, mae

    print("=== 1. Belgilar ketma-ket qo'shiladi (CV) ===")
    toplamlar = [
        ("maydon", np.column_stack([maydon])),
        ("+ xona (maydon bilan bog'liq)", np.column_stack([maydon, xona])),
        ("+ markaz (yangi ma'lumot)", np.column_stack([maydon, xona, markaz])),
        ("+ shovqin (foydasiz)", np.column_stack([maydon, xona, markaz, shovqin])),
    ]
    for nom, X in toplamlar:
        r2, mae = baho(X)
        print(f"  {nom:<32}: CV R^2 {r2:.4f}, MAE {mae:5.2f}")

    print("\n=== 2. Nega xona deyarli foyda bermadi ===")
    print(f"  corr(maydon, xona) = {np.corrcoef(maydon, xona)[0, 1]:.3f}")
    print("  (u maydon bergan ma'lumotni takrorlaydi — 13.3)")

    print("\n=== 3. Markazning hissasi ===")
    r2_siz = baho(np.column_stack([maydon, xona]))[0]
    r2_bilan = baho(np.column_stack([maydon, xona, markaz]))[0]
    print(f"  CV R^2: {r2_siz:.4f} → {r2_bilan:.4f} "
          f"(+{r2_bilan - r2_siz:.4f})")
    print(f"  corr(maydon, markaz) = {np.corrcoef(maydon, markaz)[0, 1]:.3f} "
          f"(mustaqil)")

    print("\n=== 4. Qoida ===")
    print("  belgi foydali: y bilan bog'liq VA mavjudlari bilan bog'liq emas")
    print("  ⭐ Qaror CV bilan qabul qilinadi, R^2 bilan emas")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Belgilar ketma-ket qo'shiladi (CV) ===
  maydon                          : CV R^2 0.7396, MAE 17.61
  + xona (maydon bilan bog'liq)   : CV R^2 0.7397, MAE 17.60
  + markaz (yangi ma'lumot)       : CV R^2 0.9013, MAE 10.50
  + shovqin (foydasiz)            : CV R^2 0.9013, MAE 10.50

=== 2. Nega xona deyarli foyda bermadi ===
  corr(maydon, xona) = 0.963
  (u maydon bergan ma'lumotni takrorlaydi — 13.3)

=== 3. Markazning hissasi ===
  CV R^2: 0.7397 → 0.9013 (+0.1616)
  corr(maydon, markaz) = -0.016 (mustaqil)

=== 4. Qoida ===
  belgi foydali: y bilan bog'liq VA mavjudlari bilan bog'liq emas
  ⭐ Qaror CV bilan qabul qilinadi, R^2 bilan emas

Nima ko'rsatdi: 2.4-bo'lim.


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

Noto'g'ri fikr To'g'risi
"Koeffitsiyent — yakka bog'lanish" Nazoratlangan ta'sir
"Belgi qo'shsam koeffitsiyent o'zgarmasligi kerak" O'zgarishi normal
"R^2 o'sdi — model yaxshilandi" R^2 har doim o'sadi
"Ko'p belgi — yaxshi" n >> p bo'lishi kerak
"adjusted R^2 yetarli" CV ishonchliroq
"p-qiymat kichik — belgi muhim" Ko'p test tuzatishi (11.9)
"Koeffitsiyent kattaligi = muhimlik" Birliklarga bog'liq
"sklearn CI beradi" statsmodels beradi

6. Keng tarqalgan xatolar va yechimlari

1. R^2 bilan model tanlash

python
# eng yuqori R2 li modelni tanlash                                # ⚠️
cross_val_score(model, X, y, cv=5)                                # ✅

2. Koeffitsiyentlarni to'g'ridan-to'g'ri solishtirish

python
# "maydon 1.52, markaz 38 — markaz muhimroq"                      # ⚠️
# standartlashtirilgan koeffitsiyentlar bilan solishtiring        # ✅

3. Noaniqlikni ko'rsatmaslik

python
print("maydon koeffitsiyenti:", m.coef_[0])                       # ⚠️
print(f"{w:.2f} ± {se:.2f} (95% CI)")                             # ✅

4. Kesmani unutish

python
sm.OLS(y, X).fit()                     # kesmasiz                 # ⚠️
sm.OLS(y, sm.add_constant(X)).fit()                               # ✅

5. p ~ n bilan OLS

python
LinearRegression().fit(X, y)           # p = 190, n = 200         # ⚠️
Ridge(alpha=1.0)                       # regularizatsiya 13.7-bob   # ✅

6. Sababiy til

python
# "markazda bo'lish narxni 38 ming oshiradi"                      # ⚠️
# "qolgan belgilar teng bo'lganda farq 38 ming"                   # ✅

7. Barcha p-qiymatlarni o'qish

python
# 40 belgidan 2 tasi p < 0.05 — "topdik"                          # ⚠️
# ko'p test tuzatishi 11.9-bob yoki tasdiqlash namunasi             # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 4.10-dars (o'tilgan): Simpson paradoksi
  • 10.6-dars (o'tilgan): Proyeksiya va eng kichik kvadratlar
  • 11.8-dars (o'tilgan): Ishonch oraliqlari
  • 13.3-dars: Koeffitsiyentlarni talqin qilish
  • 13.7-dars: Ridge regularizatsiyasi

8. Eng yaxshi amaliyotlar

  1. Koeffitsiyentni "nazoratlangan" deb o'qing.

  2. Model tanlashda CV ishlating.

  3. Ishonch oralig'ini bering.

  4. n >> p ni ta'minlang.

  5. Belgi yangi ma'lumot berishini tekshiring.

  6. statsmodels bilan diagnostika qiling.

  7. Koeffitsiyentlarni standartlashtirib solishtiring.

  8. Sababiy tildan saqlaning.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # 2 belgili model geometriyasi?
2.  # OLS qanday amal bajaradi?
3.  # "nazoratga olish" nima?
4.  # FWL teoremasi nima deydi?
5.  # belgi qo'shilsa R^2 nima bo'ladi?
6.  # adjusted R^2 formulasi?
7.  # model tanlashning eng ishonchli usuli?
8.  # belgi qachon foydali?
9.  # p >= n bo'lsa nima bo'ladi?
10. # CI ni kim beradi: sklearn yoki statsmodels?
11. # koeffitsiyentlarni solishtirish uchun nima kerak?
12. # koeffitsiyent o'zgarishi xatomi?
Javoblar
  1. Tekislik
  2. Proyeksiya
  3. Boshqa belgilar hissasini chiqarish
  4. Koeffitsiyent = qoldiqlar regressiyasi nishabi
  5. O'sadi
  6. 1 - (1-R^2)(n-1)/(n-p-1)
  7. Cross-validation
  8. Yangi ma'lumot bersa
  9. Yagona yechim yo'q
  10. statsmodels
  11. Standartlashtirish
  12. Yo'q, normal

Vazifa 2: Xatolarni tuzating

python
1.  # eng yuqori R2 li modelni tanlash

2.  print("koef:", m.coef_)   # noaniqliksiz

3.  sm.OLS(y, X).fit()   # kesma yo'q

4.  LinearRegression().fit(X, y)   # p=300, n=250

5.  # "reklama xarajati sotuvni 2.1 barobar oshiradi"
Javoblar
python
1.  cross_val_score(model, X, y, cv=5)

2.  print(f"{w:.3f} ± {se:.3f}")

3.  sm.OLS(y, sm.add_constant(X)).fit()

4.  Ridge(alpha=1.0).fit(X, y)

5.  # "bog'liqlik kuzatildi; sabab uchun tajriba kerak 11.10-bob"

Vazifa 3: FWL tajribasi

Modellang:

  1. Yashirin o'zgaruvchi
  2. Yakka va nazoratlangan koeffitsiyent
  3. Qoldiqlar regressiyasi
  4. Tenglikni tekshirish

Vazifa 4: R^2 va CV

Modellang:

  1. Tasodifiy belgilar
  2. R^2, adjusted R^2, CV
  3. p ~ n holati
  4. Xulosa

Vazifa 5: statsmodels

Modellang:

  1. To'liq hisobot
  2. CI va p-qiymatlar
  3. Ta'sirsiz belgi
  4. Namuna hajmi ta'siri

Vazifa 6: Belgi tanlash

Modellang:

  1. Bog'liq va mustaqil belgilar
  2. CV bilan baholash
  3. Foydali/foydasiz ajratish
  4. Yakuniy to'plam

Vazifa 7: O'ylash

Ko'p o'zgaruvchili regressiyada "boshqa belgilarni nazoratga olish" ko'pincha sababiy xulosa chiqarish uchun ishlatiladi ("yoshni nazoratga olganimizda ta'lim daromadga ta'sir qiladi"). Bu qachon to'g'ri, qachon xato?

Javob

Qisqa javob: regressiya bilan nazoratga olish sababiy xulosani faqat barcha muhim aralashuvchi omillar o'lchangan va modelga kiritilgan bo'lsa beradi — bu esa kamdan-kam ta'minlanadi. Qolgan hollarda u faqat "shu belgilar teng bo'lganda kuzatilgan farq" ni beradi.

1. Nima nazoratga olinadi

  • Faqat modelga kiritilgan va to'g'ri o'lchangan belgilar
  • Kiritilmagan aralashuvchi (masalan, oilaviy sharoit) — nazoratsiz qoladi
  • Xato bilan o'lchangan belgi to'liq nazoratga olinmaydi

2. Xavfli hollar

Holat Muammo
Kollayder nazoratga olish Yo'q bog'liqlik paydo bo'ladi
Mediator nazoratga olish Haqiqiy ta'sir yo'qoladi
Kiritilmagan aralashuvchi Soxta ta'sir qoladi
Post-treatment belgi Ta'sir noto'g'ri bo'linadi

3. To'g'ri qilish yo'llari

  • Sababiy diagramma (DAG) chizib, nimani nazoratga olishni oldindan hal qilish
  • Tajriba 11.10-bob — eng ishonchli
  • Tabiiy tajriba, instrumental o'zgaruvchi, farqlar farqi
  • Sezgirlik tahlili: "qanchalik kuchli yashirin omil natijani buzadi?"

4. Qanday yozish kerak

  • "Yosh va tajriba teng bo'lgan guruhlar orasida farq 12%"
  • "Ta'lim daromadni 12% oshiradi"

5. Xulosa

  1. Nazorat — sababiylik kafolati emas
  2. Qaysi belgi nazoratga olinishi nazariyadan kelib chiqadi
  3. Ba'zi belgilarni nazoratga olish zarar qiladi
  4. Sababiy da'vo uchun tajriba kerak

Nimani mustahkamlaydi: 2.2-bo'lim.


Xulosa

Bu darsda ko'p o'zgaruvchili regressiyani o'rgandik.

Eng muhim uch fikr:

  1. Koeffitsiyent ma'nosi o'zgaradi. Ko'p belgili modelda har koeffitsiyent "boshqa belgilar nazoratga olingandagi" ta'sir. FWL teoremasi buni aniq ko'rsatadi: u qoldiqlar bo'yicha oddiy regressiya nishabiga teng. Belgi qo'shilganda koeffitsiyent (hatto ishorasi) o'zgarishi — xato emas, boshqa savolga javob 4.10-bob.

  2. R^2 bilan model tanlab bo'lmaydi. Belgi qo'shilsa R^2 har doim o'sadi — tasodifiy belgilarda ham. adjusted R^2 jazo qo'shadi, AIC/BIC ham bor, lekin eng ishonchlisi — cross-validation 12.3-bob, chunki u yangi ma'lumotdagi ishlashni o'lchaydi.

  3. Belgi yangi ma'lumot berishi kerak. Mavjud belgilar bilan kuchli bog'liq belgi R^2 ni deyarli oshirmaydi, lekin koeffitsiyentlarni beqaror qiladi 13.3-bob. p n ga yaqinlashsa OLS buziladi (koeffitsiyentlar ulkan, test natijasi halokatli) — regularizatsiya kerak 13.7-bob. Statistik xulosa uchun statsmodels: standart xato, p-qiymat va ishonch oralig'i.

Keyingi darsda koeffitsiyentlarni talqin qilishni o'rganamiz: birliklar, standartlashtirilgan koeffitsiyentlar, multikollinearlik va VIF, log-transformatsiyalarda talqin.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
13.2-dars: Ko'p o'zgaruvchili regressiya — IlmHamroh