Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Geometriya
- 2.2. Nazoratga olish
- 2.3. R^2 va adjusted R^2
- 2.4. Belgi qo'shish qachon foydali
- 2.5. statsmodels hisoboti
- 2.6. Model sig'imi
- 2.7. Tuzoqlar
- 2.8. Ko'p belgi — boshqa savol
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Nazoratga olish: koeffitsiyent nega o'zgaradi
- Misol 2 — R^2 aldaydi: tasodifiy belgilar
- Misol 3 — statsmodels: to'liq statistik hisobot
- Misol 4 — Belgi qo'shish: foydali va foydasiz
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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
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
"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 teoremasiNazoratga 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
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
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
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
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
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'rsatXulosa
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 — bashorat4. Batafsil misollar
Misollar real numpy/pandas/sklearn/statsmodels bilan (Python 3.14).
Misol 1 — Nazoratga olish: koeffitsiyent nega o'zgaradi
"""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:
=== 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 — normalNima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — R^2 aldaydi: tasodifiy belgilar
"""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:
<<NATIJA>>Nima ko'rsatdi: 2.3, 2.6-bo'limlar.
Misol 3 — statsmodels: to'liq statistik hisobot
"""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:
=== 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
"""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:
=== 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 emasNima 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
# eng yuqori R2 li modelni tanlash # ⚠️
cross_val_score(model, X, y, cv=5) # ✅2. Koeffitsiyentlarni to'g'ridan-to'g'ri solishtirish
# "maydon 1.52, markaz 38 — markaz muhimroq" # ⚠️
# standartlashtirilgan koeffitsiyentlar bilan solishtiring # ✅3. Noaniqlikni ko'rsatmaslik
print("maydon koeffitsiyenti:", m.coef_[0]) # ⚠️
print(f"{w:.2f} ± {se:.2f} (95% CI)") # ✅4. Kesmani unutish
sm.OLS(y, X).fit() # kesmasiz # ⚠️
sm.OLS(y, sm.add_constant(X)).fit() # ✅5. p ~ n bilan OLS
LinearRegression().fit(X, y) # p = 190, n = 200 # ⚠️
Ridge(alpha=1.0) # regularizatsiya 13.7-bob # ✅6. Sababiy til
# "markazda bo'lish narxni 38 ming oshiradi" # ⚠️
# "qolgan belgilar teng bo'lganda farq 38 ming" # ✅7. Barcha p-qiymatlarni o'qish
# 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
Koeffitsiyentni "nazoratlangan" deb o'qing.
Model tanlashda CV ishlating.
Ishonch oralig'ini bering.
n >> p ni ta'minlang.
Belgi yangi ma'lumot berishini tekshiring.
statsmodels bilan diagnostika qiling.
Koeffitsiyentlarni standartlashtirib solishtiring.
Sababiy tildan saqlaning.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Tekislik
- Proyeksiya
- Boshqa belgilar hissasini chiqarish
- Koeffitsiyent = qoldiqlar regressiyasi nishabi
- O'sadi
- 1 - (1-R^2)(n-1)/(n-p-1)
- Cross-validation
- Yangi ma'lumot bersa
- Yagona yechim yo'q
- statsmodels
- Standartlashtirish
- Yo'q, normal
Vazifa 2: Xatolarni tuzating
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
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:
- Yashirin o'zgaruvchi
- Yakka va nazoratlangan koeffitsiyent
- Qoldiqlar regressiyasi
- Tenglikni tekshirish
Vazifa 4: R^2 va CV
Modellang:
- Tasodifiy belgilar
- R^2, adjusted R^2, CV
- p ~ n holati
- Xulosa
Vazifa 5: statsmodels
Modellang:
- To'liq hisobot
- CI va p-qiymatlar
- Ta'sirsiz belgi
- Namuna hajmi ta'siri
Vazifa 6: Belgi tanlash
Modellang:
- Bog'liq va mustaqil belgilar
- CV bilan baholash
- Foydali/foydasiz ajratish
- 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
- Nazorat — sababiylik kafolati emas
- Qaysi belgi nazoratga olinishi nazariyadan kelib chiqadi
- Ba'zi belgilarni nazoratga olish zarar qiladi
- 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:
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.
R^2 bilan model tanlab bo'lmaydi. Belgi qo'shilsa
R^2har doim o'sadi — tasodifiy belgilarda ham.adjusted R^2jazo qo'shadi, AIC/BIC ham bor, lekin eng ishonchlisi — cross-validation 12.3-bob, chunki u yangi ma'lumotdagi ishlashni o'lchaydi.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.
pnga yaqinlashsa OLS buziladi (koeffitsiyentlar ulkan, test natijasi halokatli) — regularizatsiya kerak 13.7-bob. Statistik xulosa uchunstatsmodels: standart xato, p-qiymat va ishonch oralig'i.
Keyingi darsda koeffitsiyentlarni talqin qilishni o'rganamiz: birliklar, standartlashtirilgan koeffitsiyentlar, multikollinearlik va VIF, log-transformatsiyalarda talqin.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!